-
Notifications
You must be signed in to change notification settings - Fork 0
/
rc.h
188 lines (158 loc) · 5.69 KB
/
rc.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
// DGen/SDL v1.23+
#ifndef RC_H_
#define RC_H_
#include <stddef.h>
#include <stdio.h>
#include <stdint.h>
// Define the different craptv types
#define NUM_CTV 5 // Include CTV_OFF
#define NUM_SCALING 7
#define CTV_OFF 0
#define CTV_BLUR 1
#define CTV_SCANLINE 2
#define CTV_INTERLACE 3
#define CTV_SWAB 4
// Define OR masks for key modifiers
#define KEYSYM_MOD_ALT 0x40000000
#define KEYSYM_MOD_SHIFT 0x20000000
#define KEYSYM_MOD_CTRL 0x10000000
#define KEYSYM_MOD_META 0x08000000
#define KEYSYM_MOD_MASK 0x78000000
// Macros to manage joystick buttons.
//
// Integer format (32b): 000000tt iiiiiiii aaaaaaaa bbbbbbbb
//
// t: type (0-3):
// 0 if not configured/invalid.
// 1 for a normal button, "a" is ignored, "b" is the button index.
// 2 for an axis, "a" is the axis index, "b" is the axis direction.
// 3 for a hat, "a" is the hat index, "b" is the hat direction.
// i: system identifier for joystick/joypad (0-255).
// a: axis or hat index (0-255).
// b: button number (0-255), axis direction (0 if negative, 128 if between,
// 255 if positive), or hat direction (0 = center, 1 = up, 2 = right,
// 3 = down, 4 = left).
#define JS_AXIS_NEGATIVE 0x00
#define JS_AXIS_BETWEEN 0x80
#define JS_AXIS_POSITIVE 0xff
#define JS_HAT_CENTERED 0
#define JS_HAT_UP 1
#define JS_HAT_RIGHT 2
#define JS_HAT_DOWN 3
#define JS_HAT_LEFT 4
#define JS_TYPE_BUTTON 0x01
#define JS_TYPE_AXIS 0x02
#define JS_TYPE_HAT 0x03
#define JS_MAKE_IDENTIFIER(i) (((i) & 0xff) << 16)
#define JS_MAKE_BUTTON(b) \
((JS_TYPE_BUTTON << 24) | ((b) & 0xff))
#define JS_MAKE_AXIS(a, d) \
((JS_TYPE_AXIS << 24) | (((a) & 0xff) << 8) | ((d) & 0xff))
#define JS_MAKE_HAT(h, d) \
((JS_TYPE_HAT << 24) | (((h) & 0xff) << 8) | ((d) & 0xff))
#define JS_GET_IDENTIFIER(v) (((v) >> 16) & 0xff)
#define JS_IS_BUTTON(v) ((((v) >> 24) & 0xff) == JS_TYPE_BUTTON)
#define JS_IS_AXIS(v) ((((v) >> 24) & 0xff) == JS_TYPE_AXIS)
#define JS_IS_HAT(v) ((((v) >> 24) & 0xff) == JS_TYPE_HAT)
#define JS_GET_BUTTON(v) ((v) & 0xff)
#define JS_GET_AXIS(v) (((v) >> 8) & 0xff)
#define JS_GET_AXIS_DIR(v) JS_GET_BUTTON(v)
#define JS_GET_HAT(v) JS_GET_AXIS(v)
#define JS_GET_HAT_DIR(v) JS_GET_BUTTON(v)
#define JS_BUTTON(id, button) \
(JS_MAKE_IDENTIFIER(id) | \
JS_MAKE_BUTTON(button))
#define JS_AXIS(id, axis, direction) \
(JS_MAKE_IDENTIFIER(id) | \
JS_MAKE_AXIS((axis), (direction)))
#define JS_HAT(id, hat, direction) \
(JS_MAKE_IDENTIFIER(id) | \
JS_MAKE_HAT((hat), (direction)))
// Macros to manage mouse events.
//
// Integer format (32b): 000000tt iiiiiiii 00000000 aaaaaaaa
//
// t: type (0-3):
// 0 if not configured/invalid.
// 1 for a button, "a" is the button index.
// 2 for a motion, "a" is the direction.
// i: system identifier for mouse (0-255).
// a: button number (0-255), motion direction ('u', 'd', 'l' and 'r' for "up",
// "down", "left" and "right").
#define MO_TYPE_BUTTON JS_TYPE_BUTTON
#define MO_TYPE_MOTION JS_TYPE_AXIS
#define MO_GET_IDENTIFIER(v) JS_GET_IDENTIFIER(v)
#define MO_IS_BUTTON(v) JS_IS_BUTTON(v)
#define MO_IS_MOTION(v) JS_IS_AXIS(v)
#define MO_GET_BUTTON(v) JS_GET_BUTTON(v)
#define MO_GET_MOTION(v) MO_GET_BUTTON(v)
#define MO_BUTTON(id, button) JS_BUTTON(id, button)
#define MO_MOTION(id, direction) JS_AXIS(id, 0, direction)
// All the CTV engine names, in string form for the RC and message bar
extern const char *ctv_names[];
// Scaling algorithms names
extern const char *scaling_names[];
// CPU names
extern const char *emu_z80_names[];
extern const char *emu_m68k_names[];
// Provide a prototype to the parse_rc function in rc.cpp
extern void parse_rc(FILE *file, const char *name);
extern char *dump_keysym(intptr_t k);
extern char *dump_joypad(intptr_t k);
extern char *dump_mouse(intptr_t k);
extern void dump_rc(FILE *file);
extern intptr_t rc_number(const char *value, intptr_t *);
extern intptr_t rc_keysym(const char *code, intptr_t *);
extern intptr_t rc_boolean(const char *value, intptr_t *);
extern intptr_t rc_joypad(const char *desc, intptr_t *);
extern intptr_t rc_mouse(const char *desc, intptr_t *);
extern intptr_t rc_ctv(const char *value, intptr_t *);
extern intptr_t rc_scaling(const char *value, intptr_t *);
extern intptr_t rc_emu_z80(const char *value, intptr_t *);
extern intptr_t rc_emu_m68k(const char *value, intptr_t *);
extern intptr_t rc_region(const char *value, intptr_t *);
extern intptr_t rc_string(const char *value, intptr_t *);
extern intptr_t rc_rom_path(const char *value, intptr_t *);
extern intptr_t rc_bind(const char *value, intptr_t *variable);
extern intptr_t rc_soundrate(const char *value, intptr_t *);
extern struct rc_str *rc_str_list;
extern void rc_str_cleanup(void);
struct rc_field {
const char *fieldname;
intptr_t (*parser)(const char *, intptr_t *);
intptr_t *variable;
};
#define RC_BIND_PREFIX "bind_"
#define RC_BIND_ITEMS 8
enum rc_binding_type {
RCBK, // Keysym.
RCBJ, // Joypad.
RCBM, // Mouse.
RCB_NUM
};
struct rc_binding_item {
unsigned int assigned:1; // Whether item contains valid data.
enum rc_binding_type type:4; // See enum rc_binding_type.
intptr_t code; // keysym, joypad or mouse code.
};
struct rc_binding {
struct rc_binding *prev;
struct rc_binding *next;
struct rc_binding_item item[RC_BIND_ITEMS];
char *rc; // RC name for this binding.
// struct rc_field.variable points to the following member.
char *to; // Related action.
// Internal storage, don't touch.
// char rc[];
};
#define RC_FIELDS_SIZE 1024
extern struct rc_field rc_fields[RC_FIELDS_SIZE];
extern struct rc_binding rc_binding_head;
extern struct rc_field *rc_binding_add(const char *rc, const char *to);
extern void rc_binding_del(struct rc_field *rcf);
struct rc_keysym {
const char *name;
long keysym;
};
extern struct rc_keysym rc_keysyms[];
#endif // RC_H_