diff options
Diffstat (limited to 'win/tkWinKey.c')
-rw-r--r-- | win/tkWinKey.c | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/win/tkWinKey.c b/win/tkWinKey.c new file mode 100644 index 0000000..3589143 --- /dev/null +++ b/win/tkWinKey.c @@ -0,0 +1,360 @@ +/* + * tkWinKey.c -- + * + * This file contains X emulation routines for keyboard related + * functions. + * + * Copyright (c) 1995 Sun Microsystems, Inc. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * SCCS: @(#) tkWinKey.c 1.9 97/06/20 15:12:39 + */ + +#include "tkWinInt.h" + +typedef struct { + unsigned int keycode; + KeySym keysym; +} Keys; + +static Keys keymap[] = { + VK_CANCEL, XK_Cancel, + VK_BACK, XK_BackSpace, + VK_TAB, XK_Tab, + VK_CLEAR, XK_Clear, + VK_RETURN, XK_Return, + VK_SHIFT, XK_Shift_L, + VK_CONTROL, XK_Control_L, + VK_MENU, XK_Alt_L, + VK_PAUSE, XK_Pause, + VK_CAPITAL, XK_Caps_Lock, + VK_ESCAPE, XK_Escape, + VK_SPACE, XK_space, + VK_PRIOR, XK_Prior, + VK_NEXT, XK_Next, + VK_END, XK_End, + VK_HOME, XK_Home, + VK_LEFT, XK_Left, + VK_UP, XK_Up, + VK_RIGHT, XK_Right, + VK_DOWN, XK_Down, + VK_SELECT, XK_Select, + VK_PRINT, XK_Print, + VK_EXECUTE, XK_Execute, + VK_INSERT, XK_Insert, + VK_DELETE, XK_Delete, + VK_HELP, XK_Help, + VK_F1, XK_F1, + VK_F2, XK_F2, + VK_F3, XK_F3, + VK_F4, XK_F4, + VK_F5, XK_F5, + VK_F6, XK_F6, + VK_F7, XK_F7, + VK_F8, XK_F8, + VK_F9, XK_F9, + VK_F10, XK_F10, + VK_F11, XK_F11, + VK_F12, XK_F12, + VK_F13, XK_F13, + VK_F14, XK_F14, + VK_F15, XK_F15, + VK_F16, XK_F16, + VK_F17, XK_F17, + VK_F18, XK_F18, + VK_F19, XK_F19, + VK_F20, XK_F20, + VK_F21, XK_F21, + VK_F22, XK_F22, + VK_F23, XK_F23, + VK_F24, XK_F24, + VK_NUMLOCK, XK_Num_Lock, + VK_SCROLL, XK_Scroll_Lock, + 0, NoSymbol +}; + + +/* + *---------------------------------------------------------------------- + * + * XLookupString -- + * + * Retrieve the string equivalent for the given keyboard event. + * + * Results: + * Returns the number of characters stored in buffer_return. + * + * Side effects: + * Retrieves the characters stored in the event and inserts them + * into buffer_return. + * + *---------------------------------------------------------------------- + */ + +int +XLookupString(event_struct, buffer_return, bytes_buffer, keysym_return, + status_in_out) + XKeyEvent* event_struct; + char* buffer_return; + int bytes_buffer; + KeySym* keysym_return; + XComposeStatus* status_in_out; +{ + int i, limit; + + if (event_struct->send_event != -1) { + /* + * This is an event generated from generic code. It has no + * nchars or trans_chars members. + */ + + int index; + KeySym keysym; + + index = 0; + if (event_struct->state & ShiftMask) { + index |= 1; + } + if (event_struct->state & Mod1Mask) { + index |= 2; + } + keysym = XKeycodeToKeysym(event_struct->display, + event_struct->keycode, index); + if (((keysym != NoSymbol) && (keysym > 0) && (keysym < 256)) + || (keysym == XK_Return) + || (keysym == XK_Tab)) { + buffer_return[0] = (char) keysym; + return 1; + } + return 0; + } + if ((event_struct->nchars <= 0) || (buffer_return == NULL)) { + return 0; + } + limit = (event_struct->nchars < bytes_buffer) ? event_struct->nchars : + bytes_buffer; + + for (i = 0; i < limit; i++) { + buffer_return[i] = event_struct->trans_chars[i]; + } + + if (keysym_return != NULL) { + *keysym_return = NoSymbol; + } + return i; +} + +/* + *---------------------------------------------------------------------- + * + * XKeycodeToKeysym -- + * + * Translate from a system-dependent keycode to a + * system-independent keysym. + * + * Results: + * Returns the translated keysym, or NoSymbol on failure. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +KeySym +XKeycodeToKeysym(display, keycode, index) + Display* display; + unsigned int keycode; + int index; +{ + Keys* key; + BYTE keys[256]; + int result; + char buf[4]; + unsigned int scancode = MapVirtualKey(keycode, 0); + + memset(keys, 0, 256); + if (index & 0x02) { + keys[VK_NUMLOCK] = 1; + } + if (index & 0x01) { + keys[VK_SHIFT] = 0x80; + } + result = ToAscii(keycode, scancode, keys, (LPWORD) buf, 0); + + /* + * Keycode mapped to a valid Latin-1 character. Since the keysyms + * for alphanumeric characters map onto Latin-1, we just return it. + */ + + if (result == 1 && buf[0] >= 0x20) { + return (KeySym) buf[0]; + } + + /* + * Keycode is a non-alphanumeric key, so we have to do the lookup. + */ + + for (key = keymap; key->keycode != 0; key++) { + if (key->keycode == keycode) { + return key->keysym; + } + } + + return NoSymbol; +} + +/* + *---------------------------------------------------------------------- + * + * XKeysymToKeycode -- + * + * Translate a keysym back into a keycode. + * + * Results: + * Returns the keycode that would generate the specified keysym. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +KeyCode +XKeysymToKeycode(display, keysym) + Display* display; + KeySym keysym; +{ + Keys* key; + SHORT result; + + if (keysym >= 0x20) { + result = VkKeyScan((char) keysym); + if (result != -1) { + return (KeyCode) (result & 0xff); + } + } + + /* + * Couldn't map the character to a virtual keycode, so do a + * table lookup. + */ + + for (key = keymap; key->keycode != 0; key++) { + if (key->keysym == keysym) { + return key->keycode; + } + } + return 0; +} + +/* + *---------------------------------------------------------------------- + * + * XGetModifierMapping -- + * + * Fetch the current keycodes used as modifiers. + * + * Results: + * Returns a new modifier map. + * + * Side effects: + * Allocates a new modifier map data structure. + * + *---------------------------------------------------------------------- + */ + +XModifierKeymap * +XGetModifierMapping(display) + Display* display; +{ + XModifierKeymap *map = (XModifierKeymap *)ckalloc(sizeof(XModifierKeymap)); + + map->max_keypermod = 1; + map->modifiermap = (KeyCode *) ckalloc(sizeof(KeyCode)*8); + map->modifiermap[ShiftMapIndex] = VK_SHIFT; + map->modifiermap[LockMapIndex] = VK_CAPITAL; + map->modifiermap[ControlMapIndex] = VK_CONTROL; + map->modifiermap[Mod1MapIndex] = VK_NUMLOCK; + map->modifiermap[Mod2MapIndex] = VK_MENU; + map->modifiermap[Mod3MapIndex] = VK_SCROLL; + map->modifiermap[Mod4MapIndex] = 0; + map->modifiermap[Mod5MapIndex] = 0; + return map; +} + +/* + *---------------------------------------------------------------------- + * + * XFreeModifiermap -- + * + * Deallocate a modifier map that was created by + * XGetModifierMapping. + * + * Results: + * None. + * + * Side effects: + * Frees the datastructure referenced by modmap. + * + *---------------------------------------------------------------------- + */ + +void +XFreeModifiermap(modmap) + XModifierKeymap* modmap; +{ + ckfree((char *) modmap->modifiermap); + ckfree((char *) modmap); +} + +/* + *---------------------------------------------------------------------- + * + * XStringToKeysym -- + * + * Translate a keysym name to the matching keysym. + * + * Results: + * Returns the keysym. Since this is already handled by + * Tk's StringToKeysym function, we just return NoSymbol. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +KeySym +XStringToKeysym(string) + _Xconst char *string; +{ + return NoSymbol; +} + +/* + *---------------------------------------------------------------------- + * + * XKeysymToString -- + * + * Convert a keysym to character form. + * + * Results: + * Returns NULL, since Tk will have handled this already. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +char * +XKeysymToString(keysym) + KeySym keysym; +{ + return NULL; +} + + |