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]
20 #include "qt_gldraw.h"
22 //#include "menuclasses.h"
23 #include "agar_logger.h"
24 #include "menu_flags.h"
27 #define Ulong unsigned long
30 #define KEY_KEEP_FRAMES 3
32 //extern USING_FLAGS *using_flags;
34 #if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
35 const struct NativeScanCode convTable_QTScan106[] = {
50 // Power, Sleep, Wake is not implemented, they are'nt safety.
52 {VK_KANJI, 0x29}, // Hankaku/Zenkaku
63 {VK_OEM_MINUS, 0x0c}, // - =
64 {VK_OEM_7, 0x0d}, // ^~
65 {VK_OEM_5, 0x7d}, // \|
66 {VK_BACK, 0x0e}, // Backspace
79 {VK_OEM_3, 0x1a}, // @
80 {VK_OEM_4, 0x1b}, // [
81 {VK_RETURN, 0x1c}, // Enter (Full key)
83 {VK_OEM_ATTN, 0x3a}, // CAPS Lock
93 {VK_OEM_PLUS, 0x27}, // ;
94 {VK_OEM_1, 0x28}, // :
95 {VK_OEM_6, 0x2b}, // ]
97 {VK_LSHIFT, 0x2a}, // LShift
105 {VK_OEM_COMMA, 0x33}, // ,
106 {VK_OEM_PERIOD, 0x34}, // .
107 {VK_OEM_2, 0x35}, // /(Slash)
108 {VK_OEM_102, 0x73}, //\_
114 {VK_NONCONVERT, 0x68}, // Muhenkan
116 {VK_CONVERT, 0x66}, // Henkan
117 {VK_OEM_COPY, 0x70}, // Katakana_Hiragana
121 {VK_RCONTROL, 0x011d},
149 {VK_DECIMAL, 0x53}, // NumLock
154 {VK_RETURN, 0x011c}, // Enter(ten Key)
155 {0xffffffff, 0xffffffff}
159 uint32_t GLDrawClass::get106Scancode2VK(uint32_t data)
164 vk = key_table->get_vk_from_scan(data);
165 if(config.swap_kanji_pause) {
168 } else if(vk == VK_PAUSE) {
172 if(!using_flags->is_notify_key_down_lr_shift()) {
173 if((vk == VK_LSHIFT) || (vk == VK_RSHIFT)) vk = VK_SHIFT;
174 if((vk == VK_LMENU) || (vk == VK_RMENU)) vk = VK_MENU;
176 if((vk == VK_LCONTROL) || (vk == VK_RCONTROL)) vk = VK_CONTROL;
180 void GLDrawClass::initKeyCode(void)
183 key_table = new CSP_KeyTables(this, default_key_table_106_QtScan);
186 // Replace only ScanCode
187 FILEIO *fio = new FILEIO();
188 std::string app_path2;
190 app_path2 = cpp_confdir + "scancode.cfg";
191 if(fio->Fopen(app_path2.c_str(), FILEIO_READ_ASCII)) {
193 memset(buf, 0x00, sizeof(buf));
194 while(fio->Fgets(buf, 512) != NULL) {
198 nstr = QString::fromUtf8(buf);
199 nlist = nstr.split(",", QString::SkipEmptyParts);
200 if(nlist.count() < 2) continue;
201 uint32_t vk = nlist.at(0).toULong(&ok1, 16);
202 uint32_t scan = nlist.at(1).toULong(&ok2, 16);
203 if((vk == 0) || (vk > 255)) continue;
205 key_table->do_set_scan_code(vk, scan);
214 void GLDrawClass::releaseKeyCode(void)
216 // Replace only ScanCode
218 FILEIO *fio = new FILEIO();
219 std::string app_path2;
223 app_path2 = cpp_confdir + "scancode.cfg";
224 if(fio->Fopen(app_path2.c_str(), FILEIO_WRITE_ASCII)) {
225 for(i = 0; i < 256; i++) {
226 scan = key_table->get_scan_from_vk((uint32_t)i);
227 if(scan >= 0xffffffff) continue;
228 fio->Fprintf("%02x,%08x\n", i, scan);
232 if(key_table != NULL) {
238 void GLDrawClass::keyReleaseEvent(QKeyEvent *event)
240 int key = event->key();
241 uint32_t mod = event->modifiers();
244 if(event->isAutoRepeat()) return;
245 scan = event->nativeScanCode();
246 vk = get106Scancode2VK(scan);
247 #if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
248 if(using_flags->is_notify_key_down_lr_shift()) {
250 if((GetAsyncKeyState(VK_LSHIFT) & 0x8000) == 0) vk = VK_LSHIFT;
251 if((GetAsyncKeyState(VK_RSHIFT) & 0x8000) == 0) vk = VK_RSHIFT;
254 if(GetAsyncKeyState(VK_LMENU) & 0x8000) vk = VK_LMENU;
255 if(GetAsyncKeyState(VK_RMENU) & 0x8000) vk = VK_RMENU;
259 //printf("Key: UP: VK=%d SCAN=%04x MOD=%08x\n", vk, scan, mod);
260 emit sig_key_up(vk, mod);
263 void GLDrawClass::keyPressEvent(QKeyEvent *event)
265 int key = event->key();
266 uint32_t mod = event->modifiers();;
270 if(event->isAutoRepeat()) return;
271 scan = event->nativeScanCode();
272 vk = get106Scancode2VK(scan);
274 if(using_flags->is_use_mouse()) {
275 if(vk == VK_APPS) { // Special key : capture/uncapture mouse.
276 emit sig_toggle_mouse();
280 #if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
281 if(using_flags->is_notify_key_down_lr_shift()) {
283 if(GetAsyncKeyState(VK_LSHIFT) & 0x8000) vk = VK_LSHIFT;
284 if(GetAsyncKeyState(VK_RSHIFT) & 0x8000) vk = VK_RSHIFT;
287 if(GetAsyncKeyState(VK_LMENU) & 0x8000) vk = VK_LMENU;
288 if(GetAsyncKeyState(VK_RMENU) & 0x8000) vk = VK_RMENU;
293 //printf("Key: DOWN: VK=%d SCAN=%04x MOD=%08x\n", vk, scan, mod);
294 emit sig_key_down(vk, mod, false);
298 QStringList *GLDrawClass::getKeyNames(void)
301 return key_table->get_scan_name_list();
306 QStringList *GLDrawClass::getVKNames(void)
309 return key_table->get_vk_name_list();
314 keydef_table_t *GLDrawClass::get_key_table(int index)
317 return key_table->get_using_key_table(index);
322 keydef_table_t *GLDrawClass::get_key_tables(void)
325 return key_table->get_using_key_table(0);
330 int GLDrawClass::get_key_table_size(void)
333 return key_table->get_key_table_size();
339 void GLDrawClass::do_update_keyboard_scan_code(uint32_t vk, uint32_t scan)
342 key_table->do_set_scan_code(vk, scan);
346 uint32_t GLDrawClass::get_vk_from_index(int index)
349 return key_table->get_vk_from_index(index);
354 uint32_t GLDrawClass::get_scan_from_index(int index)
357 return key_table->get_scan_from_index(index);
362 const char *GLDrawClass::get_key_vk_name(int index)
365 return key_table->get_vk_name(index);
370 const keydef_table_t *GLDrawClass::get_default_key_table()
373 return (const keydef_table_t *)key_table->get_default_key_table();