OSDN Git Service

[UI][Input][Qt] Using native scan code to get keycode, not portable (maybe...).
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 16 Jan 2015 18:23:42 +0000 (03:23 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 16 Jan 2015 18:23:42 +0000 (03:23 +0900)
source/src/qt/common/CMakeLists.txt
source/src/qt/common/emu_input.cpp [moved from source/src/qt/common/qt_input.cpp with 60% similarity]
source/src/qt/common/qt_gldraw.h
source/src/qt/common/qt_input.h
source/src/qt/common/qt_main.cpp
source/src/qt/gui/CMakeLists.txt
source/src/qt/gui/qt_input.cpp [new file with mode: 0644]

index 5804280..091b5ed 100644 (file)
@@ -1,11 +1,8 @@
 message("* qt/common")
 
 set(s_qt_common_headers
-#        emu_utils.h
          qt_dialogs.h
-#        qt_emuevents.h
          qt_gldraw.h
-#        qt_input.h
 )
 
 QT4_WRAP_CPP(s_qt_common_headers_MOC ${s_qt_common_headers})
@@ -19,10 +16,10 @@ add_executable(${EXEC_TARGET}
          qt_dialogs.cpp
          qt_main.cpp
          qt_screen.cpp
-         qt_input.cpp
          agar_logger.cpp
          sdl_sound.cpp
          qt_debugger.cpp
+         emu_input.cpp
          sdl_cpuid.c
          ${s_qt_common_headers_MOC}
 )
similarity index 60%
rename from source/src/qt/common/qt_input.cpp
rename to source/src/qt/common/emu_input.cpp
index b43f8c0..869d21c 100644 (file)
@@ -6,11 +6,11 @@
  *      Converted to QT by (C) 2015 K.Ohta
  *         History:
  *            Jan 12, 2015 (maybe) : Initial
- *     [ Qt input -> Keyboard]
+ *     [ SDL input -> Keyboard]
 */
 
 #include <Qt>
-#include <QKeyEvent>
+#include <SDL2/SDL.h>
 #include "emu.h"
 #include "vm/vm.h"
 #include "fifo.h"
 
 #define KEY_KEEP_FRAMES 3
 
-const struct QtKeyTable  QtKeyMappings[] = {
-       { '0',                  Qt::Key_0 },
-       { '1',                  Qt::Key_1 },
-       { '2',                  Qt::Key_2 },
-       { '3',                  Qt::Key_3 },
-       { '4',                  Qt::Key_4 },
-       { '5',                  Qt::Key_5 },
-       { '6',                  Qt::Key_6 },
-       { '7',                  Qt::Key_7 },
-       { '8',                  Qt::Key_8 },
-       { '9',                  Qt::Key_9 },
-       { 'A',                  Qt::Key_A },
-       { 'B',                  Qt::Key_B },
-       { 'C',                  Qt::Key_C },
-       { 'D',                  Qt::Key_D },
-       { 'E',                  Qt::Key_E },
-       { 'F',                  Qt::Key_F },
-       { 'G',                  Qt::Key_G },
-       { 'H',                  Qt::Key_H },
-       { 'I',                  Qt::Key_I },
-       { 'J',                  Qt::Key_J },
-       { 'K',                  Qt::Key_K },
-       { 'L',                  Qt::Key_L },
-       { 'M',                  Qt::Key_M },
-       { 'N',                  Qt::Key_N },
-       { 'O',                  Qt::Key_O },
-       { 'P',                  Qt::Key_P },
-       { 'Q',                  Qt::Key_Q },
-       { 'R',                  Qt::Key_R },
-       { 'S',                  Qt::Key_S },
-       { 'T',                  Qt::Key_T },
-       { 'U',                  Qt::Key_U },
-       { 'V',                  Qt::Key_V },
-       { 'W',                  Qt::Key_W },
-       { 'X',                  Qt::Key_X },
-       { 'Y',                  Qt::Key_Y },
-       { 'Z',                  Qt::Key_Z },
+extern EMU* emu;
+
+struct SDLKeyTable  SDLKeyMappings[] = {
+       { '0',                  SDL_SCANCODE_0 },
+       { '1',                  SDL_SCANCODE_1 },
+       { '2',                  SDL_SCANCODE_2 },
+       { '3',                  SDL_SCANCODE_3 },
+       { '4',                  SDL_SCANCODE_4 },
+       { '5',                  SDL_SCANCODE_5 },
+       { '6',                  SDL_SCANCODE_6 },
+       { '7',                  SDL_SCANCODE_7 },
+       { '8',                  SDL_SCANCODE_8 },
+       { '9',                  SDL_SCANCODE_9 },
+       { 'A',                  SDL_SCANCODE_A },
+       { 'B',                  SDL_SCANCODE_B },
+       { 'C',                  SDL_SCANCODE_C },
+       { 'D',                  SDL_SCANCODE_D },
+       { 'E',                  SDL_SCANCODE_E },
+       { 'F',                  SDL_SCANCODE_F },
+       { 'G',                  SDL_SCANCODE_G },
+       { 'H',                  SDL_SCANCODE_H },
+       { 'I',                  SDL_SCANCODE_I },
+       { 'J',                  SDL_SCANCODE_J },
+       { 'K',                  SDL_SCANCODE_K },
+       { 'L',                  SDL_SCANCODE_L },
+       { 'M',                  SDL_SCANCODE_M },
+       { 'N',                  SDL_SCANCODE_N },
+       { 'O',                  SDL_SCANCODE_O },
+       { 'P',                  SDL_SCANCODE_P },
+       { 'Q',                  SDL_SCANCODE_Q },
+       { 'R',                  SDL_SCANCODE_R },
+       { 'S',                  SDL_SCANCODE_S },
+       { 'T',                  SDL_SCANCODE_T },
+       { 'U',                  SDL_SCANCODE_U },
+       { 'V',                  SDL_SCANCODE_V },
+       { 'W',                  SDL_SCANCODE_W },
+       { 'X',                  SDL_SCANCODE_X },
+       { 'Y',                  SDL_SCANCODE_Y },
+       { 'Z',                  SDL_SCANCODE_Z },
         // Start Qt's workaround: Qt returns character directry when keyin/out.
        // Excepts(maybe) 'a' to 'z'?
        // So, you should change keycode, using other than 109 / 106 Keyboard.
-       {'1',                   Qt::Key_Exclam},
-       {'2',                   Qt::Key_QuoteDbl},
-        {'3',                  Qt::Key_NumberSign},
-        {'4',                  Qt::Key_Dollar},
-        {'5',                  Qt::Key_Percent},
-        {'6',                  Qt::Key_Ampersand},
-        {'7',                  Qt::Key_Apostrophe},
-        {'8',                  Qt::Key_ParenLeft},
-        {'9',                  Qt::Key_ParenRight},
-        {0xBA,                 Qt::Key_Asterisk}, // $2a
-        {0xBB,                 Qt::Key_Plus}, // $2b
-        {0xBC,                  Qt::Key_Less}, // ,
-        {0xBD,                  Qt::Key_AsciiTilde}, // ^~
-        {0xBE,                  Qt::Key_Greater}, //$2e
-        {0xBF,                  Qt::Key_Question}, //$2f
-        {0xC0,                  Qt::Key_QuoteLeft}, //`
-        {0xE2,                 Qt::Key_Underscore},//_\
-        
-
+//        {0xBA,                       SDL_SCANCODE_ASTERISK}, // $2a
+//        {0xBB,                       SDL_SCANCODE_PLUS}, // $2b
+//        {0xBC,                  SDL_SCANCODE_LESS}, // ,
+//        {0xBD,                  SDL_SCANCODE_CARET}, // ^~
+//        {0xBE,                  SDL_SCANCODE_GREATER}, //$2e
+//        {0xBF,                  SDL_SCANCODE_QUSETION}, //$2f
+        //{0xC0,                  SDL_SCANCODE_BACKQUOTE}, //`
+//        {0xE2,                       SDL_SCANCODE_UNDERSCORE},//_\
+        {0xE2,                 SDL_SCANCODE_INTERNATIONAL3},//_\
         // End.
-       { VK_F1,                Qt::Key_F1 },
-       { VK_F2,                Qt::Key_F2 },
-       { VK_F3,                Qt::Key_F3 },
-       { VK_F4,                Qt::Key_F4 },
-       { VK_F5,                Qt::Key_F5 },
-       { VK_F6,                Qt::Key_F6 },
-       { VK_F7,                Qt::Key_F7 },
-       { VK_F8,                Qt::Key_F8 },
-       { VK_F9,                Qt::Key_F9 },
-       { VK_F10,               Qt::Key_F10 },
-       { VK_F11,               Qt::Key_F11 },
-       { VK_F12,               Qt::Key_F12 },
-       { VK_F13,               Qt::Key_F13 },
-       { VK_F14,               Qt::Key_F14 },
-       { VK_F15,               Qt::Key_F15 },
-       { VK_BACK,              Qt::Key_Backspace },
-       { VK_TAB,               Qt::Key_Tab },
-       { VK_CLEAR,             Qt::Key_Clear },
-       { VK_RETURN,            Qt::Key_Return },
-       { VK_PAUSE,             Qt::Key_Pause },
-       { VK_ESCAPE,            Qt::Key_Escape },
-       { VK_SPACE,             Qt::Key_Space },
-       { VK_DELETE,            Qt::Key_Delete },
-       { VK_UP,                Qt::Key_Up },
-       { VK_DOWN,              Qt::Key_Down },
-       { VK_RIGHT,             Qt::Key_Right },
-       { VK_LEFT,              Qt::Key_Left },
-       { VK_INSERT,            Qt::Key_Insert },
-       { VK_HOME,              Qt::Key_Home },
-       { VK_END,               Qt::Key_End },
-       { VK_PRIOR,             Qt::Key_PageUp },
-       { VK_NEXT,              Qt::Key_PageDown },
-// Fixme: Ten keys (Key pad) are undefined on Qt. 
-//     { VK_NUMPAD0,           Qt::Key_KP0 },
-//     { VK_NUMPAD1,           Qt::Key_KP1 },
-//     { VK_NUMPAD2,           Qt::Key_KP2 },
-//     { VK_NUMPAD3,           Qt::Key_KP3 },
-//     { VK_NUMPAD4,           Qt::Key_KP4 },
-//     { VK_NUMPAD5,           Qt::Key_KP5 },
-//     { VK_NUMPAD6,           Qt::Key_KP6 },
-//     { VK_NUMPAD7,           Qt::Key_KP7 },
-//     { VK_NUMPAD8,           Qt::Key_KP8 },
-//     { VK_NUMPAD9,           Qt::Key_KP9 },
-//
-//     { VK_DECIMAL,           Qt::Key_Period },
-//     { VK_DIVIDE,            Qt::Key_Slash},
-//     { VK_MULTIPLY,          Qt::Key_multiply },
-//     { VK_SUBTRACT,          Qt::Key_Minus },
-//     { VK_ADD,               Qt::Key_Plus },
-
-       { VK_NUMLOCK,           Qt::Key_NumLock },
-       { VK_CAPITAL,           Qt::Key_Henkan }, // fixme : JP only
-       { VK_SCROLL,            Qt::Key_ScrollLock },
-       { VK_SHIFT,             Qt::Key_Shift }, // Left
-       { VK_RSHIFT,            Qt::Key_Shift }, // Right
-       { VK_LSHIFT,            Qt::Key_Shift }, // Right
-       { VK_CONTROL,           Qt::Key_Control }, // Right
-       { VK_RCONTROL,          Qt::Key_Control }, // Right
-       { VK_LCONTROL,          Qt::Key_Control }, // Left
-       { VK_RMENU,             Qt::Key_Menu },  // Right
-       { VK_LMENU,             Qt::Key_Alt },  // Left
-       { VK_MENU,              Qt::Key_Muhenkan },  // Right
-       { VK_RWIN,              Qt::Key_Hyper_R },
-       { VK_LWIN,              Qt::Key_Hyper_L },
-       { VK_HELP,              Qt::Key_Help }, // Right?
+       { VK_F1,                SDL_SCANCODE_F1 },
+       { VK_F2,                SDL_SCANCODE_F2 },
+       { VK_F3,                SDL_SCANCODE_F3 },
+       { VK_F4,                SDL_SCANCODE_F4 },
+       { VK_F5,                SDL_SCANCODE_F5 },
+       { VK_F6,                SDL_SCANCODE_F6 },
+       { VK_F7,                SDL_SCANCODE_F7 },
+       { VK_F8,                SDL_SCANCODE_F8 },
+       { VK_F9,                SDL_SCANCODE_F9 },
+       { VK_F10,               SDL_SCANCODE_F10 },
+       { VK_F11,               SDL_SCANCODE_F11 },
+       { VK_F12,               SDL_SCANCODE_F12 },
+       { VK_F13,               SDL_SCANCODE_F13 },
+       { VK_F14,               SDL_SCANCODE_F14 },
+       { VK_F15,               SDL_SCANCODE_F15 },
+       { VK_BACK,              SDL_SCANCODE_BACKSPACE },
+       { VK_TAB,               SDL_SCANCODE_TAB },
+       { VK_CLEAR,             SDL_SCANCODE_CLEAR },
+       { VK_RETURN,            SDL_SCANCODE_RETURN },
+       { VK_PAUSE,             SDL_SCANCODE_PAUSE },
+       { VK_ESCAPE,            SDL_SCANCODE_ESCAPE },
+       { VK_SPACE,             SDL_SCANCODE_SPACE },
+       { VK_DELETE,            SDL_SCANCODE_DELETE },
+       { VK_UP,                SDL_SCANCODE_UP },
+       { VK_DOWN,              SDL_SCANCODE_DOWN},
+       { VK_RIGHT,             SDL_SCANCODE_RIGHT },
+       { VK_LEFT,              SDL_SCANCODE_LEFT },
+       { VK_INSERT,            SDL_SCANCODE_INSERT },
+       { VK_HOME,              SDL_SCANCODE_HOME },
+       { VK_END,               SDL_SCANCODE_END },
+       { VK_PRIOR,             SDL_SCANCODE_PAGEUP },
+       { VK_NEXT,              SDL_SCANCODE_PAGEDOWN },
+
+       { VK_NUMPAD0,           SDL_SCANCODE_KP_0 },
+       { VK_NUMPAD1,           SDL_SCANCODE_KP_1 },
+       { VK_NUMPAD2,           SDL_SCANCODE_KP_2 },
+       { VK_NUMPAD3,           SDL_SCANCODE_KP_3 },
+       { VK_NUMPAD4,           SDL_SCANCODE_KP_4 },
+       { VK_NUMPAD5,           SDL_SCANCODE_KP_5 },
+       { VK_NUMPAD6,           SDL_SCANCODE_KP_6 },
+       { VK_NUMPAD7,           SDL_SCANCODE_KP_7 },
+       { VK_NUMPAD8,           SDL_SCANCODE_KP_8 },
+       { VK_NUMPAD9,           SDL_SCANCODE_KP_9 },
+
+       { VK_DECIMAL,           SDL_SCANCODE_KP_PERIOD },
+       { VK_DIVIDE,            SDL_SCANCODE_KP_DIVIDE},
+       { VK_MULTIPLY,          SDL_SCANCODE_KP_MULTIPLY },
+       { VK_SUBTRACT,          SDL_SCANCODE_KP_MINUS },
+       { VK_ADD,               SDL_SCANCODE_KP_PLUS },
+
+       { VK_NUMLOCK,           SDL_SCANCODE_NUMLOCKCLEAR },
+//     { VK_CAPITAL,           SDL_SCANCODE_Henkan }, // Need check
+       { VK_CAPITAL,           SDL_SCANCODE_CAPSLOCK}, // Need check
+       { VK_SCROLL,            SDL_SCANCODE_SCROLLLOCK },
+//     { VK_SHIFT,             SDL_SCANCODE_LSHIFT }, // Left
+       { VK_RSHIFT,            SDL_SCANCODE_RSHIFT }, // Right
+       { VK_LSHIFT,            SDL_SCANCODE_LSHIFT }, // Right
+//     { VK_CONTROL,           SDL_SCANCODE_CTRL }, // Right
+       { VK_RCONTROL,          SDL_SCANCODE_RCTRL }, // Right
+       { VK_LCONTROL,          SDL_SCANCODE_LCTRL }, // Left
+       { VK_RMENU,             SDL_SCANCODE_RALT },  // Right
+       { VK_LMENU,             SDL_SCANCODE_LALT },  // Left
+       { VK_MENU,              SDL_SCANCODE_MENU },  // Right
+       { VK_RWIN,              SDL_SCANCODE_RGUI },
+       { VK_LWIN,              SDL_SCANCODE_LGUI },
+       { VK_HELP,              SDL_SCANCODE_HELP }, // Right?
 #ifdef VK_PRINT
-       { VK_PRINT,             Qt::Key_Print },
-#endif
-       { VK_SNAPSHOT,          Qt::Key_Print },
-       { VK_CANCEL,            Qt::Key_Pause },
-       { VK_APPS,              Qt::Key_Menu },
-        { 0xBA,                        Qt::Key_Colon },
-        { 0xBB,                        Qt::Key_Semicolon },
-       { 0xBC,                 Qt::Key_Comma },
-       { 0xBD,                 Qt::Key_Minus },//
-       { 0xBE,                 Qt::Key_Period },//
-       { 0xBF,                 Qt::Key_Slash },//
-       { 0xBB,                 Qt::Key_Equal },//
-       { 0xC0,                 Qt::Key_At },
-       { 0xDB,                 Qt::Key_BracketLeft },//]
-       { 0xDB,                 Qt::Key_BraceLeft }, //}
-//     { 0xDC,                 Qt::Key_Backslash },  // Okay?
-       { 0xDC,                 Qt::Key_yen },
-       { 0xDC,                 Qt::Key_Bar },
-       { 0xDD,                 Qt::Key_BracketRight }, //[
-       { 0xDD,                 Qt::Key_BraceRight }, //{
-       { 0xDE,                 Qt::Key_AsciiCircum},
-//     { 0xDF,                 Qt::Key_QuoteLeft },
-       { 0xDC,                 Qt::Key_Backslash },
+       { VK_PRINT,             SDL_SCANCODE_PRINTSCREEN },
+#endif
+       { VK_SNAPSHOT,          SDL_SCANCODE_PRINTSCREEN },
+       { VK_CANCEL,            SDL_SCANCODE_PAUSE },
+       { VK_APPS,              SDL_SCANCODE_APPLICATION },
+        { 0xBA,                        SDL_SCANCODE_KP_COLON },
+        { 0xBB,                        SDL_SCANCODE_SEMICOLON },
+//        { 0xBB,                      SDL_SCANCODE_KP_SEMICOLON },
+       { 0xBC,                 SDL_SCANCODE_COMMA },
+       { 0xBD,                 SDL_SCANCODE_MINUS },//
+       { 0xBE,                 SDL_SCANCODE_PERIOD },//
+       { 0xBF,                 SDL_SCANCODE_SLASH },//
+       { 0xBB,                 SDL_SCANCODE_EQUALS },//
+       { 0xC0,                 SDL_SCANCODE_KP_AT },
+       { 0xDB,                 SDL_SCANCODE_LEFTBRACKET },//]
+       { 0xDC,                 SDL_SCANCODE_BACKSLASH },  // Okay?
+       { 0xDD,                 SDL_SCANCODE_RIGHTBRACKET }, //[
+       { 0xDE,                 SDL_SCANCODE_NONUSBACKSLASH }, // ^
+//     { 0xDF,                 SDL_SCANCODE_QuoteLeft },
 
         // VK_CAPITAL 
-       { 0xF0,                 Qt::Key_CapsLock },
+       { 0xF0,                 SDL_SCANCODE_CAPSLOCK },
         // VK_KANA 
-       { 0xF2,                 Qt::Key_Hiragana },
-       { 0xF2,                 Qt::Key_Katakana },
-       { 0xF2,                 Qt::Key_Hiragana_Katakana },
+       { 0xF2,                 SDL_SCANCODE_LANG3 },
+       { 0xF2,                 SDL_SCANCODE_LANG4 },
         // VK_KANJI 
-       { 0xF3,                 Qt::Key_Zenkaku },
-       { 0xF4,                 Qt::Key_Hankaku },
-       { 0xF3,                 Qt::Key_Zenkaku_Hankaku },
+       { 0xF3,                 SDL_SCANCODE_LANG5 },
+//     { 0xF4,                 SDL_SCANCODE_Hankaku },
    
-        { 0xffff, 0xffff}
+        { 0xffffffff, 0xffffffff}
 };
 
 
-static int mouse_x = 0;
-static int mouse_y = 0;
-static int mouse_relx = 0;
-static int mouse_rely = 0;
-static uint32 mouse_buttons = 0;
-   
-   
-void GLDrawClass::keyReleaseEvent(QKeyEvent *event)
-{
-  int key = event->key();
-  uint32 mod = event->modifiers();
-  emu->LockVM();
-  emu->key_mod(mod);
-  emu->key_up(key);
-  emu->UnlockVM();
-//   AGAR_DebugLog(AGAR_LOG_DEBUG, "Key up. Modifier = %08x", pushed_mod);
-}
-
-void GLDrawClass::keyPressEvent(QKeyEvent *event)
-{
-   int key = event->key();
-  uint32 mod = event->modifiers();
-  emu->LockVM();
-//#ifdef NOTIFY_KEY_DOWN
-  emu->key_mod(mod);
-  emu->key_down(key, false);
-//#endif
-   emu->UnlockVM();
-//        AGAR_DebugLog(AGAR_LOG_DEBUG, "Key down. Modifier = %08x", pushed_mod);
-}
-
-#if 0
-void OnMouseMotion(Q *event)
-{
-  // Need lock?
-  int x = AG_INT(1);
-  int y = AG_INT(2);
-  mouse_relx = AG_INT(3);
-  mouse_rely = AG_INT(4);
-  int buttons = AG_INT(5);
-
-  if((hScreenWidget != NULL) && (emu != NULL)){
-    //mouse_x = (x * emu->screen_width)  /  hScreenWidget->w;
-    //mouse_y = (y * emu->screen_height) /  hScreenWidget->h;
-    mouse_x = x;
-    mouse_y = y;
-  }
-  // Need Unlock?
-}
 
-void OnMouseButtonDown(AG_Event *event)
-{
-  // Need Lock?
-  int buttons = AG_INT(1);
-  switch (buttons){
-  case AG_MOUSE_NONE:
-    break;
-  case AG_MOUSE_LEFT:
-    mouse_buttons |= UI_MOUSE_LEFT;
-    break;
-  case AG_MOUSE_MIDDLE:
-    mouse_buttons |= UI_MOUSE_MIDDLE;
-    break;
-  case AG_MOUSE_RIGHT:
-    mouse_buttons |= UI_MOUSE_RIGHT;
-    break;
-  case AG_MOUSE_X1:
-    mouse_buttons |= UI_MOUSE_X1;
-    break;
-  case AG_MOUSE_X2:
-    mouse_buttons |= UI_MOUSE_X2;
-    break;
-  case AG_MOUSE_WHEELUP:
-    mouse_buttons |= UI_MOUSE_WHEELUP;
-    break;
-  case AG_MOUSE_WHEELDOWN:
-    mouse_buttons |= UI_MOUSE_WHEELDOWN;
-    break;
-  default:
-    break;
-  }
-  // Need Unlock?
-}
 
-void OnMouseButtonUp(AG_Event *event)
+uint32_t convert_SDLKey2VK(uint32_t sym)
 {
-  // Need Lock?
-  int buttons = AG_INT(1);
-  switch (buttons){
-  case AG_MOUSE_NONE:
-    break;
-  case AG_MOUSE_LEFT:
-    mouse_buttons &= ~UI_MOUSE_LEFT;
-    break;
-  case AG_MOUSE_MIDDLE:
-    mouse_buttons &= ~UI_MOUSE_MIDDLE;
-    break;
-  case AG_MOUSE_RIGHT:
-    mouse_buttons &= ~UI_MOUSE_RIGHT;
-    break;
-  case AG_MOUSE_X1:
-    mouse_buttons &= ~UI_MOUSE_X1;
-    break;
-  case AG_MOUSE_X2:
-    mouse_buttons &= ~UI_MOUSE_X2;
-    break;
-  case AG_MOUSE_WHEELUP:
-    mouse_buttons &= ~UI_MOUSE_WHEELUP;
-    break;
-  case AG_MOUSE_WHEELDOWN:
-    mouse_buttons &= ~UI_MOUSE_WHEELDOWN;
-    break;
-  default:
-    break;
-  }
-}
-#endif
-
-extern "C"{   
-uint32_t GetAsyncKeyState(uint32_t vk, uint32_t mod)
-{
-   GLDrawClass *draw = emu->main_window_handle->getGraphicsView();
-   vk = vk & 0xff; // OK?
-   quint32 modstate = mod;
-
-#if 1
-   switch(vk) {
-    case VK_SHIFT:
-      if((modstate & Qt::ShiftModifier) != 0) return 0xffffffff;
-      break;
-    case VK_LSHIFT:
-      if((modstate & Qt::ShiftModifier) != 0) return 0xffffffff;
-      break;
-    case VK_RSHIFT:
-      if((modstate & Qt::ShiftModifier) != 0) return 0xffffffff;
-      break;
-    case VK_CONTROL:
-      if((modstate & Qt::ControlModifier) != 0) return 0xffffffff;
-      break;
-    case VK_LCONTROL:
-      if((modstate & Qt::ControlModifier) != 0) return 0xffffffff;
-      break;
-    case VK_RCONTROL:
-      if((modstate & Qt::ControlModifier) != 0) return 0xffffffff;
-      break;
-    case VK_LMENU:
-      if((modstate & Qt::AltModifier) != 0) return 0xffffffff;
-      break;
-    case VK_RMENU:
-      if((modstate & Qt::AltModifier) != 0) return 0xffffffff;
-      break;
-    default:
-      break;
-   }
-#endif
-   return 0;
-}
-
-uint8_t convert_AGKey2VK(uint32_t sym)
-{
-   uint32 n;
+   uint32 n = 0;
    int i = 0;
    do {
-      if(QtKeyMappings[i].qtkey == sym) {
-          n = QtKeyMappings[i].vk;
-          return (uint8_t)n;
+      if(SDLKeyMappings[i].sdlkey == sym) {
+          n = SDLKeyMappings[i].vk;
+          break;
       }
       
       i++;
-   } while(QtKeyMappings[i].vk != 0xffff);
-   
-   return 0;
+   } while(QtKeyMappings[i].vk != 0xffffffff);
+   //if((n == VK_LSHIFT) || (n == VK_RSHIFT)) n = VK_SHIFT;
+   //if((n == VK_LCTRL) || (n == VK_RCTRL)) n = VK_CONTROL;
+   //if((n == VL_RMENU) || (n == VK_RMENU)) n = VK_MENU;
+   return n;
 }
 
-}
-
-
 void EMU::initialize_input()
 {
        // initialize status
@@ -609,15 +439,18 @@ static const int numpad_table[256] = {
 void EMU::key_down(int sym, bool repeat)
 {
        bool keep_frames = false;
-       uint8 code;
-        code = convert_AGKey2VK(sym);
+       uint8 code = sym;
+//        code = convert_AGKey2VK(sym);
 
          //printf("Key down %08x\n", sym);
 
-        if(code == VK_SHIFT) {
-               if(GetAsyncKeyState(VK_LSHIFT, modkey_status) & 0x8000) key_status[VK_LSHIFT] = 0x80;
-               if(GetAsyncKeyState(VK_RSHIFT, modkey_status) & 0x8000) key_status[VK_RSHIFT] = 0x80;
-               if(!(key_status[VK_LSHIFT] || key_status[VK_RSHIFT])) key_status[VK_LSHIFT] = 0x80;
+#if 1  // No needed with SDL?
+       if(code == VK_SHIFT) {
+#ifndef USE_SHIFT_NUMPAD_KEY
+//             if(GetAsyncKeyState(VK_LSHIFT, modkey_status) & 0x8000) key_status[VK_LSHIFT] = 0x80;
+//             if(GetAsyncKeyState(VK_RSHIFT, modkey_status) & 0x8000) key_status[VK_RSHIFT] = 0x80;
+//             if(!(key_status[VK_LSHIFT] || key_status[VK_RSHIFT])) key_status[VK_LSHIFT] = 0x80;
+#endif
        } else if(code == VK_CONTROL) {
                if(GetAsyncKeyState(VK_LCONTROL, modkey_status) & 0x8000) key_status[VK_LCONTROL] = 0x80;
                if(GetAsyncKeyState(VK_RCONTROL, modkey_status) & 0x8000) key_status[VK_RCONTROL] = 0x80;
@@ -636,8 +469,19 @@ void EMU::key_down(int sym, bool repeat)
                code = VK_KANJI;
                keep_frames = true;
        }
-#if 0  // Note:
-   // Qt is *not* detect numeric keys are from full key or numpad :-(
+#else  //SDL
+       if(code == 0xf0) {
+               code = VK_CAPITAL;
+               keep_frames = true;
+       } else if(code == 0xf2) {
+               code = VK_KANA;
+               keep_frames = true;
+       } else if(code == 0xf3 || code == 0xf4) {
+               code = VK_KANJI;
+               keep_frames = true;
+       }
+#endif
+   
 # ifdef USE_SHIFT_NUMPAD_KEY
        if(code == VK_SHIFT) {
                key_shift_pressed = true;
@@ -650,13 +494,13 @@ void EMU::key_down(int sym, bool repeat)
                }
        }
 #endif
-#endif
-       if(!(code == VK_SHIFT || code == VK_CONTROL || code == VK_MENU)) {
+
+       if(!(code == VK_CONTROL || code == VK_MENU)) {
                code = keycode_conv[code];
        }
        
 #ifdef DONT_KEEEP_KEY_PRESSED
-       if(!(code == VK_SHIFT || code == VK_CONTROL || code == VK_MENU)) {
+       if(!(code == VK_CONTROL || code == VK_MENU)) {
                key_status[code] = KEY_KEEP_FRAMES;
        } else
 #endif
@@ -674,28 +518,31 @@ void EMU::key_down(int sym, bool repeat)
        
 void EMU::key_up(int sym)
 {
-       uint8 code;
-        code = convert_AGKey2VK(sym);
+       uint8 code = sym;
+//        code = convert_AGKey2VK(sym);
    //printf("Key up %03x %03x\n", sym, code);
-
+#if 1
    if(code == VK_SHIFT) {
-//#ifndef USE_SHIFT_NUMPAD_KEY
-               if(!(GetAsyncKeyState(VK_LSHIFT, modkey_status) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
-               if(!(GetAsyncKeyState(VK_RSHIFT, modkey_status) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
-//#endif
+#ifndef USE_SHIFT_NUMPAD_KEY
+//             if(!(GetAsyncKeyState(VK_LSHIFT, modkey_status) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
+//             if(!(GetAsyncKeyState(VK_RSHIFT, modkey_status) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
+#endif
        } else if(code == VK_CONTROL) {
                if(!(GetAsyncKeyState(VK_LCONTROL, modkey_status) & 0x8000)) key_status[VK_LCONTROL] &= 0x7f;
                if(!(GetAsyncKeyState(VK_RCONTROL, modkey_status) & 0x8000)) key_status[VK_RCONTROL] &= 0x7f;
        } else if(code == VK_MENU) {
                if(!(GetAsyncKeyState(VK_LMENU, modkey_status) & 0x8000)) key_status[VK_LMENU] &= 0x7f;
                if(!(GetAsyncKeyState(VK_RMENU, modkey_status) & 0x8000)) key_status[VK_RMENU] &= 0x7f;
-       } else {
+       } else
+#endif
+     {
           key_status[code] &= 0x7f;
 #ifdef NOTIFY_KEY_DOWN
           vm->key_up(code);
 #endif
        }
-#if 0   
+
+
 #ifdef USE_SHIFT_NUMPAD_KEY
        if(code == VK_SHIFT) {
                key_shift_pressed = false;
@@ -707,7 +554,6 @@ void EMU::key_up(int sym)
        }
    
 #endif
-#endif
        if(!(code == VK_SHIFT || code == VK_CONTROL || code == VK_MENU)) {
                code = keycode_conv[code];
        }
@@ -867,6 +713,120 @@ void EMU::stop_auto_key()
        autokey_phase = autokey_shift = 0;
 #endif
 }
+#endif
+
           
           
-#endif
+// SDL Event Handler
+bool  EventSDL(SDL_Event *eventQueue)
+{
+//     SDL_Surface *p;
+        Sint16 value;
+        uint32_t *joy_status;
+        uint8_t button;
+        int vk;
+        uint32_t sym;
+        int i;
+        if(eventQueue == NULL) return;
+       /*
+        * JoyStickなどはSDLが管理する
+        */
+//     AG_SDL_GetNextEvent(void *obj, AG_DriverEvent *dev)
+        if(emu == NULL) return false;
+//        while (SDL_PollEvent(eventQueue))
+//        {
+             switch (eventQueue->type){
+                case SDL_JOYAXISMOTION:
+                     value = eventQueue->jaxis.value;
+                     i = eventQueue->jaxis.which;
+                     if((i < 0) || (i > 1)) break;
+
+                  emu->LockVM();
+                  joy_status = emu->getJoyStatPtr();
+                  if(eventQueue->jaxis.axis == 0) { // X
+                     if(value < -8192) { // left
+                        joy_status[i] |= 0x04; joy_status[i] &= ~0x08;
+                     } else if(value > 8192)  { // right
+                        joy_status[i] |= 0x08; joy_status[i] &= ~0x04;
+                     }  else { // center
+                        joy_status[i] &= ~0x0c;
+                     }
+                     
+                  } else if(eventQueue->jaxis.axis == 1) { // Y
+                     if(value < -8192) {// up
+                        joy_status[i] |= 0x01; joy_status[i] &= ~0x02;
+                     } else if(value > 8192)  {// down 
+                        joy_status[i] |= 0x02; joy_status[i] &= ~0x01;
+                     } else {
+                        joy_status[i] &= ~0x03;
+                     }
+                  }
+                  emu->UnlockVM();
+                  break;
+              case SDL_JOYBUTTONDOWN:
+                   button = eventQueue->jbutton.button;
+                   i = eventQueue->jbutton.which;
+                   if((i < 0) || (i > 1)) break;
+                   emu->LockVM();
+                   joy_status = emu->getJoyStatPtr();
+                   joy_status[i] |= (1 << (button + 4));
+                   emu->UnlockVM();
+                   break;
+              case SDL_JOYBUTTONUP:
+                     button = eventQueue->jbutton.button;
+                     i = eventQueue->jbutton.which;
+                     if((i < 0) || (i > 1)) break;
+                   emu->LockVM();
+                   joy_status = emu->getJoyStatPtr();
+                   joy_status[i] &= ~(1 << (button + 4));
+                   emu->UnlockVM();
+                   break;
+              case SDL_KEYDOWN:
+//                 sym = eventQueue->key.keysym.scancode;
+//                 vk = convert_SDLKey2VK(sym);
+//                 emu->LockVM();
+//                 emu->key_down(vk, eventQueue->key.repeat);
+//                 emu->UnlockVM();
+//                 printf("Key UP: %d VK=%04x\n", sym, vk);
+                   break;
+              case SDL_KEYUP: // Is right Ignoring?
+//                 sym = eventQueue->key.keysym.scancode;
+//                 vk = convert_SDLKey2VK(sym);
+//                 emu->LockVM();
+//                 emu->key_up(vk);
+//                 emu->UnlockVM();
+                   break;
+             }
+//     }
+   return TRUE;
+}
+
+
+void JoyThread(void *p)
+{
+  int joy_num;
+  int i;
+  SDL_Joystick *joyhandle[2] = {NULL, NULL};
+  SDL_Event event;
+  for(i = 0; i < 2; i++) joyhandle[i] = SDL_JoystickOpen(i);
+  joy_num = SDL_NumJoysticks();
+  uint32 *joy_status = NULL;
+  do {
+       if(rMainWindow->GetJoyThreadEnabled() != true) {
+         for(i = 0; i < 2; i++) {
+            if(joyhandle[i] != NULL) SDL_JoystickClose(joyhandle[i]);
+         }
+         //exit(0);
+         return;
+       }
+     if(SDL_WaitEventTimeout(&event, 15) == 1) {
+       EventSDL(&event);
+     } //else { // Clear per 150ms
+       //emu->LockVM();
+       //joy_status = emu->getJoyStatPtr();
+       //for(i = 0; i < 2; i++) joy_status[i] = 0;
+       //emu->UnlockVM();
+     //}
+     
+  } while(1);
+}
index 3fef1eb..1d8f175 100644 (file)
@@ -100,6 +100,8 @@ public:
      //     void initializeGL(void);
      //void paintGL(void);
      //void resizeGL(int width, int height);
+     uint32_t get106Scancode2VK(uint32_t data);
+
 #ifdef _USE_OPENCL
 //     extern class GLCLDraw *cldraw;
 #endif
index 293f893..3cc8285 100644 (file)
@@ -89,6 +89,10 @@ struct QtKeyTable {
    uint32_t vk;
    enum Qt::Key qtkey;
 };
+struct SDLKeyTable {
+   uint32_t vk;
+   uint32_t sdlkey;
+};
      uint32_t GetAsyncKeyState(uint32_t vk, uint32_t mod);
      uint8_t convert_AGKey2VK(uint32_t sym);
    
index 9440970..8ac7f49 100644 (file)
@@ -46,6 +46,9 @@ std::string sAG_Driver;
 std::string sRssDir;\r
 bool now_menuloop = false;\r
 static int close_notified = 0;\r
+extern void JoyThread(void *p);\r
+\r
+\r
 \r
 const int screen_mode_width[]  = {320, 320, 640, 640, 800, 1024, 1280, 1280, 1440, 1440, 1600, 1600, 1920, 1920, 0};\r
 const int screen_mode_height[] = {200, 240, 400, 480, 600, 768,  800,  960,  900,  1080, 1000, 1200, 1080, 1400, 0};\r
@@ -160,114 +163,9 @@ void EmuThread(void *p)
 }\r
 \r
 \r
-bool  EventSDL(SDL_Event *eventQueue)\r
-{\r
-//     SDL_Surface *p;\r
-        Sint16 value;\r
-        uint32_t *joy_status;\r
-        uint8_t button;\r
-        int i;\r
-        if(eventQueue == NULL) return;\r
-       /*\r
-        * JoyStickなどはSDLが管理する\r
-        */\r
-//     AG_SDL_GetNextEvent(void *obj, AG_DriverEvent *dev)\r
-        if(emu == NULL) return false;\r
-       if(SDL_WasInit(SDL_INIT_JOYSTICK) != 0) {\r
-//        while (SDL_PollEvent(eventQueue))\r
-//        {\r
-             switch (eventQueue->type){\r
-                case SDL_JOYAXISMOTION:\r
-                     value = eventQueue->jaxis.value;\r
-                     i = eventQueue->jaxis.which;\r
-                     if((i < 0) || (i > 1)) break;\r
-\r
-                  emu->LockVM();\r
-                  joy_status = emu->getJoyStatPtr();\r
-                  if(eventQueue->jaxis.axis == 0) { // X\r
-                     if(value < -8192) { // left\r
-                        joy_status[i] |= 0x04; joy_status[i] &= ~0x08;\r
-                     } else if(value > 8192)  { // right\r
-                        joy_status[i] |= 0x08; joy_status[i] &= ~0x04;\r
-                     }  else { // center\r
-                        joy_status[i] &= ~0x0c;\r
-                     }\r
-                     \r
-                  } else if(eventQueue->jaxis.axis == 1) { // Y\r
-                     if(value < -8192) {// up\r
-                        joy_status[i] |= 0x01; joy_status[i] &= ~0x02;\r
-                     } else if(value > 8192)  {// down \r
-                        joy_status[i] |= 0x02; joy_status[i] &= ~0x01;\r
-                     } else {\r
-                        joy_status[i] &= ~0x03;\r
-                     }\r
-                  }\r
-                  emu->UnlockVM();\r
-                  break;\r
-              case SDL_JOYBUTTONDOWN:\r
-                   button = eventQueue->jbutton.button;\r
-                   i = eventQueue->jbutton.which;\r
-                   if((i < 0) || (i > 1)) break;\r
-                   emu->LockVM();\r
-                   joy_status = emu->getJoyStatPtr();\r
-                   joy_status[i] |= (1 << (button + 4));\r
-                   emu->UnlockVM();\r
-                   break;\r
-              case SDL_JOYBUTTONUP:\r
-                     button = eventQueue->jbutton.button;\r
-                     i = eventQueue->jbutton.which;\r
-                     if((i < 0) || (i > 1)) break;\r
-                   emu->LockVM();\r
-                   joy_status = emu->getJoyStatPtr();\r
-                   joy_status[i] &= ~(1 << (button + 4));\r
-                   emu->UnlockVM();\r
-                   break;\r
-              default: // Is right Ignoring?\r
-                    break;\r
-             }\r
-          }\r
-//     }\r
-   return TRUE;\r
-}\r
-\r
 \r
 \r
-//void JoyThreadClass::run()\r
-void JoyThread(void *p)\r
-{\r
-  int joy_num;\r
-  int i;\r
-  SDL_Joystick *joyhandle[2] = {NULL, NULL};\r
-  SDL_Event event;\r
-  for(i = 0; i < 2; i++) joyhandle[i] = SDL_JoystickOpen(i);\r
-  joy_num = SDL_NumJoysticks();\r
-  uint32 *joy_status = NULL;\r
-  do {\r
-       if(rMainWindow->GetJoyThreadEnabled() != true) {\r
-         for(i = 0; i < 2; i++) {\r
-            if(joyhandle[i] != NULL) SDL_JoystickClose(joyhandle[i]);\r
-         }\r
-         //exit(0);\r
-         return;\r
-       }\r
-     if(SDL_WaitEventTimeout(&event, 15) == 1) {\r
-       EventSDL(&event);\r
-     } //else { // Clear per 150ms\r
-       //emu->LockVM();\r
-       //joy_status = emu->getJoyStatPtr();\r
-       //for(i = 0; i < 2; i++) joy_status[i] = 0;\r
-       //emu->UnlockVM();\r
-     //}\r
-     \r
-  } while(1);\r
-}\r
    \r
-\r
-//EmuThreadClass *hEmuThread;\r
-//JoyThreadClass *pJoyThread;\r
-//QThread *hEmuThread;\r
-//QThread *hJoyThread;\r
-\r
 // Important Flags\r
 AGAR_CPUID *pCpuID;\r
 \r
@@ -510,7 +408,7 @@ int MainLoop(int argc, char *argv[])
         */\r
 \r
    \r
-  SDL_InitSubSystem(SDL_INIT_AUDIO | SDL_INIT_JOYSTICK);\r
+  SDL_InitSubSystem(SDL_INIT_AUDIO | SDL_INIT_JOYSTICK );\r
   AGAR_DebugLog(AGAR_LOG_DEBUG, "Audio and JOYSTICK subsystem was initialised.");\r
   GuiMain = new QApplication(argc, argv);\r
 \r
index b08b724..d68eaa7 100644 (file)
@@ -7,6 +7,7 @@ QT4_WRAP_CPP(s_qt_gui_headers_MOC ${s_qt_gui_headers})
 
  
 add_library(qt_gui
+          qt_input.cpp
          menu_control.cpp
          menu_disk.cpp
          menu_quickdisk.cpp
diff --git a/source/src/qt/gui/qt_input.cpp b/source/src/qt/gui/qt_input.cpp
new file mode 100644 (file)
index 0000000..a8e9de9
--- /dev/null
@@ -0,0 +1,547 @@
+/*
+ *     Skelton for retropc emulator
+ *
+ *     Author : Takeda.Toshiya
+ *     Date   : 2006.08.18 -
+ *      Converted to QT by (C) 2015 K.Ohta
+ *         History:
+ *            Jan 12, 2015 (maybe) : Initial
+ *     [ Qt input -> Keyboard]
+*/
+
+#include <Qt>
+#include <QKeyEvent>
+#include "emu.h"
+#include "vm/vm.h"
+#include "fifo.h"
+#include "fileio.h"
+#include "qt_input.h"
+#include "qt_gldraw.h"
+#include "qt_main.h"
+#include "menuclasses.h"
+#include "agar_logger.h"
+
+#ifndef Ulong
+#define Ulong unsigned long
+#endif
+
+#define KEY_KEEP_FRAMES 3
+
+const struct QtKeyTable  QtKeyMappings[] = {
+       { '0',                  Qt::Key_0 },
+       { '1',                  Qt::Key_1 },
+       { '2',                  Qt::Key_2 },
+       { '3',                  Qt::Key_3 },
+       { '4',                  Qt::Key_4 },
+       { '5',                  Qt::Key_5 },
+       { '6',                  Qt::Key_6 },
+       { '7',                  Qt::Key_7 },
+       { '8',                  Qt::Key_8 },
+       { '9',                  Qt::Key_9 },
+       { 'A',                  Qt::Key_A },
+       { 'B',                  Qt::Key_B },
+       { 'C',                  Qt::Key_C },
+       { 'D',                  Qt::Key_D },
+       { 'E',                  Qt::Key_E },
+       { 'F',                  Qt::Key_F },
+       { 'G',                  Qt::Key_G },
+       { 'H',                  Qt::Key_H },
+       { 'I',                  Qt::Key_I },
+       { 'J',                  Qt::Key_J },
+       { 'K',                  Qt::Key_K },
+       { 'L',                  Qt::Key_L },
+       { 'M',                  Qt::Key_M },
+       { 'N',                  Qt::Key_N },
+       { 'O',                  Qt::Key_O },
+       { 'P',                  Qt::Key_P },
+       { 'Q',                  Qt::Key_Q },
+       { 'R',                  Qt::Key_R },
+       { 'S',                  Qt::Key_S },
+       { 'T',                  Qt::Key_T },
+       { 'U',                  Qt::Key_U },
+       { 'V',                  Qt::Key_V },
+       { 'W',                  Qt::Key_W },
+       { 'X',                  Qt::Key_X },
+       { 'Y',                  Qt::Key_Y },
+       { 'Z',                  Qt::Key_Z },
+        // Start Qt's workaround: Qt returns character directry when keyin/out.
+       // Excepts(maybe) 'a' to 'z'?
+       // So, you should change keycode, using other than 109 / 106 Keyboard.
+       {'1',                   Qt::Key_Exclam},
+       {'2',                   Qt::Key_QuoteDbl},
+        {'3',                  Qt::Key_NumberSign},
+        {'4',                  Qt::Key_Dollar},
+        {'5',                  Qt::Key_Percent},
+        {'6',                  Qt::Key_Ampersand},
+        {'7',                  Qt::Key_Apostrophe},
+        {'8',                  Qt::Key_ParenLeft},
+        {'9',                  Qt::Key_ParenRight},
+        {0xBA,                 Qt::Key_Asterisk}, // $2a
+        {0xBB,                 Qt::Key_Plus}, // $2b
+        {0xBC,                  Qt::Key_Less}, // ,
+        {0xBD,                  Qt::Key_AsciiTilde}, // ^~
+        {0xBE,                  Qt::Key_Greater}, //$2e
+        {0xBF,                  Qt::Key_Question}, //$2f
+        {0xC0,                  Qt::Key_QuoteLeft}, //`
+        {0xE2,                 Qt::Key_Underscore},//_\
+        
+
+        // End.
+       { VK_F1,                Qt::Key_F1 },
+       { VK_F2,                Qt::Key_F2 },
+       { VK_F3,                Qt::Key_F3 },
+       { VK_F4,                Qt::Key_F4 },
+       { VK_F5,                Qt::Key_F5 },
+       { VK_F6,                Qt::Key_F6 },
+       { VK_F7,                Qt::Key_F7 },
+       { VK_F8,                Qt::Key_F8 },
+       { VK_F9,                Qt::Key_F9 },
+       { VK_F10,               Qt::Key_F10 },
+       { VK_F11,               Qt::Key_F11 },
+       { VK_F12,               Qt::Key_F12 },
+       { VK_F13,               Qt::Key_F13 },
+       { VK_F14,               Qt::Key_F14 },
+       { VK_F15,               Qt::Key_F15 },
+       { VK_BACK,              Qt::Key_Backspace },
+       { VK_TAB,               Qt::Key_Tab },
+       { VK_CLEAR,             Qt::Key_Clear },
+       { VK_RETURN,            Qt::Key_Return },
+       { VK_PAUSE,             Qt::Key_Pause },
+       { VK_ESCAPE,            Qt::Key_Escape },
+       { VK_SPACE,             Qt::Key_Space },
+       { VK_DELETE,            Qt::Key_Delete },
+       { VK_UP,                Qt::Key_Up },
+       { VK_DOWN,              Qt::Key_Down },
+       { VK_RIGHT,             Qt::Key_Right },
+       { VK_LEFT,              Qt::Key_Left },
+       { VK_INSERT,            Qt::Key_Insert },
+       { VK_HOME,              Qt::Key_Home },
+       { VK_END,               Qt::Key_End },
+       { VK_PRIOR,             Qt::Key_PageUp },
+       { VK_NEXT,              Qt::Key_PageDown },
+// Fixme: Ten keys (Key pad) are undefined on Qt. 
+//     { VK_NUMPAD0,           Qt::Key_KP0 },
+//     { VK_NUMPAD1,           Qt::Key_KP1 },
+//     { VK_NUMPAD2,           Qt::Key_KP2 },
+//     { VK_NUMPAD3,           Qt::Key_KP3 },
+//     { VK_NUMPAD4,           Qt::Key_KP4 },
+//     { VK_NUMPAD5,           Qt::Key_KP5 },
+//     { VK_NUMPAD6,           Qt::Key_KP6 },
+//     { VK_NUMPAD7,           Qt::Key_KP7 },
+//     { VK_NUMPAD8,           Qt::Key_KP8 },
+//     { VK_NUMPAD9,           Qt::Key_KP9 },
+//
+//     { VK_DECIMAL,           Qt::Key_Period },
+//     { VK_DIVIDE,            Qt::Key_Slash},
+//     { VK_MULTIPLY,          Qt::Key_multiply },
+//     { VK_SUBTRACT,          Qt::Key_Minus },
+//     { VK_ADD,               Qt::Key_Plus },
+
+       { VK_NUMLOCK,           Qt::Key_NumLock },
+       { VK_CAPITAL,           Qt::Key_Henkan }, // fixme : JP only
+       { VK_SCROLL,            Qt::Key_ScrollLock },
+       { VK_SHIFT,             Qt::Key_Shift }, // Left
+       { VK_RSHIFT,            Qt::Key_Shift }, // Right
+       { VK_LSHIFT,            Qt::Key_Shift }, // Right
+       { VK_CONTROL,           Qt::Key_Control }, // Right
+       { VK_RCONTROL,          Qt::Key_Control }, // Right
+       { VK_LCONTROL,          Qt::Key_Control }, // Left
+       { VK_RMENU,             Qt::Key_Menu },  // Right
+       { VK_LMENU,             Qt::Key_Alt },  // Left
+       { VK_MENU,              Qt::Key_Muhenkan },  // Right
+       { VK_RWIN,              Qt::Key_Hyper_R },
+       { VK_LWIN,              Qt::Key_Hyper_L },
+       { VK_HELP,              Qt::Key_Help }, // Right?
+#ifdef VK_PRINT
+       { VK_PRINT,             Qt::Key_Print },
+#endif
+       { VK_SNAPSHOT,          Qt::Key_Print },
+       { VK_CANCEL,            Qt::Key_Pause },
+       { VK_APPS,              Qt::Key_Menu },
+        { 0xBA,                        Qt::Key_Colon },
+        { 0xBB,                        Qt::Key_Semicolon },
+       { 0xBC,                 Qt::Key_Comma },
+       { 0xBD,                 Qt::Key_Minus },//
+       { 0xBE,                 Qt::Key_Period },//
+       { 0xBF,                 Qt::Key_Slash },//
+       { 0xBB,                 Qt::Key_Equal },//
+       { 0xC0,                 Qt::Key_At },
+       { 0xDB,                 Qt::Key_BracketLeft },//]
+       { 0xDB,                 Qt::Key_BraceLeft }, //}
+//     { 0xDC,                 Qt::Key_Backslash },  // Okay?
+       { 0xDC,                 Qt::Key_yen },
+       { 0xDC,                 Qt::Key_Bar },
+       { 0xDD,                 Qt::Key_BracketRight }, //[
+       { 0xDD,                 Qt::Key_BraceRight }, //{
+       { 0xDE,                 Qt::Key_AsciiCircum},
+//     { 0xDF,                 Qt::Key_QuoteLeft },
+       { 0xDC,                 Qt::Key_Backslash },
+
+        // VK_CAPITAL 
+       { 0xF0,                 Qt::Key_CapsLock },
+        // VK_KANA 
+       { 0xF2,                 Qt::Key_Hiragana },
+       { 0xF2,                 Qt::Key_Katakana },
+       { 0xF2,                 Qt::Key_Hiragana_Katakana },
+        // VK_KANJI 
+       { 0xF3,                 Qt::Key_Zenkaku },
+       { 0xF4,                 Qt::Key_Hankaku },
+       { 0xF3,                 Qt::Key_Zenkaku_Hankaku },
+   
+        { 0xffff, 0xffff},
+};
+
+
+static int mouse_x = 0;
+static int mouse_y = 0;
+static int mouse_relx = 0;
+static int mouse_rely = 0;
+static uint32 mouse_buttons = 0;
+   
+struct NativeScanCode {
+   uint32 vk;
+   uint32 scan;
+};
+struct NativeScanCode convTable_QTScan106[] = {
+   // Line 0
+     {VK_F1,  67},
+     {VK_F2,  68},
+     {VK_F3,  69},
+     {VK_F4,  70},
+     {VK_F5,  71},
+     {VK_F6,  72},
+     {VK_F7,  73},
+     {VK_F8,  74},
+     {VK_F9,  75},
+     {VK_F10, 76},
+     {VK_F11, 95},
+     {VK_F12, 96},
+     // Power, Sleep, Wake is not implemented, they are'nt safetey.
+   // Line 1
+     {0xf3, 49}, // Hankaku/Zenkaku
+     {'0', 19},
+     {'1', 10},
+     {'2', 11},
+     {'3', 12},
+     {'4', 13},
+     {'5', 14},
+     {'6', 15},
+     {'7', 16},
+     {'8', 17},
+     {'9', 18},
+     {0xbd, 20}, // - =
+     {0xde, 21}, // ^~
+     {0xdc, 132}, // \|
+     {VK_BACK, 22}, // Backspace
+     // Line 2
+     {VK_TAB, 23},
+     {'Q', 24},
+     {'W', 25},
+     {'E', 26},
+     {'R', 27},
+     {'T', 28},
+     {'Y', 29},
+     {'U', 30},
+     {'I', 31},
+     {'O', 32},
+     {'P', 33},
+     {0xc0, 34}, // @
+     {VK_RETURN, 36}, // [
+     {0xdb, 35}, // Enter (Full key)
+     // Line 3
+     {0xf0, 66}, // CAPS Lock
+     {'A', 38},
+     {'S', 39},
+     {'D', 40},
+     {'F', 41},
+     {'G', 42},
+     {'H', 43},
+     {'J', 44},
+     {'K', 45},
+     {'L', 46},
+     {0xbb, 47}, // ;
+     {0xba, 48}, // :
+     {0xdd, 51}, // ]
+      // Line 3
+     {VK_LSHIFT, 50}, // LShift
+     {'Z', 52},
+     {'X', 53},
+     {'C', 54},
+     {'V', 55},
+     {'B', 56},
+     {'N', 57},
+     {'M', 58},
+     {0xbc, 59}, // ,
+     {0xbe, 60}, // .
+     {0xbf, 61}, // /(Slash)
+     {0xe2, 97}, //\_
+     {VK_RSHIFT, 62},
+     // Line 4
+     {VK_LCONTROL, 37},
+     {VK_LWIN, 133},
+     {VK_LMENU, 64},
+     {0x1d, 102}, // Muhenkan
+     {VK_SPACE, 65},
+     {0xf3, 100}, // Henkan
+     {0xf2, 101}, // Katakana_Hiragana
+     {VK_RMENU, 108},
+     {VK_RWIN,  134},
+     {VK_APPS, 135},
+     {VK_RCONTROL, 105},
+      // Cursors
+     {VK_UP, 111},
+     {VK_DOWN, 116},
+     {VK_LEFT, 113},
+     {VK_RIGHT,114},
+     // 
+//     {VK_PRINT, },
+     {VK_SCROLL, 78},
+     {VK_PAUSE, 127},
+     {VK_INSERT, 118},
+     {VK_HOME, 110},
+     {VK_NEXT, 112},
+     {VK_DELETE, 119},
+     {VK_END, 115},
+     {VK_PRIOR, 117},
+     // TenKey
+     {VK_NUMPAD0, 90},
+     {VK_NUMPAD1, 87},
+     {VK_NUMPAD2, 88},
+     {VK_NUMPAD3, 89},
+     {VK_NUMPAD4, 83},
+     {VK_NUMPAD5, 84},
+     {VK_NUMPAD6, 85},
+     {VK_NUMPAD7, 79},
+     {VK_NUMPAD8, 80},
+     {VK_NUMPAD9, 81},
+     //
+     {VK_DECIMAL, 77}, // NumLock     
+     {VK_DIVIDE, 106},
+     {VK_MULTIPLY, 63},
+     {VK_SUBTRACT, 82},
+     {VK_ADD, 86},
+     {VK_RETURN, 104},  // Enter(ten Key)
+     {0xffffffff, 0xffffffff}
+};
+       
+uint32_t GLDrawClass::get106Scancode2VK(uint32_t data)
+{
+   uint32 val = 0;
+   uint32 vk;
+   int i = 0;
+   while(convTable_QTScan106[i].vk != 0xffffffff) {
+      val = convTable_QTScan106[i].scan;
+      if(val == data) break;
+      i++;
+   }
+   vk = convTable_QTScan106[i].vk;
+   if(vk == 0xffffffff) return 0;
+//   if((vk == VK_LSHIFT) || (vk == VK_RSHIFT)) vk = VK_SHIFT;
+   if((vk == VK_LCONTROL) || (vk == VK_RCONTROL)) vk = VK_CONTROL;
+   if((vk == VK_LMENU) || (vk == VK_RMENU)) vk = VK_MENU;
+   return vk;
+}
+
+
+void GLDrawClass::keyReleaseEvent(QKeyEvent *event)
+{
+  int key = event->key();
+  uint32 mod = event->modifiers();
+  uint32 scan = event->nativeScanCode();
+  uint32 vk;
+  uint8 *stat;
+   
+  vk = get106Scancode2VK(scan);
+  emu->LockVM();
+  emu->key_mod(mod);
+   
+  // Note: Qt4 with 106KEY, event->modifier() don't get Shift key as KEYMOD.
+  // At least, linux.
+  stat = emu->key_buffer();
+  if(vk == VK_LSHIFT) stat[VK_LSHIFT] &= 0x7f;
+  if(vk == VK_RSHIFT) stat[VK_RSHIFT] &= 0x7f;
+  if((vk == VK_RSHIFT) || (vk == VK_LSHIFT)) stat[VK_SHIFT] &= 0x7f;
+#ifdef NOTIFY_KEY_DOWN
+  if(vk == 0) {
+     emu->key_mod(mod);
+  } else {
+     emu->key_mod(mod);
+     emu->key_up(vk);
+  }
+#endif
+   emu->UnlockVM();
+}
+
+void GLDrawClass::keyPressEvent(QKeyEvent *event)
+{
+   int key = event->key();
+  uint32 mod = event->modifiers();;
+  uint32 scan = event->nativeScanCode();
+  uint32 vk;
+  uint8 *stat;
+   
+  vk = get106Scancode2VK(scan);
+  //printf("Key: %d %d\n", vk, scan);
+  emu->LockVM();
+  stat = emu->key_buffer();
+  if(vk == VK_LSHIFT) stat[VK_LSHIFT] = 0x80;
+  if(vk == VK_RSHIFT) stat[VK_RSHIFT] = 0x80;
+  //if(!(stat[VK_LSHIFT] || stat[VK_RSHIFT])) stat[VK_LSHIFT] = 0x80;
+  if((vk == VK_RSHIFT) || (vk == VK_LSHIFT)) stat[VK_SHIFT] = 0x80;
+#ifdef NOTIFY_KEY_DOWN
+  if(vk == 0) {
+     emu->key_mod(mod);
+  } else {
+     emu->key_mod(mod);
+     emu->key_down(vk, false);
+  }
+#endif
+   emu->UnlockVM();
+}
+
+#if 0
+void OnMouseMotion(Q *event)
+{
+  // Need lock?
+  int x = AG_INT(1);
+  int y = AG_INT(2);
+  mouse_relx = AG_INT(3);
+  mouse_rely = AG_INT(4);
+  int buttons = AG_INT(5);
+
+  if((hScreenWidget != NULL) && (emu != NULL)){
+    //mouse_x = (x * emu->screen_width)  /  hScreenWidget->w;
+    //mouse_y = (y * emu->screen_height) /  hScreenWidget->h;
+    mouse_x = x;
+    mouse_y = y;
+  }
+  // Need Unlock?
+}
+
+void OnMouseButtonDown(AG_Event *event)
+{
+  // Need Lock?
+  int buttons = AG_INT(1);
+  switch (buttons){
+  case AG_MOUSE_NONE:
+    break;
+  case AG_MOUSE_LEFT:
+    mouse_buttons |= UI_MOUSE_LEFT;
+    break;
+  case AG_MOUSE_MIDDLE:
+    mouse_buttons |= UI_MOUSE_MIDDLE;
+    break;
+  case AG_MOUSE_RIGHT:
+    mouse_buttons |= UI_MOUSE_RIGHT;
+    break;
+  case AG_MOUSE_X1:
+    mouse_buttons |= UI_MOUSE_X1;
+    break;
+  case AG_MOUSE_X2:
+    mouse_buttons |= UI_MOUSE_X2;
+    break;
+  case AG_MOUSE_WHEELUP:
+    mouse_buttons |= UI_MOUSE_WHEELUP;
+    break;
+  case AG_MOUSE_WHEELDOWN:
+    mouse_buttons |= UI_MOUSE_WHEELDOWN;
+    break;
+  default:
+    break;
+  }
+  // Need Unlock?
+}
+
+void OnMouseButtonUp(AG_Event *event)
+{
+  // Need Lock?
+  int buttons = AG_INT(1);
+  switch (buttons){
+  case AG_MOUSE_NONE:
+    break;
+  case AG_MOUSE_LEFT:
+    mouse_buttons &= ~UI_MOUSE_LEFT;
+    break;
+  case AG_MOUSE_MIDDLE:
+    mouse_buttons &= ~UI_MOUSE_MIDDLE;
+    break;
+  case AG_MOUSE_RIGHT:
+    mouse_buttons &= ~UI_MOUSE_RIGHT;
+    break;
+  case AG_MOUSE_X1:
+    mouse_buttons &= ~UI_MOUSE_X1;
+    break;
+  case AG_MOUSE_X2:
+    mouse_buttons &= ~UI_MOUSE_X2;
+    break;
+  case AG_MOUSE_WHEELUP:
+    mouse_buttons &= ~UI_MOUSE_WHEELUP;
+    break;
+  case AG_MOUSE_WHEELDOWN:
+    mouse_buttons &= ~UI_MOUSE_WHEELDOWN;
+    break;
+  default:
+    break;
+  }
+}
+#endif
+
+extern "C"{   
+uint32_t GetAsyncKeyState(uint32_t vk, uint32_t mod)
+{
+   GLDrawClass *draw = emu->main_window_handle->getGraphicsView();
+   vk = vk & 0xff; // OK?
+   quint32 modstate = mod;
+   //printf("Mod %d %08x\n", vk, mod);
+#if 1
+   switch(vk) {
+    case VK_SHIFT:
+      if((modstate & Qt::ShiftModifier) != 0) return 0xffffffff;
+      break;
+    case VK_LSHIFT:
+      if((modstate & Qt::ShiftModifier) != 0) return 0xffffffff;
+      break;
+    case VK_RSHIFT:
+      if((modstate & Qt::ShiftModifier) != 0) return 0xffffffff;
+      break;
+    case VK_CONTROL:
+      if((modstate & Qt::ControlModifier) != 0) return 0xffffffff;
+      break;
+    case VK_LCONTROL:
+      if((modstate & Qt::ControlModifier) != 0) return 0xffffffff;
+      break;
+    case VK_RCONTROL:
+      if((modstate & Qt::ControlModifier) != 0) return 0xffffffff;
+      break;
+    case VK_LMENU:
+      if((modstate & Qt::AltModifier) != 0) return 0xffffffff;
+      break;
+    case VK_RMENU:
+      if((modstate & Qt::AltModifier) != 0) return 0xffffffff;
+      break;
+    default:
+      break;
+   }
+#endif
+   return 0;
+}
+
+uint8_t convert_AGKey2VK(uint32_t sym)
+{
+   uint32 n;
+   int i = 0;
+   do {
+      if(QtKeyMappings[i].qtkey == sym) {
+          n = QtKeyMappings[i].vk;
+          return (uint8_t)n;
+      }
+      
+      i++;
+   } while(QtKeyMappings[i].vk != 0xffff);
+   
+   return 0;
+}
+
+}
+
+