void WIN_UpdateKeymap() { int i; SDL_scancode scancode; SDLKey keymap[SDL_NUM_SCANCODES]; SDL_GetDefaultKeymap(keymap); for (i = 0; i < SDL_arraysize(win32_scancode_table); i++) { /* Make sure this scancode is a valid character scancode */ scancode = win32_scancode_table[i]; if (scancode == SDL_SCANCODE_UNKNOWN || keymap[scancode] >= 127) { continue; } /* Alphabetic keys are handled specially, since Windows remaps them */ if (i >= 'A' && i <= 'Z') { BYTE vsc = alpha_scancodes[i - 'A']; keymap[scancode] = MapVirtualKey(vsc, MAPVK_VSC_TO_VK) + 0x20; } else { keymap[scancode] = (MapVirtualKey(i, MAPVK_VK_TO_CHAR) & 0x7FFF); } } SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); }
void Android_InitKeyboard(void) { SDL_Keycode keymap[SDL_NUM_SCANCODES]; /* Add default scancode to key mapping */ SDL_GetDefaultKeymap(keymap); SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); }
void X11_UpdateKeymap(_THIS) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; int i; SDL_Scancode scancode; SDL_Keycode keymap[SDL_NUM_SCANCODES]; SDL_GetDefaultKeymap(keymap); for (i = 0; i < SDL_arraysize(data->key_layout); i++) { Uint32 key; /* Make sure this is a valid scancode */ scancode = data->key_layout[i]; if (scancode == SDL_SCANCODE_UNKNOWN) { continue; } /* See if there is a UCS keycode for this scancode */ key = X11_KeyCodeToUcs4(data->display, (KeyCode)i); if (key) { keymap[scancode] = key; } else { SDL_Scancode keyScancode = X11_KeyCodeToSDLScancode(data->display, (KeyCode)i); switch (keyScancode) { case SDL_SCANCODE_RETURN: keymap[scancode] = SDLK_RETURN; break; case SDL_SCANCODE_ESCAPE: keymap[scancode] = SDLK_ESCAPE; break; case SDL_SCANCODE_BACKSPACE: keymap[scancode] = SDLK_BACKSPACE; break; case SDL_SCANCODE_TAB: keymap[scancode] = SDLK_TAB; break; case SDL_SCANCODE_DELETE: keymap[scancode] = SDLK_DELETE; break; default: keymap[scancode] = SDL_SCANCODE_TO_KEYCODE(keyScancode); break; } } } SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); }
static DFBEnumerationResult EnumKeyboards(DFBInputDeviceID device_id, DFBInputDeviceDescription desc, void *callbackdata) { cb_data *cb = callbackdata; DFB_DeviceData *devdata = cb->devdata; #if USE_MULTI_API SDL_Keyboard keyboard; #endif SDLKey keymap[SDL_NUM_SCANCODES]; if (!cb->sys_kbd) { if (cb->sys_ids) { if (device_id >= 0x10) return DFENUM_OK; } else { if (device_id < 0x10) return DFENUM_OK; } } else { if (device_id != DIDID_KEYBOARD) return DFENUM_OK; } if ((desc.caps & DIDTF_KEYBOARD)) { #if USE_MULTI_API SDL_zero(keyboard); SDL_AddKeyboard(&keyboard, devdata->num_keyboard); #endif devdata->keyboard[devdata->num_keyboard].id = device_id; devdata->keyboard[devdata->num_keyboard].is_generic = 0; if (!strncmp("X11", desc.name, 3)) devdata->keyboard[devdata->num_keyboard].is_generic = 1; SDL_GetDefaultKeymap(keymap); #if USE_MULTI_API SDL_SetKeymap(devdata->num_keyboard, 0, keymap, SDL_NUM_SCANCODES); #else SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); #endif devdata->num_keyboard++; if (cb->sys_kbd) return DFENUM_CANCEL; } return DFENUM_OK; }
void X11_UpdateKeymap(_THIS) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; int i; SDL_Scancode scancode; SDL_Keycode keymap[SDL_NUM_SCANCODES]; unsigned char group = 0; SDL_GetDefaultKeymap(keymap); #if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM if (data->xkb) { XkbStateRec state; X11_XkbGetUpdatedMap(data->display, XkbAllClientInfoMask, data->xkb); if (X11_XkbGetState(data->display, XkbUseCoreKbd, &state) == Success) { group = state.group; } } #endif for (i = 0; i < SDL_arraysize(data->key_layout); i++) { Uint32 key; /* Make sure this is a valid scancode */ scancode = data->key_layout[i]; if (scancode == SDL_SCANCODE_UNKNOWN) { continue; } /* See if there is a UCS keycode for this scancode */ key = X11_KeyCodeToUcs4(_this, (KeyCode)i, group); if (key) { keymap[scancode] = key; } else { SDL_Scancode keyScancode = X11_KeyCodeToSDLScancode(_this, (KeyCode)i); switch (keyScancode) { case SDL_SCANCODE_RETURN: keymap[scancode] = SDLK_RETURN; break; case SDL_SCANCODE_ESCAPE: keymap[scancode] = SDLK_ESCAPE; break; case SDL_SCANCODE_BACKSPACE: keymap[scancode] = SDLK_BACKSPACE; break; case SDL_SCANCODE_TAB: keymap[scancode] = SDLK_TAB; break; case SDL_SCANCODE_DELETE: keymap[scancode] = SDLK_DELETE; break; default: keymap[scancode] = SDL_SCANCODE_TO_KEYCODE(keyScancode); break; } } } SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); }
int X11_InitKeyboard(_THIS) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; int i = 0; int j = 0; int min_keycode, max_keycode; struct { SDL_Scancode scancode; KeySym keysym; int value; } fingerprint[] = { { SDL_SCANCODE_HOME, XK_Home, 0 }, { SDL_SCANCODE_PAGEUP, XK_Prior, 0 }, { SDL_SCANCODE_UP, XK_Up, 0 }, { SDL_SCANCODE_LEFT, XK_Left, 0 }, { SDL_SCANCODE_DELETE, XK_Delete, 0 }, { SDL_SCANCODE_KP_ENTER, XK_KP_Enter, 0 }, }; int best_distance; int best_index; int distance; BOOL xkb_repeat = 0; X11_XAutoRepeatOn(data->display); #if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM { int xkb_major = XkbMajorVersion; int xkb_minor = XkbMinorVersion; if (X11_XkbQueryExtension(data->display, NULL, NULL, NULL, &xkb_major, &xkb_minor)) { data->xkb = X11_XkbGetMap(data->display, XkbAllClientInfoMask, XkbUseCoreKbd); } /* This will remove KeyRelease events for held keys */ X11_XkbSetDetectableAutoRepeat(data->display, True, &xkb_repeat); } #endif /* Open a connection to the X input manager */ #ifdef X_HAVE_UTF8_STRING if (SDL_X11_HAVE_UTF8) { /* Set the locale, and call XSetLocaleModifiers before XOpenIM so that Compose keys will work correctly. */ char *prev_locale = setlocale(LC_ALL, NULL); char *prev_xmods = X11_XSetLocaleModifiers(NULL); const char *new_xmods = ""; #if defined(HAVE_IBUS_IBUS_H) || defined(HAVE_FCITX_FRONTEND_H) const char *env_xmods = SDL_getenv("XMODIFIERS"); #endif SDL_bool has_dbus_ime_support = SDL_FALSE; if (prev_locale) { prev_locale = SDL_strdup(prev_locale); } if (prev_xmods) { prev_xmods = SDL_strdup(prev_xmods); } /* IBus resends some key events that were filtered by XFilterEvents when it is used via XIM which causes issues. Prevent this by forcing @im=none if XMODIFIERS contains @im=ibus. IBus can still be used via the DBus implementation, which also has support for pre-editing. */ #ifdef HAVE_IBUS_IBUS_H if (env_xmods && SDL_strstr(env_xmods, "@im=ibus") != NULL) { has_dbus_ime_support = SDL_TRUE; } #endif #ifdef HAVE_FCITX_FRONTEND_H if (env_xmods && SDL_strstr(env_xmods, "@im=fcitx") != NULL) { has_dbus_ime_support = SDL_TRUE; } #endif if (has_dbus_ime_support || !xkb_repeat) { new_xmods = "@im=none"; } setlocale(LC_ALL, ""); X11_XSetLocaleModifiers(new_xmods); data->im = X11_XOpenIM(data->display, NULL, data->classname, data->classname); /* Reset the locale + X locale modifiers back to how they were, locale first because the X locale modifiers depend on it. */ setlocale(LC_ALL, prev_locale); X11_XSetLocaleModifiers(prev_xmods); if (prev_locale) { SDL_free(prev_locale); } if (prev_xmods) { SDL_free(prev_xmods); } } #endif /* Try to determine which scancodes are being used based on fingerprint */ best_distance = SDL_arraysize(fingerprint) + 1; best_index = -1; X11_XDisplayKeycodes(data->display, &min_keycode, &max_keycode); for (i = 0; i < SDL_arraysize(fingerprint); ++i) { fingerprint[i].value = X11_XKeysymToKeycode(data->display, fingerprint[i].keysym) - min_keycode; } for (i = 0; i < SDL_arraysize(scancode_set); ++i) { /* Make sure the scancode set isn't too big */ if ((max_keycode - min_keycode + 1) <= scancode_set[i].table_size) { continue; } distance = 0; for (j = 0; j < SDL_arraysize(fingerprint); ++j) { if (fingerprint[j].value < 0 || fingerprint[j].value >= scancode_set[i].table_size) { distance += 1; } else if (scancode_set[i].table[fingerprint[j].value] != fingerprint[j].scancode) { distance += 1; } } if (distance < best_distance) { best_distance = distance; best_index = i; } } if (best_index >= 0 && best_distance <= 2) { #ifdef DEBUG_KEYBOARD printf("Using scancode set %d, min_keycode = %d, max_keycode = %d, table_size = %d\n", best_index, min_keycode, max_keycode, scancode_set[best_index].table_size); #endif SDL_memcpy(&data->key_layout[min_keycode], scancode_set[best_index].table, sizeof(SDL_Scancode) * scancode_set[best_index].table_size); } else { SDL_Keycode keymap[SDL_NUM_SCANCODES]; printf ("Keyboard layout unknown, please send the following to the SDL mailing list ([email protected]):\n"); /* Determine key_layout - only works on US QWERTY layout */ SDL_GetDefaultKeymap(keymap); for (i = min_keycode; i <= max_keycode; ++i) { KeySym sym; sym = X11_KeyCodeToSym(_this, (KeyCode) i, 0); if (sym != NoSymbol) { SDL_Scancode scancode; printf("code = %d, sym = 0x%X (%s) ", i - min_keycode, (unsigned int) sym, X11_XKeysymToString(sym)); scancode = X11_KeyCodeToSDLScancode(_this, i); data->key_layout[i] = scancode; if (scancode == SDL_SCANCODE_UNKNOWN) { printf("scancode not found\n"); } else { printf("scancode = %d (%s)\n", scancode, SDL_GetScancodeName(scancode)); } } } } X11_UpdateKeymap(_this); SDL_SetScancodeName(SDL_SCANCODE_APPLICATION, "Menu"); #ifdef SDL_USE_IME SDL_IME_Init(); #endif return 0; }
int X11_InitKeyboard(_THIS) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; int i = 0; int j = 0; int min_keycode, max_keycode; struct { SDL_Scancode scancode; KeySym keysym; int value; } fingerprint[] = { { SDL_SCANCODE_HOME, XK_Home, 0 }, { SDL_SCANCODE_PAGEUP, XK_Prior, 0 }, { SDL_SCANCODE_UP, XK_Up, 0 }, { SDL_SCANCODE_LEFT, XK_Left, 0 }, { SDL_SCANCODE_DELETE, XK_Delete, 0 }, { SDL_SCANCODE_KP_ENTER, XK_KP_Enter, 0 }, }; int best_distance; int best_index; int distance; X11_XAutoRepeatOn(data->display); /* Try to determine which scancodes are being used based on fingerprint */ best_distance = SDL_arraysize(fingerprint) + 1; best_index = -1; X11_XDisplayKeycodes(data->display, &min_keycode, &max_keycode); for (i = 0; i < SDL_arraysize(fingerprint); ++i) { fingerprint[i].value = X11_XKeysymToKeycode(data->display, fingerprint[i].keysym) - min_keycode; } for (i = 0; i < SDL_arraysize(scancode_set); ++i) { /* Make sure the scancode set isn't too big */ if ((max_keycode - min_keycode + 1) <= scancode_set[i].table_size) { continue; } distance = 0; for (j = 0; j < SDL_arraysize(fingerprint); ++j) { if (fingerprint[j].value < 0 || fingerprint[j].value >= scancode_set[i].table_size) { distance += 1; } else if (scancode_set[i].table[fingerprint[j].value] != fingerprint[j].scancode) { distance += 1; } } if (distance < best_distance) { best_distance = distance; best_index = i; } } if (best_index >= 0 && best_distance <= 2) { #ifdef DEBUG_KEYBOARD printf("Using scancode set %d, min_keycode = %d, max_keycode = %d, table_size = %d\n", best_index, min_keycode, max_keycode, scancode_set[best_index].table_size); #endif SDL_memcpy(&data->key_layout[min_keycode], scancode_set[best_index].table, sizeof(SDL_Scancode) * scancode_set[best_index].table_size); } else { SDL_Keycode keymap[SDL_NUM_SCANCODES]; printf ("Keyboard layout unknown, please send the following to the SDL mailing list ([email protected]):\n"); /* Determine key_layout - only works on US QWERTY layout */ SDL_GetDefaultKeymap(keymap); for (i = min_keycode; i <= max_keycode; ++i) { KeySym sym; #if SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM sym = X11_XkbKeycodeToKeysym(data->display, i, 0, 0); #else sym = X11_XKeycodeToKeysym(data->display, i, 0); #endif if (sym != NoSymbol) { SDL_Scancode scancode; printf("code = %d, sym = 0x%X (%s) ", i - min_keycode, (unsigned int) sym, X11_XKeysymToString(sym)); scancode = X11_KeyCodeToSDLScancode(data->display, i); data->key_layout[i] = scancode; if (scancode == SDL_SCANCODE_UNKNOWN) { printf("scancode not found\n"); } else { printf("scancode = %d (%s)\n", scancode, SDL_GetScancodeName(scancode)); } } } } X11_UpdateKeymap(_this); SDL_SetScancodeName(SDL_SCANCODE_APPLICATION, "Menu"); #ifdef SDL_USE_IBUS SDL_IBus_Init(); #endif return 0; }
void ANDROID_InitOSKeymap() { int i; SDLKey * keymap = SDL_android_keymap; #if (SDL_VERSION_ATLEAST(1,3,0)) SDLKey defaultKeymap[SDL_NUM_SCANCODES]; SDL_GetDefaultKeymap(defaultKeymap); SDL_SetKeymap(0, defaultKeymap, SDL_NUM_SCANCODES); #endif // TODO: keys are mapped rather randomly for (i=0; i<SDL_arraysize(SDL_android_keymap); ++i) SDL_android_keymap[i] = SDL_KEY(UNKNOWN); keymap[KEYCODE_UNKNOWN] = SDL_KEY(UNKNOWN); //keymap[KEYCODE_CALL] = SDL_KEY(RCTRL); //keymap[KEYCODE_DPAD_CENTER] = SDL_KEY(LALT); keymap[KEYCODE_0] = SDL_KEY(0); keymap[KEYCODE_1] = SDL_KEY(1); keymap[KEYCODE_2] = SDL_KEY(2); keymap[KEYCODE_3] = SDL_KEY(3); keymap[KEYCODE_4] = SDL_KEY(4); keymap[KEYCODE_5] = SDL_KEY(5); keymap[KEYCODE_6] = SDL_KEY(6); keymap[KEYCODE_7] = SDL_KEY(7); keymap[KEYCODE_8] = SDL_KEY(8); keymap[KEYCODE_9] = SDL_KEY(9); keymap[KEYCODE_STAR] = SDL_KEY(KP_DIVIDE); keymap[KEYCODE_POUND] = SDL_KEY(KP_MULTIPLY); keymap[KEYCODE_DPAD_UP] = SDL_KEY(UP); keymap[KEYCODE_DPAD_DOWN] = SDL_KEY(DOWN); keymap[KEYCODE_DPAD_LEFT] = SDL_KEY(LEFT); keymap[KEYCODE_DPAD_RIGHT] = SDL_KEY(RIGHT); keymap[KEYCODE_DPAD_CENTER] = SDL_KEY(RETURN); keymap[KEYCODE_ENTER] = SDL_KEY(RETURN); //SDL_KEY(KP_ENTER); keymap[KEYCODE_CLEAR] = SDL_KEY(BACKSPACE); keymap[KEYCODE_A] = SDL_KEY(A); keymap[KEYCODE_B] = SDL_KEY(B); keymap[KEYCODE_C] = SDL_KEY(C); keymap[KEYCODE_D] = SDL_KEY(D); keymap[KEYCODE_E] = SDL_KEY(E); keymap[KEYCODE_F] = SDL_KEY(F); keymap[KEYCODE_G] = SDL_KEY(G); keymap[KEYCODE_H] = SDL_KEY(H); keymap[KEYCODE_I] = SDL_KEY(I); keymap[KEYCODE_J] = SDL_KEY(J); keymap[KEYCODE_K] = SDL_KEY(K); keymap[KEYCODE_L] = SDL_KEY(L); keymap[KEYCODE_M] = SDL_KEY(M); keymap[KEYCODE_N] = SDL_KEY(N); keymap[KEYCODE_O] = SDL_KEY(O); keymap[KEYCODE_P] = SDL_KEY(P); keymap[KEYCODE_Q] = SDL_KEY(Q); keymap[KEYCODE_R] = SDL_KEY(R); keymap[KEYCODE_S] = SDL_KEY(S); keymap[KEYCODE_T] = SDL_KEY(T); keymap[KEYCODE_U] = SDL_KEY(U); keymap[KEYCODE_V] = SDL_KEY(V); keymap[KEYCODE_W] = SDL_KEY(W); keymap[KEYCODE_X] = SDL_KEY(X); keymap[KEYCODE_Y] = SDL_KEY(Y); keymap[KEYCODE_Z] = SDL_KEY(Z); keymap[KEYCODE_COMMA] = SDL_KEY(COMMA); keymap[KEYCODE_PERIOD] = SDL_KEY(PERIOD); keymap[KEYCODE_TAB] = SDL_KEY(TAB); keymap[KEYCODE_SPACE] = SDL_KEY(SPACE); keymap[KEYCODE_GRAVE] = SDL_KEY(GRAVE); keymap[KEYCODE_MINUS] = SDL_KEY(KP_MINUS); keymap[KEYCODE_PLUS] = SDL_KEY(KP_PLUS); keymap[KEYCODE_EQUALS] = SDL_KEY(EQUALS); keymap[KEYCODE_LEFT_BRACKET] = SDL_KEY(LEFTBRACKET); keymap[KEYCODE_RIGHT_BRACKET] = SDL_KEY(RIGHTBRACKET); keymap[KEYCODE_BACKSLASH] = SDL_KEY(BACKSLASH); keymap[KEYCODE_SEMICOLON] = SDL_KEY(SEMICOLON); keymap[KEYCODE_APOSTROPHE] = SDL_KEY(APOSTROPHE); keymap[KEYCODE_SLASH] = SDL_KEY(SLASH); keymap[KEYCODE_SHIFT_LEFT] = SDL_KEY(LSHIFT); keymap[KEYCODE_SHIFT_RIGHT] = SDL_KEY(RSHIFT); keymap[KEYCODE_DEL] = SDL_KEY(BACKSPACE); keymap[KEYCODE_AT] = SDL_KEY(AT); }