SDL_EVDEV_keyboard_state * SDL_EVDEV_kbd_init(void) { SDL_EVDEV_keyboard_state *kbd; int i; char flag_state; char shift_state[2] = {TIOCL_GETSHIFTSTATE, 0}; kbd = (SDL_EVDEV_keyboard_state *)SDL_calloc(1, sizeof(*kbd)); if (!kbd) { return NULL; } kbd->npadch = -1; /* This might fail if we're not connected to a tty (e.g. on the Steam Link) */ kbd->console_fd = open("/dev/tty", O_RDONLY); if (ioctl(kbd->console_fd, TIOCLINUX, shift_state) == 0) { kbd->shift_state = *shift_state; } if (ioctl(kbd->console_fd, KDGKBLED, &flag_state) == 0) { kbd->ledflagstate = flag_state; } kbd->accents = &default_accents; if (ioctl(kbd->console_fd, KDGKBDIACR, kbd->accents) < 0) { /* No worries, we'll use the default accent table */ } kbd->key_maps = default_key_maps; if (ioctl(kbd->console_fd, KDGKBMODE, &kbd->old_kbd_mode) == 0) { /* Set the keyboard in UNICODE mode and load the keymaps */ ioctl(kbd->console_fd, KDSKBMODE, K_UNICODE); if (SDL_EVDEV_kbd_load_keymaps(kbd) < 0) { for (i = 0; i < MAX_NR_KEYMAPS; ++i) { if (kbd->key_maps[i]) { SDL_free(kbd->key_maps[i]); } } SDL_free(kbd->key_maps); kbd->key_maps = default_key_maps; } /* Allow inhibiting keyboard mute with env. variable for debugging etc. */ if (getenv("SDL_INPUT_LINUX_KEEP_KBD") == NULL) { /* Mute the keyboard so keystrokes only generate evdev events * and do not leak through to the console */ ioctl(kbd->console_fd, KDSKBMODE, K_OFF); /* Make sure to restore keyboard if application fails to call * SDL_Quit before exit or fatal signal is raised. */ if (!SDL_GetHintBoolean(SDL_HINT_NO_SIGNAL_HANDLERS, SDL_FALSE)) { kbd_register_emerg_cleanup(kbd); } } } #ifdef DUMP_ACCENTS SDL_EVDEV_dump_accents(kbd); #endif #ifdef DUMP_KEYMAP SDL_EVDEV_dump_keymap(kbd); #endif return kbd; }
SDL_EVDEV_keyboard_state * SDL_EVDEV_kbd_init(void) { SDL_EVDEV_keyboard_state *kbd; int i; char flag_state; char shift_state[2] = {TIOCL_GETSHIFTSTATE, 0}; kbd = (SDL_EVDEV_keyboard_state *)SDL_calloc(1, sizeof(*kbd)); if (!kbd) { return NULL; } kbd->npadch = -1; /* This might fail if we're not connected to a tty (e.g. on the Steam Link) */ kbd->console_fd = open("/dev/tty", O_RDONLY); if (ioctl(kbd->console_fd, TIOCLINUX, shift_state) == 0) { kbd->shift_state = *shift_state; } if (ioctl(kbd->console_fd, KDGKBLED, &flag_state) == 0) { kbd->ledflagstate = flag_state; } kbd->accents = &default_accents; if (ioctl(kbd->console_fd, KDGKBDIACR, kbd->accents) < 0) { /* No worries, we'll use the default accent table */ } kbd->key_maps = default_key_maps; if (ioctl(kbd->console_fd, KDGKBMODE, &kbd->old_kbd_mode) == 0) { /* Set the keyboard in UNICODE mode and load the keymaps */ ioctl(kbd->console_fd, KDSKBMODE, K_UNICODE); if (SDL_EVDEV_kbd_load_keymaps(kbd) < 0) { for (i = 0; i < MAX_NR_KEYMAPS; ++i) { if (kbd->key_maps[i]) { SDL_free(kbd->key_maps[i]); } } SDL_free(kbd->key_maps); kbd->key_maps = default_key_maps; } /* Mute the keyboard so keystrokes only generate evdev events * and do not leak through to the console */ ioctl(kbd->console_fd, KDSKBMODE, K_OFF); } #ifdef DUMP_ACCENTS SDL_EVDEV_dump_accents(kbd); #endif #ifdef DUMP_KEYMAP SDL_EVDEV_dump_keymap(kbd); #endif return kbd; }