1 module scone.input.os.windows.input.key_event_record_converter; 2 3 version (Windows) 4 { 5 import core.sys.windows.windows; 6 import scone.input.scone_control_key : SCK; 7 import scone.input.scone_key : SK; 8 import scone.core.flags : hasFlag, withFlag; 9 10 final class KeyEventRecordConverter 11 { 12 private KEY_EVENT_RECORD keyEventRecord; 13 14 this(KEY_EVENT_RECORD keyEventRecord) 15 { 16 this.keyEventRecord = keyEventRecord; 17 } 18 19 SK sconeKey() 20 { 21 switch (this.keyEventRecord.wVirtualKeyCode) 22 { 23 default: 24 return SK.unknown; 25 case WindowsKeyCode.K_0: 26 return SK.key_0; 27 case WindowsKeyCode.K_1: 28 return SK.key_1; 29 case WindowsKeyCode.K_2: 30 return SK.key_2; 31 case WindowsKeyCode.K_3: 32 return SK.key_3; 33 case WindowsKeyCode.K_4: 34 return SK.key_4; 35 case WindowsKeyCode.K_5: 36 return SK.key_5; 37 case WindowsKeyCode.K_6: 38 return SK.key_6; 39 case WindowsKeyCode.K_7: 40 return SK.key_7; 41 case WindowsKeyCode.K_8: 42 return SK.key_8; 43 case WindowsKeyCode.K_9: 44 return SK.key_9; 45 case WindowsKeyCode.K_A: 46 return SK.a; 47 case WindowsKeyCode.K_B: 48 return SK.b; 49 case WindowsKeyCode.K_C: 50 return SK.c; 51 case WindowsKeyCode.K_D: 52 return SK.d; 53 case WindowsKeyCode.K_E: 54 return SK.e; 55 case WindowsKeyCode.K_F: 56 return SK.f; 57 case WindowsKeyCode.K_G: 58 return SK.g; 59 case WindowsKeyCode.K_H: 60 return SK.h; 61 case WindowsKeyCode.K_I: 62 return SK.i; 63 case WindowsKeyCode.K_J: 64 return SK.j; 65 case WindowsKeyCode.K_K: 66 return SK.k; 67 case WindowsKeyCode.K_L: 68 return SK.l; 69 case WindowsKeyCode.K_M: 70 return SK.m; 71 case WindowsKeyCode.K_N: 72 return SK.n; 73 case WindowsKeyCode.K_O: 74 return SK.o; 75 case WindowsKeyCode.K_P: 76 return SK.p; 77 case WindowsKeyCode.K_Q: 78 return SK.q; 79 case WindowsKeyCode.K_R: 80 return SK.r; 81 case WindowsKeyCode.K_S: 82 return SK.s; 83 case WindowsKeyCode.K_T: 84 return SK.t; 85 case WindowsKeyCode.K_U: 86 return SK.u; 87 case WindowsKeyCode.K_V: 88 return SK.v; 89 case WindowsKeyCode.K_W: 90 return SK.w; 91 case WindowsKeyCode.K_X: 92 return SK.x; 93 case WindowsKeyCode.K_Y: 94 return SK.y; 95 case WindowsKeyCode.K_Z: 96 return SK.z; 97 case VK_F1: 98 return SK.f1; 99 case VK_F2: 100 return SK.f2; 101 case VK_F3: 102 return SK.f3; 103 case VK_F4: 104 return SK.f4; 105 case VK_F5: 106 return SK.f5; 107 case VK_F6: 108 return SK.f6; 109 case VK_F7: 110 return SK.f7; 111 case VK_F8: 112 return SK.f8; 113 case VK_F9: 114 return SK.f9; 115 case VK_F10: 116 return SK.f10; 117 case VK_F11: 118 return SK.f11; 119 case VK_F12: 120 return SK.f12; 121 case VK_F13: 122 return SK.f13; 123 case VK_F14: 124 return SK.f14; 125 case VK_F15: 126 return SK.f15; 127 case VK_F16: 128 return SK.f16; 129 case VK_F17: 130 return SK.f17; 131 case VK_F18: 132 return SK.f18; 133 case VK_F19: 134 return SK.f19; 135 case VK_F20: 136 return SK.f20; 137 case VK_F21: 138 return SK.f21; 139 case VK_F22: 140 return SK.f22; 141 case VK_F23: 142 return SK.f23; 143 case VK_F24: 144 return SK.f24; 145 case VK_NUMPAD0: 146 return SK.numpad_0; 147 case VK_NUMPAD1: 148 return SK.numpad_1; 149 case VK_NUMPAD2: 150 return SK.numpad_2; 151 case VK_NUMPAD3: 152 return SK.numpad_3; 153 case VK_NUMPAD4: 154 return SK.numpad_4; 155 case VK_NUMPAD5: 156 return SK.numpad_5; 157 case VK_NUMPAD6: 158 return SK.numpad_6; 159 case VK_NUMPAD7: 160 return SK.numpad_7; 161 case VK_NUMPAD8: 162 return SK.numpad_8; 163 case VK_NUMPAD9: 164 return SK.numpad_9; 165 case VK_BACK: 166 return SK.backspace; 167 case VK_TAB: 168 return SK.tab; 169 case VK_ESCAPE: 170 return SK.escape; 171 case VK_SPACE: 172 return SK.space; 173 case VK_PRIOR: 174 return SK.page_up; 175 case VK_NEXT: 176 return SK.page_down; 177 case VK_END: 178 return SK.end; 179 case VK_HOME: 180 return SK.home; 181 case VK_LEFT: 182 return SK.left; 183 case VK_RIGHT: 184 return SK.right; 185 case VK_UP: 186 return SK.up; 187 case VK_DOWN: 188 return SK.down; 189 case VK_DELETE: 190 return SK.del; 191 case VK_SEPARATOR: 192 return SK.enter; 193 case VK_ADD: 194 return SK.plus; 195 case VK_OEM_PLUS: 196 return SK.plus; 197 case VK_SUBTRACT: 198 return SK.minus; 199 case VK_OEM_MINUS: 200 return SK.minus; 201 case VK_OEM_PERIOD: 202 return SK.period; 203 case VK_OEM_COMMA: 204 return SK.comma; 205 case VK_DECIMAL: 206 return SK.comma; 207 case VK_MULTIPLY: 208 return SK.asterisk; 209 case VK_DIVIDE: 210 return SK.divide; 211 case VK_OEM_1: 212 return SK.oem_1; 213 case VK_OEM_2: 214 return SK.oem_2; 215 case VK_OEM_3: 216 return SK.oem_3; 217 case VK_OEM_4: 218 return SK.oem_4; 219 case VK_OEM_5: 220 return SK.oem_5; 221 case VK_OEM_6: 222 return SK.oem_6; 223 case VK_OEM_7: 224 return SK.oem_7; 225 case VK_OEM_8: 226 return SK.oem_8; 227 case VK_OEM_102: 228 return SK.oem_102; 229 case VK_RETURN: 230 return SK.enter; 231 232 /+ 233 case VK_CLEAR: return SK.clear; 234 case VK_SHIFT: return SK.shift; 235 case VK_CONTROL: return SK.control; 236 case VK_MENU: return SK.alt; 237 case VK_CAPITAL: return SK.capslock; 238 case VK_SELECT: return SK.select; 239 case VK_PRINT: return SK.print; 240 case VK_EXECUTE: return SK.execute; 241 case VK_SNAPSHOT: return SK.print_screen; 242 case VK_INSERT: return SK.insert; 243 case VK_HELP: return SK.help; 244 case VK_LWIN: return SK.windows_left; 245 case VK_RWIN: return SK.windows_right; 246 case VK_APPS: return SK.apps; 247 case VK_SLEEP: return SK.sleep; 248 case VK_NUMLOCK: return SK.numlock; 249 case VK_SCROLL: return SK.scroll_lock; 250 case VK_LSHIFT: return SK.shift_left; 251 case VK_RSHIFT: return SK.shift_right; 252 case VK_LCONTROL: return SK.control_left; 253 case VK_RCONTROL: return SK.control_right; 254 case VK_LMENU: return SK.menu_left; 255 case VK_RMENU: return SK.menu_right; 256 case VK_BROWSER_BACK: return SK.browser_back; 257 case VK_BROWSER_FORWARD: return SK.browser_forward; 258 case VK_BROWSER_REFRESH: return SK.browser_refresh; 259 case VK_BROWSER_STOP: return SK.browser_stop; 260 case VK_BROWSER_SEARCH: return SK.browser_search; 261 case VK_BROWSER_FAVORITES: return SK.browser_favorites; 262 case VK_BROWSER_HOME: return SK.browser_home; 263 case VK_VOLUME_MUTE: return SK.volume_mute; 264 case VK_VOLUME_DOWN: return SK.volume_down; 265 case VK_VOLUME_UP: return SK.volume_up; 266 case VK_MEDIA_NEXT_TRACK: return SK.media_next; 267 case VK_MEDIA_PREV_TRACK: return SK.media_prev; 268 case VK_MEDIA_STOP: return SK.media_stop; 269 case VK_MEDIA_PLAY_PAUSE: return SK.media_play_pause; 270 case VK_LAUNCH_MAIL: return SK.launch_mail; 271 case VK_LAUNCH_MEDIA_SELECT: return SK.launch_media_select; 272 case VK_LAUNCH_APP1: return SK.launch_app_1; 273 case VK_LAUNCH_APP2: return SK.launch_app_2;case VK_PACKET: return SK.packet; 274 case VK_ATTN: return SK.attn; 275 case VK_CRSEL: return SK.crsel; 276 case VK_EXSEL: return SK.exsel; 277 case VK_EREOF: return SK.ereof; 278 case VK_PLAY: return SK.play; 279 case VK_ZOOM: return SK.zoom; 280 case VK_OEM_CLEAR: return SK.oem_clear; 281 case VK_PAUSE: return SK.pause; 282 case VK_CANCEL: return SK.cancel; 283 +/ 284 } 285 } 286 287 SCK sconeControlKey() 288 { 289 SCK sck; 290 291 DWORD controlKeyState = this.keyEventRecord.dwControlKeyState; 292 293 if (controlKeyState.hasFlag(CAPSLOCK_ON)) 294 { 295 sck = sck.withFlag(SCK.capslock); 296 } 297 if (controlKeyState.hasFlag(SCROLLLOCK_ON)) 298 { 299 sck = sck.withFlag(SCK.scrolllock); 300 } 301 if (controlKeyState.hasFlag(SHIFT_PRESSED)) 302 { 303 sck = sck.withFlag(SCK.shift); 304 } 305 if (controlKeyState.hasFlag(ENHANCED_KEY)) 306 { 307 sck = sck.withFlag(SCK.enhanced); 308 } 309 if (controlKeyState.hasFlag(LEFT_ALT_PRESSED)) 310 { 311 sck = sck.withFlag(SCK.alt); 312 } 313 if (controlKeyState.hasFlag(RIGHT_ALT_PRESSED)) 314 { 315 sck = sck.withFlag(SCK.alt); 316 } 317 if (controlKeyState.hasFlag(LEFT_CTRL_PRESSED)) 318 { 319 sck = sck.withFlag(SCK.ctrl); 320 } 321 if (controlKeyState.hasFlag(RIGHT_CTRL_PRESSED)) 322 { 323 sck = sck.withFlag(SCK.ctrl); 324 } 325 if (controlKeyState.hasFlag(NUMLOCK_ON)) 326 { 327 sck = sck.withFlag(SCK.numlock); 328 } 329 330 return sck; 331 } 332 333 bool pressed() 334 { 335 return cast(bool) keyEventRecord.bKeyDown; 336 } 337 338 private enum WindowsKeyCode 339 { 340 K_0 = 0x30, 341 K_1 = 0x31, 342 K_2 = 0x32, 343 K_3 = 0x33, 344 K_4 = 0x34, 345 K_5 = 0x35, 346 K_6 = 0x36, 347 K_7 = 0x37, 348 K_8 = 0x38, 349 K_9 = 0x39, 350 K_A = 0x41, 351 K_B = 0x42, 352 K_C = 0x43, 353 K_D = 0x44, 354 K_E = 0x45, 355 K_F = 0x46, 356 K_G = 0x47, 357 K_H = 0x48, 358 K_I = 0x49, 359 K_J = 0x4A, 360 K_K = 0x4B, 361 K_L = 0x4C, 362 K_M = 0x4D, 363 K_N = 0x4E, 364 K_O = 0x4F, 365 K_P = 0x50, 366 K_Q = 0x51, 367 K_R = 0x52, 368 K_S = 0x53, 369 K_T = 0x54, 370 K_U = 0x55, 371 K_V = 0x56, 372 K_W = 0x57, 373 K_X = 0x58, 374 K_Y = 0x59, 375 K_Z = 0x5A, 376 } 377 } 378 }