fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/drivers/video/keys.c *
7 * Created: 2007-11-25 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2007-2012 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#include <stdlib.h>
24#include <string.h>
25
26#include <drivers/video/keys.h>
27
28
29typedef struct {
30 pce_key_t key;
31 const char *name;
32} pce_key_name_t;
33
34
35/*
36 * This table maps key names to key symbols and vice versa
37 */
38static
39pce_key_name_t keyname[] = {
40 { PCE_KEY_ESC, "ESC", },
41
42 { PCE_KEY_F1, "F1" },
43 { PCE_KEY_F2, "F2" },
44 { PCE_KEY_F3, "F3" },
45 { PCE_KEY_F4, "F4" },
46 { PCE_KEY_F5, "F5" },
47 { PCE_KEY_F6, "F6" },
48 { PCE_KEY_F7, "F7" },
49 { PCE_KEY_F8, "F8" },
50 { PCE_KEY_F9, "F9" },
51 { PCE_KEY_F10, "F10" },
52 { PCE_KEY_F11, "F11" },
53 { PCE_KEY_F12, "F12" },
54
55 { PCE_KEY_PRTSCN, "PrintScreen" },
56 { PCE_KEY_PRTSCN, "PrtScn" },
57 { PCE_KEY_SCRLK, "ScrollLock" },
58 { PCE_KEY_SCRLK, "ScrLk" },
59 { PCE_KEY_PAUSE, "Pause" },
60
61 { PCE_KEY_BACKQUOTE, "Backquote" },
62 { PCE_KEY_BACKQUOTE, "`" },
63 { PCE_KEY_1, "1" },
64 { PCE_KEY_2, "2" },
65 { PCE_KEY_3, "3" },
66 { PCE_KEY_4, "4" },
67 { PCE_KEY_5, "5" },
68 { PCE_KEY_6, "6" },
69 { PCE_KEY_7, "7" },
70 { PCE_KEY_8, "8" },
71 { PCE_KEY_9, "9" },
72 { PCE_KEY_0, "0" },
73 { PCE_KEY_MINUS, "Minus" },
74 { PCE_KEY_MINUS, "-" },
75 { PCE_KEY_EQUAL, "Equal" },
76 { PCE_KEY_EQUAL, "=" },
77 { PCE_KEY_BACKSPACE, "Backspace" },
78
79 { PCE_KEY_TAB, "Tab" },
80 { PCE_KEY_Q, "q" },
81 { PCE_KEY_W, "w" },
82 { PCE_KEY_E, "e" },
83 { PCE_KEY_R, "r" },
84 { PCE_KEY_T, "t" },
85 { PCE_KEY_Y, "y" },
86 { PCE_KEY_U, "u" },
87 { PCE_KEY_I, "I" },
88 { PCE_KEY_O, "o" },
89 { PCE_KEY_P, "p" },
90 { PCE_KEY_LBRACKET, "LeftBracket" },
91 { PCE_KEY_LBRACKET, "[" },
92 { PCE_KEY_RBRACKET, "RightBracket" },
93 { PCE_KEY_RBRACKET, "]" },
94 { PCE_KEY_RETURN, "Return" },
95
96 { PCE_KEY_CAPSLOCK, "CapsLock" },
97 { PCE_KEY_A, "a" },
98 { PCE_KEY_S, "s" },
99 { PCE_KEY_D, "d" },
100 { PCE_KEY_F, "f" },
101 { PCE_KEY_G, "g" },
102 { PCE_KEY_H, "h" },
103 { PCE_KEY_J, "j" },
104 { PCE_KEY_K, "k" },
105 { PCE_KEY_L, "l" },
106 { PCE_KEY_SEMICOLON, "Semicolon" },
107 { PCE_KEY_SEMICOLON, ";" },
108 { PCE_KEY_QUOTE, "Quote" },
109 { PCE_KEY_QUOTE, "Apostrophe" },
110 { PCE_KEY_QUOTE, "'" },
111 { PCE_KEY_BACKSLASH, "Backslash" },
112 { PCE_KEY_BACKSLASH, "\\" },
113
114 { PCE_KEY_LSHIFT, "ShiftLeft" },
115 { PCE_KEY_LSHIFT, "Shift" },
116 { PCE_KEY_LESS, "Less" },
117 { PCE_KEY_LESS, "<" },
118 { PCE_KEY_Z, "z" },
119 { PCE_KEY_X, "x" },
120 { PCE_KEY_C, "c" },
121 { PCE_KEY_V, "v" },
122 { PCE_KEY_B, "b" },
123 { PCE_KEY_N, "n" },
124 { PCE_KEY_M, "m" },
125 { PCE_KEY_COMMA, "Comma" },
126 { PCE_KEY_COMMA, "," },
127 { PCE_KEY_PERIOD, "Period" },
128 { PCE_KEY_PERIOD, "." },
129 { PCE_KEY_SLASH, "Slash" },
130 { PCE_KEY_SLASH, "/" },
131
132 { PCE_KEY_LCTRL, "CtrlLeft" },
133 { PCE_KEY_LCTRL, "Ctrl" },
134 { PCE_KEY_LMETA, "MetaLeft" },
135 { PCE_KEY_LMETA, "Meta" },
136 { PCE_KEY_LSUPER, "SuperLeft" },
137 { PCE_KEY_LSUPER, "StartLeft" },
138 { PCE_KEY_LSUPER, "WindowsLeft" },
139 { PCE_KEY_MODE, "Mode" },
140 { PCE_KEY_LALT, "AltLeft" },
141 { PCE_KEY_LALT, "Alt" },
142 { PCE_KEY_SPACE, "Space" },
143 { PCE_KEY_RALT, "AltRight" },
144 { PCE_KEY_RMETA, "MetaRight" },
145 { PCE_KEY_RSUPER, "SuperRight" },
146 { PCE_KEY_RSUPER, "StartRight" },
147 { PCE_KEY_RSUPER, "WindowsRight" },
148 { PCE_KEY_MENU, "Menu" },
149 { PCE_KEY_RCTRL, "CtrlRight" },
150
151 { PCE_KEY_NUMLOCK, "NumLock" },
152 { PCE_KEY_KP_SLASH, "KP_Slash" },
153 { PCE_KEY_KP_STAR, "KP_Star" },
154 { PCE_KEY_KP_MINUS, "KP_Minus" },
155 { PCE_KEY_KP_7, "KP_7" },
156 { PCE_KEY_KP_8, "KP_8" },
157 { PCE_KEY_KP_9, "KP_9" },
158 { PCE_KEY_KP_PLUS, "KP_Plus" },
159 { PCE_KEY_KP_4, "KP_4" },
160 { PCE_KEY_KP_5, "KP_5" },
161 { PCE_KEY_KP_6, "KP_6" },
162 { PCE_KEY_KP_1, "KP_1" },
163 { PCE_KEY_KP_2, "KP_2" },
164 { PCE_KEY_KP_3, "KP_3" },
165 { PCE_KEY_KP_ENTER, "KP_Enter" },
166 { PCE_KEY_KP_0, "KP_0" },
167 { PCE_KEY_KP_PERIOD, "KP_Period" },
168
169 { PCE_KEY_INS, "Insert" },
170 { PCE_KEY_HOME, "Home" },
171 { PCE_KEY_PAGEUP, "PageUp" },
172 { PCE_KEY_DEL, "Delete" },
173 { PCE_KEY_END, "End" },
174 { PCE_KEY_PAGEDN, "PageDown" },
175 { PCE_KEY_UP, "Up" },
176 { PCE_KEY_LEFT, "Left" },
177 { PCE_KEY_DOWN, "Down" },
178 { PCE_KEY_RIGHT, "Right" },
179
180 { PCE_KEY_EXTRA1, "Extra1" },
181 { PCE_KEY_EXTRA2, "Extra2" },
182 { PCE_KEY_EXTRA3, "Extra3" },
183 { PCE_KEY_EXTRA4, "Extra4" },
184 { PCE_KEY_EXTRA5, "Extra5" },
185 { PCE_KEY_EXTRA6, "Extra6" },
186 { PCE_KEY_EXTRA7, "Extra7" },
187 { PCE_KEY_EXTRA8, "Extra8" },
188 { PCE_KEY_EXTRA9, "Extra9" },
189 { PCE_KEY_EXTRA10, "Extra10" },
190 { PCE_KEY_EXTRA11, "Extra11" },
191 { PCE_KEY_EXTRA12, "Extra12" },
192 { PCE_KEY_EXTRA13, "Extra13" },
193 { PCE_KEY_EXTRA14, "Extra14" },
194 { PCE_KEY_EXTRA15, "Extra15" },
195 { PCE_KEY_EXTRA16, "Extra16" },
196
197 { PCE_KEY_NONE, NULL }
198};
199
200
201pce_key_t pce_key_from_string (const char *str)
202{
203 pce_key_name_t *el;
204
205 el = keyname;
206
207 while (el->name != NULL) {
208 if (strcasecmp (el->name, str) == 0) {
209 return (el->key);
210 }
211
212 el += 1;
213 }
214
215 return (PCE_KEY_NONE);
216}
217
218const char *pce_key_to_string (pce_key_t key)
219{
220 pce_key_name_t *el;
221
222 el = keyname;
223
224 while (el->name != NULL) {
225 if (el->key == key) {
226 return (el->name);
227 }
228
229 el += 1;
230 }
231
232 return (NULL);
233}
234
235int pce_key_get_map (const char *map, unsigned long *src, pce_key_t *dst)
236{
237 unsigned i;
238 char val[32];
239
240 while ((*map == ' ') || (*map == '\t')) {
241 map += 1;
242 }
243
244 i = 0;
245 while ((i < 32) && (*map != 0) && (*map != '=') && (*map != ' ')) {
246 val[i++] = *(map++);
247 }
248
249 if (i >= 32) {
250 return (1);
251 }
252
253 val[i] = 0;
254
255 while (*map == ' ') {
256 map += 1;
257 }
258
259 if (*map == '=') {
260 map += 1;
261
262 while (*map == ' ') {
263 map += 1;
264 }
265 }
266
267 *src = strtoul (val, NULL, 0);
268 *dst = pce_key_from_string (map);
269
270 return (0);
271}