Mercurial > repos > blastem
annotate bindings.c @ 1863:d60f2d7c02a5
Differentiate between the full Sega mapper and the SRAM only one. Fixes crash on save state load for Phantasy Star IV and other games that use the same mapper
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 14 May 2019 23:20:35 -0700 |
parents | 30f2821ffd65 |
children | 508522f08e4d |
rev | line source |
---|---|
1587
ea687ca7d845
Fix missing include in bindings.c
Michael Pavone <pavone@retrodev.com>
parents:
1583
diff
changeset
|
1 #include <string.h> |
1783 | 2 #include <stdlib.h> |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 #include "render.h" |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 #include "system.h" |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 #include "io.h" |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 #include "blastem.h" |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 #include "saves.h" |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 #include "util.h" |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 #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
|
10 #include "sms.h" |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 #include "menu.h" |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 #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
|
13 #include "controller_info.h" |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 #ifndef DISABLE_NUKLEAR |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 #include "nuklear_ui/blastem_nuklear.h" |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 #endif |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 enum { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 BIND_NONE, |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 BIND_UI, |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 BIND_GAMEPAD, |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 BIND_MOUSE |
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 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 typedef enum { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 UI_DEBUG_MODE_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, |
1638
f27142c48567
Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents:
1634
diff
changeset
|
41 UI_VRAM_DEBUG, |
f27142c48567
Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents:
1634
diff
changeset
|
42 UI_CRAM_DEBUG, |
1641
bc9bb4e5856f
Basic version of layer compositing debug view in a separate window
Michael Pavone <pavone@retrodev.com>
parents:
1638
diff
changeset
|
43 UI_COMPOSITE_DEBUG |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 } ui_action; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 typedef struct { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 uint8_t bind_type; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 uint8_t subtype_a; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 uint8_t subtype_b; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 } keybinding; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 typedef struct { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 keybinding bindings[4]; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 uint8_t state; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 } joydpad; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 typedef struct { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 keybinding positive; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 keybinding negative; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 int16_t value; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 } joyaxis; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 typedef struct { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 keybinding *buttons; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 joydpad *dpads; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 joyaxis *axes; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 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
|
68 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
|
69 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
|
70 } joystick; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 typedef struct { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 keybinding buttons[MAX_MOUSE_BUTTONS]; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 keybinding motion; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 } mousebinding; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 #define DEFAULT_JOYBUTTON_ALLOC 12 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 static keybinding *bindings[0x10000]; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 static joystick joysticks[MAX_JOYSTICKS]; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 static mousebinding mice[MAX_MICE]; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 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
|
82 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 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
|
84 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 binding->bind_type = bind_type; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 binding->subtype_a = subtype_a; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 binding->subtype_b = subtype_b; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 } |
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 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
|
91 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 int bucket = keycode >> 15 & 0xFFFF; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
93 if (!bindings[bucket]) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 bindings[bucket] = malloc(sizeof(keybinding) * 0x8000); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 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
|
96 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 int idx = keycode & 0x7FFF; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
98 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
|
99 } |
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 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
|
102 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 if (joystick >= MAX_JOYSTICKS) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
106 if (!joysticks[joystick].buttons) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
107 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
|
108 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
|
109 } 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
|
110 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
|
111 joysticks[joystick].num_buttons *= 2; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
112 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
|
113 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
|
114 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
115 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
|
116 } |
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 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
|
119 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
120 if (joystick >= MAX_JOYSTICKS) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
121 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
122 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
123 if (!joysticks[joystick].dpads) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
124 //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
|
125 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
|
126 joysticks[joystick].num_dpads = dpad+1; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 } 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
|
128 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
|
129 joysticks[joystick].num_dpads *= 2; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 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
|
131 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
|
132 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
133 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
|
134 if (dpadbits[i] & direction) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
135 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
|
136 break; |
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 } |
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 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
|
142 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
143 if (joystick >= MAX_JOYSTICKS) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
144 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
145 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
146 if (!joysticks[joystick].axes) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
147 //typical gamepad has 4 axes |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
148 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
|
149 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
|
150 } 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
|
151 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
|
152 joysticks[joystick].num_axes *= 2; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
153 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
|
154 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
|
155 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
156 if (positive) { |
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].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
|
158 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
159 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
|
160 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
161 } |
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 void reset_joystick_bindings(int joystick) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
164 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
165 if (joystick >= MAX_JOYSTICKS) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
166 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
167 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
168 if (joysticks[joystick].buttons) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
169 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
|
170 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
171 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
|
172 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
173 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
174 if (joysticks[joystick].dpads) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
175 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
|
176 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
177 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
|
178 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
179 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
|
180 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
181 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
182 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
183 if (joysticks[joystick].axes) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
184 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
|
185 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
186 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
|
187 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
|
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 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
191 |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
192 static uint8_t content_binds_enabled = 1; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
193 void set_content_binding_state(uint8_t enabled) |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
194 { |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
195 content_binds_enabled = enabled; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
196 } |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
197 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
198 void handle_binding_down(keybinding * binding) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
199 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
200 if (!current_system) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
201 return; |
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 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
|
204 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
205 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
|
206 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
207 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
|
208 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
209 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
|
210 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
211 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
212 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
213 static uint8_t keyboard_captured; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
214 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
|
215 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
216 int bucket = keycode >> 15 & 0xFFFF; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
217 int idx = keycode & 0x7FFF; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
218 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
|
219 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
|
220 handle_binding_down(binding); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
221 } 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
|
222 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
|
223 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
224 } |
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 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
|
227 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
228 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
|
229 return; |
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 keybinding * binding = joysticks[joystick].buttons + button; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
232 handle_binding_down(binding); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
233 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
234 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
235 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
|
236 static uint8_t mouse_captured; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
237 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
|
238 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
239 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
|
240 mouse_captured = 1; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
241 render_relative_mouse(1); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
242 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
243 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
244 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
|
245 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
246 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
247 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
|
248 handle_binding_down(binding); |
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 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
251 static int current_speed = 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
252 static int num_speeds = 1; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
253 static uint32_t * speeds = NULL; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
254 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
255 static uint8_t mouse_captured; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
256 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
257 #ifdef _WIN32 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
258 #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
|
259 #endif |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
260 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
261 void handle_binding_up(keybinding * binding) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
262 { |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
263 uint8_t allow_content_binds = content_binds_enabled && current_system; |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
264 switch(binding->bind_type) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
265 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
266 case BIND_GAMEPAD: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
267 if (allow_content_binds && current_system->gamepad_up) { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
268 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
|
269 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
270 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
271 case BIND_MOUSE: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
272 if (allow_content_binds && current_system->mouse_up) { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
273 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
|
274 } |
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 BIND_UI: |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
277 switch (binding->subtype_a) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
278 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
279 case UI_DEBUG_MODE_INC: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
280 if (allow_content_binds) { |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
281 current_system->inc_debug_mode(current_system); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
282 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
283 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
284 case UI_ENTER_DEBUGGER: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
285 if (allow_content_binds) { |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
286 current_system->enter_debugger = 1; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
287 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
288 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
289 case UI_SAVE_STATE: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
290 if (allow_content_binds) { |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
291 current_system->save_state = QUICK_SAVE_SLOT+1; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
292 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
293 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
294 case UI_NEXT_SPEED: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
295 if (allow_content_binds) { |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
296 current_speed++; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
297 if (current_speed >= num_speeds) { |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
298 current_speed = 0; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
299 } |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
300 printf("Setting speed to %d: %d\n", current_speed, speeds[current_speed]); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
301 current_system->set_speed_percent(current_system, speeds[current_speed]); |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
302 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
303 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
304 case UI_PREV_SPEED: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
305 if (allow_content_binds) { |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
306 current_speed--; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
307 if (current_speed < 0) { |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
308 current_speed = num_speeds - 1; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
309 } |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
310 printf("Setting speed to %d: %d\n", current_speed, speeds[current_speed]); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
311 current_system->set_speed_percent(current_system, speeds[current_speed]); |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
312 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
313 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
314 case UI_SET_SPEED: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
315 if (allow_content_binds) { |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
316 if (binding->subtype_b < num_speeds) { |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
317 current_speed = binding->subtype_b; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
318 printf("Setting speed to %d: %d\n", current_speed, speeds[current_speed]); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
319 current_system->set_speed_percent(current_system, speeds[current_speed]); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
320 } else { |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
321 printf("Setting speed to %d\n", speeds[current_speed]); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
322 current_system->set_speed_percent(current_system, speeds[current_speed]); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
323 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
324 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
325 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
326 case UI_RELEASE_MOUSE: |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
327 if (mouse_captured) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
328 mouse_captured = 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
329 render_relative_mouse(0); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
330 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
331 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
332 case UI_TOGGLE_KEYBOARD_CAPTURE: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
333 if (allow_content_binds && current_system->has_keyboard) { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
334 keyboard_captured = !keyboard_captured; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
335 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
336 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
337 case UI_TOGGLE_FULLSCREEN: |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
338 render_toggle_fullscreen(); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
339 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
340 case UI_SOFT_RESET: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
341 if (allow_content_binds) { |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
342 current_system->soft_reset(current_system); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
343 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
344 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
345 case UI_RELOAD: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
346 if (allow_content_binds) { |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
347 reload_media(); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
348 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
349 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
350 case UI_SMS_PAUSE: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
351 if (allow_content_binds && current_system->gamepad_down) { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
352 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
|
353 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
354 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
355 case UI_SCREENSHOT: { |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
356 if (allow_content_binds) { |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
357 char *screenshot_base = tern_find_path(config, "ui\0screenshot_path\0", TVAL_PTR).ptrval; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
358 if (!screenshot_base) { |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
359 screenshot_base = "$HOME"; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
360 } |
1850
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
361 const system_media *media = current_media(); |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
362 tern_node *vars = tern_insert_ptr(NULL, "HOME", get_home_dir()); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
363 vars = tern_insert_ptr(vars, "EXEDIR", get_exe_dir()); |
1850
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
364 vars = tern_insert_ptr(vars, "USERDATA", (char *)get_userdata_dir()); |
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
365 vars = tern_insert_ptr(vars, "ROMNAME", media->name); |
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
366 vars = tern_insert_ptr(vars, "ROMDIR", media->dir); |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
367 screenshot_base = replace_vars(screenshot_base, vars, 1); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
368 tern_free(vars); |
1850
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
369 ensure_dir_exists(screenshot_base); |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
370 time_t now = time(NULL); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
371 struct tm local_store; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
372 char fname_part[256]; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
373 char *template = tern_find_path(config, "ui\0screenshot_template\0", TVAL_PTR).ptrval; |
1850
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
374 if (template) { |
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
375 vars = tern_insert_ptr(NULL, "ROMNAME", media->name); |
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
376 template = replace_vars(template, vars, 0); |
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
377 } else { |
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
378 template = strdup("blastem_%c.ppm"); |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
379 } |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
380 strftime(fname_part, sizeof(fname_part), template, localtime_r(&now, &local_store)); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
381 char const *parts[] = {screenshot_base, PATH_SEP, fname_part}; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
382 char *path = alloc_concat_m(3, parts); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
383 free(screenshot_base); |
1850
30f2821ffd65
Allow rom directory and rom name in screenshot path. Allow rom name in screenshot name. Remove ability for path variables to contain underscores
Michael Pavone <pavone@retrodev.com>
parents:
1839
diff
changeset
|
384 free(template); |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
385 render_save_screenshot(path); |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
386 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
387 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
388 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
389 case UI_EXIT: |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
390 #ifndef DISABLE_NUKLEAR |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
391 if (is_nuklear_active()) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
392 show_pause_menu(); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
393 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
394 #endif |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
395 current_system->request_exit(current_system); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
396 if (current_system->type == SYSTEM_GENESIS) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
397 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
|
398 if (gen->extra) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
399 //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
|
400 menu_context *menu = gen->extra; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
401 menu->external_game_load = 1; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
402 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
403 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
404 #ifndef DISABLE_NUKLEAR |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
405 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
406 #endif |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
407 break; |
1638
f27142c48567
Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents:
1634
diff
changeset
|
408 case UI_PLANE_DEBUG: |
f27142c48567
Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents:
1634
diff
changeset
|
409 case UI_VRAM_DEBUG: |
1641
bc9bb4e5856f
Basic version of layer compositing debug view in a separate window
Michael Pavone <pavone@retrodev.com>
parents:
1638
diff
changeset
|
410 case UI_CRAM_DEBUG: |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
411 case UI_COMPOSITE_DEBUG: |
1680
326d1a601fb9
Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents:
1679
diff
changeset
|
412 if (allow_content_binds) { |
1672
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
413 vdp_context *vdp = NULL; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
414 if (current_system->type == SYSTEM_GENESIS) { |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
415 genesis_context *gen = (genesis_context *)current_system; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
416 vdp = gen->vdp; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
417 } else if (current_system->type == SYSTEM_SMS) { |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
418 sms_context *sms = (sms_context *)current_system; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
419 vdp = sms->vdp; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
420 } |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
421 if (vdp) { |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
422 uint8_t debug_type; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
423 switch(binding->subtype_a) |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
424 { |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
425 case UI_PLANE_DEBUG: debug_type = VDP_DEBUG_PLANE; break; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
426 case UI_VRAM_DEBUG: debug_type = VDP_DEBUG_VRAM; break; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
427 case UI_CRAM_DEBUG: debug_type = VDP_DEBUG_CRAM; break; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
428 case UI_COMPOSITE_DEBUG: debug_type = VDP_DEBUG_COMPOSITE; break; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
429 default: return; |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
430 } |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
431 vdp_toggle_debug_view(vdp, debug_type); |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
432 } |
12d0c7c4ad80
Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
433 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
|
434 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
435 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
436 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
437 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
438 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
439 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
440 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
|
441 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
442 int bucket = keycode >> 15 & 0xFFFF; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
443 int idx = keycode & 0x7FFF; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
444 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
|
445 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
|
446 handle_binding_up(binding); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
447 } 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
|
448 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
|
449 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
450 } |
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_joyup(int joystick, int button) |
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 || button >= joysticks[joystick].num_buttons) { |
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 keybinding * binding = joysticks[joystick].buttons + button; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
458 handle_binding_up(binding); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
459 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
460 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
461 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
|
462 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
463 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
|
464 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
465 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
466 joydpad * dpad = joysticks[joystick].dpads + dpadnum; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
467 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
|
468 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
|
469 dpad->state = value; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
470 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
|
471 if (newdown & dpadbits[i]) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
472 handle_binding_down(dpad->bindings + i); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
473 } else if(newup & dpadbits[i]) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
474 handle_binding_up(dpad->bindings + i); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
475 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
476 } |
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 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
479 #define JOY_AXIS_THRESHOLD 2000 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
480 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
481 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
|
482 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
483 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
|
484 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
485 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
486 joyaxis *jaxis = joysticks[joystick].axes + axis; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
487 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
|
488 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
|
489 int old_pos = jaxis->value > 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
490 int new_pos = value > 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
491 jaxis->value = value; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
492 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
|
493 //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
|
494 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
|
495 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
496 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
|
497 //previously unactivated direction is now active |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
498 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
|
499 } |
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 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
502 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
|
503 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
504 if (mouse >= MAX_MICE || !current_system) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
505 return; |
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 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
|
508 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
|
509 switch(mouse_mode) |
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 case MOUSE_NONE: |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
512 break; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
513 case MOUSE_ABSOLUTE: { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
514 if (current_system->mouse_motion_absolute) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
515 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
|
516 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
|
517 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
|
518 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
|
519 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
520 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
|
521 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
522 break; |
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 case MOUSE_RELATIVE: { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
525 if (current_system->mouse_motion_relative) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
526 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
|
527 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
528 break; |
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 case MOUSE_CAPTURE: { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
531 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
|
532 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
|
533 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
534 break; |
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 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
537 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
538 handle_binding_up(&mice[mouse].motion); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
539 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
540 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
541 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
542 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
|
543 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
544 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
|
545 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
546 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
547 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
|
548 handle_binding_up(binding); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
549 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
550 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
551 void bindings_release_capture(void) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
552 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
553 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
|
554 render_relative_mouse(0); |
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 keyboard_captured = 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
557 } |
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 void bindings_reacquire_capture(void) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
560 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
561 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
|
562 render_relative_mouse(1); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
563 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
564 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
565 |
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
|
566 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
|
567 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
568 const int gpadslen = strlen("gamepads."); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
569 const int mouselen = strlen("mouse."); |
1783 | 570 if (startswith(target, "gamepads.")) { |
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
|
571 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
|
572 if (padnum >= 1 && padnum <= 8) { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
573 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
|
574 if (button) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
575 *subtype_a = padnum; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
576 *subtype_b = button; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
577 return BIND_GAMEPAD; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
578 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
579 if (target[gpadslen+1]) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
580 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
|
581 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
582 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
|
583 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
584 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
585 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
586 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
|
587 } |
1783 | 588 } else if(startswith(target, "mouse.")) { |
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
|
589 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
|
590 if (mousenum >= 1 && mousenum <= 8) { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
591 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
|
592 if (button) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
593 *subtype_a = mousenum; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
594 *subtype_b = button; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
595 return BIND_MOUSE; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
596 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
597 if (target[mouselen+1]) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
598 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
|
599 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
600 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
|
601 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
602 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
603 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
604 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
|
605 } |
1783 | 606 } else if(startswith(target, "ui.")) { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
607 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
|
608 *subtype_a = UI_DEBUG_MODE_INC; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
609 } else if(!strcmp(target + 3, "vdp_debug_pal")) { |
1643
6909c5d0bbb5
Removed old VDP debug functionality
Michael Pavone <pavone@retrodev.com>
parents:
1641
diff
changeset
|
610 //legacy binding, ignore |
6909c5d0bbb5
Removed old VDP debug functionality
Michael Pavone <pavone@retrodev.com>
parents:
1641
diff
changeset
|
611 return 0; |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
612 } 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
|
613 *subtype_a = UI_ENTER_DEBUGGER; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
614 } 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
|
615 *subtype_a = UI_SAVE_STATE; |
1783 | 616 } else if(startswith(target + 3, "set_speed.")) { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
617 *subtype_a = UI_SET_SPEED; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
618 *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
|
619 } 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
|
620 *subtype_a = UI_NEXT_SPEED; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
621 } 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
|
622 *subtype_a = UI_PREV_SPEED; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
623 } 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
|
624 *subtype_a = UI_RELEASE_MOUSE; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
625 } 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
|
626 *subtype_a = UI_TOGGLE_KEYBOARD_CAPTURE; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
627 } 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
|
628 *subtype_a = UI_TOGGLE_FULLSCREEN; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
629 } 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
|
630 *subtype_a = UI_SOFT_RESET; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
631 } else if (!strcmp(target + 3, "reload")) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
632 *subtype_a = UI_RELOAD; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
633 } 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
|
634 *subtype_a = UI_SMS_PAUSE; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
635 } else if (!strcmp(target + 3, "screenshot")) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
636 *subtype_a = UI_SCREENSHOT; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
637 } else if(!strcmp(target + 3, "exit")) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
638 *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
|
639 } 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
|
640 *subtype_a = UI_PLANE_DEBUG; |
1634
e397766c3028
Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents:
1631
diff
changeset
|
641 } else if (!strcmp(target + 3, "vram_debug")) { |
e397766c3028
Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents:
1631
diff
changeset
|
642 *subtype_a = UI_VRAM_DEBUG; |
1638
f27142c48567
Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents:
1634
diff
changeset
|
643 } else if (!strcmp(target + 3, "cram_debug")) { |
f27142c48567
Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents:
1634
diff
changeset
|
644 *subtype_a = UI_CRAM_DEBUG; |
1641
bc9bb4e5856f
Basic version of layer compositing debug view in a separate window
Michael Pavone <pavone@retrodev.com>
parents:
1638
diff
changeset
|
645 } else if (!strcmp(target + 3, "compositing_debug")) { |
bc9bb4e5856f
Basic version of layer compositing debug view in a separate window
Michael Pavone <pavone@retrodev.com>
parents:
1638
diff
changeset
|
646 *subtype_a = UI_COMPOSITE_DEBUG; |
1638
f27142c48567
Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents:
1634
diff
changeset
|
647 } else { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
648 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
|
649 return 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 return BIND_UI; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
652 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
653 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
|
654 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
655 return 0; |
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 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
658 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
|
659 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
660 char * curstr = NULL; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
661 int len; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
662 if (!cur) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
663 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
664 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
665 char onec[2]; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
666 if (prefix) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
667 len = strlen(prefix); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
668 curstr = malloc(len + 2); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
669 memcpy(curstr, prefix, len); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
670 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
671 curstr = onec; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
672 len = 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
673 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
674 curstr[len] = cur->el; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
675 curstr[len+1] = 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
676 if (cur->el) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
677 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
|
678 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
679 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
|
680 if (!keycode) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
681 keycode = curstr[0]; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
682 if (curstr[1] != 0) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
683 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
|
684 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
685 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
686 char * target = cur->straight.value.ptrval; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
687 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
|
688 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
|
689 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
|
690 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
691 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
|
692 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
|
693 if (curstr && len) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
694 free(curstr); |
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 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
697 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
698 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
|
699 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
700 char * curstr = NULL; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
701 int len; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
702 if (!cur) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
703 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
704 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
705 char onec[2]; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
706 if (prefix) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
707 len = strlen(prefix); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
708 curstr = malloc(len + 2); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
709 memcpy(curstr, prefix, len); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
710 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
711 curstr = onec; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
712 len = 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
713 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
714 curstr[len] = cur->el; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
715 curstr[len+1] = 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
716 if (cur->el) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
717 process_speeds(cur->straight.next, curstr); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
718 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
719 char *end; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
720 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
|
721 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
|
722 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
|
723 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
724 if (speed_index >= num_speeds) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
725 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
|
726 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
|
727 speeds[num_speeds] = 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
728 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
729 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
730 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
|
731 if (speeds[speed_index] < 1) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
732 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
|
733 speeds[speed_index] = 100; |
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 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
737 process_speeds(cur->left, prefix); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
738 process_speeds(cur->right, prefix); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
739 if (curstr && len) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
740 free(curstr); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
741 } |
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 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
744 typedef struct { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
745 tern_node *padbuttons; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
746 tern_node *mousebuttons; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
747 int mouseidx; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
748 } pmb_state; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
749 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
750 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
|
751 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
752 pmb_state *state = data; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
753 int buttonnum = atoi(buttonstr); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
754 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
|
755 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
|
756 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
757 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
758 if (valtype != TVAL_PTR) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
759 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
|
760 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
761 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
762 buttonnum--; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
763 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
|
764 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
|
765 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
|
766 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
|
767 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
|
768 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
769 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
770 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
|
771 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
772 tern_node **buttonmaps = data; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
773 if (valtype != TVAL_NODE) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
774 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
|
775 return; |
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 tern_node *mousedef = value.ptrval; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
778 tern_node *padbuttons = buttonmaps[0]; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
779 tern_node *mousebuttons = buttonmaps[1]; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
780 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
781 int mouseidx = atoi(mousenum); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
782 if (mouseidx < 0 || mouseidx >= MAX_MICE) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
783 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
|
784 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
785 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
786 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
|
787 if (motion) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
788 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
|
789 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
|
790 mice[mouseidx].motion.bind_type = bindtype; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
791 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
|
792 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
|
793 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
794 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
|
795 if (buttons) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
796 pmb_state state = {padbuttons, mousebuttons, mouseidx}; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
797 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
|
798 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
799 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
800 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
801 typedef struct { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
802 int padnum; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
803 tern_node *padbuttons; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
804 tern_node *mousebuttons; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
805 } pad_button_state; |
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 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
808 static long map_warning_pad = -1; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
809 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
|
810 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
811 pad_button_state *state = data; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
812 int hostpadnum = state->padnum; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
813 if (valtype != TVAL_PTR) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
814 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
|
815 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
816 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
817 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
|
818 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
|
819 char *end; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
820 long hostbutton = strtol(key, &end, 10); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
821 if (*end) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
822 //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
|
823 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
|
824 if (hostbutton < 0) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
825 if (hostbutton == RENDER_INVALID_NAME) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
826 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
|
827 } else if (hostbutton == RENDER_NOT_MAPPED && hostpadnum != map_warning_pad) { |
1839
78abbabfd58d
Get Android build working again and update for SDL 2.0.7 (last version to support older versions of Android)
Michael Pavone <pavone@retrodev.com>
parents:
1804
diff
changeset
|
828 debug_message("No SDL 2 mapping exists for input %s on gamepad %d\n", key, hostpadnum); |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
829 map_warning_pad = 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 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
832 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
833 if (hostbutton & RENDER_DPAD_BIT) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
834 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
|
835 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
836 } else if (hostbutton & RENDER_AXIS_BIT) { |
1804
34370330eaf3
Support controllers that have their dpad mapped to an axis
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
837 bind_axis(hostpadnum, render_axis_part(hostbutton), hostbutton & RENDER_AXIS_POS, bindtype, subtype_a, subtype_b); |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
838 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
839 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
840 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
841 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
|
842 } |
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 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
|
845 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
846 key = strdup(key); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
847 pad_button_state *state = data; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
848 int hostpadnum = state->padnum; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
849 if (valtype != TVAL_PTR) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
850 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
|
851 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
852 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
853 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
|
854 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
|
855 char *modifier = strchr(key, '.'); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
856 int positive = 1; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
857 if (modifier) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
858 *modifier = 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
859 modifier++; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
860 if (!strcmp("negative", modifier)) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
861 positive = 0; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
862 } else if(strcmp("positive", modifier)) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
863 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
|
864 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
865 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
866 char *end; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
867 long axis = strtol(key, &end, 10); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
868 if (*end) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
869 //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
|
870 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
|
871 if (axis < 0) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
872 if (axis == RENDER_INVALID_NAME) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
873 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
|
874 } else if (axis == RENDER_NOT_MAPPED && hostpadnum != map_warning_pad) { |
1839
78abbabfd58d
Get Android build working again and update for SDL 2.0.7 (last version to support older versions of Android)
Michael Pavone <pavone@retrodev.com>
parents:
1804
diff
changeset
|
875 debug_message("No SDL 2 mapping exists for input %s on gamepad %d\n", key, hostpadnum); |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
876 map_warning_pad = hostpadnum; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
877 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
878 goto done; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
879 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
880 if (axis & RENDER_DPAD_BIT) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
881 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
|
882 goto done; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
883 } else if (axis & RENDER_AXIS_BIT) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
884 axis = render_axis_part(axis); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
885 } else { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
886 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
|
887 goto done; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
888 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
889 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
890 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
|
891 done: |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
892 free(key); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
893 return; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
894 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
895 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
896 static tern_node *get_pad_buttons() |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
897 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
898 static tern_node *padbuttons; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
899 if (!padbuttons) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
900 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
|
901 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
|
902 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
|
903 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
|
904 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
|
905 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
|
906 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
|
907 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
|
908 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
|
909 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
|
910 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
|
911 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
|
912 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
913 return padbuttons; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
914 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
915 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
916 static tern_node *get_mouse_buttons() |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
917 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
918 static tern_node *mousebuttons; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
919 if (!mousebuttons) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
920 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
|
921 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
|
922 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
|
923 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
|
924 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
|
925 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
926 return mousebuttons; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
927 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
928 |
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
|
929 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
|
930 { |
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
|
931 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
|
932 return NULL; |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
933 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
934 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
|
935 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
|
936 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
|
937 } |
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 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
|
939 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
|
940 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
|
941 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
|
942 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
|
943 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
|
944 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
|
945 } |
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
|
946 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
|
947 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
|
948 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
|
949 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
|
950 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
|
951 } |
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 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
|
953 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
|
954 } |
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 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
|
956 } |
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 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
|
959 { |
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 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
|
961 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
|
962 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
|
963 } |
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 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
|
965 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
|
966 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
|
967 { |
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
|
968 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
|
969 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
|
970 char * dirs[] = {"up", "down", "left", "right"}; |
1679
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
971 char *render_dirs[] = {"dpup", "dpdown", "dpleft", "dpright"}; |
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
|
972 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
|
973 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
|
974 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
|
975 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
|
976 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
|
977 int bindtype = parse_binding_target(joystick, target, get_pad_buttons(), get_mouse_buttons(), &subtype_a, &subtype_b); |
1679
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
978 int32_t hostbutton = dpad >0 ? -1 : render_translate_input_name(joystick, render_dirs[dir], 0); |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
979 if (hostbutton < 0) { |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
980 //assume this is a raw dpad mapping |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
981 bind_dpad(joystick, dpad, dirnums[dir], bindtype, subtype_a, subtype_b); |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
982 } else if (hostbutton & RENDER_DPAD_BIT) { |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
983 bind_dpad(joystick, render_dpad_part(hostbutton), render_direction_part(hostbutton), bindtype, subtype_a, subtype_b); |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
984 } else if (hostbutton & RENDER_AXIS_BIT) { |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
985 //SDL2 knows internally whether this should be a positive or negative binding, but doesn't expose that externally |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
986 //for now I'll just assume that any controller with axes for a d-pad has these mapped the "sane" way |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
987 bind_axis(joystick, render_axis_part(hostbutton), dir == 1 || dir == 3 ? 1 : 0, bindtype, subtype_a, subtype_b); |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
988 } else { |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
989 bind_button(joystick, hostbutton, bindtype, subtype_a, subtype_b); |
deaf31803b11
Add code to handle controllers that have their d-pads mapped as buttons or axes
Michael Pavone <pavone@retrodev.com>
parents:
1672
diff
changeset
|
990 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
991 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
992 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
993 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
994 } |
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
|
995 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
|
996 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
|
997 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
|
998 .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
|
999 .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
|
1000 .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
|
1001 }; |
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
|
1002 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
|
1003 } |
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
|
1004 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
|
1005 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
|
1006 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
|
1007 .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
|
1008 .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
|
1009 .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
|
1010 }; |
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
|
1011 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
|
1012 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1013 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1014 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1015 //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
|
1016 void set_bindings(void) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1017 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1018 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
|
1019 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
|
1020 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
|
1021 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
|
1022 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
|
1023 special = tern_insert_int(special, "space", ' '); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1024 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
|
1025 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
|
1026 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
|
1027 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
|
1028 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
|
1029 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
|
1030 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
|
1031 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
|
1032 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
|
1033 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
|
1034 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
|
1035 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
|
1036 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
|
1037 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
|
1038 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
|
1039 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
|
1040 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
|
1041 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
|
1042 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
|
1043 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
|
1044 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
|
1045 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
|
1046 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
|
1047 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
|
1048 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
|
1049 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
|
1050 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
|
1051 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
|
1052 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
|
1053 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
|
1054 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
|
1055 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
|
1056 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
|
1057 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
|
1058 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
|
1059 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
|
1060 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
|
1061 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
|
1062 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
|
1063 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
|
1064 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
|
1065 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
|
1066 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
|
1067 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
|
1068 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
|
1069 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
|
1070 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1071 tern_node *padbuttons = get_pad_buttons(); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1072 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1073 tern_node *mousebuttons = get_mouse_buttons(); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1074 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1075 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
|
1076 process_keys(keys, special, padbuttons, mousebuttons, NULL); |
1587
ea687ca7d845
Fix missing include in bindings.c
Michael Pavone <pavone@retrodev.com>
parents:
1583
diff
changeset
|
1077 tern_free(special); |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1078 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1079 memset(mice, 0, sizeof(mice)); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1080 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
|
1081 if (mice) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1082 tern_node *buttonmaps[2] = {padbuttons, mousebuttons}; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1083 tern_foreach(mice, process_mouse, buttonmaps); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1084 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1085 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
|
1086 speeds = malloc(sizeof(uint32_t)); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1087 speeds[0] = 100; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1088 process_speeds(speed_nodes, NULL); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1089 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
|
1090 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1091 if (!speeds[i]) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1092 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
|
1093 speeds[i] = 100; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1094 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1095 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1096 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1097 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1098 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
|
1099 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1100 mouse_mode = mode; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1101 if (mode == MOUSE_RELATIVE) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1102 render_relative_mouse(1); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1103 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1104 } |