unsigned int _pSLsys_getkey () { unsigned int c; unsigned char scan; if (!keyWaiting()) { int tsecs = 300; while (!_pSLsys_input_pending(tsecs)) ; } /* read codes from buffer */ RequestSem(); startBuf = (startBuf + 1) % BUFFER_LEN; c = threadKeys [startBuf].ascii; scan = threadKeys [startBuf].scan; ReleaseSem(); switch (c) { case 8: if (scan == 0x0E) c = 127; break; case 0xE0: case 0: c = _pSLpc_convert_scancode (scan, 0, 1); break; default: break; } return (c); }
static int process_key_event (KEY_EVENT_RECORD *key) { unsigned int key_state = 0; unsigned int scan; char c1; DWORD d = key->dwControlKeyState; unsigned char buf[4]; if (!key->bKeyDown) return 0; if (d & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) key_state |= _pSLTT_KEY_ALT; if (d & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) key_state |= _pSLTT_KEY_CTRL; if (d & SHIFT_PRESSED) key_state |= _pSLTT_KEY_SHIFT; scan = key->wVirtualScanCode; switch (scan) { case 0x00E: /* backspace */ return SLang_buffer_keystring ((unsigned char *)"\x7F", 1); case 0x003: /* 2 key */ if (key_state & _pSLTT_KEY_ALT) break; /* Drop */ case 0x039: /* space */ if (key_state & _pSLTT_KEY_CTRL) return SLang_buffer_keystring ((unsigned char *)"\x00\x03", 2); break; case 0x007: /* 6 key */ if (_pSLTT_KEY_CTRL == (key_state & (_pSLTT_KEY_ALT|_pSLTT_KEY_CTRL))) return SLang_buffer_keystring ((unsigned char *)"\x1E", 1); /* Ctrl-^ */ break; case 0x00C: /* -/_ key */ if (_pSLTT_KEY_CTRL == (key_state & (_pSLTT_KEY_ALT|_pSLTT_KEY_CTRL))) return SLang_buffer_keystring ((unsigned char *)"\x1F", 1); break; case 0x00F: /* TAB */ if (_pSLTT_KEY_SHIFT == key_state) return SLang_buffer_keystring ((unsigned char *)"\x00\x09", 2); break; case 0xE02F: /* KEYPAD SLASH */ case 0x037: /* KEYPAD STAR */ case 0x04A: /* KEYPAD MINUS */ case 0x04E: /* KEYPAD PLUS */ if (d & NUMLOCK_ON) break; case 0x047: /* KEYPAD HOME */ case 0x048: /* KEYPAD UP */ case 0x049: /* KEYPAD PGUP */ case 0x04B: /* KEYPAD LEFT */ case 0x04C: /* KEYPAD 5 */ case 0x04D: /* KEYPAD RIGHT */ case 0x04F: /* KEYPAD END */ case 0x050: /* KEYPAD DOWN */ case 0x051: /* KEYPAD PGDN */ case 0x052: /* KEYPAD INSERT */ case 0x053: /* KEYPAD DEL */ if (d & ENHANCED_KEY) scan |= 0xE000; else { if (d & NUMLOCK_ON) break; } (void) _pSLpc_convert_scancode (scan, key_state, 0); return 0; case 0x3b: /* F1 */ case 0x3c: case 0x3d: case 0x3e: case 0x3f: case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x57: case 0x58: /* F12 */ (void) _pSLpc_convert_scancode (scan, key_state, 0); } c1 = key->uChar.AsciiChar; if (c1 != 0) { if (_pSLTT_KEY_ALT == (key_state & (_pSLTT_KEY_ALT|_pSLTT_KEY_CTRL))) { buf[0] = 27; buf[1] = c1; return SLang_buffer_keystring (buf, 2); } if (c1 == SLang_Abort_Char) { if (SLang_Ignore_User_Abort == 0) SLang_set_error (USER_BREAK); SLKeyBoard_Quit = 1; } buf[0] = c1; return SLang_buffer_keystring (buf, 1); } return 0; }