annotate bindings.c @ 1637:95880d947257

Fix for VRAM byte write order broke VDP FIFO testing ROM results. This change cleans up VRAM writes and fixes the regression while preserving the correct VRAM byte write order
author Michael Pavone <pavone@retrodev.com>
date Sun, 11 Nov 2018 22:39:29 -0800
parents e397766c3028
children f27142c48567
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1587
ea687ca7d845 Fix missing include in bindings.c
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1 #include <string.h>
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include "render.h"
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include "system.h"
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include "io.h"
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #include "blastem.h"
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include "saves.h"
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include "util.h"
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include "genesis.h"
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
9 #include "sms.h"
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 #include "menu.h"
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 #include "bindings.h"
1608
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
12 #include "controller_info.h"
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 #ifndef DISABLE_NUKLEAR
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 #include "nuklear_ui/blastem_nuklear.h"
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 #endif
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 enum {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 BIND_NONE,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 BIND_UI,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 BIND_GAMEPAD,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 BIND_MOUSE
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 };
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 typedef enum {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 UI_DEBUG_MODE_INC,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 UI_DEBUG_PAL_INC,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 UI_ENTER_DEBUGGER,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 UI_SAVE_STATE,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 UI_SET_SPEED,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 UI_NEXT_SPEED,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 UI_PREV_SPEED,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 UI_RELEASE_MOUSE,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 UI_TOGGLE_KEYBOARD_CAPTURE,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 UI_TOGGLE_FULLSCREEN,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 UI_SOFT_RESET,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 UI_RELOAD,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 UI_SMS_PAUSE,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 UI_SCREENSHOT,
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
39 UI_EXIT,
1634
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
40 UI_PLANE_DEBUG,
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
41 UI_VRAM_DEBUG
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 } ui_action;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 uint8_t bind_type;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 uint8_t subtype_a;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 uint8_t subtype_b;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 } keybinding;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 keybinding bindings[4];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 uint8_t state;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 } joydpad;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 keybinding positive;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 keybinding negative;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 int16_t value;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 } joyaxis;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 keybinding *buttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 joydpad *dpads;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 joyaxis *axes;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 uint32_t num_buttons; //number of entries in the buttons array, not necessarily the number of buttons on the device
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 uint32_t num_dpads; //number of entries in the dpads array, not necessarily the number of dpads on the device
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 uint32_t num_axes; //number of entries in the axes array, not necessarily the number of dpads on the device
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 } joystick;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 keybinding buttons[MAX_MOUSE_BUTTONS];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 keybinding motion;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 } mousebinding;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 #define DEFAULT_JOYBUTTON_ALLOC 12
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 static keybinding *bindings[0x10000];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 static joystick joysticks[MAX_JOYSTICKS];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 static mousebinding mice[MAX_MICE];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 const uint8_t dpadbits[] = {RENDER_DPAD_UP, RENDER_DPAD_DOWN, RENDER_DPAD_LEFT, RENDER_DPAD_RIGHT};
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 static void do_bind(keybinding *binding, uint8_t bind_type, uint8_t subtype_a, uint8_t subtype_b)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 binding->bind_type = bind_type;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 binding->subtype_a = subtype_a;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 binding->subtype_b = subtype_b;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 void bind_key(int keycode, uint8_t bind_type, uint8_t subtype_a, uint8_t subtype_b)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 int bucket = keycode >> 15 & 0xFFFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 if (!bindings[bucket]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 bindings[bucket] = malloc(sizeof(keybinding) * 0x8000);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 memset(bindings[bucket], 0, sizeof(keybinding) * 0x8000);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 int idx = keycode & 0x7FFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 do_bind(bindings[bucket] + idx, bind_type, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 void bind_button(int joystick, int button, uint8_t bind_type, uint8_t subtype_a, uint8_t subtype_b)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 if (!joysticks[joystick].buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 joysticks[joystick].num_buttons = button < DEFAULT_JOYBUTTON_ALLOC ? DEFAULT_JOYBUTTON_ALLOC : button + 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 joysticks[joystick].buttons = calloc(joysticks[joystick].num_buttons, sizeof(keybinding));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 } else if (joysticks[joystick].num_buttons <= button) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 uint32_t old_capacity = joysticks[joystick].num_buttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 joysticks[joystick].num_buttons *= 2;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 joysticks[joystick].buttons = realloc(joysticks[joystick].buttons, sizeof(keybinding) * joysticks[joystick].num_buttons);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 memset(joysticks[joystick].buttons + old_capacity, 0, joysticks[joystick].num_buttons - old_capacity);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113 do_bind(joysticks[joystick].buttons + button, bind_type, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
115
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 void bind_dpad(int joystick, int dpad, int direction, uint8_t bind_type, uint8_t subtype_a, uint8_t subtype_b)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
117 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 if (!joysticks[joystick].dpads) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 //multiple D-pads/hats are not common, so don't allocate any extra space
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 joysticks[joystick].dpads = calloc(dpad+1, sizeof(joydpad));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 joysticks[joystick].num_dpads = dpad+1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 } else if (joysticks[joystick].num_dpads <= dpad) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 uint32_t old_capacity = joysticks[joystick].num_dpads;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 joysticks[joystick].num_dpads *= 2;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 joysticks[joystick].dpads = realloc(joysticks[joystick].dpads, sizeof(joydpad) * joysticks[joystick].num_dpads);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 memset(joysticks[joystick].dpads + old_capacity, 0, (joysticks[joystick].num_dpads - old_capacity) * sizeof(joydpad));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 for (int i = 0; i < 4; i ++) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 if (dpadbits[i] & direction) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 do_bind(joysticks[joystick].dpads[dpad].bindings + i, bind_type, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 void bind_axis(int joystick, int axis, int positive, uint8_t bind_type, uint8_t subtype_a, uint8_t subtype_b)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 if (!joysticks[joystick].axes) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 //typical gamepad has 4 axes
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 joysticks[joystick].num_axes = axis+1 > 4 ? axis+1 : 4;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 joysticks[joystick].axes = calloc(joysticks[joystick].num_axes, sizeof(joyaxis));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 } else if (joysticks[joystick].num_axes <= axis) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 uint32_t old_capacity = joysticks[joystick].num_axes;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 joysticks[joystick].num_axes *= 2;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 joysticks[joystick].axes = realloc(joysticks[joystick].axes, sizeof(joyaxis) * joysticks[joystick].num_axes);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 memset(joysticks[joystick].axes + old_capacity, 0, (joysticks[joystick].num_axes - old_capacity) * sizeof(joyaxis));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 if (positive) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 do_bind(&joysticks[joystick].axes[axis].positive, bind_type, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 do_bind(&joysticks[joystick].axes[axis].negative, bind_type, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 void reset_joystick_bindings(int joystick)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 if (joysticks[joystick].buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 for (int i = 0; i < joysticks[joystick].num_buttons; i++)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 joysticks[joystick].buttons[i].bind_type = BIND_NONE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 if (joysticks[joystick].dpads) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 for (int i = 0; i < joysticks[joystick].num_dpads; i++)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 for (int dir = 0; dir < 4; dir++)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 joysticks[joystick].dpads[i].bindings[dir].bind_type = BIND_NONE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 if (joysticks[joystick].axes) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 for (int i = 0; i < joysticks[joystick].num_axes; i++)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 joysticks[joystick].axes[i].positive.bind_type = BIND_NONE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 joysticks[joystick].axes[i].negative.bind_type = BIND_NONE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
190 void handle_binding_down(keybinding * binding)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
191 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
192 if (!current_system) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 if (binding->bind_type == BIND_GAMEPAD && current_system && current_system->gamepad_down)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197 current_system->gamepad_down(current_system, binding->subtype_a, binding->subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
198 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 else if (binding->bind_type == BIND_MOUSE && current_system && current_system->mouse_down)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 current_system->mouse_down(current_system, binding->subtype_a, binding->subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 static uint8_t keyboard_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 void handle_keydown(int keycode, uint8_t scancode)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 int bucket = keycode >> 15 & 0xFFFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 int idx = keycode & 0x7FFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 keybinding * binding = bindings[bucket] ? bindings[bucket] + idx : NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211 if (binding && (!keyboard_captured || (binding->bind_type == BIND_UI && binding->subtype_a == UI_TOGGLE_KEYBOARD_CAPTURE))) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212 handle_binding_down(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 } else if (keyboard_captured && current_system && current_system->keyboard_down) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 current_system->keyboard_down(current_system, scancode);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 void handle_joydown(int joystick, int button)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 if (joystick >= MAX_JOYSTICKS || button >= joysticks[joystick].num_buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223 keybinding * binding = joysticks[joystick].buttons + button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 handle_binding_down(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 static uint8_t mouse_mode = MOUSE_NONE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 static uint8_t mouse_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 void handle_mousedown(int mouse, int button)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 if (mouse_mode == MOUSE_CAPTURE && !mouse_captured) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 mouse_captured = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 render_relative_mouse(1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
234 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
235 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
236 if (mouse >= MAX_MICE || button > MAX_MOUSE_BUTTONS || button <= 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
237 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
238 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 keybinding * binding = mice[mouse].buttons + button - 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 handle_binding_down(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 static uint8_t ui_debug_mode = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 static uint8_t ui_debug_pal = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
245
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
246 static int current_speed = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
247 static int num_speeds = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 static uint32_t * speeds = NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
249
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
250 static uint8_t mouse_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
251
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
252 #ifdef _WIN32
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 #define localtime_r(a,b) localtime(a)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254 #endif
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
255
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
256 void handle_binding_up(keybinding * binding)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
258 switch(binding->bind_type)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
260 case BIND_GAMEPAD:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261 if (current_system && current_system->gamepad_up) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
262 current_system->gamepad_up(current_system, binding->subtype_a, binding->subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
263 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
264 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265 case BIND_MOUSE:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
266 if (current_system && current_system->mouse_up) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 current_system->mouse_up(current_system, binding->subtype_a, binding->subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
268 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
270 case BIND_UI:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
271 switch (binding->subtype_a)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
272 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
273 case UI_DEBUG_MODE_INC:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
274 current_system->inc_debug_mode(current_system);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
275 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276 case UI_DEBUG_PAL_INC:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
277 current_system->inc_debug_pal(current_system);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
278 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
279 case UI_ENTER_DEBUGGER:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280 current_system->enter_debugger = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
281 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
282 case UI_SAVE_STATE:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
283 current_system->save_state = QUICK_SAVE_SLOT+1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
284 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
285 case UI_NEXT_SPEED:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
286 current_speed++;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
287 if (current_speed >= num_speeds) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
288 current_speed = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
289 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
290 printf("Setting speed to %d: %d\n", current_speed, speeds[current_speed]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
291 current_system->set_speed_percent(current_system, speeds[current_speed]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 case UI_PREV_SPEED:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
294 current_speed--;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 if (current_speed < 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296 current_speed = num_speeds - 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
297 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
298 printf("Setting speed to %d: %d\n", current_speed, speeds[current_speed]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
299 current_system->set_speed_percent(current_system, speeds[current_speed]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
300 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
301 case UI_SET_SPEED:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
302 if (binding->subtype_b < num_speeds) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
303 current_speed = binding->subtype_b;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304 printf("Setting speed to %d: %d\n", current_speed, speeds[current_speed]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
305 current_system->set_speed_percent(current_system, speeds[current_speed]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
306 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
307 printf("Setting speed to %d\n", speeds[current_speed]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
308 current_system->set_speed_percent(current_system, speeds[current_speed]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
311 case UI_RELEASE_MOUSE:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312 if (mouse_captured) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 mouse_captured = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
314 render_relative_mouse(0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
315 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
316 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 case UI_TOGGLE_KEYBOARD_CAPTURE:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
318 if (current_system && current_system->has_keyboard) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
319 keyboard_captured = !keyboard_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
320 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
321 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322 case UI_TOGGLE_FULLSCREEN:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 render_toggle_fullscreen();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325 case UI_SOFT_RESET:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 current_system->soft_reset(current_system);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
327 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328 case UI_RELOAD:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
329 reload_media();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 case UI_SMS_PAUSE:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
332 if (current_system && current_system->gamepad_down) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
333 current_system->gamepad_down(current_system, GAMEPAD_MAIN_UNIT, MAIN_UNIT_PAUSE);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
334 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
335 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
336 case UI_SCREENSHOT: {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
337 char *screenshot_base = tern_find_path(config, "ui\0screenshot_path\0", TVAL_PTR).ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
338 if (!screenshot_base) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
339 screenshot_base = "$HOME";
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
340 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
341 tern_node *vars = tern_insert_ptr(NULL, "HOME", get_home_dir());
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
342 vars = tern_insert_ptr(vars, "EXEDIR", get_exe_dir());
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
343 screenshot_base = replace_vars(screenshot_base, vars, 1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
344 tern_free(vars);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
345 time_t now = time(NULL);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
346 struct tm local_store;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
347 char fname_part[256];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
348 char *template = tern_find_path(config, "ui\0screenshot_template\0", TVAL_PTR).ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
349 if (!template) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
350 template = "blastem_%c.ppm";
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
351 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
352 strftime(fname_part, sizeof(fname_part), template, localtime_r(&now, &local_store));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
353 char const *parts[] = {screenshot_base, PATH_SEP, fname_part};
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
354 char *path = alloc_concat_m(3, parts);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
355 free(screenshot_base);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
356 render_save_screenshot(path);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
357 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
358 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
359 case UI_EXIT:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
360 #ifndef DISABLE_NUKLEAR
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
361 if (is_nuklear_active()) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
362 show_pause_menu();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
363 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
364 #endif
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
365 current_system->request_exit(current_system);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
366 if (current_system->type == SYSTEM_GENESIS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
367 genesis_context *gen = (genesis_context *)current_system;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
368 if (gen->extra) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
369 //TODO: More robust mechanism for detecting menu
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
370 menu_context *menu = gen->extra;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
371 menu->external_game_load = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
372 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
373 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
374 #ifndef DISABLE_NUKLEAR
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
375 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
376 #endif
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
377 break;
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
378 case UI_PLANE_DEBUG: {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
379 vdp_context *vdp = NULL;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
380 if (current_system->type == SYSTEM_GENESIS) {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
381 genesis_context *gen = (genesis_context *)current_system;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
382 vdp = gen->vdp;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
383 } else if (current_system->type == SYSTEM_SMS) {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
384 sms_context *sms = (sms_context *)current_system;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
385 vdp = sms->vdp;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
386 }
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
387 if (vdp) {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
388 vdp_toggle_debug_view(vdp, VDP_DEBUG_PLANE);
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
389 }
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
390 break;
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
391 }
1634
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
392 case UI_VRAM_DEBUG: {
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
393 vdp_context *vdp = NULL;
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
394 if (current_system->type == SYSTEM_GENESIS) {
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
395 genesis_context *gen = (genesis_context *)current_system;
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
396 vdp = gen->vdp;
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
397 } else if (current_system->type == SYSTEM_SMS) {
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
398 sms_context *sms = (sms_context *)current_system;
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
399 vdp = sms->vdp;
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
400 }
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
401 if (vdp) {
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
402 vdp_toggle_debug_view(vdp, VDP_DEBUG_VRAM);
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
403 }
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
404 break;
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
405 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
406 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
407 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
408 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
409 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
410
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
411 void handle_keyup(int keycode, uint8_t scancode)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
412 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
413 int bucket = keycode >> 15 & 0xFFFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
414 int idx = keycode & 0x7FFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
415 keybinding * binding = bindings[bucket] ? bindings[bucket] + idx : NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
416 if (binding && (!keyboard_captured || (binding->bind_type == BIND_UI && binding->subtype_a == UI_TOGGLE_KEYBOARD_CAPTURE))) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
417 handle_binding_up(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
418 } else if (keyboard_captured && current_system && current_system->keyboard_up) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
419 current_system->keyboard_up(current_system, scancode);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
420 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
421 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
422
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
423 void handle_joyup(int joystick, int button)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
424 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
425 if (joystick >= MAX_JOYSTICKS || button >= joysticks[joystick].num_buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
426 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
427 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
428 keybinding * binding = joysticks[joystick].buttons + button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
429 handle_binding_up(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
430 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
431
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
432 void handle_joy_dpad(int joystick, int dpadnum, uint8_t value)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
433 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
434 if (joystick >= MAX_JOYSTICKS || dpadnum >= joysticks[joystick].num_dpads) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
435 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
436 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
437 joydpad * dpad = joysticks[joystick].dpads + dpadnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
438 uint8_t newdown = (value ^ dpad->state) & value;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
439 uint8_t newup = ((~value) ^ (~dpad->state)) & (~value);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
440 dpad->state = value;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
441 for (int i = 0; i < 4; i++) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
442 if (newdown & dpadbits[i]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
443 handle_binding_down(dpad->bindings + i);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
444 } else if(newup & dpadbits[i]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
445 handle_binding_up(dpad->bindings + i);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
446 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
447 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
448 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
449
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
450 #define JOY_AXIS_THRESHOLD 2000
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
451
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
452 void handle_joy_axis(int joystick, int axis, int16_t value)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
453 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
454 if (joystick >= MAX_JOYSTICKS || axis >= joysticks[joystick].num_axes) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
456 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
457 joyaxis *jaxis = joysticks[joystick].axes + axis;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
458 int old_active = abs(jaxis->value) > JOY_AXIS_THRESHOLD;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
459 int new_active = abs(value) > JOY_AXIS_THRESHOLD;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
460 int old_pos = jaxis->value > 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
461 int new_pos = value > 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
462 jaxis->value = value;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
463 if (old_active && (!new_active || old_pos != new_pos)) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
464 //previously activated direction is no longer active
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
465 handle_binding_up(old_pos ? &jaxis->positive : &jaxis->negative);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
466 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
467 if (new_active && (!old_active || old_pos != new_pos)) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
468 //previously unactivated direction is now active
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
469 handle_binding_down(new_pos ? &jaxis->positive : &jaxis->negative);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
470 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
471 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
472
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
473 void handle_mouse_moved(int mouse, uint16_t x, uint16_t y, int16_t deltax, int16_t deltay)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
474 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
475 if (mouse >= MAX_MICE || !current_system) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
476 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
477 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
478 if (mice[mouse].motion.bind_type == BIND_MOUSE && mice[mouse].motion.subtype_b == PSEUDO_BUTTON_MOTION) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
479 uint8_t target_mouse = mice[mouse].motion.subtype_a;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
480 switch(mouse_mode)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
481 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
482 case MOUSE_NONE:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
483 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
484 case MOUSE_ABSOLUTE: {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
485 if (current_system->mouse_motion_absolute) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
486 float scale_x = (render_emulated_width() * 2.0f) / ((float)render_width());
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
487 float scale_y = (render_emulated_height() * 2.0f) / ((float)render_height());
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
488 int32_t adj_x = x * scale_x + 2 * render_overscan_left() - 2 * BORDER_LEFT;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
489 int32_t adj_y = y * scale_y + 2 * render_overscan_top() - 4;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
490
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
491 current_system->mouse_motion_absolute(current_system, target_mouse, adj_x, adj_y);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
492 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
493 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
494 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
495 case MOUSE_RELATIVE: {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
496 if (current_system->mouse_motion_relative) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
497 current_system->mouse_motion_relative(current_system, target_mouse, deltax, deltay);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
498 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
499 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
500 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
501 case MOUSE_CAPTURE: {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
502 if (mouse_captured && current_system->mouse_motion_relative) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
503 current_system->mouse_motion_relative(current_system, target_mouse, deltax, deltay);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
504 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
505 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
506 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
507 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
508 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
509 handle_binding_up(&mice[mouse].motion);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
510 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
511 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
512
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
513 void handle_mouseup(int mouse, int button)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
514 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
515 if (mouse >= MAX_MICE || button > MAX_MOUSE_BUTTONS || button <= 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
516 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
517 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
518 keybinding * binding = mice[mouse].buttons + button - 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
519 handle_binding_up(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
520 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
521
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
522 void bindings_release_capture(void)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
523 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
524 if (mouse_mode == MOUSE_RELATIVE || (mouse_mode == MOUSE_CAPTURE && mouse_captured)) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
525 render_relative_mouse(0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
526 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
527 keyboard_captured = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
528 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
529
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
530 void bindings_reacquire_capture(void)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
531 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
532 if (mouse_mode == MOUSE_RELATIVE || (mouse_mode == MOUSE_CAPTURE && mouse_captured)) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
533 render_relative_mouse(1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
534 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
535 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
536
1608
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
537 int parse_binding_target(int device_num, char * target, tern_node * padbuttons, tern_node *mousebuttons, uint8_t * subtype_a, uint8_t * subtype_b)
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
538 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
539 const int gpadslen = strlen("gamepads.");
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
540 const int mouselen = strlen("mouse.");
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
541 if (!strncmp(target, "gamepads.", gpadslen)) {
1608
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
542 int padnum = target[gpadslen] == 'n' ? device_num + 1 : target[gpadslen] - '0';
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
543 if (padnum >= 1 && padnum <= 8) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
544 int button = tern_find_int(padbuttons, target + gpadslen + 1, 0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
545 if (button) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
546 *subtype_a = padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
547 *subtype_b = button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
548 return BIND_GAMEPAD;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
549 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
550 if (target[gpadslen+1]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
551 warning("Gamepad mapping string '%s' refers to an invalid button '%s'\n", target, target + gpadslen + 1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
552 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
553 warning("Gamepad mapping string '%s' has no button component\n", target);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
554 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
555 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
556 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
557 warning("Gamepad mapping string '%s' refers to an invalid gamepad number %c\n", target, target[gpadslen]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
558 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
559 } else if(!strncmp(target, "mouse.", mouselen)) {
1608
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
560 int mousenum = target[mouselen] == 'n' ? device_num + 1 : target[mouselen] - '0';
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
561 if (mousenum >= 1 && mousenum <= 8) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
562 int button = tern_find_int(mousebuttons, target + mouselen + 1, 0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
563 if (button) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
564 *subtype_a = mousenum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
565 *subtype_b = button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
566 return BIND_MOUSE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
567 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
568 if (target[mouselen+1]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
569 warning("Mouse mapping string '%s' refers to an invalid button '%s'\n", target, target + mouselen + 1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
570 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
571 warning("Mouse mapping string '%s' has no button component\n", target);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
572 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
573 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
574 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
575 warning("Gamepad mapping string '%s' refers to an invalid mouse number %c\n", target, target[mouselen]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
576 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
577 } else if(!strncmp(target, "ui.", strlen("ui."))) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
578 if (!strcmp(target + 3, "vdp_debug_mode")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
579 *subtype_a = UI_DEBUG_MODE_INC;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
580 } else if(!strcmp(target + 3, "vdp_debug_pal")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
581 *subtype_a = UI_DEBUG_PAL_INC;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
582 } else if(!strcmp(target + 3, "enter_debugger")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
583 *subtype_a = UI_ENTER_DEBUGGER;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
584 } else if(!strcmp(target + 3, "save_state")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
585 *subtype_a = UI_SAVE_STATE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
586 } else if(!strncmp(target + 3, "set_speed.", strlen("set_speed."))) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
587 *subtype_a = UI_SET_SPEED;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
588 *subtype_b = atoi(target + 3 + strlen("set_speed."));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
589 } else if(!strcmp(target + 3, "next_speed")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
590 *subtype_a = UI_NEXT_SPEED;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
591 } else if(!strcmp(target + 3, "prev_speed")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
592 *subtype_a = UI_PREV_SPEED;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
593 } else if(!strcmp(target + 3, "release_mouse")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
594 *subtype_a = UI_RELEASE_MOUSE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
595 } else if(!strcmp(target + 3, "toggle_keyboard_captured")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
596 *subtype_a = UI_TOGGLE_KEYBOARD_CAPTURE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
597 } else if (!strcmp(target + 3, "toggle_fullscreen")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
598 *subtype_a = UI_TOGGLE_FULLSCREEN;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
599 } else if (!strcmp(target + 3, "soft_reset")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
600 *subtype_a = UI_SOFT_RESET;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
601 } else if (!strcmp(target + 3, "reload")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
602 *subtype_a = UI_RELOAD;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
603 } else if (!strcmp(target + 3, "sms_pause")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
604 *subtype_a = UI_SMS_PAUSE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
605 } else if (!strcmp(target + 3, "screenshot")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
606 *subtype_a = UI_SCREENSHOT;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
607 } else if(!strcmp(target + 3, "exit")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
608 *subtype_a = UI_EXIT;
1631
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
609 } else if (!strcmp(target + 3, "plane_debug")) {
c4ba3177b72d WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents: 1623
diff changeset
610 *subtype_a = UI_PLANE_DEBUG;
1634
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
611 } else if (!strcmp(target + 3, "vram_debug")) {
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
612 *subtype_a = UI_VRAM_DEBUG;
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
613 } else {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
614 warning("Unreconized UI binding type %s\n", target);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
615 return 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
616 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
617 return BIND_UI;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
618 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
619 warning("Unrecognized binding type %s\n", target);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
620 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
621 return 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
622 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
623
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
624 void process_keys(tern_node * cur, tern_node * special, tern_node * padbuttons, tern_node *mousebuttons, char * prefix)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
625 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
626 char * curstr = NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
627 int len;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
628 if (!cur) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
629 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
630 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
631 char onec[2];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
632 if (prefix) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
633 len = strlen(prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
634 curstr = malloc(len + 2);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
635 memcpy(curstr, prefix, len);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
636 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
637 curstr = onec;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
638 len = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
639 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
640 curstr[len] = cur->el;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
641 curstr[len+1] = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
642 if (cur->el) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
643 process_keys(cur->straight.next, special, padbuttons, mousebuttons, curstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
644 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
645 int keycode = tern_find_int(special, curstr, 0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
646 if (!keycode) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
647 keycode = curstr[0];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
648 if (curstr[1] != 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
649 warning("%s is not recognized as a key identifier, truncating to %c\n", curstr, curstr[0]);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
650 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
651 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
652 char * target = cur->straight.value.ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
653 uint8_t subtype_a = 0, subtype_b = 0;
1608
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
654 int bindtype = parse_binding_target(0, target, padbuttons, mousebuttons, &subtype_a, &subtype_b);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
655 bind_key(keycode, bindtype, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
656 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
657 process_keys(cur->left, special, padbuttons, mousebuttons, prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
658 process_keys(cur->right, special, padbuttons, mousebuttons, prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
659 if (curstr && len) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
660 free(curstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
661 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
662 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
663
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
664 void process_speeds(tern_node * cur, char * prefix)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
665 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
666 char * curstr = NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
667 int len;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
668 if (!cur) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
669 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
670 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
671 char onec[2];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
672 if (prefix) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
673 len = strlen(prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
674 curstr = malloc(len + 2);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
675 memcpy(curstr, prefix, len);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
676 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
677 curstr = onec;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
678 len = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
679 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
680 curstr[len] = cur->el;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
681 curstr[len+1] = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
682 if (cur->el) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
683 process_speeds(cur->straight.next, curstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
684 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
685 char *end;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
686 long speed_index = strtol(curstr, &end, 10);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
687 if (speed_index < 0 || end == curstr || *end) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
688 warning("%s is not a valid speed index", curstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
689 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
690 if (speed_index >= num_speeds) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
691 speeds = realloc(speeds, sizeof(uint32_t) * (speed_index+1));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
692 for(; num_speeds < speed_index + 1; num_speeds++) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
693 speeds[num_speeds] = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
694 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
695 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
696 speeds[speed_index] = atoi(cur->straight.value.ptrval);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
697 if (speeds[speed_index] < 1) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
698 warning("%s is not a valid speed percentage, setting speed %d to 100", cur->straight.value.ptrval, speed_index);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
699 speeds[speed_index] = 100;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
700 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
701 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
702 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
703 process_speeds(cur->left, prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
704 process_speeds(cur->right, prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
705 if (curstr && len) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
706 free(curstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
707 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
708 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
709
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
710 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
711 tern_node *padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
712 tern_node *mousebuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
713 int mouseidx;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
714 } pmb_state;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
715
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
716 void process_mouse_button(char *buttonstr, tern_val value, uint8_t valtype, void *data)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
717 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
718 pmb_state *state = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
719 int buttonnum = atoi(buttonstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
720 if (buttonnum < 1 || buttonnum > MAX_MOUSE_BUTTONS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
721 warning("Mouse button %s is out of the supported range of 1-8\n", buttonstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
722 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
723 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
724 if (valtype != TVAL_PTR) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
725 warning("Mouse button %s is not a scalar value!\n", buttonstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
726 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
727 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
728 buttonnum--;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
729 uint8_t subtype_a = 0, subtype_b = 0;
1608
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
730 int bindtype = parse_binding_target(state->mouseidx, value.ptrval, state->padbuttons, state->mousebuttons, &subtype_a, &subtype_b);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
731 mice[state->mouseidx].buttons[buttonnum].bind_type = bindtype;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
732 mice[state->mouseidx].buttons[buttonnum].subtype_a = subtype_a;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
733 mice[state->mouseidx].buttons[buttonnum].subtype_b = subtype_b;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
734 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
735
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
736 void process_mouse(char *mousenum, tern_val value, uint8_t valtype, void *data)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
737 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
738 tern_node **buttonmaps = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
739 if (valtype != TVAL_NODE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
740 warning("Binding for mouse %s is a scalar!\n", mousenum);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
741 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
742 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
743 tern_node *mousedef = value.ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
744 tern_node *padbuttons = buttonmaps[0];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
745 tern_node *mousebuttons = buttonmaps[1];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
746
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
747 int mouseidx = atoi(mousenum);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
748 if (mouseidx < 0 || mouseidx >= MAX_MICE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
749 warning("Mouse numbers must be between 0 and %d, but %d is not\n", MAX_MICE, mouseidx);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
750 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
751 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
752 char *motion = tern_find_ptr(mousedef, "motion");
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
753 if (motion) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
754 uint8_t subtype_a = 0, subtype_b = 0;
1608
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
755 int bindtype = parse_binding_target(mouseidx, motion, padbuttons, mousebuttons, &subtype_a, &subtype_b);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
756 mice[mouseidx].motion.bind_type = bindtype;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
757 mice[mouseidx].motion.subtype_a = subtype_a;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
758 mice[mouseidx].motion.subtype_b = subtype_b;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
759 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
760 tern_node *buttons = tern_find_path(mousedef, "buttons\0\0", TVAL_NODE).ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
761 if (buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
762 pmb_state state = {padbuttons, mousebuttons, mouseidx};
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
763 tern_foreach(buttons, process_mouse_button, &state);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
764 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
765 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
766
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
767 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
768 int padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
769 tern_node *padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
770 tern_node *mousebuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
771 } pad_button_state;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
772
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
773
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
774 static long map_warning_pad = -1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
775 void process_pad_button(char *key, tern_val val, uint8_t valtype, void *data)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
776 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
777 pad_button_state *state = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
778 int hostpadnum = state->padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
779 if (valtype != TVAL_PTR) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
780 warning("Pad button %s has a non-scalar value\n", key);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
781 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
782 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
783 uint8_t subtype_a = 0, subtype_b = 0;
1608
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
784 int bindtype = parse_binding_target(hostpadnum, val.ptrval, state->padbuttons, state->mousebuttons, &subtype_a, &subtype_b);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
785 char *end;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
786 long hostbutton = strtol(key, &end, 10);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
787 if (*end) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
788 //key is not a valid base 10 integer
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
789 hostbutton = render_translate_input_name(hostpadnum, key, 0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
790 if (hostbutton < 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
791 if (hostbutton == RENDER_INVALID_NAME) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
792 warning("%s is not a valid gamepad input name\n", key);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
793 } else if (hostbutton == RENDER_NOT_MAPPED && hostpadnum != map_warning_pad) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
794 warning("No SDL 2 mapping exists for input %s on gamepad %d\n", key, hostpadnum);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
795 map_warning_pad = hostpadnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
796 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
797 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
798 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
799 if (hostbutton & RENDER_DPAD_BIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
800 bind_dpad(hostpadnum, render_dpad_part(hostbutton), render_direction_part(hostbutton), bindtype, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
801 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
802 } else if (hostbutton & RENDER_AXIS_BIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
803 bind_axis(hostpadnum, render_axis_part(hostbutton), 1, bindtype, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
804 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
805 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
806 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
807 bind_button(hostpadnum, hostbutton, bindtype, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
808 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
809
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
810 void process_pad_axis(char *key, tern_val val, uint8_t valtype, void *data)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
811 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
812 key = strdup(key);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
813 pad_button_state *state = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
814 int hostpadnum = state->padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
815 if (valtype != TVAL_PTR) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
816 warning("Mapping for axis %s has a non-scalar value", key);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
817 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
818 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
819 uint8_t subtype_a = 0, subtype_b = 0;
1608
419a0a133b5c Allow a gamepad mapping to apply to all controllers, controllers of a particular type (i.e.e 6-button PS4 controllers) or specific controllers (based on SDL2 GUID) in addition to the controller in a certain slot
Michael Pavone <pavone@retrodev.com>
parents: 1587
diff changeset
820 int bindtype = parse_binding_target(hostpadnum, val.ptrval, state->padbuttons, state->mousebuttons, &subtype_a, &subtype_b);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
821 char *modifier = strchr(key, '.');
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
822 int positive = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
823 if (modifier) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
824 *modifier = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
825 modifier++;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
826 if (!strcmp("negative", modifier)) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
827 positive = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
828 } else if(strcmp("positive", modifier)) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
829 warning("Invalid axis modifier %s for axis %s on pad %d\n", modifier, key, hostpadnum);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
830 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
831 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
832 char *end;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
833 long axis = strtol(key, &end, 10);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
834 if (*end) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
835 //key is not a valid base 10 integer
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
836 axis = render_translate_input_name(hostpadnum, key, 1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
837 if (axis < 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
838 if (axis == RENDER_INVALID_NAME) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
839 warning("%s is not a valid gamepad input name\n", key);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
840 } else if (axis == RENDER_NOT_MAPPED && hostpadnum != map_warning_pad) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
841 warning("No SDL 2 mapping exists for input %s on gamepad %d\n", key, hostpadnum);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
842 map_warning_pad = hostpadnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
843 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
844 goto done;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
845 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
846 if (axis & RENDER_DPAD_BIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
847 bind_dpad(hostpadnum, render_dpad_part(axis), render_direction_part(axis), bindtype, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
848 goto done;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
849 } else if (axis & RENDER_AXIS_BIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
850 axis = render_axis_part(axis);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
851 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
852 bind_button(hostpadnum, axis, bindtype, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
853 goto done;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
854 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
855 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
856 bind_axis(hostpadnum, axis, positive, bindtype, subtype_a, subtype_b);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
857 done:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
858 free(key);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
859 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
860 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
861
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
862 static tern_node *get_pad_buttons()
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
863 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
864 static tern_node *padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
865 if (!padbuttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
866 padbuttons = tern_insert_int(NULL, ".up", DPAD_UP);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
867 padbuttons = tern_insert_int(padbuttons, ".down", DPAD_DOWN);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
868 padbuttons = tern_insert_int(padbuttons, ".left", DPAD_LEFT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
869 padbuttons = tern_insert_int(padbuttons, ".right", DPAD_RIGHT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
870 padbuttons = tern_insert_int(padbuttons, ".a", BUTTON_A);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
871 padbuttons = tern_insert_int(padbuttons, ".b", BUTTON_B);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
872 padbuttons = tern_insert_int(padbuttons, ".c", BUTTON_C);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
873 padbuttons = tern_insert_int(padbuttons, ".x", BUTTON_X);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
874 padbuttons = tern_insert_int(padbuttons, ".y", BUTTON_Y);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
875 padbuttons = tern_insert_int(padbuttons, ".z", BUTTON_Z);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
876 padbuttons = tern_insert_int(padbuttons, ".start", BUTTON_START);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
877 padbuttons = tern_insert_int(padbuttons, ".mode", BUTTON_MODE);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
878 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
879 return padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
880 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
881
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
882 static tern_node *get_mouse_buttons()
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
883 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
884 static tern_node *mousebuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
885 if (!mousebuttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
886 mousebuttons = tern_insert_int(NULL, ".left", MOUSE_LEFT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
887 mousebuttons = tern_insert_int(mousebuttons, ".middle", MOUSE_MIDDLE);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
888 mousebuttons = tern_insert_int(mousebuttons, ".right", MOUSE_RIGHT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
889 mousebuttons = tern_insert_int(mousebuttons, ".start", MOUSE_START);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
890 mousebuttons = tern_insert_int(mousebuttons, ".motion", PSEUDO_BUTTON_MOTION);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
891 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
892 return mousebuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
893 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
894
1623
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
895 tern_node *get_binding_node_for_pad(int padnum)
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
896 {
1623
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
897 if (padnum > MAX_JOYSTICKS) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
898 return NULL;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
899 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
900 tern_node * pads = tern_find_path(config, "bindings\0pads\0", TVAL_NODE).ptrval;
1623
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
901 if (!pads) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
902 return NULL;
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
903 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
904 char numstr[11];
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
905 sprintf(numstr, "%d", padnum);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
906 tern_node * pad = tern_find_node(pads, numstr);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
907 if (!pad) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
908 char *type_id = render_joystick_type_id(padnum);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
909 pad = tern_find_node(pads, type_id);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
910 free(type_id);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
911 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
912 if (!pad) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
913 controller_info info = get_controller_info(padnum);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
914 char *key = make_controller_type_key(&info);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
915 pad = tern_find_node(pads, key);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
916 free(key);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
917 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
918 if (!pad) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
919 pad = tern_find_node(pads, "default");
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
920 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
921 return pad;
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
922 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
923
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
924 void handle_joy_added(int joystick)
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
925 {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
926 tern_node *pad = get_binding_node_for_pad(joystick);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
927 if (!pad) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
928 return;
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
929 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
930 tern_node * dpad_node = tern_find_node(pad, "dpads");
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
931 if (dpad_node) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
932 for (int dpad = 0; dpad < 10; dpad++)
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
933 {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
934 char numstr[2] = {dpad + '0', 0};
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
935 tern_node * pad_dpad = tern_find_node(dpad_node, numstr);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
936 char * dirs[] = {"up", "down", "left", "right"};
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
937 //TODO: Support controllers that have d-pads implemented as analog axes or buttons
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
938 int dirnums[] = {RENDER_DPAD_UP, RENDER_DPAD_DOWN, RENDER_DPAD_LEFT, RENDER_DPAD_RIGHT};
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
939 for (int dir = 0; dir < sizeof(dirs)/sizeof(dirs[0]); dir++) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
940 char * target = tern_find_ptr(pad_dpad, dirs[dir]);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
941 if (target) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
942 uint8_t subtype_a = 0, subtype_b = 0;
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
943 int bindtype = parse_binding_target(joystick, target, get_pad_buttons(), get_mouse_buttons(), &subtype_a, &subtype_b);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
944 bind_dpad(joystick, dpad, dirnums[dir], bindtype, subtype_a, subtype_b);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
945 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
946 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
947 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
948 }
1623
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
949 tern_node *button_node = tern_find_node(pad, "buttons");
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
950 if (button_node) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
951 pad_button_state state = {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
952 .padnum = joystick,
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
953 .padbuttons = get_pad_buttons(),
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
954 .mousebuttons = get_mouse_buttons()
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
955 };
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
956 tern_foreach(button_node, process_pad_button, &state);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
957 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
958 tern_node *axes_node = tern_find_node(pad, "axes");
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
959 if (axes_node) {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
960 pad_button_state state = {
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
961 .padnum = joystick,
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
962 .padbuttons = get_pad_buttons(),
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
963 .mousebuttons = get_mouse_buttons()
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
964 };
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
965 tern_foreach(axes_node, process_pad_axis, &state);
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
966 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
967 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
968
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
969 //only handles keyboards and mice as gamepads are handled on hotplug events
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
970 void set_bindings(void)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
971 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
972 tern_node * special = tern_insert_int(NULL, "up", RENDERKEY_UP);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
973 special = tern_insert_int(special, "down", RENDERKEY_DOWN);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
974 special = tern_insert_int(special, "left", RENDERKEY_LEFT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
975 special = tern_insert_int(special, "right", RENDERKEY_RIGHT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
976 special = tern_insert_int(special, "enter", '\r');
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
977 special = tern_insert_int(special, "space", ' ');
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
978 special = tern_insert_int(special, "tab", '\t');
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
979 special = tern_insert_int(special, "backspace", '\b');
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
980 special = tern_insert_int(special, "esc", RENDERKEY_ESC);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
981 special = tern_insert_int(special, "delete", RENDERKEY_DEL);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
982 special = tern_insert_int(special, "lshift", RENDERKEY_LSHIFT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
983 special = tern_insert_int(special, "rshift", RENDERKEY_RSHIFT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
984 special = tern_insert_int(special, "lctrl", RENDERKEY_LCTRL);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
985 special = tern_insert_int(special, "rctrl", RENDERKEY_RCTRL);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
986 special = tern_insert_int(special, "lalt", RENDERKEY_LALT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
987 special = tern_insert_int(special, "ralt", RENDERKEY_RALT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
988 special = tern_insert_int(special, "home", RENDERKEY_HOME);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
989 special = tern_insert_int(special, "end", RENDERKEY_END);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
990 special = tern_insert_int(special, "pageup", RENDERKEY_PAGEUP);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
991 special = tern_insert_int(special, "pagedown", RENDERKEY_PAGEDOWN);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
992 special = tern_insert_int(special, "f1", RENDERKEY_F1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
993 special = tern_insert_int(special, "f2", RENDERKEY_F2);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
994 special = tern_insert_int(special, "f3", RENDERKEY_F3);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
995 special = tern_insert_int(special, "f4", RENDERKEY_F4);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
996 special = tern_insert_int(special, "f5", RENDERKEY_F5);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
997 special = tern_insert_int(special, "f6", RENDERKEY_F6);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
998 special = tern_insert_int(special, "f7", RENDERKEY_F7);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
999 special = tern_insert_int(special, "f8", RENDERKEY_F8);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1000 special = tern_insert_int(special, "f9", RENDERKEY_F9);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1001 special = tern_insert_int(special, "f10", RENDERKEY_F10);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1002 special = tern_insert_int(special, "f11", RENDERKEY_F11);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1003 special = tern_insert_int(special, "f12", RENDERKEY_F12);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1004 special = tern_insert_int(special, "select", RENDERKEY_SELECT);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1005 special = tern_insert_int(special, "play", RENDERKEY_PLAY);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1006 special = tern_insert_int(special, "search", RENDERKEY_SEARCH);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1007 special = tern_insert_int(special, "back", RENDERKEY_BACK);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1008 special = tern_insert_int(special, "np0", RENDERKEY_NP0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1009 special = tern_insert_int(special, "np1", RENDERKEY_NP1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1010 special = tern_insert_int(special, "np2", RENDERKEY_NP2);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1011 special = tern_insert_int(special, "np3", RENDERKEY_NP3);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1012 special = tern_insert_int(special, "np4", RENDERKEY_NP4);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1013 special = tern_insert_int(special, "np5", RENDERKEY_NP5);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1014 special = tern_insert_int(special, "np6", RENDERKEY_NP6);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1015 special = tern_insert_int(special, "np7", RENDERKEY_NP7);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1016 special = tern_insert_int(special, "np8", RENDERKEY_NP8);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1017 special = tern_insert_int(special, "np9", RENDERKEY_NP9);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1018 special = tern_insert_int(special, "np/", RENDERKEY_NP_DIV);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1019 special = tern_insert_int(special, "np*", RENDERKEY_NP_MUL);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1020 special = tern_insert_int(special, "np-", RENDERKEY_NP_MIN);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1021 special = tern_insert_int(special, "np+", RENDERKEY_NP_PLUS);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1022 special = tern_insert_int(special, "npenter", RENDERKEY_NP_ENTER);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1023 special = tern_insert_int(special, "np.", RENDERKEY_NP_STOP);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1024
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1025 tern_node *padbuttons = get_pad_buttons();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1026
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1027 tern_node *mousebuttons = get_mouse_buttons();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1028
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1029 tern_node * keys = tern_find_path(config, "bindings\0keys\0", TVAL_NODE).ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1030 process_keys(keys, special, padbuttons, mousebuttons, NULL);
1587
ea687ca7d845 Fix missing include in bindings.c
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1031 tern_free(special);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1032
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1033 memset(mice, 0, sizeof(mice));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1034 tern_node * mice = tern_find_path(config, "bindings\0mice\0", TVAL_NODE).ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1035 if (mice) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1036 tern_node *buttonmaps[2] = {padbuttons, mousebuttons};
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1037 tern_foreach(mice, process_mouse, buttonmaps);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1038 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1039 tern_node * speed_nodes = tern_find_path(config, "clocks\0speeds\0", TVAL_NODE).ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1040 speeds = malloc(sizeof(uint32_t));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1041 speeds[0] = 100;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1042 process_speeds(speed_nodes, NULL);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1043 for (int i = 0; i < num_speeds; i++)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1044 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1045 if (!speeds[i]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1046 warning("Speed index %d was not set to a valid percentage!", i);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1047 speeds[i] = 100;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1048 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1049 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1050 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1051
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1052 void bindings_set_mouse_mode(uint8_t mode)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1053 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1054 mouse_mode = mode;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1055 if (mode == MOUSE_RELATIVE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1056 render_relative_mouse(1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1057 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1058 }