summaryrefslogtreecommitdiffstats
path: root/win/tkWinKey.c
diff options
context:
space:
mode:
Diffstat (limited to 'win/tkWinKey.c')
-rw-r--r--win/tkWinKey.c360
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;
+}
+
+