summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2017-02-28 23:50:12 -0800
committerMichael Pavone <pavone@retrodev.com>2017-02-28 23:50:12 -0800
commit7e380229cdc766edc88ee443797763e24b2a97bc (patch)
treefb44751cf2c2112a8d67ff789c179c6f8725774f
parentf38bb8e55d1df64f8fb85d7dc58eb2902198ed97 (diff)
Implement keyboard capture functionality
-rw-r--r--default.cfg1
-rw-r--r--io.c35
-rw-r--r--io.h1
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 {
diff --git a/io.c b/io.c
index 17c8452..e7d3f84 100644
--- a/io.c
+++ b/io.c
@@ -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")) {
diff --git a/io.h b/io.h
index 5daa683..958ffc8 100644
--- a/io.h
+++ b/io.h
@@ -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