diff options
-rw-r--r-- | default.cfg | 1 | ||||
-rw-r--r-- | io.c | 35 | ||||
-rw-r--r-- | io.h | 1 |
3 files changed, 24 insertions, 13 deletions
diff --git a/default.cfg b/default.cfg index b5f44d8..f3a4432 100644 --- a/default.cfg +++ b/default.cfg @@ -32,6 +32,7 @@ bindings { - ui.prev_speed f11 ui.toggle_fullscreen tab ui.soft_reset + rctrl ui.toggle_keyboard_captured } pads { 0 { @@ -71,6 +71,7 @@ typedef enum { UI_NEXT_SPEED, UI_PREV_SPEED, UI_RELEASE_MOUSE, + UI_TOGGLE_KEYBOARD_CAPTURE, UI_TOGGLE_FULLSCREEN, UI_SOFT_RESET, UI_EXIT @@ -348,14 +349,17 @@ void store_key_event(uint16_t code) void handle_keydown(int keycode, uint8_t scancode) { - int bucket = keycode >> 15 & 0xFFFF; - if (!bindings[bucket]) { - return; + if (current_io->keyboard_captured) { + store_key_event(scancode); + } else { + int bucket = keycode >> 15 & 0xFFFF; + if (!bindings[bucket]) { + return; + } + int idx = keycode & 0x7FFF; + keybinding * binding = bindings[bucket] + idx; + handle_binding_down(binding); } - int idx = keycode & 0x7FFF; - keybinding * binding = bindings[bucket] + idx; - handle_binding_down(binding); - store_key_event(scancode); } void handle_joydown(int joystick, int button) @@ -466,6 +470,9 @@ void handle_binding_up(keybinding * binding) render_relative_mouse(0); } break; + case UI_TOGGLE_KEYBOARD_CAPTURE: + current_io->keyboard_captured = !current_io->keyboard_captured; + break; case UI_TOGGLE_FULLSCREEN: render_toggle_fullscreen(); break; @@ -483,13 +490,13 @@ void handle_binding_up(keybinding * binding) void handle_keyup(int keycode, uint8_t scancode) { int bucket = keycode >> 15 & 0xFFFF; - if (!bindings[bucket]) { - return; - } int idx = keycode & 0x7FFF; - keybinding * binding = bindings[bucket] + idx; - handle_binding_up(binding); - store_key_event(0xF000 | scancode); + keybinding * binding = bindings[bucket] ? bindings[bucket] + idx : NULL; + if (binding && (!current_io->keyboard_captured || (binding->bind_type == BIND_UI && binding->subtype_a == UI_TOGGLE_KEYBOARD_CAPTURE))) { + handle_binding_up(binding); + } else { + store_key_event(0xF000 | scancode); + } } void handle_joyup(int joystick, int button) @@ -640,6 +647,8 @@ int parse_binding_target(char * target, tern_node * padbuttons, tern_node *mouse *ui_out = UI_PREV_SPEED; } else if(!strcmp(target + 3, "release_mouse")) { *ui_out = UI_RELEASE_MOUSE; + } else if(!strcmp(target + 3, "toggle_keyboard_captured")) { + *ui_out = UI_TOGGLE_KEYBOARD_CAPTURE; } else if (!strcmp(target + 3, "toggle_fullscreen")) { *ui_out = UI_TOGGLE_FULLSCREEN; } else if (!strcmp(target + 3, "soft_reset")) { @@ -70,6 +70,7 @@ typedef struct { io_port ports[3]; uint8_t mouse_mode; uint8_t mouse_captured; + uint8_t keyboard_captured; } sega_io; #define GAMEPAD_TH0 0 |