fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 271 lines 6.7 kB view raw
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}