/* Portions Copyright 2003, Jordan Crouse (jordan@cosmicpenguin.net) */ #include "nxlib.h" #include #include "keysym.h" #include "Xutil.h" #include "keysymstr.h" #include #include #include #include #include /* kernel unicode tables per shiftstate and scancode*/ #define NUM_VGAKEYMAPS (1< 127) return NoSymbol; /* first convert scancode to mwkey*/ mwkey=TranslateScancode(kc); /* then possibly convert mwkey to X KeySym*/ for (i=0; mwkey_to_xkey[i].nxKey != 0xffff; i++) { if (mwkey == mwkey_to_xkey[i].nxKey){ return mwkey_to_xkey[i].xKey; } } /* assume X KeySym is same as MWKEY value*/ return mwkey; } /* translate event->keycode into KeySym, no control/shift processing*/ KeySym XLookupKeysym(XKeyEvent *event, int index) { return XKeycodeToKeysym(event->display, event->keycode, index); } /* translate event->keycode into *keysym, control/shift processing*/ int XLookupString(XKeyEvent *event, char *buffer, int nbytes, KeySym *keysym, XComposeStatus *status) { KeySym k; modstate &= 0xffff ^ MWKMOD_SHIFT; modstate &= 0xffff ^ MWKMOD_CTRL; /* translate Control/Shift*/ if ((event->state & ControlMask) /* && k < 256*/){ modstate |= MWKMOD_CTRL; //k &= 0x1f; } else if (event->state & ShiftMask) { modstate |= MWKMOD_SHIFT; }else if( event->state & Mod1Mask){ modstate |= MWKMOD_ALTGR; } k = XLookupKeysym(event, 0); if(!map_loaded){ /* translate Control/Shift*/ if ((event->state & ControlMask) && k < 256) k &= 0x1f; else if (event->state & ShiftMask) { if (k >= 'a' && k <= 'z') k = k-'a'+'A'; else switch (k) { case '`': k = '~'; break; case '1': k = '!'; break; case '2': k = '@'; break; case '3': k = '#'; break; case '4': k = '$'; break; case '5': k = '%'; break; case '6': k = '^'; break; case '7': k = '&'; break; case '8': k = '*'; break; case '9': k = '('; break; case '0': k = ')'; break; case '-': k = '_'; break; case '=': k = '+'; break; case '\\': k = '|'; break; case '[': k = '{'; break; case ']': k = '}'; break; case ';': k = ':'; break; case '\'': k = '"'; break; case ',': k = '<'; break; case '.': k = '>'; break; case '/': k = '?'; break; } } } *keysym = k; if (nbytes > 0){ buffer[0] = '\0'; } } /* Freeking ugly! */ KeySym XStringToKeysym(_Xconst char *string) { int i; for (i=0; i < NX_KEYSYMSTR_COUNT; i++) if (strcmp(nxKeyStrings[i].str, string) == 0) return nxKeyStrings[i].keysym; return NoSymbol; } /* translate KeySym to KeyCode*/ KeyCode XKeysymToKeycode(Display *dpy, KeySym ks) { int i; for (i=0; i<128; ++i) if (mwscan_to_mwkey[i] == ks) return i; return NoSymbol; } /* Translate the keysym to upper case and lower case */ void XConvertCase(KeySym in, KeySym *upper, KeySym *lower) { if (in & MWKEY_NONASCII_MASK) *upper = *lower = in; else { *upper = (in >= 'a' && in <= 'z')? in-'a'+'A': in; *lower = (in >= 'A' && in <= 'A')? in-'A'+'a': in; } } #if 0000 /* * Microwindows ttyscan.c compatible scancode conversion * table. Note this is NOT the same as the Linux kernel * table due to the HACK XXX in ttyscan.c after getting * the kernel scancode. FIXME */ #define UNKNOWN 0 static MWKEY mwscan_to_mwkey[128] = { UNKNOWN, /* 0*/ UNKNOWN, /* 1*/ UNKNOWN, /* 2*/ UNKNOWN, /* 3*/ UNKNOWN, /* 4*/ UNKNOWN, /* 5*/ UNKNOWN, /* 6*/ UNKNOWN, /* 7*/ UNKNOWN, /* 8*/ MWKEY_ESCAPE, /* 9*/ '1', /* 10*/ '2', /* 11*/ '3', /* 12*/ '4', /* 13*/ '5', /* 14*/ '6', /* 15*/ '7', /* 16*/ '8', /* 17*/ '9', /* 18*/ '0', /* 19*/ '-', /* 20*/ UNKNOWN, /* 21*/ MWKEY_BACKSPACE,/* 22*/ MWKEY_TAB, /* 23*/ 'q', /* 24*/ 'w', /* 25*/ 'e', /* 26*/ 'r', /* 27*/ 't', /* 28*/ 'y', /* 29*/ 'u', /* 30*/ 'i', /* 31*/ 'o', /* 32*/ 'p', /* 33*/ '[', /* 34*/ ']', /* 35*/ MWKEY_ENTER, /* 36*/ MWKEY_LCTRL, /* 37*/ 'a', /* 38*/ 's', /* 39*/ 'd', /* 40*/ 'f', /* 41*/ 'g', /* 42*/ 'h', /* 43*/ 'j', /* 44*/ 'k', /* 45*/ 'l', /* 46*/ ';', /* 47*/ '\'', /* 48*/ '`', /* 49*/ MWKEY_LSHIFT, /* 50*/ '\\', /* 51*/ 'z', /* 52*/ 'x', /* 53*/ 'c', /* 54*/ 'v', /* 55*/ 'b', /* 56*/ 'n', /* 57*/ 'm', /* 58*/ ',', /* 59*/ '.', /* 60*/ '/', /* 61*/ MWKEY_RSHIFT, /* 62*/ MWKEY_KP_MULTIPLY,/* 63*/ MWKEY_LALT, /* 64*/ ' ', /* 65*/ UNKNOWN, /* 66*/ MWKEY_F1, /* 67*/ MWKEY_F2, /* 68*/ MWKEY_F3, /* 69*/ MWKEY_F4, /* 70*/ MWKEY_F5, /* 71*/ MWKEY_F6, /* 72*/ MWKEY_F7, /* 73*/ MWKEY_F8, /* 74*/ MWKEY_F9, /* 75*/ MWKEY_F10, /* 76*/ UNKNOWN, /* 77*/ UNKNOWN, /* 78*/ MWKEY_KP7, /* 79*/ MWKEY_KP8, /* 80*/ MWKEY_KP9, /* 81*/ MWKEY_KP_MINUS, /* 82*/ MWKEY_KP4, /* 83*/ MWKEY_KP5, /* 84*/ MWKEY_KP6, /* 85*/ MWKEY_KP_PLUS, /* 86*/ MWKEY_KP1, /* 87*/ MWKEY_KP2, /* 88*/ MWKEY_KP3, /* 89*/ MWKEY_KP0, /* 90*/ MWKEY_KP_PERIOD,/* 91*/ UNKNOWN, /* 92*/ UNKNOWN, /* 93*/ UNKNOWN, /* 94*/ MWKEY_F11, /* 95*/ MWKEY_F12, /* 96*/ MWKEY_HOME, /* 97*/ MWKEY_UP, /* 98*/ MWKEY_PAGEUP, /* 99*/ MWKEY_LEFT, /*100*/ UNKNOWN, /*101*/ MWKEY_RIGHT, /*102*/ MWKEY_END, /*103*/ MWKEY_DOWN, /*104*/ MWKEY_PAGEDOWN, /*105*/ MWKEY_INSERT, /*106*/ MWKEY_DELETE, /*107*/ MWKEY_KP_ENTER, /*108*/ MWKEY_RCTRL, /*109*/ UNKNOWN, /*110*/ MWKEY_PRINT, /*111*/ MWKEY_KP_DIVIDE, /*112*/ MWKEY_RALT, /*113*/ UNKNOWN, /*114*/ UNKNOWN, /*115*/ UNKNOWN, /*116*/ UNKNOWN, /*117*/ UNKNOWN, /*118*/ UNKNOWN, /*119*/ UNKNOWN, /*120*/ UNKNOWN, /*121*/ UNKNOWN, /*122*/ UNKNOWN, /*123*/ UNKNOWN, /*124*/ UNKNOWN, /*125*/ UNKNOWN, /*126*/ UNKNOWN /*127*/ }; #endif