📄 ringkey.c
字号:
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
//
// Copyright (c) 2005 ZYM <yanming.zhang@gmail.com>
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pspctrl.h>
#include "main.h"
#include "chinesedraw.h"
// we make '_' as ' ' for display
//char kbletters[]="abcdefghijklmnopqrstuvwxyz.-('@_";
char kbletters[]="fghijklmnopqrstuvwxyz.'-_/(abcde";
char kbnumbers[]="87654321!@#$%^&*()_+{}|\\:;][=-09";
//char kbletters2[]="FGHIJKLMNOPQRSTUVWXYZ.'-_@(ABCDE";
char *currkb;
int currkeyindex;
const int KEYCOS[8]={
// cos()*10000, from ...
// 5.625, 16.875, 28.125, 39.375
9952, 9569, 8819, 7730,
// 50.625, 61.875, 73.125, 84.375
6344, 4714, 2903, 980};
const int KEYTAN[8]={
// tan()*10000
// 5.625, 16.875, 28.125, 39.375
985, 3033, 5345, 8207,
// 50.625, 61.875, 73.125, 84.375
12185, 18709, 32966, 101532};
const int ANALOGTAN[4]={
// tan()*10000
// 11.25, 22.5, 33.75, 45
1989, 4142, 6682, 10000};
struct key_info {
unsigned int x;
unsigned int y;
};
struct key_info kb[KEYNUMBER];
#define INPUTBAR_SIZE 35
struct inputbar {
char string[INPUTBAR_SIZE];
int cursor;
};
struct inputbar myinput;
int getcurrentkeyindex(unsigned char x, unsigned char y)
{
unsigned int deltax, deltay;
int i;
deltax = abs(MAXANALOG_X/2 -x);
deltay = abs(MAXANALOG_Y/2 -y);
if ((x<MAXANALOG_X/2) &&(y<MAXANALOG_Y/2)) {
//kbletter 0..7
if (deltax>=deltay) {
//kbletter 0..3
for (i=0;i<4;i++) {
if (deltay*10000/deltax <=ANALOGTAN[i])
return i;
}
}
else {
// kbletter 4..7
for (i=0;i<4;i++) {
if (deltax*10000/deltay<=ANALOGTAN[i])
return (7-i);
}
}
}
else if ((x>MAXANALOG_X/2)&&(y<MAXANALOG_Y/2)) {
// kbletter 8..15
if (deltax<=deltay) {
// kbletter 8..11
for (i=0;i<4;i++) {
if (deltax*10000/deltay<=ANALOGTAN[i])
return (8+i);
}
}
else {
// kbletter 12..15
for (i=0;i<4;i++) {
if (deltay*10000/deltax<=ANALOGTAN[i])
return (15-i);
}
}
}
else if ((x>MAXANALOG_X/2)&&(y>MAXANALOG_Y/2)) {
// kbletter 16..23
if (deltax>=deltay) {
// kbletter 16.. 19
for (i=0;i<4;i++){
if (deltay*10000/deltax<=ANALOGTAN[i])
return (16+i);
}
}
else {
// kbletter 20..23
for (i=0;i<4;i++) {
if (deltax*10000/deltay<=ANALOGTAN[i])
return (23-i);
}
}
}
else if ((x<MAXANALOG_X/2)&&(y>MAXANALOG_Y/2)) {
// kbletter 24..31
if (deltax<=deltay) {
// kbletter 24..27
for (i=0;i<4;i++) {
if (deltax*10000/deltay<=ANALOGTAN[i])
return (24+i);
}
}
else {
// kbletter 28..31
for (i=0;i<4;i++) {
if (deltay*10000/deltax<=ANALOGTAN[i])
return (31-i);
}
}
}
}
void buildkeyxy(void)
{
int i;
int deltax1, deltay1, deltax2,deltay2;
//build letter array
for (i=0;i<8; i++) {
deltax1 = (KBRADIUS * KEYCOS[i]+5000) / 10000;
deltay1 = (deltax1 * KEYTAN[i]+5000) / 10000;
deltax2 = (KBRADIUS * KEYCOS[7-i]+5000) / 10000;
deltay2 = (deltax2 * KEYTAN[7-i]+5000)/ 10000;
kb[i].x = KBCENTRE_X - deltax1;
kb[i].y = KBCENTRE_Y - deltay1;
kb[i+8].x = KBCENTRE_X +deltax2;
kb[i+8].y = KBCENTRE_Y - deltay2;
kb[i+16].x = KBCENTRE_X + deltax1;
kb[i+16].y = KBCENTRE_Y + deltay1;
kb[i+24].x= KBCENTRE_X -deltax2;
kb[i+24].y= KBCENTRE_Y+deltay2;
}
}
int getindex(char *inputstr)
{
int i, mid, first, last;
first = 0;
last = wordcount-1;
while(1) {
mid=(first+last)/2;
i = strcasecmp(inputstr, *(wordarray+mid));
if (i==0) {
break;
}
else if (i>0) {
first=mid;
}
else {
last=mid;
}
if ((last-first)<=1){
//DBG_PRINT("first %s last %s", *(wordarray+first), *(wordarray+last));
break;
}
}
//DBG_PRINT(" %s/ %s/ %s", *(wordarray+first),*(wordarray+mid),*(wordarray+last));
if ((mid>0) && (strcasecmp(inputstr, *(wordarray+mid-1))==0))
return (mid-1);
if (strcasecmp(inputstr, *(wordarray+mid))>0)
return last;
return mid;
}
void disp_ringkey_page(void);
void ydict_ringkey(int laststate)
{
unsigned char x, y;
unsigned int button;
struct ydictctrl yctrl;
buildkeyxy();
memset(&myinput, 0, sizeof(struct inputbar));
updatelist(0);
curword = -1;
currkb = &kbletters;
while (1) {
if ((curword !=-1)&&(curpage == 0)) {
build_dictraw(&wordlist[curword]);
curwordrows= (strlen(*(wordarray+wordlist[curword].index))+C_LEN)/C_LEN;
dictpages = (curwordrows+dictrows+R_LEN)/R_LEN;
}
disp_ringkey_page();
getcontrol(&yctrl);
x = yctrl.x;
y = yctrl.y;
button = yctrl.buttons;
if ((abs(MAXANALOG_X/2 -x)+abs(MAXANALOG_Y/2 -y)) >ANALOG_IGNORE) {
// maybe should use (dx*dx + dy*dy) >ignore*ignore
currkeyindex= getcurrentkeyindex(x, y);
if (curword !=-1){
memset(&myinput, 0, sizeof(struct inputbar));
updatelist(0);
curword =-1;
}
}
else {
// no analog input
currkeyindex= -1;
}
switch (button) {
case PSP_CTRL_SELECT:
//
gstate = STATE_SWITCHMODE;
return;
case PSP_CTRL_START:
memset(&myinput, 0, sizeof(struct inputbar));
updatelist(0);
curword = -1;
break;
case PSP_CTRL_CIRCLE:
// input the currkey
if ((myinput.cursor<INPUTBAR_SIZE )&&(currkeyindex!=-1)) {
if ((currkb==&kbletters) && (*(currkb+currkeyindex)=='_'))
myinput.string[myinput.cursor] = ' ';
else
myinput.string[myinput.cursor] = *(currkb+currkeyindex);
myinput.cursor++;
updatelist(getindex(myinput.string));
curword =-1;
}
break;
case PSP_CTRL_SQUARE:
// erase last key
if (myinput.cursor>0) {
myinput.cursor--;
myinput.string[myinput.cursor]=0;
updatelist(getindex(myinput.string));
curword =-1;
}
break;
case PSP_CTRL_UP:
// previous word
if (curword == -1) {
curword = WORDLIST_SIZE -1;
}
else if (curword == 0){
int i;
if (wordlist[curword].index >0) {
i = wordlist[curword].index -1;
updatelist(i);
//updateidxword(i, &currange.mid);
//update currange first
//if (currange.first.index >= currange.mid.index)
// updateidxword(currange.mid.index, &currange.first);
}
}
else {
curword +=(WORDLIST_SIZE -1);
curword %= WORDLIST_SIZE;
}
curpage = 0;
break;
case PSP_CTRL_DOWN:
// next word
if (curword == -1)
curword = 0;
else if (curword == (WORDLIST_SIZE-1)) {
int i;
if (wordlist[curword].index <(wordcount-1)) {
i = wordlist[curword].index +1;
updatelist(i-WORDLIST_SIZE+1);
//updateidxword(i, &currange.mid);
//update currange last
//if (currange.last.index <= currange.mid.index)
// updateidxword(currange.mid.index, &currange.last);
}
}
else {
curword++;
curword %= WORDLIST_SIZE;
}
curpage = 0;
break;
case PSP_CTRL_LEFT:
//previous list
if (wordlist[0].index <WORDLIST_SIZE)
updatelist(0);
else
updatelist(wordlist[0].index - WORDLIST_SIZE);
// left/right key do not change curword
// but if curword has value, set curpage as 0 to update the dictraw info
if (curword != -1){
curword = 0;
curpage = 0;
}
break;
case PSP_CTRL_RIGHT:
//next list
if ((wordlist[0].index + WORDLIST_SIZE) > (wordcount - WORDLIST_SIZE))
updatelist(wordcount - WORDLIST_SIZE);
else
updatelist(wordlist[0].index + WORDLIST_SIZE);
// left/right key do not change curword
// but if curword has value, set curpage as 0 to update the dictraw info
if (curword != -1) {
curword = 0;
curpage = 0;
}
break;
case PSP_CTRL_TRIANGLE:
// change keyboard, or previous page in view mode
{
if (curword !=-1) {
if (curpage>0)
curpage--;
}
else {
// change ring keyboard
if (currkb == &kbletters)
currkb = &kbnumbers;
else
currkb = &kbletters;
}
}
break;
case PSP_CTRL_CROSS:
// view word dict, or next page in dict mode, or mark this word
if (curword == -1) {
curword = 0;
curpage = 0;
}
else {
if ((curpage+1)<dictpages)
curpage++;
else {
if (tagfilep!=NULL) {
int idx;
unsigned char tag, c;
idx = wordlist[curword].index;
tag = *(tagfilep+idx);
c = ((tag&0x03) +1) %3;
*(tagfilep +idx) = (tag&0xF0) + c;
tagchanged = 1;
}
}
}
break;
case PSP_CTRL_LTRIGGER:
if (tagfilep!=NULL)
{
int idx, i;
unsigned char tag;
// view the previous marked word
if (curword ==-1)
idx=wordlist[0].index;
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -