annotate bindings.c @ 2528:90a40be940f7

Implement read-only SC-3000 cassette support
author Michael Pavone <pavone@retrodev.com>
date Mon, 25 Nov 2024 22:26:45 -0800
parents f8ce89498e11
children f973651b48d7
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,
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
22 BIND_MOUSE,
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
23 BIND_CASSETTE
1583
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
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 typedef enum {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 UI_DEBUG_MODE_INC,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 UI_ENTER_DEBUGGER,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 UI_SAVE_STATE,
2162
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2083
diff changeset
30 UI_LOAD_STATE,
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 UI_SET_SPEED,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 UI_NEXT_SPEED,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 UI_PREV_SPEED,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 UI_RELEASE_MOUSE,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 UI_TOGGLE_KEYBOARD_CAPTURE,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 UI_TOGGLE_FULLSCREEN,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 UI_SOFT_RESET,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 UI_RELOAD,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 UI_SMS_PAUSE,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 UI_SCREENSHOT,
2295
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
41 UI_RECORD_VIDEO,
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
42 UI_VGM_LOG,
2306
62f316b76e9a Migrate ui.exit to ui.menu and create a new ui.exit for quitting
Michael Pavone <pavone@retrodev.com>
parents: 2304
diff changeset
43 UI_MENU,
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
44 UI_EXIT,
1634
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
45 UI_PLANE_DEBUG,
1638
f27142c48567 Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents: 1634
diff changeset
46 UI_VRAM_DEBUG,
f27142c48567 Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents: 1634
diff changeset
47 UI_CRAM_DEBUG,
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
48 UI_COMPOSITE_DEBUG,
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
49 UI_OSCILLOSCOPE_DEBUG,
2271
3ef80963c2a7 Fix stamp address mask and add WIP CD graphics debug view
Michael Pavone <pavone@retrodev.com>
parents: 2243
diff changeset
50 UI_CD_GRAPHICS_DEBUG
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 } ui_action;
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 uint8_t bind_type;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 uint8_t subtype_a;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 uint8_t subtype_b;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 } keybinding;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 keybinding bindings[4];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 uint8_t state;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 } joydpad;
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 positive;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 keybinding negative;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 int16_t value;
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
68 int16_t deadzone;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 } joyaxis;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 keybinding *buttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 joydpad *dpads;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 joyaxis *axes;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 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
76 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
77 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
78 } joystick;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 keybinding buttons[MAX_MOUSE_BUTTONS];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 keybinding motion;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 } mousebinding;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 #define DEFAULT_JOYBUTTON_ALLOC 12
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 static keybinding *bindings[0x10000];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 static joystick joysticks[MAX_JOYSTICKS];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 static mousebinding mice[MAX_MICE];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 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
90
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 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
92 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 binding->bind_type = bind_type;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 binding->subtype_a = subtype_a;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 binding->subtype_b = subtype_b;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 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
99 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 int bucket = keycode >> 15 & 0xFFFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 if (!bindings[bucket]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 bindings[bucket] = malloc(sizeof(keybinding) * 0x8000);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 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
104 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 int idx = keycode & 0x7FFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 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
107 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 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
110 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114 if (!joysticks[joystick].buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
115 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
116 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
117 } 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
118 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
119 joysticks[joystick].num_buttons *= 2;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120 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
121 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
122 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 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
124 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 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
127 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 if (!joysticks[joystick].dpads) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 //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
133 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
134 joysticks[joystick].num_dpads = dpad+1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 } 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
136 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
137 joysticks[joystick].num_dpads *= 2;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 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
139 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
140 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 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
142 if (dpadbits[i] & direction) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 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
144 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
149 void bind_axis(int joystick, int axis, int positive, int deadzone, uint8_t bind_type, 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
150 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 if (!joysticks[joystick].axes) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 //typical gamepad has 4 axes
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 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
157 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
158 } 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
159 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
160 joysticks[joystick].num_axes *= 2;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 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
162 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
163 }
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
164 joysticks[joystick].axes[axis].deadzone = deadzone;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 if (positive) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 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
167 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 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
169 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 void reset_joystick_bindings(int joystick)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 if (joystick >= MAX_JOYSTICKS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 if (joysticks[joystick].buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 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
179 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 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
181 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 if (joysticks[joystick].dpads) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 for (int i = 0; i < joysticks[joystick].num_dpads; i++)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 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
187 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 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
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 if (joysticks[joystick].axes) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 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
194 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 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
196 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
197 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
198 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
201 static uint8_t content_binds_enabled = 1;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
202 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
203 {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
204 content_binds_enabled = enabled;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
205 }
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
206
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207 void handle_binding_down(keybinding * binding)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 {
2291
4de40b13b55f Filter out "down" binds when content binds are disabled
Michael Pavone <pavone@retrodev.com>
parents: 2286
diff changeset
209 if (!current_system || !content_binds_enabled) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 return;
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 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
213 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 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
215 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 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
217 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 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
219 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 static uint8_t keyboard_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223 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
224 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 int bucket = keycode >> 15 & 0xFFFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226 int idx = keycode & 0x7FFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 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
228 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
229 handle_binding_down(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 } 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
231 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
232 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
234
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
235 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
236 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
237 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
238 return;
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 keybinding * binding = joysticks[joystick].buttons + button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 handle_binding_down(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 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
245 static uint8_t mouse_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
246 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
247 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 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
249 mouse_captured = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
250 render_relative_mouse(1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
251 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
252 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 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
254 return;
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 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
257 handle_binding_down(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
258 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
260 static int current_speed = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261 static int num_speeds = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
262 static uint32_t * speeds = NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
263
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
264 static uint8_t mouse_captured;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
266 #ifdef _WIN32
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 #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
268 #endif
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
270 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
271 {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
272 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
273 if (!base) {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
274 base = "$HOME";
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
275 }
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
276 const system_media *media = current_media();
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
277 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
278 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
279 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
280 vars = tern_insert_ptr(vars, "ROMNAME", media->name);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
281 vars = tern_insert_ptr(vars, "ROMDIR", media->dir);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
282 base = replace_vars(base, vars, 1);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
283 tern_free(vars);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
284 ensure_dir_exists(base);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
285 time_t now = time(NULL);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
286 struct tm local_store;
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
287 char fname_part[256];
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
288 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
289 if (template) {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
290 vars = tern_insert_ptr(NULL, "ROMNAME", media->name);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
291 template = replace_vars(template, vars, 0);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
292 } else {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
293 template = strdup(default_name);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
294 }
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
295 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
296 char const *parts[] = {base, PATH_SEP, fname_part};
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
297 char *path = alloc_concat_m(3, parts);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
298 free(base);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
299 free(template);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
300 return path;
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
301 }
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
302
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
303 void handle_binding_up(keybinding * binding)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304 {
1680
326d1a601fb9 Fixed crash bug that could occur in a narrow window of time when loading a ROM
Michael Pavone <pavone@retrodev.com>
parents: 1679
diff changeset
305 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
306 switch(binding->bind_type)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
307 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
308 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
309 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
310 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
311 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 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
314 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
315 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
316 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 break;
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
318 case BIND_CASSETTE:
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
319 if (allow_content_binds && current_system->cassette_action) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
320 current_system->cassette_action(current_system, binding->subtype_a);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
321 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
322 break;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 case BIND_UI:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324 switch (binding->subtype_a)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 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
327 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
328 current_system->inc_debug_mode(current_system);
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
329 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 case UI_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
332 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
333 current_system->enter_debugger = 1;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
334 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
335 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
336 case UI_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
337 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
338 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
339 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
340 break;
2162
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2083
diff changeset
341 case UI_LOAD_STATE:
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2083
diff changeset
342 if (allow_content_binds) {
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2083
diff changeset
343 current_system->load_state(current_system, QUICK_SAVE_SLOT);
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2083
diff changeset
344 }
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2083
diff changeset
345 break;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
346 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
347 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
348 current_speed++;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
349 if (current_speed >= num_speeds) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
350 current_speed = 0;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
351 }
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]);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
354 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
355 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
356 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
357 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
358 current_speed--;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
359 if (current_speed < 0) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
360 current_speed = num_speeds - 1;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
361 }
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
362 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
363 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
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_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
367 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
368 if (binding->subtype_b < num_speeds) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
369 current_speed = binding->subtype_b;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
370 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
371 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
372 } else {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
373 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
374 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
375 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
376 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
377 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
378 case UI_RELEASE_MOUSE:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
379 if (mouse_captured) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
380 mouse_captured = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
381 render_relative_mouse(0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
382 }
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_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
385 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
386 keyboard_captured = !keyboard_captured;
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;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
389 case UI_TOGGLE_FULLSCREEN:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
390 render_toggle_fullscreen();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
391 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
392 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
393 if (allow_content_binds) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
394 current_system->soft_reset(current_system);
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
395 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
396 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
397 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
398 if (allow_content_binds) {
2409
f8ce89498e11 Fix some further fallout of ZIP reload fix
Michael Pavone <pavone@retrodev.com>
parents: 2317
diff changeset
399 reload_media();
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
400 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
401 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
402 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
403 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
404 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
405 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
406 break;
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
407 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
408 if (allow_content_binds) {
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
409 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
410 render_save_screenshot(path);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
411 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
412 break;
2295
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
413 case UI_RECORD_VIDEO:
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
414 if (allow_content_binds) {
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
415 if (render_saving_video()) {
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
416 render_end_video();
2304
b3832f73444f Save audio to a wave file when saving video to APNG
Michael Pavone <pavone@retrodev.com>
parents: 2295
diff changeset
417 render_end_audio();
2295
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
418 } else {
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
419 char *path = get_content_config_path("ui\0video_path\0", "ui\0video_template\0", "blastem_%c.apng");
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
420 render_save_video(path);
2304
b3832f73444f Save audio to a wave file when saving video to APNG
Michael Pavone <pavone@retrodev.com>
parents: 2295
diff changeset
421 path = get_content_config_path("ui\0audio_path\0", "ui\0audio_template\0", "blastem_%c.wav");
b3832f73444f Save audio to a wave file when saving video to APNG
Michael Pavone <pavone@retrodev.com>
parents: 2295
diff changeset
422 render_save_audio(path);
2295
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
423 }
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
424 }
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
425 break;
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
426 case UI_VGM_LOG:
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
427 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
428 if (current_system->vgm_logging) {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
429 current_system->stop_vgm_log(current_system);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
430 } else {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
431 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
432 current_system->start_vgm_log(current_system, path);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
433 free(path);
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
434 }
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
435 }
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
436 break;
2306
62f316b76e9a Migrate ui.exit to ui.menu and create a new ui.exit for quitting
Michael Pavone <pavone@retrodev.com>
parents: 2304
diff changeset
437 case UI_MENU:
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
438 #ifndef DISABLE_NUKLEAR
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
439 if (is_nuklear_active()) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
440 show_pause_menu();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
441 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
442 #endif
1980
81df9aa2de9b Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents: 1909
diff changeset
443 system_request_exit(current_system, 1);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
444 if (current_system->type == SYSTEM_GENESIS) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
445 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
446 if (gen->extra) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
447 //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
448 menu_context *menu = gen->extra;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
449 menu->external_game_load = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
450 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
451 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
452 #ifndef DISABLE_NUKLEAR
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
453 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
454 #endif
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 break;
2306
62f316b76e9a Migrate ui.exit to ui.menu and create a new ui.exit for quitting
Michael Pavone <pavone@retrodev.com>
parents: 2304
diff changeset
456 case UI_EXIT:
62f316b76e9a Migrate ui.exit to ui.menu and create a new ui.exit for quitting
Michael Pavone <pavone@retrodev.com>
parents: 2304
diff changeset
457 exit(0);
2083
372625dd9590 Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
458 case UI_PLANE_DEBUG:
372625dd9590 Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
459 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
460 case UI_CRAM_DEBUG:
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
461 case UI_COMPOSITE_DEBUG:
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
462 case UI_OSCILLOSCOPE_DEBUG:
2271
3ef80963c2a7 Fix stamp address mask and add WIP CD graphics debug view
Michael Pavone <pavone@retrodev.com>
parents: 2243
diff changeset
463 case UI_CD_GRAPHICS_DEBUG:
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
464 if (allow_content_binds && current_system->toggle_debug_view) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
465 current_system->toggle_debug_view(current_system, binding->subtype_a - UI_PLANE_DEBUG + DEBUG_PLANE);
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
466 /*
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
467 vdp_context *vdp = NULL;
2083
372625dd9590 Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
468 if (current_system->type == SYSTEM_GENESIS || current_system->type == SYSTEM_SEGACD) {
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
469 genesis_context *gen = (genesis_context *)current_system;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
470 vdp = gen->vdp;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
471 } else if (current_system->type == SYSTEM_SMS) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
472 sms_context *sms = (sms_context *)current_system;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
473 vdp = sms->vdp;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
474 }
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
475 if (vdp) {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
476 uint8_t debug_type;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
477 switch(binding->subtype_a)
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
478 {
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
479 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
480 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
481 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
482 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
483 default: return;
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
484 }
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
485 vdp_toggle_debug_view(vdp, debug_type);
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
486 }*/
1672
12d0c7c4ad80 Disable most bindings when UI is active
Michael Pavone <pavone@retrodev.com>
parents: 1643
diff changeset
487 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
488 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
489 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
490 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
491 }
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 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
495 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
496 int bucket = keycode >> 15 & 0xFFFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
497 int idx = keycode & 0x7FFF;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
498 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
499 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
500 handle_binding_up(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
501 } 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
502 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
503 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
504 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
505
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
506 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
507 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
508 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
509 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
510 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
511 keybinding * binding = joysticks[joystick].buttons + button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
512 handle_binding_up(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
513 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
514
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
515 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
516 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
517 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
518 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
519 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
520 joydpad * dpad = joysticks[joystick].dpads + dpadnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
521 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
522 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
523 dpad->state = value;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
524 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
525 if (newdown & dpadbits[i]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
526 handle_binding_down(dpad->bindings + i);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
527 } else if(newup & dpadbits[i]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
528 handle_binding_up(dpad->bindings + i);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
529 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
530 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
531 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
532
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
533 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
534 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
535 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
536 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
537 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
538 joyaxis *jaxis = joysticks[joystick].axes + axis;
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
539 int old_active = abs(jaxis->value) > jaxis->deadzone;
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
540 int new_active = abs(value) > jaxis->deadzone;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
541 int old_pos = jaxis->value > 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
542 int new_pos = value > 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
543 jaxis->value = value;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
544 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
545 //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
546 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
547 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
548 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
549 //previously unactivated direction is now active
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
550 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
551 }
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 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
555 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
556 if (mouse >= MAX_MICE || !current_system) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
557 return;
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 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
560 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
561 switch(mouse_mode)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
562 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
563 case MOUSE_NONE:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
564 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
565 case MOUSE_ABSOLUTE: {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
566 if (current_system->mouse_motion_absolute) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
567 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
568 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
569 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
570 int32_t adj_y = y * scale_y + 2 * render_overscan_top() - 4;
2083
372625dd9590 Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
571
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
572 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
573 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
574 break;
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 case MOUSE_RELATIVE: {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
577 if (current_system->mouse_motion_relative) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
578 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
579 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
580 break;
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 case MOUSE_CAPTURE: {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
583 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
584 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
585 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
586 break;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
587 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
588 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
589 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
590 handle_binding_up(&mice[mouse].motion);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
591 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
592 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
593
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
594 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
595 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
596 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
597 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
598 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
599 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
600 handle_binding_up(binding);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
601 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
602
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
603 void bindings_release_capture(void)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
604 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
605 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
606 render_relative_mouse(0);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
607 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
608 keyboard_captured = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
609 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
610
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
611 void bindings_reacquire_capture(void)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
612 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
613 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
614 render_relative_mouse(1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
615 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
616 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
617
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
618 int parse_binding_target(int device_num, const 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
619 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
620 const int gpadslen = strlen("gamepads.");
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
621 const int mouselen = strlen("mouse.");
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1680
diff changeset
622 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
623 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
624 if (padnum >= 1 && padnum <= 8) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
625 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
626 if (button) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
627 *subtype_a = padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
628 *subtype_b = button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
629 return BIND_GAMEPAD;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
630 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
631 if (target[gpadslen+1]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
632 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
633 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
634 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
635 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
636 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
637 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
638 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
639 }
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1680
diff changeset
640 } 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
641 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
642 if (mousenum >= 1 && mousenum <= 8) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
643 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
644 if (button) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
645 *subtype_a = mousenum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
646 *subtype_b = button;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
647 return BIND_MOUSE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
648 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
649 if (target[mouselen+1]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
650 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
651 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
652 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
653 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
654 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
655 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
656 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
657 }
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
658 } else if (startswith(target, "cassette.")) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
659 if (!strcmp(target + 9, "play")) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
660 *subtype_a = CASSETTE_PLAY;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
661 } else if (!strcmp(target + 9, "record")) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
662 *subtype_a = CASSETTE_RECORD;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
663 } else if (!strcmp(target + 9, "stop")) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
664 *subtype_a = CASSETTE_STOP;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
665 } else if (!strcmp(target + 9, "rewind")) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
666 *subtype_a = CASSETTE_REWIND;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
667 } else {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
668 warning("Cassette mapping string '%s' refers to an invalid action\n", target);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
669 return BIND_NONE;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
670 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2409
diff changeset
671 return BIND_CASSETTE;
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1680
diff changeset
672 } else if(startswith(target, "ui.")) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
673 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
674 *subtype_a = UI_DEBUG_MODE_INC;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
675 } else if(!strcmp(target + 3, "vdp_debug_pal")) {
1643
6909c5d0bbb5 Removed old VDP debug functionality
Michael Pavone <pavone@retrodev.com>
parents: 1641
diff changeset
676 //legacy binding, ignore
6909c5d0bbb5 Removed old VDP debug functionality
Michael Pavone <pavone@retrodev.com>
parents: 1641
diff changeset
677 return 0;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
678 } 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
679 *subtype_a = UI_ENTER_DEBUGGER;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
680 } 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
681 *subtype_a = UI_SAVE_STATE;
2162
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2083
diff changeset
682 } else if(!strcmp(target + 3, "load_state")) {
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2083
diff changeset
683 *subtype_a = UI_LOAD_STATE;
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1680
diff changeset
684 } 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
685 *subtype_a = UI_SET_SPEED;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
686 *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
687 } 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
688 *subtype_a = UI_NEXT_SPEED;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
689 } 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
690 *subtype_a = UI_PREV_SPEED;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
691 } 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
692 *subtype_a = UI_RELEASE_MOUSE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
693 } 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
694 *subtype_a = UI_TOGGLE_KEYBOARD_CAPTURE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
695 } 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
696 *subtype_a = UI_TOGGLE_FULLSCREEN;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
697 } 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
698 *subtype_a = UI_SOFT_RESET;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
699 } else if (!strcmp(target + 3, "reload")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
700 *subtype_a = UI_RELOAD;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
701 } 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
702 *subtype_a = UI_SMS_PAUSE;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
703 } else if (!strcmp(target + 3, "screenshot")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
704 *subtype_a = UI_SCREENSHOT;
2295
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
705 } else if (!strcmp(target + 3, "record_video")) {
eb45ad9d8a3f WIP "video" recording in APNG format
Michael Pavone <pavone@retrodev.com>
parents: 2291
diff changeset
706 *subtype_a = UI_RECORD_VIDEO;
1909
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
707 } else if (!strcmp(target + 3, "vgm_log")) {
508522f08e4d Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents: 1850
diff changeset
708 *subtype_a = UI_VGM_LOG;
2306
62f316b76e9a Migrate ui.exit to ui.menu and create a new ui.exit for quitting
Michael Pavone <pavone@retrodev.com>
parents: 2304
diff changeset
709 } else if(!strcmp(target + 3, "menu")) {
62f316b76e9a Migrate ui.exit to ui.menu and create a new ui.exit for quitting
Michael Pavone <pavone@retrodev.com>
parents: 2304
diff changeset
710 *subtype_a = UI_MENU;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
711 } else if(!strcmp(target + 3, "exit")) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
712 *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
713 } 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
714 *subtype_a = UI_PLANE_DEBUG;
1634
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
715 } else if (!strcmp(target + 3, "vram_debug")) {
e397766c3028 Added VRAM debug window
Michael Pavone <pavone@retrodev.com>
parents: 1631
diff changeset
716 *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
717 } 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
718 *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
719 } 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
720 *subtype_a = UI_COMPOSITE_DEBUG;
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
721 } else if (!strcmp(target + 3, "oscilloscope")) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
722 *subtype_a = UI_OSCILLOSCOPE_DEBUG;
2271
3ef80963c2a7 Fix stamp address mask and add WIP CD graphics debug view
Michael Pavone <pavone@retrodev.com>
parents: 2243
diff changeset
723 } else if (!strcmp(target + 3, "cd_graphics_debug")) {
3ef80963c2a7 Fix stamp address mask and add WIP CD graphics debug view
Michael Pavone <pavone@retrodev.com>
parents: 2243
diff changeset
724 *subtype_a = UI_CD_GRAPHICS_DEBUG;
1638
f27142c48567 Initial stab at CRAM debug in a detached window
Michael Pavone <pavone@retrodev.com>
parents: 1634
diff changeset
725 } else {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
726 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
727 return 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
728 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
729 return BIND_UI;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
730 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
731 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
732 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
733 return 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
734 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
735
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
736 void process_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
737 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
738 char * curstr = NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
739 int len;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
740 if (!cur) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
741 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
742 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
743 char onec[2];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
744 if (prefix) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
745 len = strlen(prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
746 curstr = malloc(len + 2);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
747 memcpy(curstr, prefix, len);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
748 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
749 curstr = onec;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
750 len = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
751 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
752 curstr[len] = cur->el;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
753 curstr[len+1] = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
754 if (cur->el) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
755 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
756 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
757 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
758 if (!keycode) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
759 keycode = curstr[0];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
760 if (curstr[1] != 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
761 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
762 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
763 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
764 char * target = cur->straight.value.ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
765 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
766 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
767 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
768 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
769 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
770 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
771 if (curstr && len) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
772 free(curstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
773 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
774 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
775
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
776 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
777 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
778 char * curstr = NULL;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
779 int len;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
780 if (!cur) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
781 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
782 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
783 char onec[2];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
784 if (prefix) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
785 len = strlen(prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
786 curstr = malloc(len + 2);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
787 memcpy(curstr, prefix, len);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
788 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
789 curstr = onec;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
790 len = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
791 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
792 curstr[len] = cur->el;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
793 curstr[len+1] = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
794 if (cur->el) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
795 process_speeds(cur->straight.next, curstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
796 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
797 char *end;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
798 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
799 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
800 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
801 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
802 if (speed_index >= num_speeds) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
803 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
804 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
805 speeds[num_speeds] = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
806 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
807 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
808 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
809 if (speeds[speed_index] < 1) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
810 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
811 speeds[speed_index] = 100;
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 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
814 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
815 process_speeds(cur->left, prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
816 process_speeds(cur->right, prefix);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
817 if (curstr && len) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
818 free(curstr);
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 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
821
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
822 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
823 tern_node *padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
824 tern_node *mousebuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
825 int mouseidx;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
826 } pmb_state;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
827
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
828 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
829 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
830 pmb_state *state = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
831 int buttonnum = atoi(buttonstr);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
832 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
833 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
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 if (valtype != TVAL_PTR) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
837 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
838 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
839 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
840 buttonnum--;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
841 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
842 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
843 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
844 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
845 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
846 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
847
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
848 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
849 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
850 tern_node **buttonmaps = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
851 if (valtype != TVAL_NODE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
852 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
853 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
854 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
855 tern_node *mousedef = value.ptrval;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
856 tern_node *padbuttons = buttonmaps[0];
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
857 tern_node *mousebuttons = buttonmaps[1];
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 int mouseidx = atoi(mousenum);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
860 if (mouseidx < 0 || mouseidx >= MAX_MICE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
861 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
862 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
863 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
864 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
865 if (motion) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
866 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
867 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
868 mice[mouseidx].motion.bind_type = bindtype;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
869 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
870 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
871 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
872 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
873 if (buttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
874 pmb_state state = {padbuttons, mousebuttons, mouseidx};
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
875 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
876 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
877 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
878
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
879 typedef struct {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
880 int padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
881 tern_node *padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
882 tern_node *mousebuttons;
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
883 int stick_deadzone;
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
884 int trigger_deadzone;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
885 } pad_button_state;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
886
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
887
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
888 static long map_warning_pad = -1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
889 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
890 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
891 pad_button_state *state = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
892 int hostpadnum = state->padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
893 if (valtype != TVAL_PTR) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
894 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
895 return;
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 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
898 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
899 char *end;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
900 long hostbutton = strtol(key, &end, 10);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
901 if (*end) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
902 //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
903 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
904 if (hostbutton < 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
905 if (hostbutton == RENDER_INVALID_NAME) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
906 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
907 } 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
908 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
909 map_warning_pad = hostpadnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
910 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
911 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
912 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
913 if (hostbutton & RENDER_DPAD_BIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
914 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
915 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
916 } else if (hostbutton & RENDER_AXIS_BIT) {
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
917 bind_axis(hostpadnum, render_axis_part(hostbutton), hostbutton & RENDER_AXIS_POS, state->trigger_deadzone, bindtype, subtype_a, subtype_b);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
918 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
919 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
920 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
921 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
922 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
923
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
924 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
925 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
926 key = strdup(key);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
927 pad_button_state *state = data;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
928 int hostpadnum = state->padnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
929 if (valtype != TVAL_PTR) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
930 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
931 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
932 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
933 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
934 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
935 char *modifier = strchr(key, '.');
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
936 int positive = 1;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
937 if (modifier) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
938 *modifier = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
939 modifier++;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
940 if (!strcmp("negative", modifier)) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
941 positive = 0;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
942 } else if(strcmp("positive", modifier)) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
943 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
944 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
945 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
946 char *end;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
947 long axis = strtol(key, &end, 10);
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
948 int deadzone = state->stick_deadzone;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
949 if (*end) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
950 //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
951 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
952 if (axis < 0) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
953 if (axis == RENDER_INVALID_NAME) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
954 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
955 } 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
956 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
957 map_warning_pad = hostpadnum;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
958 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
959 goto done;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
960 }
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
961 if (!strcmp("lefttrigger", key) || !strcmp("righttrigger", key) || !strcmp("l2", key) || !strcmp("r2", key)) {
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
962 deadzone = state->trigger_deadzone;
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
963 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
964 if (axis & RENDER_DPAD_BIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
965 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
966 goto done;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
967 } else if (axis & RENDER_AXIS_BIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
968 axis = render_axis_part(axis);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
969 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
970 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
971 goto done;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
972 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
973 }
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
974 bind_axis(hostpadnum, axis, positive, deadzone, bindtype, subtype_a, subtype_b);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
975 done:
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
976 free(key);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
977 return;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
978 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
979
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
980 static tern_node *get_pad_buttons()
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
981 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
982 static tern_node *padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
983 if (!padbuttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
984 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
985 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
986 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
987 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
988 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
989 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
990 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
991 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
992 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
993 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
994 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
995 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
996 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
997 return padbuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
998 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
999
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1000 static tern_node *get_mouse_buttons()
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1001 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1002 static tern_node *mousebuttons;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1003 if (!mousebuttons) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1004 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
1005 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
1006 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
1007 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
1008 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
1009 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1010 return mousebuttons;
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
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1013 uint8_t bind_up(const char *target)
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1014 {
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1015 keybinding bind;
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1016 bind.bind_type = parse_binding_target(0, target, get_pad_buttons(), get_mouse_buttons(), &bind.subtype_a, &bind.subtype_b);
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1017 if (!bind.bind_type) {
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1018 return 0;
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1019 }
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1020 handle_binding_up(&bind);
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1021 return 1;
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1022 }
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1023
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1024 uint8_t bind_down(const char *target)
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1025 {
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1026 keybinding bind;
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1027 bind.bind_type = parse_binding_target(0, target, get_pad_buttons(), get_mouse_buttons(), &bind.subtype_a, &bind.subtype_b);
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1028 if (!bind.bind_type) {
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1029 return 0;
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1030 }
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1031 handle_binding_down(&bind);
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1032 return 1;
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1033 }
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1034
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
1035
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1036 tern_node *get_binding_node_for_pad(int padnum, controller_info *info)
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1037 {
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
1038 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
1039 return NULL;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1040 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1041 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
1042 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
1043 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
1044 }
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
1045 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
1046 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
1047 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
1048 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
1049 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
1050 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
1051 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
1052 }
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
1053 if (!pad) {
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1054 char *key = make_controller_type_key(info);
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
1055 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
1056 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
1057 }
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
1058 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
1059 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
1060 }
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
1061 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
1062 }
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
1063
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
1064 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
1065 {
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1066 controller_info info = get_controller_info(joystick);
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1067 tern_node *pad = get_binding_node_for_pad(joystick, &info);
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
1068 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
1069 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
1070 }
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
1071 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
1072 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
1073 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
1074 {
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
1075 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
1076 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
1077 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
1078 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
1079 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
1080 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
1081 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
1082 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
1083 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
1084 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
1085 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
1086 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
1087 //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
1088 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
1089 } 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
1090 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
1091 } 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
1092 //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
1093 //for now I'll just assume that any controller with axes for a d-pad has these mapped the "sane" way
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1094 bind_axis(joystick, render_axis_part(hostbutton), dir == 1 || dir == 3 ? 1 : 0, info.stick_deadzone, bindtype, 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
1095 } 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
1096 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
1097 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1098 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1099 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1100 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1101 }
2317
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1102 pad_button_state state = {
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1103 .padnum = joystick,
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1104 .padbuttons = get_pad_buttons(),
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1105 .mousebuttons = get_mouse_buttons(),
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1106 .stick_deadzone = info.stick_deadzone,
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1107 .trigger_deadzone = info.trigger_deadzone
e836cf11783b Make deadzones configurable and bump up the default value
Michael Pavone <pavone@retrodev.com>
parents: 2314
diff changeset
1108 };
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
1109 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
1110 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
1111 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
1112 }
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
1113 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
1114 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
1115 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
1116 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1117 }
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 //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
1120 void set_bindings(void)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1121 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1122 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
1123 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
1124 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
1125 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
1126 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
1127 special = tern_insert_int(special, "space", ' ');
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1128 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
1129 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
1130 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
1131 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
1132 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
1133 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
1134 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
1135 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
1136 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
1137 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
1138 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
1139 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
1140 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
1141 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
1142 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
1143 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
1144 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
1145 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
1146 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
1147 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
1148 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
1149 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
1150 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
1151 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
1152 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
1153 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
1154 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
1155 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
1156 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
1157 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
1158 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
1159 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
1160 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
1161 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
1162 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
1163 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
1164 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
1165 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
1166 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
1167 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
1168 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
1169 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
1170 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
1171 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
1172 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
1173 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
1174
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1175 tern_node *padbuttons = get_pad_buttons();
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1176
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1177 tern_node *mousebuttons = get_mouse_buttons();
2083
372625dd9590 Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1178
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1179 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
1180 process_keys(keys, special, padbuttons, mousebuttons, NULL);
1587
ea687ca7d845 Fix missing include in bindings.c
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1181 tern_free(special);
2083
372625dd9590 Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1182
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1183 memset(mice, 0, sizeof(mice));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1184 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
1185 if (mice) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1186 tern_node *buttonmaps[2] = {padbuttons, mousebuttons};
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1187 tern_foreach(mice, process_mouse, buttonmaps);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1188 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1189 tern_node * speed_nodes = tern_find_path(config, "clocks\0speeds\0", TVAL_NODE).ptrval;
2314
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1190 free(speeds);
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1191 speeds = malloc(sizeof(uint32_t));
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1192 speeds[0] = 100;
2314
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1193 num_speeds = 1;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1194 process_speeds(speed_nodes, NULL);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1195 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
1196 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1197 if (!speeds[i]) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1198 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
1199 speeds[i] = 100;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1200 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1201 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1202 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1203
2314
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1204 void update_pad_bindings(void)
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1205 {
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1206 for (int i = 0; i < MAX_JOYSTICKS; i++)
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1207 {
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1208 if (joysticks[i].num_buttons || joysticks[i].num_axes || joysticks[i].num_dpads) {
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1209 reset_joystick_bindings(i);
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1210 handle_joy_added(i);
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1211 }
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1212 }
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1213 }
59fd8aa352e2 Apply binding changes after a config change in UI
Michael Pavone <pavone@retrodev.com>
parents: 2306
diff changeset
1214
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1215 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
1216 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1217 mouse_mode = mode;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1218 if (mode == MOUSE_RELATIVE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1219 render_relative_mouse(1);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1220 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1221 }