1 #ifndef INPUT_H
2 #define INPUT_H
3 
4 #include <retro_inline.h>
5 
6 typedef unsigned InputCode;
7 
8 struct KeyboardInfo
9 {
10 	char *name; /* OS dependant name; 0 terminates the list */
11 	unsigned code; /* OS dependant code */
12 	InputCode standardcode;	/* CODE_xxx equivalent from list below, or CODE_OTHER if n/a */
13 };
14 
15 struct JoystickInfo
16 {
17 	char *name; /* OS dependant name; 0 terminates the list */
18 	unsigned code; /* OS dependant code */
19 	InputCode standardcode;	/* CODE_xxx equivalent from list below, or CODE_OTHER if n/a */
20 };
21 
22 enum
23 {
24 	/* key */
25 	KEYCODE_A, KEYCODE_B, KEYCODE_C, KEYCODE_D, KEYCODE_E, KEYCODE_F,
26 	KEYCODE_G, KEYCODE_H, KEYCODE_I, KEYCODE_J, KEYCODE_K, KEYCODE_L,
27 	KEYCODE_M, KEYCODE_N, KEYCODE_O, KEYCODE_P, KEYCODE_Q, KEYCODE_R,
28 	KEYCODE_S, KEYCODE_T, KEYCODE_U, KEYCODE_V, KEYCODE_W, KEYCODE_X,
29 	KEYCODE_Y, KEYCODE_Z, KEYCODE_0, KEYCODE_1, KEYCODE_2, KEYCODE_3,
30 	KEYCODE_4, KEYCODE_5, KEYCODE_6, KEYCODE_7, KEYCODE_8, KEYCODE_9,
31 	KEYCODE_0_PAD, KEYCODE_1_PAD, KEYCODE_2_PAD, KEYCODE_3_PAD, KEYCODE_4_PAD,
32 	KEYCODE_5_PAD, KEYCODE_6_PAD, KEYCODE_7_PAD, KEYCODE_8_PAD, KEYCODE_9_PAD,
33 	KEYCODE_F1, KEYCODE_F2, KEYCODE_F3, KEYCODE_F4, KEYCODE_F5,
34 	KEYCODE_F6, KEYCODE_F7, KEYCODE_F8, KEYCODE_F9, KEYCODE_F10,
35 	KEYCODE_F11, KEYCODE_F12,
36 	KEYCODE_ESC, KEYCODE_TILDE, KEYCODE_MINUS, KEYCODE_EQUALS, KEYCODE_BACKSPACE,
37 	KEYCODE_TAB, KEYCODE_OPENBRACE, KEYCODE_CLOSEBRACE, KEYCODE_ENTER, KEYCODE_COLON,
38 	KEYCODE_QUOTE, KEYCODE_BACKSLASH, KEYCODE_BACKSLASH2, KEYCODE_COMMA, KEYCODE_STOP,
39 	KEYCODE_SLASH, KEYCODE_SPACE, KEYCODE_INSERT, KEYCODE_DEL,
40 	KEYCODE_HOME, KEYCODE_END, KEYCODE_PGUP, KEYCODE_PGDN, KEYCODE_LEFT,
41 	KEYCODE_RIGHT, KEYCODE_UP, KEYCODE_DOWN,
42 	KEYCODE_SLASH_PAD, KEYCODE_ASTERISK, KEYCODE_MINUS_PAD, KEYCODE_PLUS_PAD,
43 	KEYCODE_DEL_PAD, KEYCODE_ENTER_PAD, KEYCODE_PRTSCR, KEYCODE_PAUSE,
44 	KEYCODE_LSHIFT, KEYCODE_RSHIFT, KEYCODE_LCONTROL, KEYCODE_RCONTROL,
45 	KEYCODE_LALT, KEYCODE_RALT, KEYCODE_SCRLOCK, KEYCODE_NUMLOCK, KEYCODE_CAPSLOCK,
46 	KEYCODE_LWIN, KEYCODE_RWIN, KEYCODE_MENU,
47 #define __code_key_first KEYCODE_A
48 #define __code_key_last KEYCODE_MENU
49 
50 	/* joy */
51 	JOYCODE_1_LEFT,JOYCODE_1_RIGHT,JOYCODE_1_UP,JOYCODE_1_DOWN,
52 	JOYCODE_1_BUTTON1,JOYCODE_1_BUTTON2,JOYCODE_1_BUTTON3,
53 	JOYCODE_1_BUTTON4,JOYCODE_1_BUTTON5,JOYCODE_1_BUTTON6,
54 	JOYCODE_2_LEFT,JOYCODE_2_RIGHT,JOYCODE_2_UP,JOYCODE_2_DOWN,
55 	JOYCODE_2_BUTTON1,JOYCODE_2_BUTTON2,JOYCODE_2_BUTTON3,
56 	JOYCODE_2_BUTTON4,JOYCODE_2_BUTTON5,JOYCODE_2_BUTTON6,
57 	JOYCODE_3_LEFT,JOYCODE_3_RIGHT,JOYCODE_3_UP,JOYCODE_3_DOWN,
58 	JOYCODE_3_BUTTON1,JOYCODE_3_BUTTON2,JOYCODE_3_BUTTON3,
59 	JOYCODE_3_BUTTON4,JOYCODE_3_BUTTON5,JOYCODE_3_BUTTON6,
60 	JOYCODE_4_LEFT,JOYCODE_4_RIGHT,JOYCODE_4_UP,JOYCODE_4_DOWN,
61 	JOYCODE_4_BUTTON1,JOYCODE_4_BUTTON2,JOYCODE_4_BUTTON3,
62 	JOYCODE_4_BUTTON4,JOYCODE_4_BUTTON5,JOYCODE_4_BUTTON6,
63 #define __code_joy_first JOYCODE_1_LEFT
64 #define __code_joy_last JOYCODE_4_BUTTON6
65 
66 	__code_max, /* Temination of standard code */
67 
68 	/* special */
69 	CODE_NONE = 0x8000, /* no code, also marker of sequence end */
70 	CODE_OTHER, /* OS code not mapped to any other code */
71 	CODE_DEFAULT, /* special for input port definitions */
72         CODE_PREVIOUS, /* special for input port definitions */
73 	CODE_NOT, /* operators for sequences */
74 	CODE_OR /* operators for sequences */
75 };
76 
77 /* Wrapper for compatibility */
78 #define KEYCODE_OTHER CODE_OTHER
79 #define JOYCODE_OTHER CODE_OTHER
80 #define KEYCODE_NONE CODE_NONE
81 #define JOYCODE_NONE CODE_NONE
82 
83 /***************************************************************************/
84 /* Single code functions */
85 
86 int code_init(void);
87 void code_close(void);
88 
89 InputCode keyoscode_to_code(unsigned oscode);
90 InputCode joyoscode_to_code(unsigned oscode);
91 InputCode savecode_to_code(unsigned savecode);
92 unsigned code_to_savecode(InputCode code);
93 
94 const char *code_name(InputCode code);
95 int code_pressed(InputCode code);
96 int code_pressed_memory(InputCode code);
97 int code_pressed_memory_repeat(InputCode code, int speed);
98 InputCode code_read_async(void);
99 InputCode code_read_sync(void);
100 INT8 code_read_hex_async(void);
101 
102 /* Wrappers for compatibility */
103 #define keyboard_name                   code_name
104 #define keyboard_pressed                code_pressed
105 #define keyboard_pressed_memory         code_pressed_memory
106 #define keyboard_pressed_memory_repeat  code_pressed_memory_repeat
107 #define keyboard_read_async	        code_read_async
108 #define keyboard_read_sync              code_read_sync
109 
110 /***************************************************************************/
111 /* Sequence code funtions */
112 
113 /* NOTE: If you modify this value you need also to modify the SEQ_DEF declarations */
114 #define SEQ_MAX 16
115 
116 typedef InputCode InputSeq[SEQ_MAX];
117 
seq_get_1(InputSeq * a)118 static INLINE InputCode seq_get_1(InputSeq* a)
119 {
120 	return (*a)[0];
121 }
122 
123 void seq_set_0(InputSeq* seq);
124 void seq_set_1(InputSeq* seq, InputCode code);
125 void seq_set_2(InputSeq* seq, InputCode code1, InputCode code2);
126 void seq_set_3(InputSeq* seq, InputCode code1, InputCode code2, InputCode code3);
127 void seq_copy(InputSeq* seqdst, InputSeq* seqsrc);
128 int seq_cmp(InputSeq* seq1, InputSeq* seq2);
129 void seq_name(InputSeq* seq, char* buffer, unsigned max);
130 int seq_pressed(InputSeq* seq);
131 void seq_read_async_start(void);
132 int seq_read_async(InputSeq* code, int first);
133 
134 /* NOTE: It's very important that this sequence is EXACLY long SEQ_MAX */
135 #define SEQ_DEF_6(a,b,c,d,e,f) { a, b, c, d, e, f, CODE_NONE, CODE_NONE, CODE_NONE, CODE_NONE, CODE_NONE, CODE_NONE, CODE_NONE, CODE_NONE, CODE_NONE, CODE_NONE }
136 #define SEQ_DEF_5(a,b,c,d,e) SEQ_DEF_6(a,b,c,d,e,CODE_NONE)
137 #define SEQ_DEF_4(a,b,c,d) SEQ_DEF_5(a,b,c,d,CODE_NONE)
138 #define SEQ_DEF_3(a,b,c) SEQ_DEF_4(a,b,c,CODE_NONE)
139 #define SEQ_DEF_2(a,b) SEQ_DEF_3(a,b,CODE_NONE)
140 #define SEQ_DEF_1(a) SEQ_DEF_2(a,CODE_NONE)
141 #define SEQ_DEF_0 SEQ_DEF_1(CODE_NONE)
142 
143 /***************************************************************************/
144 /* input_ui */
145 
146 int input_ui_pressed(int code);
147 int input_ui_pressed_repeat(int code, int speed);
148 
149 #endif
150