int main(void) { /*char text[] = "abcdef;aGDZXC"; */ char text[] = "abcdef;a:ibgdezhuiklmnjoprstyfxcv"; kstate_init_all(GREEK_ELOT928); printf("text: %s\n", text); greek_xlat(text, STRLEN(text)); printf("xlat'ed text: %s\n", text); kstate_end_all(); return 0; }
/* Convert the keypress event into a string. Matthias: trick: used the composed character from Qt if usefull */ static unsigned char *lookup_key(XEvent *ev,int *pcount, unsigned char qt_c) { KeySym keysym; static XComposeStatus compose = {NULL,0}; int count; static unsigned char kbuf[KBUFSIZE]; unsigned char *s, *c; int meta; count = XLookupString(&ev->xkey,kbuf,KBUFSIZE-1,&keysym,&compose); if (count <= 1 && qt_c != '\0'){ kbuf[0] = qt_c; count = 1; } kbuf[count] = (unsigned char)0; meta = ev->xkey.state & Mod1Mask; s = NULL; /* no longer needed. (Matthias) */ if((keysym == SecureKeysym)&&((ev->xkey.state &Mod1Mask) == Mod1Mask)) { /* scr_secure(); */ count = 0; } else if((keysym == BigFontKeysym)&&((ev->xkey.state &Mod1Mask) == Mod1Mask)) { /* NewFont(BIGGER); */ count = 0; } else if((keysym==SmallFontKeysym)&&((ev->xkey.state &Mod1Mask) == Mod1Mask)) { /* NewFont(SMALLER); */ count = 0; } else if((keysym == PageUpKeysym)&&((ev->xkey.state &Mod1Mask) == Mod1Mask)) { scr_move_up_down(UP); count = 0; } else if((keysym == PageDownKeysym)&&((ev->xkey.state &Mod1Mask) == Mod1Mask)) { scr_move_up_down(DOWN); count = 0; } /* added ShiftMask here to be more like an xterm. (Matthias) */ else if((keysym == PageUpKeysym)&&((ev->xkey.state &ShiftMask) == ShiftMask)) { scr_move_up_down(UP); count = 0; } else if((keysym == PageDownKeysym)&&((ev->xkey.state &ShiftMask) == ShiftMask)) { scr_move_up_down(DOWN); count = 0; } #ifdef MAPALERT else if((keysym == AlertKeysym)&&((ev->xkey.state &Mod1Mask) == Mod1Mask)) { map_alert = !map_alert; count = 0; } #endif #ifdef GREEK_KBD else if(keysym == GreekSwitchKeysym) { greek_mode_ON = !greek_mode_ON; if (greek_mode_ON) greek_reset(); count = 0; } #endif else switch(keysym) { /* introduced BackSpace and Delete mapping (Matthias) */ case XK_BackSpace : /* \010 = ^H (BS) */ /* \177 = ^? (Del) */ strcpy(kbuf, BackspaceSendsControlH ? "\010" : "\177"); count = 1; break; case XK_Delete : #if XlibSpecificationRelease >= 6 case XK_KP_Delete : #endif /* strcpy(kbuf,"\033[3~"); */ /* strcpy(kbuf, BackspaceSendsControlH ? "\177" : "\010"); */ strcpy(kbuf, keys[KeySetSend].del); count = strlen(kbuf); break; case XK_Up : #if XlibSpecificationRelease >= 6 case XK_KP_Up : #endif strcpy(kbuf,(app_cur_keys ? "\033OA" : "\033[A")); count = strlen(kbuf); break; case XK_Down : #if XlibSpecificationRelease >= 6 case XK_KP_Down : #endif strcpy(kbuf,app_cur_keys ? "\033OB" : "\033[B"); count = strlen(kbuf); break; case XK_Right : strcpy(kbuf,app_cur_keys ? "\033OC" : "\033[C"); count = strlen(kbuf); break; case XK_Left : strcpy(kbuf,app_cur_keys ? "\033OD" : "\033[D"); count = strlen(kbuf); break; case XK_KP_F1 : strcpy(kbuf,"\033OP"); count = 3; break; case XK_KP_F2 : strcpy(kbuf,"\033OQ"); count = 3; break; case XK_KP_F3 : strcpy(kbuf,"\033OR"); count = 3; break; case XK_KP_F4 : strcpy(kbuf,"\033OS"); count = 3; break; case XK_KP_0 : strcpy(kbuf,app_kp_keys ? "\033Op" : "0"); count = strlen(kbuf); break; case XK_KP_1 : strcpy(kbuf,app_kp_keys ? "\033Oq" : "1"); count = strlen(kbuf); break; case XK_KP_2 : strcpy(kbuf,app_kp_keys ? "\033Or" : "2"); count = strlen(kbuf); break; case XK_KP_3 : strcpy(kbuf,app_kp_keys ? "\033Os" : "3"); count = strlen(kbuf); break; case XK_KP_4 : strcpy(kbuf,app_kp_keys ? "\033Ot" : "4"); count = strlen(kbuf); break; case XK_KP_5 : strcpy(kbuf,app_kp_keys ? "\033Ou" : "5"); count = strlen(kbuf); break; case XK_KP_6 : strcpy(kbuf,app_kp_keys ? "\033Ov" : "6"); count = strlen(kbuf); break; case XK_KP_7 : strcpy(kbuf,app_kp_keys ? "\033Ow" : "7"); count = strlen(kbuf); break; case XK_KP_8 : strcpy(kbuf,app_kp_keys ? "\033Ox" : "8"); count = strlen(kbuf); break; case XK_KP_9 : strcpy(kbuf,app_kp_keys ? "\033Oy" : "9"); count = strlen(kbuf); break; case XK_KP_Subtract : strcpy(kbuf,app_kp_keys ? "\033Om" : "-"); count = strlen(kbuf); break; case XK_KP_Separator : strcpy(kbuf,app_kp_keys ? "\033Ol" : ","); count = strlen(kbuf); break; case XK_KP_Decimal : strcpy(kbuf,app_kp_keys ? "\033On" : "."); count = strlen(kbuf); break; case XK_KP_Enter : strcpy(kbuf,app_kp_keys ? "\033OM" : "\r"); count = strlen(kbuf); break; /* changed home and end to more modern values (Matthias) */ case XK_Home : #if XlibSpecificationRelease >= 6 case XK_KP_Home : #endif /*strcpy(kbuf,"\033[H");*/ strcpy(kbuf, keys[KeySetSend].home); count = strlen(kbuf); break; case XK_End : #if XlibSpecificationRelease >= 6 case XK_KP_End : #endif /*strcpy(kbuf,"\033[F");*/ strcpy(kbuf, keys[KeySetSend].end); count = strlen(kbuf); break; case XK_F1 : strcpy(kbuf,"\033[11~"); count = 5; break; case XK_F2 : strcpy(kbuf,"\033[12~"); count = 5; break; case XK_F3 : strcpy(kbuf,"\033[13~"); count = 5; break; case XK_F4 : strcpy(kbuf,"\033[14~"); count = 5; break; case XK_F5 : strcpy(kbuf,"\033[15~"); count = 5; break; case XK_F6 : strcpy(kbuf,"\033[17~"); count = 5; break; case XK_F7 : strcpy(kbuf,"\033[18~"); count = 5; break; case XK_F8 : strcpy(kbuf,"\033[19~"); count = 5; break; case XK_F9 : strcpy(kbuf,"\033[20~"); count = 5; break; case XK_F10 : strcpy(kbuf,"\033[21~"); count = 5; break; case XK_F11 : strcpy(kbuf,"\033[23~"); count = 5; break; case XK_F12 : strcpy(kbuf,"\033[24~"); count = 5; break; case XK_F13 : strcpy(kbuf,"\033[25~"); count = 5; break; case XK_F14 : strcpy(kbuf,"\033[26~"); count = 5; break; case XK_Help : case XK_F15 : strcpy(kbuf,"\033[28~"); count = 5; break; case XK_Menu : case XK_F16 : strcpy(kbuf,"\033[29~"); count = 5; break; case XK_F17 : strcpy(kbuf,"\033[31~"); count = 5; break; case XK_F18 : strcpy(kbuf,"\033[32~"); count = 5; break; case XK_F19 : strcpy(kbuf,"\033[33~"); count = 5; break; case XK_F20 : strcpy(kbuf,"\033[34~"); count = 5; break; case XK_Find : strcpy(kbuf,"\033[1~"); count = 4; break; case XK_Insert : #if XlibSpecificationRelease >= 6 case XK_KP_Insert : #endif /* strcpy(kbuf,"\033[2~"); */ strcpy(kbuf, keys[KeySetSend].ins); count = strlen(kbuf); break; case XK_Execute : strcpy(kbuf,"\033[3~"); count = 4; break; case XK_Select : strcpy(kbuf,"\033[4~"); count = 4; break; case XK_Prior : #if XlibSpecificationRelease >= 6 case XK_KP_Prior : #endif strcpy(kbuf,"\033[5~"); count = 4; break; case XK_Next : #if XlibSpecificationRelease >= 6 case XK_KP_Next : #endif strcpy(kbuf,"\033[6~"); count = 4; break; #ifdef GREEK_KBD default: if (greek_mode_ON) count = greek_xlat(kbuf, count); #endif } *pcount = count; /* if meta is pressed, precede message with ESC */ /* used to set the 8th bit high, but this confuses things * for some non-english character sets */ if((MetaHandling == ESCAPE) && meta &&(count > 0)) { *pcount = count + 1; for(c = (kbuf + (count)); c > kbuf ; c--) { *c = *(c-1); } *kbuf = 27; *(kbuf+count+1)=0; } else if((MetaHandling == BIT) && meta &&(count > 0)) { for(c = kbuf; c < kbuf+count ; c++) { *c = *c | 0x80 ; } *(kbuf+count)=0; } else *(kbuf+count) = 0; return (kbuf); }