annotate bindings.c @ 1971:80920c21bb52

Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
author Michael Pavone <pavone@retrodev.com>
date Fri, 08 May 2020 11:40:30 -0700
parents 508522f08e4d
children 81df9aa2de9b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1587
ea687ca7d845 Fix missing include in bindings.c
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1 #include <string.h>
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1680
diff changeset
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,
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
39 UI_VGM_LOG,
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
40 UI_EXIT,
1634
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
41 UI_PLANE_DEBUG,
1638
f27142c48567 Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents: 1634
diff changeset
42 UI_VRAM_DEBUG,
f27142c48567 Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents: 1634
diff changeset
43 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
44 UI_COMPOSITE_DEBUG
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 } ui_action;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 uint8_t bind_type;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 uint8_t subtype_a;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 uint8_t subtype_b;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 } keybinding;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 keybinding bindings[4];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 uint8_t state;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 } joydpad;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 keybinding positive;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 keybinding negative;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 int16_t value;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 } joyaxis;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 keybinding *buttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 joydpad *dpads;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 joyaxis *axes;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 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
69 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
70 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
71 } joystick;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 keybinding buttons[MAX_MOUSE_BUTTONS];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 keybinding motion;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 } mousebinding;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 #define DEFAULT_JOYBUTTON_ALLOC 12
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 static keybinding *bindings[0x10000];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 static joystick joysticks[MAX_JOYSTICKS];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 static mousebinding mice[MAX_MICE];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 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
83
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 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
85 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 binding->bind_type = bind_type;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 binding->subtype_a = subtype_a;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 binding->subtype_b = subtype_b;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 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
92 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 int bucket = keycode >> 15 & 0xFFFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 if (!bindings[bucket]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 bindings[bucket] = malloc(sizeof(keybinding) * 0x8000);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 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
97 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 int idx = keycode & 0x7FFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 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
100 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 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
103 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 if (!joysticks[joystick].buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 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
109 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
110 } 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
111 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
112 joysticks[joystick].num_buttons *= 2;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113 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
114 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
115 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 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
117 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 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
120 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 if (!joysticks[joystick].dpads) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 //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
126 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
127 joysticks[joystick].num_dpads = dpad+1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 } 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
129 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
130 joysticks[joystick].num_dpads *= 2;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 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
132 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
133 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 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
135 if (dpadbits[i] & direction) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 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
137 break;
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
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 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
143 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 if (!joysticks[joystick].axes) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 //typical gamepad has 4 axes
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 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
150 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
151 } 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
152 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
153 joysticks[joystick].num_axes *= 2;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 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
155 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
156 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 if (positive) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 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
159 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 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
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
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 void reset_joystick_bindings(int joystick)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 if (joysticks[joystick].buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 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
171 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 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
173 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 if (joysticks[joystick].dpads) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 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
177 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 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
179 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 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
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 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 if (joysticks[joystick].axes) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 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
186 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 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
188 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
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 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
192
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
193 static uint8_t content_binds_enabled = 1;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
194 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
195 {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
196 content_binds_enabled = enabled;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
197 }
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
198
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 void handle_binding_down(keybinding * binding)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 if (!current_system) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204 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
205 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 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
207 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 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
209 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 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
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
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 static uint8_t keyboard_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 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
216 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217 int bucket = keycode >> 15 & 0xFFFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 int idx = keycode & 0x7FFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 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
220 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
221 handle_binding_down(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 } 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
223 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
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
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 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
228 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 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
230 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 keybinding * binding = joysticks[joystick].buttons + button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 handle_binding_down(binding);
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
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
236 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
237 static uint8_t mouse_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
238 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
239 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 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
241 mouse_captured = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 render_relative_mouse(1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
245 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
246 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
247 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 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
249 handle_binding_down(binding);
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
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
252 static int current_speed = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 static int num_speeds = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254 static uint32_t * speeds = NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
255
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
256 static uint8_t mouse_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
258 #ifdef _WIN32
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259 #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
260 #endif
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
262 char *get_content_config_path(char *config_path, char *config_template, char *default_name)
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
263 {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
264 char *base = tern_find_path(config, config_path, TVAL_PTR).ptrval;
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
265 if (!base) {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
266 base = "$HOME";
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
267 }
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
268 const system_media *media = current_media();
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
269 tern_node *vars = tern_insert_ptr(NULL, "HOME", get_home_dir());
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
270 vars = tern_insert_ptr(vars, "EXEDIR", get_exe_dir());
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
271 vars = tern_insert_ptr(vars, "USERDATA", (char *)get_userdata_dir());
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
272 vars = tern_insert_ptr(vars, "ROMNAME", media->name);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
273 vars = tern_insert_ptr(vars, "ROMDIR", media->dir);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
274 base = replace_vars(base, vars, 1);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
275 tern_free(vars);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
276 ensure_dir_exists(base);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
277 time_t now = time(NULL);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
278 struct tm local_store;
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
279 char fname_part[256];
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
280 char *template = tern_find_path(config, config_template, TVAL_PTR).ptrval;
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
281 if (template) {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
282 vars = tern_insert_ptr(NULL, "ROMNAME", media->name);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
283 template = replace_vars(template, vars, 0);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
284 } else {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
285 template = strdup(default_name);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
286 }
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
287 strftime(fname_part, sizeof(fname_part), template, localtime_r(&now, &local_store));
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
288 char const *parts[] = {base, PATH_SEP, fname_part};
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
289 char *path = alloc_concat_m(3, parts);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
290 free(base);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
291 free(template);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
292 return path;
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
293 }
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
294
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 void handle_binding_up(keybinding * binding)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296 {
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
297 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
298 switch(binding->bind_type)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
299 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
300 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
301 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
302 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
303 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
305 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
306 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
307 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
308 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310 case BIND_UI:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
311 switch (binding->subtype_a)
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 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
314 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
315 current_system->inc_debug_mode(current_system);
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
316 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
318 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
319 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
320 current_system->enter_debugger = 1;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
321 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 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
324 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
325 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
326 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
327 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328 case UI_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
329 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
330 current_speed++;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
331 if (current_speed >= num_speeds) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
332 current_speed = 0;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
333 }
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
334 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
335 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
336 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
337 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
338 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
339 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
340 current_speed--;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
341 if (current_speed < 0) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
342 current_speed = num_speeds - 1;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
343 }
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
344 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
345 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
346 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
347 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
348 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
349 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
350 if (binding->subtype_b < num_speeds) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
351 current_speed = binding->subtype_b;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
352 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
353 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
354 } else {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
355 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
356 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
357 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
358 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
359 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
360 case UI_RELEASE_MOUSE:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
361 if (mouse_captured) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
362 mouse_captured = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
363 render_relative_mouse(0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
364 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
365 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
366 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
367 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
368 keyboard_captured = !keyboard_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
369 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
370 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
371 case UI_TOGGLE_FULLSCREEN:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
372 render_toggle_fullscreen();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
373 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
374 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
375 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
376 current_system->soft_reset(current_system);
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
377 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
378 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
379 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
380 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
381 reload_media();
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
382 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
383 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
384 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
385 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
386 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
387 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
388 break;
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
389 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
390 if (allow_content_binds) {
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
391 char *path = get_content_config_path("ui\0screenshot_path\0", "ui\0screenshot_template\0", "blastem_%c.ppm");
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
392 render_save_screenshot(path);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
393 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
394 break;
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
395 case UI_VGM_LOG:
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
396 if (allow_content_binds && current_system->start_vgm_log) {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
397 if (current_system->vgm_logging) {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
398 current_system->stop_vgm_log(current_system);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
399 } else {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
400 char *path = get_content_config_path("ui\0vgm_path\0", "ui\0vgm_template\0", "blastem_%c.vgm");
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
401 current_system->start_vgm_log(current_system, path);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
402 free(path);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
403 }
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
404 }
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
405 break;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
406 case UI_EXIT:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
407 #ifndef DISABLE_NUKLEAR
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
408 if (is_nuklear_active()) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
409 show_pause_menu();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
410 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
411 #endif
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
412 current_system->request_exit(current_system);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
413 if (current_system->type == SYSTEM_GENESIS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
414 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
415 if (gen->extra) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
416 //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
417 menu_context *menu = gen->extra;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
418 menu->external_game_load = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
419 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
420 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
421 #ifndef DISABLE_NUKLEAR
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
422 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
423 #endif
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
424 break;
1638
f27142c48567 Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents: 1634
diff changeset
425 case UI_PLANE_DEBUG:
f27142c48567 Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents: 1634
diff changeset
426 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
427 case UI_CRAM_DEBUG:
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
428 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
429 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
430 vdp_context *vdp = NULL;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
431 if (current_system->type == SYSTEM_GENESIS) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
432 genesis_context *gen = (genesis_context *)current_system;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
433 vdp = gen->vdp;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
434 } else if (current_system->type == SYSTEM_SMS) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
435 sms_context *sms = (sms_context *)current_system;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
436 vdp = sms->vdp;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
437 }
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
438 if (vdp) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
439 uint8_t debug_type;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
440 switch(binding->subtype_a)
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
441 {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
442 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
443 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
444 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
445 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
446 default: return;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
447 }
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
448 vdp_toggle_debug_view(vdp, debug_type);
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
449 }
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
450 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
451 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
452 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
453 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
454 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 }
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 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
458 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
459 int bucket = keycode >> 15 & 0xFFFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
460 int idx = keycode & 0x7FFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
461 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
462 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
463 handle_binding_up(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
464 } 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
465 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
466 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
467 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
468
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
469 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
470 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
471 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
472 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
473 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
474 keybinding * binding = joysticks[joystick].buttons + button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
475 handle_binding_up(binding);
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 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
479 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
480 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
481 return;
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 joydpad * dpad = joysticks[joystick].dpads + dpadnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
484 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
485 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
486 dpad->state = value;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
487 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
488 if (newdown & dpadbits[i]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
489 handle_binding_down(dpad->bindings + i);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
490 } else if(newup & dpadbits[i]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
491 handle_binding_up(dpad->bindings + i);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
492 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
493 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
494 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
495
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
496 #define JOY_AXIS_THRESHOLD 2000
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
497
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
498 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
499 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
500 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
501 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
502 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
503 joyaxis *jaxis = joysticks[joystick].axes + axis;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
504 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
505 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
506 int old_pos = jaxis->value > 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
507 int new_pos = value > 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
508 jaxis->value = value;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
509 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
510 //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
511 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
512 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
513 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
514 //previously unactivated direction is now active
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
515 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
516 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
517 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
518
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
519 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
520 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
521 if (mouse >= MAX_MICE || !current_system) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
522 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
523 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
524 if (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
525 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
526 switch(mouse_mode)
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 case MOUSE_NONE:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
529 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
530 case MOUSE_ABSOLUTE: {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
531 if (current_system->mouse_motion_absolute) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
532 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
533 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
534 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
535 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
536
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
537 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
538 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
539 break;
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 case MOUSE_RELATIVE: {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
542 if (current_system->mouse_motion_relative) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
543 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
544 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
545 break;
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 case MOUSE_CAPTURE: {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
548 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
549 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
550 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
551 break;
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 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
554 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
555 handle_binding_up(&mice[mouse].motion);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
556 }
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 handle_mouseup(int mouse, int button)
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 >= 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
562 return;
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 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
565 handle_binding_up(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
566 }
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 void bindings_release_capture(void)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
569 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
570 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
571 render_relative_mouse(0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
572 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
573 keyboard_captured = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
574 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
575
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
576 void bindings_reacquire_capture(void)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
577 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
578 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
579 render_relative_mouse(1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
580 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
581 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
582
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
583 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
584 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
585 const int gpadslen = strlen("gamepads.");
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
586 const int mouselen = strlen("mouse.");
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1680
diff changeset
587 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
588 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
589 if (padnum >= 1 && padnum <= 8) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
590 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
591 if (button) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
592 *subtype_a = padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
593 *subtype_b = button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
594 return BIND_GAMEPAD;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
595 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
596 if (target[gpadslen+1]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
597 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
598 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
599 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
600 }
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 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
603 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
604 }
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1680
diff changeset
605 } 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
606 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
607 if (mousenum >= 1 && mousenum <= 8) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
608 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
609 if (button) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
610 *subtype_a = mousenum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
611 *subtype_b = button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
612 return BIND_MOUSE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
613 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
614 if (target[mouselen+1]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
615 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
616 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
617 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
618 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
619 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
620 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
621 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
622 }
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1680
diff changeset
623 } else if(startswith(target, "ui.")) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
624 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
625 *subtype_a = UI_DEBUG_MODE_INC;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
626 } else if(!strcmp(target + 3, "vdp_debug_pal")) {
1643
6909c5d0bbb5 Removed old VDP debug functionality
Michael Pavone <pavone@retrodev.com>
parents: 1641
diff changeset
627 //legacy binding, ignore
6909c5d0bbb5 Removed old VDP debug functionality
Michael Pavone <pavone@retrodev.com>
parents: 1641
diff changeset
628 return 0;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
629 } 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
630 *subtype_a = UI_ENTER_DEBUGGER;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
631 } 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
632 *subtype_a = UI_SAVE_STATE;
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1680
diff changeset
633 } 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
634 *subtype_a = UI_SET_SPEED;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
635 *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
636 } 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
637 *subtype_a = UI_NEXT_SPEED;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
638 } 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
639 *subtype_a = UI_PREV_SPEED;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
640 } 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
641 *subtype_a = UI_RELEASE_MOUSE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
642 } 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
643 *subtype_a = UI_TOGGLE_KEYBOARD_CAPTURE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
644 } 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
645 *subtype_a = UI_TOGGLE_FULLSCREEN;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
646 } 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
647 *subtype_a = UI_SOFT_RESET;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
648 } else if (!strcmp(target + 3, "reload")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
649 *subtype_a = UI_RELOAD;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
650 } 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
651 *subtype_a = UI_SMS_PAUSE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
652 } else if (!strcmp(target + 3, "screenshot")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
653 *subtype_a = UI_SCREENSHOT;
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
654 } else if (!strcmp(target + 3, "vgm_log")) {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
655 *subtype_a = UI_VGM_LOG;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
656 } else if(!strcmp(target + 3, "exit")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
657 *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
658 } 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
659 *subtype_a = UI_PLANE_DEBUG;
1634
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
660 } else if (!strcmp(target + 3, "vram_debug")) {
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
661 *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
662 } 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
663 *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
664 } 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
665 *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
666 } else {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
667 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
668 return 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
669 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
670 return BIND_UI;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
671 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
672 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
673 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
674 return 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
675 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
676
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
677 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
678 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
679 char * curstr = NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
680 int len;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
681 if (!cur) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
682 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
683 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
684 char onec[2];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
685 if (prefix) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
686 len = strlen(prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
687 curstr = malloc(len + 2);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
688 memcpy(curstr, prefix, len);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
689 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
690 curstr = onec;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
691 len = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
692 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
693 curstr[len] = cur->el;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
694 curstr[len+1] = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
695 if (cur->el) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
696 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
697 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
698 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
699 if (!keycode) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
700 keycode = curstr[0];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
701 if (curstr[1] != 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
702 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
703 }
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 * target = cur->straight.value.ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
706 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
707 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
708 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
709 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
710 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
711 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
712 if (curstr && len) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
713 free(curstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
714 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
715 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
716
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
717 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
718 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
719 char * curstr = NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
720 int len;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
721 if (!cur) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
722 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
723 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
724 char onec[2];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
725 if (prefix) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
726 len = strlen(prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
727 curstr = malloc(len + 2);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
728 memcpy(curstr, prefix, len);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
729 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
730 curstr = onec;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
731 len = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
732 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
733 curstr[len] = cur->el;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
734 curstr[len+1] = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
735 if (cur->el) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
736 process_speeds(cur->straight.next, curstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
737 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
738 char *end;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
739 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
740 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
741 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
742 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
743 if (speed_index >= num_speeds) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
744 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
745 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
746 speeds[num_speeds] = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
747 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
748 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
749 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
750 if (speeds[speed_index] < 1) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
751 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
752 speeds[speed_index] = 100;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
753 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
754 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
755 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
756 process_speeds(cur->left, prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
757 process_speeds(cur->right, prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
758 if (curstr && len) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
759 free(curstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
760 }
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
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
763 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
764 tern_node *padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
765 tern_node *mousebuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
766 int mouseidx;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
767 } pmb_state;
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 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
770 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
771 pmb_state *state = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
772 int buttonnum = atoi(buttonstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
773 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
774 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
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 if (valtype != TVAL_PTR) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
778 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
779 return;
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 buttonnum--;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
782 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
783 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
784 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
785 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
786 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
787 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
788
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
789 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
790 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
791 tern_node **buttonmaps = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
792 if (valtype != TVAL_NODE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
793 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
794 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
795 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
796 tern_node *mousedef = value.ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
797 tern_node *padbuttons = buttonmaps[0];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
798 tern_node *mousebuttons = buttonmaps[1];
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 int mouseidx = atoi(mousenum);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
801 if (mouseidx < 0 || mouseidx >= MAX_MICE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
802 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
803 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
804 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
805 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
806 if (motion) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
807 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
808 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
809 mice[mouseidx].motion.bind_type = bindtype;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
810 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
811 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
812 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
813 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
814 if (buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
815 pmb_state state = {padbuttons, mousebuttons, mouseidx};
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
816 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
817 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
818 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
819
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
820 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
821 int padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
822 tern_node *padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
823 tern_node *mousebuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
824 } pad_button_state;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
825
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
826
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
827 static long map_warning_pad = -1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
828 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
829 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
830 pad_button_state *state = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
831 int hostpadnum = state->padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
832 if (valtype != TVAL_PTR) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
833 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
834 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
835 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
836 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
837 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
838 char *end;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
839 long hostbutton = strtol(key, &end, 10);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
840 if (*end) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
841 //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
842 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
843 if (hostbutton < 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
844 if (hostbutton == RENDER_INVALID_NAME) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
845 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
846 } 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
847 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
848 map_warning_pad = hostpadnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
849 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
850 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
851 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
852 if (hostbutton & RENDER_DPAD_BIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
853 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
854 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
855 } 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
856 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
857 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
858 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
859 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
860 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
861 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
862
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
863 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
864 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
865 key = strdup(key);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
866 pad_button_state *state = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
867 int hostpadnum = state->padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
868 if (valtype != TVAL_PTR) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
869 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
870 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
871 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
872 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
873 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
874 char *modifier = strchr(key, '.');
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
875 int positive = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
876 if (modifier) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
877 *modifier = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
878 modifier++;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
879 if (!strcmp("negative", modifier)) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
880 positive = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
881 } else if(strcmp("positive", modifier)) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
882 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
883 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
884 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
885 char *end;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
886 long axis = strtol(key, &end, 10);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
887 if (*end) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
888 //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
889 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
890 if (axis < 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
891 if (axis == RENDER_INVALID_NAME) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
892 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
893 } 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
894 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
895 map_warning_pad = hostpadnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
896 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
897 goto done;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
898 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
899 if (axis & RENDER_DPAD_BIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
900 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
901 goto done;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
902 } else if (axis & RENDER_AXIS_BIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
903 axis = render_axis_part(axis);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
904 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
905 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
906 goto done;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
907 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
908 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
909 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
910 done:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
911 free(key);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
912 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
913 }
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 static tern_node *get_pad_buttons()
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
916 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
917 static tern_node *padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
918 if (!padbuttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
919 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
920 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
921 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
922 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
923 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
924 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
925 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
926 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
927 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
928 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
929 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
930 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
931 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
932 return padbuttons;
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
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
935 static tern_node *get_mouse_buttons()
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
936 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
937 static tern_node *mousebuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
938 if (!mousebuttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
939 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
940 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
941 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
942 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
943 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
944 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
945 return mousebuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
946 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
947
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
948 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
949 {
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
950 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
951 return NULL;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
952 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
953 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
954 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
955 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
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 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
958 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
959 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
960 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
961 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
962 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
963 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
964 }
18a946ec74c8 Pull current controller config in binding UI from whatever the actual binding code would end up using
Michael Pavone <pavone@retrodev.com>
parents: 1608
diff changeset
965 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
966 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
967 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
968 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
969 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
970 }
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
971 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
972 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
973 }
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 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
975 }
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
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 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
978 {
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
979 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
980 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
981 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
982 }
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
983 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
984 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
985 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
986 {
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
987 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
988 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
989 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
990 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
991 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
992 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
993 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
994 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
995 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
996 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
997 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
998 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
999 //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
1000 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
1001 } 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
1002 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
1003 } 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
1004 //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
1005 //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
1006 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
1007 } 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
1008 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
1009 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1010 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1011 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1012 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1013 }
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
1014 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
1015 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
1016 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
1017 .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
1018 .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
1019 .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
1020 };
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
1021 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
1022 }
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
1023 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
1024 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
1025 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
1026 .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
1027 .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
1028 .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
1029 };
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
1030 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
1031 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1032 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1033
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1034 //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
1035 void set_bindings(void)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1036 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1037 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
1038 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
1039 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
1040 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
1041 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
1042 special = tern_insert_int(special, "space", ' ');
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1043 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
1044 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
1045 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
1046 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
1047 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
1048 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
1049 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
1050 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
1051 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
1052 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
1053 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
1054 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
1055 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
1056 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
1057 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
1058 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
1059 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
1060 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
1061 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
1062 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
1063 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
1064 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
1065 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
1066 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
1067 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
1068 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
1069 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
1070 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
1071 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
1072 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
1073 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
1074 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
1075 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
1076 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
1077 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
1078 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
1079 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
1080 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
1081 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
1082 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
1083 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
1084 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
1085 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
1086 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
1087 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
1088 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
1089
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1090 tern_node *padbuttons = get_pad_buttons();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1091
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1092 tern_node *mousebuttons = get_mouse_buttons();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1093
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1094 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
1095 process_keys(keys, special, padbuttons, mousebuttons, NULL);
1587
ea687ca7d845 Fix missing include in bindings.c
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1096 tern_free(special);
1583
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 memset(mice, 0, sizeof(mice));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1099 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
1100 if (mice) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1101 tern_node *buttonmaps[2] = {padbuttons, mousebuttons};
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1102 tern_foreach(mice, process_mouse, buttonmaps);
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 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
1105 speeds = malloc(sizeof(uint32_t));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1106 speeds[0] = 100;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1107 process_speeds(speed_nodes, NULL);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1108 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
1109 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1110 if (!speeds[i]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1111 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
1112 speeds[i] = 100;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1113 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1114 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1115 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1116
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1117 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
1118 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1119 mouse_mode = mode;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1120 if (mode == MOUSE_RELATIVE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1121 render_relative_mouse(1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1122 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1123 }