2 * Skelton for retropc emulator
4 * Author : Takeda.Toshiya
6 * Converted to QT by (C) 2015 K.Ohta
8 * Jan 12, 2015 (maybe) : Initial
9 * [ Qt input -> Keyboard]
22 #include "qt_gldraw.h"
24 #include "menuclasses.h"
25 #include "agar_logger.h"
28 #define Ulong unsigned long
31 #define KEY_KEEP_FRAMES 3
33 static int mouse_x = 0;
34 static int mouse_y = 0;
35 static int mouse_relx = 0;
36 static int mouse_rely = 0;
37 static uint32 mouse_buttons = 0;
39 struct NativeScanCode {
43 struct NativeVirtualKeyCode {
48 struct NativeScanCode convTable_QTScan106[] = {
63 // Power, Sleep, Wake is not implemented, they are'nt safety.
65 {VK_KANJI, 49}, // Hankaku/Zenkaku
76 {VK_OEM_MINUS, 20}, // - =
78 {VK_OEM_5, 132}, // \|
79 {VK_BACK, 22}, // Backspace
93 {VK_RETURN, 36}, // Enter (Full key)
96 {VK_OEM_ATTN, 66}, // CAPS Lock
106 {VK_OEM_PLUS, 47}, // ;
110 {VK_LSHIFT, 50}, // LShift
118 {VK_OEM_COMMA, 59}, // ,
119 {VK_OEM_PERIOD, 60}, // .
120 {VK_OEM_2, 61}, // /(Slash)
121 {VK_OEM_102, 97}, //\_
127 {VK_NONCONVERT, 102}, // Muhenkan
129 {VK_CONVERT, 100}, // Henkan
130 {VK_OEM_COPY, 101}, // Katakana_Hiragana
162 {VK_DECIMAL, 77}, // NumLock
167 {VK_RETURN, 104}, // Enter(ten Key)
168 {0xffffffff, 0xffffffff}
170 #if defined(Q_OS_WIN32)
171 #else // Linux or Unix
172 const struct NativeVirtualKeyCode convTable_QTKey[] = {
187 // Power, Sleep, Wake is not implemented, they are'nt safety.
189 {VK_KANJI, 0xff2a}, // Hankaku/Zenkaku
190 {VK_OEM_MINUS, 0x002d}, // -=
191 {VK_OEM_MINUS, 0x003d},
192 {VK_OEM_7, 0x005e}, // ^~
194 {VK_OEM_5, 0x005c}, // \|
196 {VK_BACK, 0xff08}, // Backspace
199 {VK_RETURN, 0xff0d}, // Enter (Full key)
200 {VK_OEM_3, 0x0040}, // @
201 {VK_OEM_3, 0x0060}, // @
203 {VK_OEM_4, 0x005b}, // [
204 {VK_OEM_4, 0x007b}, // [
206 {VK_OEM_ATTN, 0xff30}, // CAPS Lock
207 {VK_OEM_PLUS, 0x002b}, // ;
208 {VK_OEM_PLUS, 0x003b}, // ;
209 {VK_OEM_1, 0x002a}, // :
210 {VK_OEM_1, 0x003a}, // :
211 {VK_OEM_6, 0x005d}, // ]
212 {VK_OEM_6, 0x007d}, // ]
214 {VK_LSHIFT, 0xffe1}, // LShift
215 {VK_OEM_COMMA, 0x2c}, // ,
216 {VK_OEM_COMMA, 0x3c}, // ,
217 {VK_OEM_PERIOD, 0x2e}, // .
218 {VK_OEM_PERIOD, 0x3e}, // .
219 {VK_OEM_2, 0x2f}, // /(Slash)
220 {VK_OEM_2, 0x3f}, // /(Slash)
221 {VK_OEM_102, 0x5f}, //\_
225 {VK_LCONTROL, 0xffe3},
228 {VK_NONCONVERT, 0xff22}, // Muhenkan
230 //{VK_OEM_AUTO, 0xff23}, // Henkan
231 {VK_CONVERT, 0xff23}, // Henkan
232 {VK_OEM_COPY, 0xff27}, // Katakana_Hiragana
236 {VK_RCONTROL, 0xffe4},
253 {VK_NUMPAD0, 0xffb0},
254 {VK_NUMPAD1, 0xffb1},
255 {VK_NUMPAD2, 0xffb2},
256 {VK_NUMPAD3, 0xffb3},
257 {VK_NUMPAD4, 0xffb4},
258 {VK_NUMPAD5, 0xffb5},
259 {VK_NUMPAD6, 0xffb6},
260 {VK_NUMPAD7, 0xffb7},
261 {VK_NUMPAD8, 0xffb8},
262 {VK_NUMPAD9, 0xffb9},
264 {VK_DECIMAL, 0xff7f}, // NumLock
266 {VK_MULTIPLY, 0xffaa},
267 {VK_SUBTRACT, 0xffad},
269 {VK_RETURN, 0xff8d}, // Enter(ten Key)
270 {VK_DECIMAL, 0xffae}, // Period(ten Key)
271 {0xffffffff, 0xffffffff}
275 #if defined(Q_OS_WIN32)
276 uint32_t GLDrawClass::getNativeKey2VK(uint32_t data)
279 #if defined(ENABLE_SWAP_KANJI_PAUSE)
280 if(config.swap_kanji_pause) {
283 } else if(vk == VK_PAUSE) {
291 uint32_t GLDrawClass::getNativeKey2VK(uint32_t data)
298 if((data >= 'a') && (data <= 'z')) {
301 if((data >= 'A') && (data <= 'Z')) {
304 if((data >= '0') && (data <= '9')) {
307 if((data > 0x20) && (data <= 0x29)) {
311 while(convTable_QTKey[i].vk != 0xffffffff) {
312 val = convTable_QTKey[i].key;
313 if(val == data) break;
316 vk = convTable_QTKey[i].vk;
318 if(vk == 0xffffffff) return 0;
319 #if defined(ENABLE_SWAP_KANJI_PAUSE)
320 if(config.swap_kanji_pause) {
323 } else if(vk == VK_PAUSE) {
328 #if !defined(_FM8) && !defined(_FM7) && !defined(_FMNEW7) && !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
329 if((vk == VK_LSHIFT) || (vk == VK_RSHIFT)) vk = VK_SHIFT;
330 if((vk == VK_LMENU) || (vk == VK_RMENU)) vk = VK_MENU;
332 if((vk == VK_LCONTROL) || (vk == VK_RCONTROL)) vk = VK_CONTROL;
337 uint32_t GLDrawClass::get106Scancode2VK(uint32_t data)
342 while(convTable_QTScan106[i].vk != 0xffffffff) {
343 val = convTable_QTScan106[i].scan;
344 if(val == data) break;
347 vk = convTable_QTScan106[i].vk;
348 //printf("SCAN=%02x VK=%02x\n", val, vk);
349 if(vk == 0xffffffff) return 0;
350 #if defined(ENABLE_SWAP_KANJI_PAUSE)
351 if(config.swap_kanji_pause) {
354 } else if(vk == VK_PAUSE) {
359 #if !defined(_FM8) && !defined(_FM7) && !defined(_FMNEW7) && !defined(_FM77_VARIANTS) && !defined(_FM77AV_VARIANTS)
360 if((vk == VK_LSHIFT) || (vk == VK_RSHIFT)) vk = VK_SHIFT;
361 if((vk == VK_LMENU) || (vk == VK_RMENU)) vk = VK_MENU;
363 if((vk == VK_LCONTROL) || (vk == VK_RCONTROL)) vk = VK_CONTROL;
367 void GLDrawClass::keyReleaseEvent(QKeyEvent *event)
369 int key = event->key();
370 uint32 mod = event->modifiers();
373 if(event->isAutoRepeat()) return;
374 //scan = event->nativeVirtualKey();
375 //vk = getNativeKey2VK(scan);
376 scan = event->nativeScanCode();
377 vk = get106Scancode2VK(scan);
379 //printf("Key: UP: VK=%d SCAN=%04x MOD=%08x\n", vk, scan, mod);
382 // Note: Qt4 with 106KEY, event->modifier() don't get Shift key as KEYMOD.
390 void GLDrawClass::keyPressEvent(QKeyEvent *event)
392 int key = event->key();
393 uint32 mod = event->modifiers();;
397 if(event->isAutoRepeat()) return;
398 //scan = event->nativeVirtualKey();
399 //vk = getNativeKey2VK(scan);
400 scan = event->nativeScanCode();
401 vk = get106Scancode2VK(scan);
403 if(vk == VK_APPS) { // Special key : capture/uncapture mouse.
404 emit sig_toggle_mouse();
408 //printf("Key: DOWN: VK=%d SCAN=%04x MOD=%08x\n", vk, scan, mod);
412 emu->key_down(vk, false);
419 uint32_t GetAsyncKeyState(uint32_t vk, uint32_t mod)
421 vk = vk & 0xff; // OK?
422 quint32 modstate = mod;
423 //printf("Mod %d %08x\n", vk, mod);
426 if((modstate & Qt::ShiftModifier) != 0) return 0xffffffff;
429 if((modstate & Qt::ShiftModifier) != 0) return 0xffffffff;
432 if((modstate & Qt::ShiftModifier) != 0) return 0xffffffff;
435 if((modstate & Qt::ControlModifier) != 0) return 0xffffffff;
438 if((modstate & Qt::ControlModifier) != 0) return 0xffffffff;
441 if((modstate & Qt::ControlModifier) != 0) return 0xffffffff;
444 if((modstate & Qt::AltModifier) != 0) return 0xffffffff;
447 if((modstate & Qt::AltModifier) != 0) return 0xffffffff;