#include #include #include #include #include "machine_type.h" #include "input.h" #include "output.h" #include "unistd.h" void initkeytab(tOutput* output) { // those values are for mac os x const tKeyTab KeyTab[NUM_SPECIALKEYS]={ // key return value (retval),allowed_in_inputfield,seqlen,seq[8],config[16] {KEYESC, 1,1,{0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00},"KEYESC:","The standard cancel key"}, {KEYF1, 0,2,{0xc2,0xa1,0x00,0x00,0x00,0x00,0x00,0x00},"KEYF1:","This key opens the goto dialog"}, {KEYF2, 0,3,{0xe2,0x84,0xa2,0x00,0x00,0x00,0x00,0x00},"KEYF2:","This key opens the search dialog"}, {KEYF3, 0,2,{0xc2,0xa3,0x00,0x00,0x00,0x00,0x00,0x00},"KEYF3:","This key jumps to the next search item"}, {KEYF4, 0,2,{0xc2,0xa2,0x00,0x00,0x00,0x00,0x00,0x00},"KEYF4:","This key jumps to the previous search item"}, {KEYF5, 0,3,{0xe2,0x88,0x9e,0x00,0x00,0x00,0x00,0x00},"KEYF5:","This key openes the hexcalc tool"}, {KEYF6, 0,2,{0xc2,0xa7,0x00,0x00,0x00,0x00,0x00,0x00},"KEYF6:","This key is not used yet"}, {KEYF7, 0,2,{0xc2,0xb6,0x00,0x00,0x00,0x00,0x00,0x00},"KEYF7:","This key is not used yet"}, {KEYF8, 0,3,{0xe2,0x80,0xa2,0x00,0x00,0x00,0x00,0x00},"KEYF8:","This key is not used yet"}, {KEYF9, 0,2,{0xc2,0xaa,0x00,0x00,0x00,0x00,0x00,0x00},"KEYF9:","This key is for undo"}, {KEYF10, 0,2,{0xc2,0xba,0x00,0x00,0x00,0x00,0x00,0x00},"KEYF10:","This key is for saving and quitting"}, {KEYBACKSPACE, 1,1,{0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00},"KEYBACKSPACE:","Erases a character in input fields"}, {KEYDEL, 1,0,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},"KEYDEL:","Erases a character in input fields"}, {KEYENTER, 1,1,{0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00},"KEYENTER:","The standard Enter key"}, {KEYTAB, 1,1,{0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00},"KEYTAB:","This key jumps trough windows and menu items"}, {KEYUP, 0,3,{0x1b,0x5b,0x41,0x00,0x00,0x00,0x00,0x00},"KEYUP:","Standard scroll key"}, {KEYDOWN, 0,3,{0x1b,0x5b,0x42,0x00,0x00,0x00,0x00,0x00},"KEYDOWN:","Standard scroll key"}, {KEYRIGHT, 0,3,{0x1b,0x5b,0x43,0x00,0x00,0x00,0x00,0x00},"KEYRIGHT:","Standard scroll key"}, {KEYLEFT, 0,3,{0x1b,0x5b,0x44,0x00,0x00,0x00,0x00,0x00},"KEYLEFT:","Standard scroll key"}, {KEYPGUP, 0,0,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},"KEYPGUP:","Scrolls up a full page"}, {KEYPGDOWN, 0,0,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},"KEYPGDOWN:","Scrolls down a full page"}, {KEYHOME, 0,0,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},"KEYHOME:","Jumps to beginning"}, {KEYEND, 0,0,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},"KEYEND:","Jumps to the end"} }; if (output->pKeyTab) free(output->pKeyTab); output->pKeyTab=malloc(sizeof(tKeyTab)*NUM_SPECIALKEYS); memcpy(output->pKeyTab,KeyTab,sizeof(tKeyTab)*NUM_SPECIALKEYS); } tInt16 getkey(tKeyTab* pKeyTab,tBool inputfield) // =1 this is an inputfield. which means that certain allowed_in_inputfields may not be used { tInt16 ch; unsigned char seq[8]; tUInt8 seqlen=0; tBool done; tInt16 donecnt; tInt16 lastch=ERR; tBool partial; tBool exact; int i,j; donecnt=1000; done=0; partial=0; exact=0; while (!done) { while (!done) { ch=getch(); if ((lastch!=ERR && ch==ERR) || seqlen==8) done=1; if (ch!=ERR) { if (seqlen<8) seq[seqlen++]=ch; lastch=ch; done=1; // a key was pressed } else { usleep(1); donecnt=donecnt-partial; done=!donecnt; } } exact=0; partial=0; for (i=0;iseqlen) { j=memcmp(pKeyTab[i].seq,seq,seqlen); if (j==0) partial=1; } } if (exact && (!partial || !donecnt)) done=1; else if (partial && donecnt) done=0; } return lastch; } tInt16 decinput(tOutput* output,tInt16 y,tInt16 x,tUInt64* val,tInt16 len) { tInt16 i; tInt16 ch; tInt16 done=0; tUInt64 newval; char tmpbuf[21]; newval=*val; setcolor(output,COLOR_BRACKETS); mvwprintw(output->win,y,x,"["); mvwprintw(output->win,y,x+len,"]"); while (!done) { setcolor(output,COLOR_INPUT); snprintf(tmpbuf,21,"%20lli",newval); for (i=0;iwin,y,x+len-i,"%c",tmpbuf[20-i]); wmove(output->win,y,x+len); ch=getkey(output->pKeyTab,1); if (ch==KEYENTER) done=1; if (ch==KEYTAB) done=1; if (ch==KEYESC) done=1; if (ch>='0' && ch<='9') { newval=newval*10; newval=newval+(ch-'0'); } if (ch==KEYBACKSPACE || ch==KEYDEL) { newval=newval/10; } } if (ch!=KEYESC) { *val=newval; } return ch; } tInt16 hexinput(tOutput* output,tInt16 y,tInt16 x,tUInt64* val,char* relative,tInt16 len) { char e; tInt16 i; tInt16 ch; tInt16 done=0; tUInt64 newval; tUInt64 t; newval=*val; if (relative) e=*relative; else e='='; setcolor(output,COLOR_BRACKETS); mvwprintw(output->win,y,x,"["); mvwprintw(output->win,y,x+len+1,"]"); while (!done) { setcolor(output,COLOR_BRACKETS); for (i=0;iwin,y,x+i+1," "); setcolor(output,COLOR_INPUT); t=newval; for (i=len-2;i>=0 && t;i--) { tUInt8 c=t&0xf; t>>=4; mvwprintw(output->win,y,x+i+2,"%1x",c); } mvwprintw(output->win,y,x+i+2,"%c",e); refresh(); ch=getkey(output->pKeyTab,1); if (ch=='=' || ch=='-' || ch=='+') e=ch; if (ch>='a' && ch<='f') ch-=32; // make it uppercase if (ch==KEYENTER) done=1; if (ch==KEYTAB) done=1; if (ch==KEYESC) done=1; if (ch>='0' && ch<='9') { newval=newval*16; newval=newval+(ch-'0'); } else if (ch>='A' && ch<='F') { newval=newval*16; newval=newval+(ch-'A'+10); } if (ch==KEYBACKSPACE || ch==KEYDEL) { newval=newval/16; } } if (ch!=KEYESC && relative==NULL) { if (e=='=') *val=newval; if (e=='-') *val-=newval; if (e=='+') *val+=newval; } else if (ch!=KEYESC) { *val=newval; *relative=e; } return ch; } tInt16 hexinput2(tOutput* output,tInt16 y,tInt16 x,char* s,tInt16* usedlen,tInt16 len) { char* buf; tInt16 ch; tBool done=0; tInt16 newusedlen; tBool nibble=0; tUInt8 newchar=0; int i; buf=malloc(len); memcpy(buf,s,len); newusedlen=*usedlen; setcolor(output,COLOR_BRACKETS); mvwprintw(output->win,y,x,"["); mvwprintw(output->win,y,x+len*3,"]"); while (!done) { setcolor(output,COLOR_INPUT); for (i=0;iwin,y,x+1+i*3,"%02x",((tUInt16)buf[i]&0xff)); else if (i==newusedlen && nibble) mvwprintw(output->win,y,x+1+i*3,"%1x ",newchar&0xf); else mvwprintw(output->win,y,x+1+i*3," "); if (i!=(len-1)) mvwprintw(output->win,y,x+3+i*3," "); } wmove(output->win,y,x+1+newusedlen*3+nibble); ch=getkey(output->pKeyTab,1); if (ch>='a' && ch<='z') ch-=32; if (newusedlen='0' && ch<='9') || (ch>='A' && ch<='F'))) { newchar<<=4; newchar|=(ch>='A')?(ch-'A'+10):(ch-'0'); if (nibble) buf[newusedlen++]=newchar; nibble=!nibble; } if ((newusedlen>0 || nibble) && ch==KEYBACKSPACE) { if (!nibble && newusedlen) newchar=buf[--newusedlen]; newchar>>=4; nibble=!nibble; } if (ch==KEYENTER || ch==KEYTAB || ch==KEYUP || ch==KEYDOWN) done=1; if (ch==KEYESC) done=1; } if (ch!=KEYESC) { memcpy(s,buf,len); *usedlen=newusedlen; } setcolor(output,COLOR_TEXT); newusedlen=*usedlen; for (i=0;iwin,y,x+1+i*3,"%02x",((tUInt16)buf[i]&0xff)); else if (i==newusedlen && nibble) mvwprintw(output->win,y,x+1+i*3,"%1x ",newchar&0xf); else mvwprintw(output->win,y,x+1+i*3," "); if (i!=(len-1)) mvwprintw(output->win,y,x+3+i*3," "); } free(buf); return ch; } tInt16 stringinput(tOutput* output,tInt16 y,tInt16 x,char* s,tInt16 len) { tInt16 i; tInt16 cursorpos; tInt16 ch; tInt16 done=0; char* buf; buf=malloc(len); memcpy(buf,s,len); cursorpos=strlen(s); setcolor(output,COLOR_BRACKETS); mvwprintw(output->win,y,x,"["); mvwprintw(output->win,y,x+len+1,"]"); while (!done) { setcolor(output,COLOR_INPUT); for (i=0;iwin,y,x+i+1,"%c",(iwin,y,x+cursorpos+1,"%c",(cursorpospKeyTab,1); if (ch==KEYENTER) done=1; if (ch==KEYTAB) done=1; if (ch==KEYESC) done=1; if (ch==KEYLEFT && cursorpos) cursorpos--; if (ch==KEYRIGHT && cursorpos=' ' && ch<127 && cursorpos0) { memmove(&buf[cursorpos-1],&buf[cursorpos],len-cursorpos); cursorpos--; } else if (ch==KEYDEL && cursorpos<(strlen(buf))) { memmove(&buf[cursorpos],&buf[cursorpos+1],len-cursorpos); } } if (ch!=KEYESC) memcpy(s,buf,len); setcolor(output,COLOR_TEXT); for (i=0;iwin,y,x+i+1,"%c",(i='0' && line[j]<='9') x|=(line[j]-'0'); if (line[j]>='A' && line[j]<='F') x|=(line[j]-'A'+10); if (x&0x100 && pKeyTab[i].seqlen<8) { pKeyTab[i].seq[pKeyTab[i].seqlen++]=(x&0xff); x=1; } } } } return retval; } int writeconfigfile(tOutput* output,char* configfilename) { tFptr f; char tmpbuf[65536]; char lineorig[512]; char lineupcase[512]; char c; int lineorigidx; int lineupcaseidx; int i,j,size; tBool found; tKeyTab* pKeyTab=(tKeyTab*)output->pKeyTab; f=fopen(configfilename,"rb"); if (!f) return RETNOK; size=fread(tmpbuf,sizeof(char),65536,f); fclose(f); if (size>=65536) return RETNOK; tmpbuf[size++]=0; lineorigidx=0; lineupcaseidx=0; f=fopen(configfilename,"w"); for (i=0;i='a' && c<='z') c-=32; if (c==9) c=32; if (c!=32) { lineupcase[lineupcaseidx++]=c; lineupcase[lineupcaseidx]=0; } if (c<32) { found=0; for (j=0;jpKeyTab; mvwprintw(output->win,0,0,"Please press the following keys"); mvwprintw(output->win,1,0,"(Press ESC if your keyboard does not have them)"); mvwprintw(output->win,3,0,"Config file:%s",configfilename); for (i=0;iwin,21,0," "); mvwprintw(output->win,21,0,"%s",pKeyTab[i].desc); if (i<12) mvwprintw(output->win,5+i,0,"%s",pKeyTab[i].config); else mvwprintw(output->win,i-7,40,"%s",pKeyTab[i].config); memset(pKeyTab[i].seq,0,8); while (!done) { ch=getch(); if (ch==-1 && lastkey!=-1) done=1; if (ch!=-1 && seqlen<8) seq[seqlen++]=ch; lastkey=ch; } pKeyTab[i].seqlen=seqlen; memcpy(pKeyTab[i].seq,seq,seqlen); if (pKeyTab[i].retval==KEYESC) keyesc=i; else if (memcmp(pKeyTab[i].seq,pKeyTab[keyesc].seq,8)==0 && i!=keyesc) pKeyTab[i].seqlen=0; for (j=0;jwin,5+i,15+j*3,"%02x",seq[j]); else mvwprintw(output->win,i-7,55+j*3,"%02x",seq[j]); } if (seqlen==1 && seq[0]>=32 && seq[0]<127) { mvwprintw(output->win,(i<12)?(5+i):(i-7),(i<12)?0:40,"%s(*)",pKeyTab[i].config); mvwprintw(output->win,20,0,"WARNING: Keystrokes with (*) cannot be used in an input field\n"); } } for (i=0;iwin,21,0,"Would you like me to write this into the config file? (Y/N)"); done=0; while (!done) { ch=getch(); if (ch=='n' || ch=='N') done=1; else if (ch=='y' || ch=='Y') { writeconfigfile(output,configfilename); done=1; } else usleep(1); } }