void XkbFreeKeyboard(XkbDescPtr xkb,unsigned which,Bool freeAll) { if (xkb==NULL) return; if (freeAll) which= XkbAllComponentsMask; if (which&XkbClientMapMask) XkbFreeClientMap(xkb,XkbAllClientInfoMask,TRUE); if (which&XkbServerMapMask) XkbFreeServerMap(xkb,XkbAllServerInfoMask,TRUE); if (which&XkbCompatMapMask) XkbFreeCompatMap(xkb,XkbAllCompatMask,TRUE); if (which&XkbIndicatorMapMask) XkbFreeIndicatorMaps(xkb); if (which&XkbNamesMask) XkbFreeNames(xkb,XkbAllNamesMask,TRUE); if ((which&XkbGeometryMask) && (xkb->geom!=NULL)) { XkbFreeGeometry(xkb->geom,XkbGeomAllMask,TRUE); /* PERHAPS BONGHITS etc */ xkb->geom = NULL; } if (which&XkbControlsMask) XkbFreeControls(xkb,XkbAllControlsMask,TRUE); if (freeAll) xfree(xkb); return; }
static int check_for_evdev(void) { SDL_SysWMinfo info; XkbDescPtr desc; int has_evdev = 0; const char *keycodes; SDL_VERSION(&info.version); if (!SDL_GetWMInfo(&info)) return 0; desc = XkbGetKeyboard(info.info.x11.display, XkbGBN_AllComponentsMask, XkbUseCoreKbd); if (desc == NULL || desc->names == NULL) return 0; keycodes = XGetAtomName(info.info.x11.display, desc->names->keycodes); if (keycodes == NULL) fprintf(stderr, "could not lookup keycode name\n"); else if (strstart(keycodes, "evdev", NULL)) has_evdev = 1; else if (!strstart(keycodes, "xfree86", NULL)) fprintf(stderr, "unknown keycodes `%s', please report to [email protected]\n", keycodes); XkbFreeClientMap(desc, XkbGBN_AllComponentsMask, True); return has_evdev; }
int main(int, char **) { Display *display = 0; int opcode = -1; int xkbEventBase = -1; int xkbErrorBase = -1; int xkblibMajor = XkbMajorVersion; int xkblibMinor = XkbMinorVersion; XkbQueryExtension(display, &opcode, &xkbEventBase, &xkbErrorBase, &xkblibMajor, &xkblibMinor); int keycode = 0; unsigned int state = 0; KeySym keySym; unsigned int consumedModifiers; XkbLookupKeySym(display, keycode, state, &consumedModifiers, &keySym); XkbDescPtr xkbDesc = XkbGetMap(display, XkbAllClientInfoMask, XkbUseCoreKbd); int w = XkbKeyGroupsWidth(xkbDesc, keycode); keySym = XkbKeySym(xkbDesc, keycode, w-1); XkbFreeClientMap(xkbDesc, XkbAllClientInfoMask, true); state = XkbPCF_GrabsUseXKBStateMask; (void) XkbSetPerClientControls(display, state, &state); return 0; }
// Create key code translation tables // static void createKeyTables(void) { int scancode, key; memset(_glfw.x11.publicKeys, -1, sizeof(_glfw.x11.publicKeys)); if (_glfw.x11.xkb.available) { // Use XKB to determine physical key locations independently of the current // keyboard layout char name[XkbKeyNameLength + 1]; XkbDescPtr desc = XkbGetMap(_glfw.x11.display, 0, XkbUseCoreKbd); XkbGetNames(_glfw.x11.display, XkbKeyNamesMask, desc); // Find the X11 key code -> GLFW key code mapping for (scancode = desc->min_key_code; scancode <= desc->max_key_code; scancode++) { memcpy(name, desc->names->keys[scancode].name, XkbKeyNameLength); name[XkbKeyNameLength] = '\0'; // Map the key name to a GLFW key code. Note: We only map printable // keys here, and we use the US keyboard layout. The rest of the // keys (function keys) are mapped using traditional KeySym // translations. if (strcmp(name, "TLDE") == 0) key = GLFW_KEY_GRAVE_ACCENT; else if (strcmp(name, "AE01") == 0) key = GLFW_KEY_1; else if (strcmp(name, "AE02") == 0) key = GLFW_KEY_2; else if (strcmp(name, "AE03") == 0) key = GLFW_KEY_3; else if (strcmp(name, "AE04") == 0) key = GLFW_KEY_4; else if (strcmp(name, "AE05") == 0) key = GLFW_KEY_5; else if (strcmp(name, "AE06") == 0) key = GLFW_KEY_6; else if (strcmp(name, "AE07") == 0) key = GLFW_KEY_7; else if (strcmp(name, "AE08") == 0) key = GLFW_KEY_8; else if (strcmp(name, "AE09") == 0) key = GLFW_KEY_9; else if (strcmp(name, "AE10") == 0) key = GLFW_KEY_0; else if (strcmp(name, "AE11") == 0) key = GLFW_KEY_MINUS; else if (strcmp(name, "AE12") == 0) key = GLFW_KEY_EQUAL; else if (strcmp(name, "AD01") == 0) key = GLFW_KEY_Q; else if (strcmp(name, "AD02") == 0) key = GLFW_KEY_W; else if (strcmp(name, "AD03") == 0) key = GLFW_KEY_E; else if (strcmp(name, "AD04") == 0) key = GLFW_KEY_R; else if (strcmp(name, "AD05") == 0) key = GLFW_KEY_T; else if (strcmp(name, "AD06") == 0) key = GLFW_KEY_Y; else if (strcmp(name, "AD07") == 0) key = GLFW_KEY_U; else if (strcmp(name, "AD08") == 0) key = GLFW_KEY_I; else if (strcmp(name, "AD09") == 0) key = GLFW_KEY_O; else if (strcmp(name, "AD10") == 0) key = GLFW_KEY_P; else if (strcmp(name, "AD11") == 0) key = GLFW_KEY_LEFT_BRACKET; else if (strcmp(name, "AD12") == 0) key = GLFW_KEY_RIGHT_BRACKET; else if (strcmp(name, "AC01") == 0) key = GLFW_KEY_A; else if (strcmp(name, "AC02") == 0) key = GLFW_KEY_S; else if (strcmp(name, "AC03") == 0) key = GLFW_KEY_D; else if (strcmp(name, "AC04") == 0) key = GLFW_KEY_F; else if (strcmp(name, "AC05") == 0) key = GLFW_KEY_G; else if (strcmp(name, "AC06") == 0) key = GLFW_KEY_H; else if (strcmp(name, "AC07") == 0) key = GLFW_KEY_J; else if (strcmp(name, "AC08") == 0) key = GLFW_KEY_K; else if (strcmp(name, "AC09") == 0) key = GLFW_KEY_L; else if (strcmp(name, "AC10") == 0) key = GLFW_KEY_SEMICOLON; else if (strcmp(name, "AC11") == 0) key = GLFW_KEY_APOSTROPHE; else if (strcmp(name, "AB01") == 0) key = GLFW_KEY_Z; else if (strcmp(name, "AB02") == 0) key = GLFW_KEY_X; else if (strcmp(name, "AB03") == 0) key = GLFW_KEY_C; else if (strcmp(name, "AB04") == 0) key = GLFW_KEY_V; else if (strcmp(name, "AB05") == 0) key = GLFW_KEY_B; else if (strcmp(name, "AB06") == 0) key = GLFW_KEY_N; else if (strcmp(name, "AB07") == 0) key = GLFW_KEY_M; else if (strcmp(name, "AB08") == 0) key = GLFW_KEY_COMMA; else if (strcmp(name, "AB09") == 0) key = GLFW_KEY_PERIOD; else if (strcmp(name, "AB10") == 0) key = GLFW_KEY_SLASH; else if (strcmp(name, "BKSL") == 0) key = GLFW_KEY_BACKSLASH; else if (strcmp(name, "LSGT") == 0) key = GLFW_KEY_WORLD_1; else key = GLFW_KEY_UNKNOWN; if ((scancode >= 0) && (scancode < 256)) _glfw.x11.publicKeys[scancode] = key; } XkbFreeNames(desc, XkbKeyNamesMask, True); XkbFreeClientMap(desc, 0, True); } // Translate the un-translated key codes using traditional X11 KeySym // lookups for (scancode = 0; scancode < 256; scancode++) { if (_glfw.x11.publicKeys[scancode] < 0) _glfw.x11.publicKeys[scancode] = translateKeyCode(scancode); } }
/* Grab or ungrab then keyval and modifiers combination, grabbing all key * combinations yielding the same key values. * Includes ignorable modifiers using grab_ungrab_with_ignorable_modifiers. */ static gboolean grab_ungrab (GdkWindow *rootwin, uint keyval, uint modifiers, gboolean grab) { int k; GdkKeymap *map; GdkKeymapKey *keys; gint n_keys; GdkModifierType add_modifiers; XkbDescPtr xmap; gboolean success = FALSE; xmap = XkbGetMap(GDK_WINDOW_XDISPLAY(rootwin), XkbAllClientInfoMask, XkbUseCoreKbd); map = gdk_keymap_get_default(); gdk_keymap_get_entries_for_keyval(map, keyval, &keys, &n_keys); if (n_keys == 0) return FALSE; for (k = 0; k < n_keys; k++) { /* NOTE: We only bind for the first group, * so regardless of current keyboard layout, it will * grab the key from the default Layout. */ if (keys[k].group != WE_ONLY_USE_ONE_GROUP) { continue; } add_modifiers = FinallyGetModifiersForKeycode(xmap, keys[k].keycode, keys[k].group, keys[k].level); if (add_modifiers == MODIFIERS_ERROR) { continue; } TRACE (g_print("grab/ungrab keycode: %d, lev: %d, grp: %d, ", keys[k].keycode, keys[k].level, keys[k].group)); TRACE (g_print("modifiers: 0x%x (consumed: 0x%x)\n", add_modifiers | modifiers, add_modifiers)); if (grab_ungrab_with_ignorable_modifiers(rootwin, keys[k].keycode, add_modifiers | modifiers, grab)) { success = TRUE; } else { /* When grabbing, break on error */ if (grab && !success) { break; } } } g_free(keys); XkbFreeClientMap(xmap, 0, TRUE); return success; }