OSDN Git Service

[Qt][Win32] Fix compilation errors with msys2, still not working.
[csp-qt/common_source_project-fm7.git] / source / src / qt / common / emu_input.cpp
index 5a9186a..f097cef 100644 (file)
@@ -4,13 +4,14 @@
  *     Author : Takeda.Toshiya
  *     Date   : 2006.08.18 -
  *      Converted to QT by (C) 2015 K.Ohta
- *         History:
- *            Jan 12, 2015 (maybe) : Initial
+ *       History:
+ *          Jan 12, 2015 (maybe) : Initial
  *     [ SDL input -> Keyboard]
 */
 
 #include <Qt>
-#include <SDL2/SDL.h>
+#include <QApplication>
+#include <SDL.h>
 #include "emu.h"
 #include "vm/vm.h"
 #include "fifo.h"
@@ -18,7 +19,9 @@
 #include "qt_input.h"
 #include "qt_gldraw.h"
 #include "qt_main.h"
-#include "menuclasses.h"
+//#include "menuclasses.h"
+//#include "commonclasses.h"
+#include "mainwidget.h"
 #include "agar_logger.h"
 
 #ifndef Ulong
 
 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.
-//        {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,                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,             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,                 SDL_SCANCODE_CAPSLOCK },
-        // VK_KANA 
-       { 0xF2,                 SDL_SCANCODE_LANG3 },
-       { 0xF2,                 SDL_SCANCODE_LANG4 },
-        // VK_KANJI 
-       { 0xF3,                 SDL_SCANCODE_LANG5 },
-//     { 0xF4,                 SDL_SCANCODE_Hankaku },
-   
-        { 0xffffffff, 0xffffffff}
-};
-
-
-
-
-uint32_t convert_SDLKey2VK(uint32_t sym)
-{
-   uint32 n = 0;
-   int i = 0;
-   do {
-      if(SDLKeyMappings[i].sdlkey == sym) {
-          n = SDLKeyMappings[i].vk;
-          break;
-      }
-      
-      i++;
-   } 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
@@ -209,19 +42,12 @@ void EMU::initialize_input()
        // initialize joysticks
        // mouse emulation is disenabled
        mouse_enabled = false;
-        joy_num = SDL_NumJoysticks();
-        for(int i = 0; i < joy_num && i < 2; i++) {
-          //SDL_Joystick *joycaps = SDL_JoystickOpen(i);
-          //if(joycaps != NULL) {
-          //   joy_mask[i] = (1 << SDL_JoystickNumButtons(joycaps)) - 1;
-          //   SDL_JoystickClose(joycaps);
-          //} else {
-             joy_mask[i] = 0x0f; // 4buttons
-          //}
-  
+       mouse_ptrx = mouse_oldx = SCREEN_WIDTH / 2;
+       mouse_ptry = mouse_oldy = SCREEN_HEIGHT / 2;
+        joy_num = SDL_NumJoysticks();
+        for(int i = 0; i < joy_num && i < 2; i++) {
+               joy_mask[i] = 0x0f; // 4buttons
        }
-
-       
        // initialize keycode convert table
        FILEIO* fio = new FILEIO();
        if(fio->Fopen(bios_path(_T("keycode.cfg")), FILEIO_READ_BINARY)) {
@@ -267,32 +93,64 @@ void EMU::release_input()
 
 void EMU::update_input()
 {
-
-    int *keystat;
-    int i_c = 0;;
+       int *keystat;
+       int i_c = 0;;
+       bool press_flag = false;
+       bool release_flag = false;
 #ifdef USE_SHIFT_NUMPAD_KEY
-   //update numpad key status
-   if(key_shift_pressed && !key_shift_released) {
-      if(key_status[VK_SHIFT] == 0) {
-        // shift key is newly pressed
-        key_status[VK_SHIFT] = 0x80;
+       //update numpad key status
+       if(key_shift_pressed && !key_shift_released) {
+               if(key_status[VK_SHIFT] == 0) {
+                       // shift key is newly pressed
+                       key_status[VK_SHIFT] = 0x80;
 # ifdef NOTIFY_KEY_DOWN
-        vm->key_down(VK_SHIFT, false);
+                       vm->key_down(VK_SHIFT, false);
 # endif
-      }
-   } else if(!key_shift_pressed && key_shift_released) {
-      if(key_status[VK_SHIFT] != 0) {
-        // shift key is newly released
-        key_status[VK_SHIFT] = 0;
+               }
+       } else if(!key_shift_pressed && key_shift_released) {
+               if(key_status[VK_SHIFT] != 0) {
+                       // shift key is newly released
+                       key_status[VK_SHIFT] = 0;
 # ifdef NOTIFY_KEY_DOWN
-        vm->key_up(VK_SHIFT);
+                       vm->key_up(VK_SHIFT);
 # endif
-        // check l/r shift
-        if(!(GetAsyncKeyState(VK_LSHIFT, modkey_status) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
-        if(!(GetAsyncKeyState(VK_RSHIFT, modkey_status) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
-      }
-   }
-   key_shift_pressed = key_shift_released = false;
+                       // check l/r shift
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)                 // 
+                       if(!(GetAsyncKeyState(VK_LSHIFT) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
+                       if(!(GetAsyncKeyState(VK_RSHIFT) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
+# else            
+                       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
+               }
+               if(key_status[VK_LSHIFT] != 0) {
+                       // shift key is newly released
+                       key_status[VK_LSHIFT] = 0;
+# ifdef NOTIFY_KEY_DOWN
+                       vm->key_up(VK_LSHIFT);
+# endif
+                       // check l/r shift
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)                 // 
+                       if(!(GetAsyncKeyState(VK_LSHIFT) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
+# else            
+                       if(!(GetAsyncKeyState(VK_LSHIFT, modkey_status) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
+# endif                   
+               }
+               if(key_status[VK_RSHIFT] != 0) {
+                       // shift key is newly released
+                       key_status[VK_RSHIFT] = 0;
+# ifdef NOTIFY_KEY_DOWN
+                       vm->key_up(VK_RSHIFT);
+# endif
+                       // check l/r shift
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)                 // 
+                       if(!(GetAsyncKeyState(VK_RSHIFT) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
+# else            
+                       if(!(GetAsyncKeyState(VK_RSHIFT, modkey_status) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
+# endif                   
+               }
+       }
+       key_shift_pressed = key_shift_released = false;
 #endif
            
        // release keys
@@ -305,6 +163,7 @@ void EMU::update_input()
                for(int i = 0; i < 256; i++) {
                        if(key_status[i] & 0x80) {
                                key_status[i] &= 0x7f;
+                               release_flag = true;
 #ifdef NOTIFY_KEY_DOWN
                                if(!key_status[i]) {
                                        vm->key_up(i);
@@ -316,6 +175,7 @@ void EMU::update_input()
                for(int i = 0; i < 256; i++) {
                        if(key_status[i] & 0x7f) {
                                key_status[i] = (key_status[i] & 0x80) | ((key_status[i] & 0x7f) - 1);
+                               press_flag = true;
 #ifdef NOTIFY_KEY_DOWN
                                if(!key_status[i]) {
                                        vm->key_up(i);
@@ -325,7 +185,7 @@ void EMU::update_input()
                }
        }
        lost_focus = false;
-#if 1  
+
        // update joystick status
 #ifdef USE_KEY_TO_JOY
        // emulate joystick #1 with keyboard
@@ -359,31 +219,54 @@ void EMU::update_input()
 #endif
 #endif
 
-#endif
-       // update mouse status
-       memset(mouse_status, 0, sizeof(mouse_status));
-#if 0
-          if(mouse_enabled) {
-               // get current status
-               POINT pt;
-               GetCursorPos(&pt);
-               ScreenToClient(main_window_handle, &pt);
-               mouse_status[0]  = pt.x - display_width / 2;
-               mouse_status[1]  = pt.y - display_height / 2;
-               mouse_status[2]  = (GetAsyncKeyState(VK_LBUTTON, modkey_status) & 0x8000) ? 1 : 0;
-               mouse_status[2] |= (GetAsyncKeyState(VK_RBUTTON, modkey_status) & 0x8000) ? 2 : 0;
-               mouse_status[2] |= (GetAsyncKeyState(VK_MBUTTON, modkey_status) & 0x8000) ? 4 : 0;
-                move mouse cursor to the center of window
-               if(!(mouse_status[0] == 0 && mouse_status[1] == 0)) {
-                       pt.x = display_width / 2;
-                       pt.y = display_height / 2;
-               //      ClientToScreen(main_window_handle, &pt);
-               //      SetCursorPos(pt.x, pt.y);
+       // swap joystick buttons
+       if(config.swap_joy_buttons) {
+               for(int i = 0; i < joy_num && i < 2; i++) {
+                       uint32 b0 = joy_status[i] & 0xaaaaaaa0;
+                       uint32 b1 = joy_status[i] & 0x55555550;
+                       joy_status[i] = (joy_status[i] & 0x0f) | (b0 >> 1) | (b1 << 1);
                }
        }
-#endif
 
-#if 1
+#if defined(USE_BUTTON)
+       if(!press_flag && !release_flag) {
+               int ii;
+               ii = 0;
+               for(ii = 0; buttons[ii].code != 0x00; ii++) { 
+                       if((mouse_ptrx >= buttons[ii].x) && (mouse_ptrx < (buttons[ii].x + buttons[ii].width))) {
+                               if((mouse_ptry >= buttons[ii].y) && (mouse_ptry < (buttons[ii].y + buttons[ii].height))) {
+                                       if((key_status[buttons[ii].code] & 0x7f) == 0) this->press_button(ii);
+                               }
+                       }
+               }
+               if((mouse_ptrx >= buttons[ii].x) && (mouse_ptrx < (buttons[ii].x + buttons[ii].width))) {
+                       if((mouse_ptry >= buttons[ii].y) && (mouse_ptry < (buttons[ii].y + buttons[ii].height))) {
+                               this->press_button(ii);
+                       }
+               }
+               mouse_ptrx = mouse_ptry = 0;
+       }
+       //return;
+#endif                 
+               
+       // update mouse status
+       if(mouse_enabled) {
+               bool hid = false;
+               memset(mouse_status, 0, sizeof(mouse_status));
+               // get current status
+               // move mouse cursor to the center of window
+               //if(mouse_ptrx < 0) mouse_ptrx = 0;
+               //if(mouse_ptrx >= SCREEN_WIDTH) mouse_ptrx = SCREEN_WIDTH - 1;
+               //if(mouse_ptry < 0) mouse_ptry = 0;
+               //if(mouse_ptry >= SCREEN_HEIGHT) mouse_ptry = SCREEN_HEIGHT - 1;
+               
+               mouse_status[0] = mouse_ptrx - mouse_oldx;
+               mouse_status[1] = mouse_ptry - mouse_oldy;
+               mouse_status[2] = mouse_button;
+               mouse_oldx = mouse_ptrx;
+               mouse_oldy = mouse_ptry;
+       }
+       
 #ifdef USE_AUTO_KEY
        // auto key
        switch(autokey_phase) {
@@ -391,25 +274,31 @@ void EMU::update_input()
                if(autokey_buffer && !autokey_buffer->empty()) {
                        // update shift key status
                        int shift = autokey_buffer->read_not_remove(0) & 0x100;
+# ifdef NOTIFY_KEY_DOWN
                        if(shift && !autokey_shift) {
                                key_down(VK_SHIFT, false);
                        } else if(!shift && autokey_shift) {
                                key_up(VK_SHIFT);
                        }
+# endif                   
                        autokey_shift = shift;
                        autokey_phase++;
                        break;
                }
        case 3:
+# ifdef NOTIFY_KEY_DOWN
                if(autokey_buffer && !autokey_buffer->empty()) {
                        key_down(autokey_buffer->read_not_remove(0) & 0xff, false);
                }
+# endif           
                autokey_phase++;
                break;
        case USE_AUTO_KEY:
+# ifdef NOTIFY_KEY_DOWN
                if(autokey_buffer && !autokey_buffer->empty()) {
                        key_up(autokey_buffer->read_not_remove(0) & 0xff);
                }
+# endif           
                autokey_phase++;
                break;
        case USE_AUTO_KEY_RELEASE:
@@ -433,8 +322,7 @@ void EMU::update_input()
                }
        }
 #endif
-#endif
-       }
+}
 
 
 
@@ -464,38 +352,78 @@ void EMU::key_down(int sym, bool repeat)
 {
        bool keep_frames = false;
        uint8 code = sym;
-//        code = convert_AGKey2VK(sym);
-
-         //printf("Key down %08x\n", sym);
-
-#if 1  // No needed with SDL?
-       if(code == VK_SHIFT){
+       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(GetAsyncKeyState(VK_SHIFT, modkey_status) & 0x8000) key_status[VK_LSHIFT] = 0x80;
-               if(!(key_status[VK_LSHIFT] || key_status[VK_RSHIFT])) key_status[VK_LSHIFT] = 0x80;
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)                 // 
+               if(GetAsyncKeyState(VK_SHIFT) & 0x8000) {
+# else            
+               if(GetAsyncKeyState(VK_SHIFT, modkey_status) & 0x8000) {
+# endif                   
+                        key_status[VK_LSHIFT] = 0x80;
+                        key_status[VK_RSHIFT] = 0x80;
+                        key_status[VK_SHIFT] = 0x80;
+               }
 #endif
-       } else if(code == VK_LSHIFT){
+       } else if(code == VK_LSHIFT){
 #ifndef USE_SHIFT_NUMPAD_KEY
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(GetAsyncKeyState(VK_LSHIFT) & 0x8000) key_status[VK_LSHIFT] = 0x80;
+# else
                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           
 #endif
        } else if(code == VK_RSHIFT){
 #ifndef USE_SHIFT_NUMPAD_KEY
-//             if(GetAsyncKeyState(VK_LSHIFT, modkey_status) & 0x8000) key_status[VK_LSHIFT] = 0x80;
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(GetAsyncKeyState(VK_RSHIFT) & 0x8000) key_status[VK_RSHIFT] = 0x80;
+# else
                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           
 #endif
        } else if(code == VK_CONTROL) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(GetAsyncKeyState(VK_CONTROL) & 0x8000) {
+# else
+               if(GetAsyncKeyState(VK_CONTROL, modkey_status) & 0x8000) {
+# endif                   
+                       key_status[VK_LCONTROL] = 0x80;
+                       key_status[VK_RCONTROL] = 0x80;
+                       key_status[VK_CONTROL] = 0x80;
+               }
+       } else if(code == VK_LCONTROL) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN) 
+               if(GetAsyncKeyState(VK_LCONTROL) & 0x8000) key_status[VK_LCONTROL] = 0x80;
+# else
                if(GetAsyncKeyState(VK_LCONTROL, modkey_status) & 0x8000) key_status[VK_LCONTROL] = 0x80;
+# endif           
+       } else if(code == VK_RCONTROL) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN) 
+               if(GetAsyncKeyState(VK_RCONTROL) & 0x8000) key_status[VK_RCONTROL] = 0x80;
+# else
                if(GetAsyncKeyState(VK_RCONTROL, modkey_status) & 0x8000) key_status[VK_RCONTROL] = 0x80;
-               if(!(key_status[VK_LCONTROL] || key_status[VK_RCONTROL])) key_status[VK_LCONTROL] = 0x80;
+# endif           
        } else if(code == VK_MENU) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN) 
+               if(GetAsyncKeyState(VK_MENU) & 0x8000) {
+# else
+               if(GetAsyncKeyState(VK_MENU, modkey_status) & 0x8000) {
+# endif                   
+                       key_status[VK_LMENU] = 0x80;
+                       key_status[VK_RMENU] = 0x80;
+                       key_status[VK_MENU] = 0x80;
+               }
+       } else if(code == VK_LMENU) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)    
+               if(GetAsyncKeyState(VK_LMENU) & 0x8000) key_status[VK_LMENU] = 0x80;
+# else    
                if(GetAsyncKeyState(VK_LMENU, modkey_status) & 0x8000) key_status[VK_LMENU] = 0x80;
+# endif           
+       } else if(code == VK_RMENU) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)    
+               if(GetAsyncKeyState(VK_RMENU) & 0x8000) key_status[VK_RMENU] = 0x80;
+# else    
                if(GetAsyncKeyState(VK_RMENU, modkey_status) & 0x8000) key_status[VK_RMENU] = 0x80;
-               if(!(key_status[VK_LMENU] || key_status[VK_RMENU])) key_status[VK_LMENU] = 0x80;
+# endif           
        } else if(code == 0xf0) {
                code = VK_CAPITAL;
                keep_frames = true;
@@ -506,35 +434,7 @@ void EMU::key_down(int sym, bool repeat)
                code = VK_KANJI;
                keep_frames = true;
        }
-#else  //SDL
-       if((code == VK_LSHIFT) || (code == VK_RSHIFT)) {
-                       key_status[code] = 0x80;
-               if(!(key_status[VK_LSHIFT] || key_status[VK_RSHIFT])) key_status[VK_LSHIFT] = 0x80;
-       } else if(code == VK_SHIFT) {
-                       key_status[code] = 0x80;
-               if(!(key_status[VK_LSHIFT] || key_status[VK_RSHIFT])) key_status[VK_LSHIFT] = 0x80;
-       } else if((code == VK_LCONTROL) || (code == VK_RCONTROL)) {
-                       key_status[code] = 0x80;
-       } else if(code == VK_CONTROL) {
-                       key_status[code] = 0x80;
-                       key_status[VK_LCONTROL] = 0x80;
-       } else if((code == VK_LMENU) || (code == VK_RMENU)) {
-                       key_status[code] = 0x80;
-       } else if(code == VK_MENU) {
-                       key_status[code] = 0x80;
-                       key_status[VK_LMENU] = 0x80;
-       } else 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;
@@ -550,12 +450,12 @@ void EMU::key_down(int sym, bool repeat)
        }
 #endif
 
-       if(!(code == VK_CONTROL || code == VK_MENU || code == VK_SHIFT)) {
+       if(!(code == VK_CONTROL || code == VK_MENU || code == VK_SHIFT || code == VK_LSHIFT || code == VK_RSHIFT)) {
                code = keycode_conv[code];
        }
        
 #ifdef DONT_KEEEP_KEY_PRESSED
-       if(!(code == VK_CONTROL || code == VK_MENU || code == VK_SHIFT)) {
+       if(!(code == VK_CONTROL || code == VK_MENU || code == VK_SHIFT || code == VK_LSHIFT || code == VK_RSHIFT)) {
                key_status[code] = KEY_KEEP_FRAMES;
        } else
 #endif
@@ -574,56 +474,79 @@ void EMU::key_down(int sym, bool repeat)
 void EMU::key_up(int sym)
 {
        uint8 code = sym;
-//        code = convert_AGKey2VK(sym);
-   //printf("Key up %03x %03x\n", sym, code);
-#if 1
-   if(code == VK_SHIFT) {
+       if(code == VK_SHIFT) {
 #ifndef USE_SHIFT_NUMPAD_KEY
-               if(!(GetAsyncKeyState(VK_SHIFT, modkey_status) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
-//             if(!(GetAsyncKeyState(VK_RSHIFT, modkey_status) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(!(GetAsyncKeyState(VK_SHIFT) & 0x8000)) {
+# else            
+               if(!(GetAsyncKeyState(VK_SHIFT, modkey_status) & 0x8000)) {
+# endif                   
+                       key_status[VK_LSHIFT] &= 0x7f;
+                       key_status[VK_RSHIFT] &= 0x7f;
+                       key_status[VK_SHIFT] &= 0x7f;
+               }
 #endif
        } else if(code == VK_LSHIFT) {
 #ifndef USE_SHIFT_NUMPAD_KEY
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(!(GetAsyncKeyState(VK_LSHIFT) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
+# else            
                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           
 #endif
        } else if(code == VK_RSHIFT) {
 #ifndef USE_SHIFT_NUMPAD_KEY
-//             if(!(GetAsyncKeyState(VK_LSHIFT, modkey_status) & 0x8000)) key_status[VK_LSHIFT] &= 0x7f;
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(!(GetAsyncKeyState(VK_RSHIFT) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
+# else            
                if(!(GetAsyncKeyState(VK_RSHIFT, modkey_status) & 0x8000)) key_status[VK_RSHIFT] &= 0x7f;
+# endif           
 #endif
        } else if(code == VK_CONTROL) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(!(GetAsyncKeyState(VK_CONTROL) & 0x8000)) {
+# else            
+               if(!(GetAsyncKeyState(VK_CONTROL, modkey_status) & 0x8000)) {
+# endif                   
+                       key_status[VK_LCONTROL] &= 0x7f;
+                       key_status[VK_RCONTROL] &= 0x7f;
+                       key_status[VK_CONTROL] &= 0x7f;
+               }
+       } else if(code == VK_LCONTROL) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(!(GetAsyncKeyState(VK_LCONTROL) & 0x8000)) key_status[VK_LCONTROL] &= 0x7f;
+# else            
                if(!(GetAsyncKeyState(VK_LCONTROL, modkey_status) & 0x8000)) key_status[VK_LCONTROL] &= 0x7f;
+# endif                   
+       } else if(code == VK_RCONTROL) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(!(GetAsyncKeyState(VK_RCONTROL) & 0x8000)) key_status[VK_RCONTROL] &= 0x7f;
+# else            
                if(!(GetAsyncKeyState(VK_RCONTROL, modkey_status) & 0x8000)) key_status[VK_RCONTROL] &= 0x7f;
+# endif           
        } else if(code == VK_MENU) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(!(GetAsyncKeyState(VK_MENU) & 0x8000)) {
+# else            
+               if(!(GetAsyncKeyState(VK_MENU, modkey_status) & 0x8000)) {
+# endif                   
+                       key_status[VK_LMENU] &= 0x7f;
+                       key_status[VK_RMENU] &= 0x7f;
+                       key_status[VK_MENU] &= 0x7f;
+               }
+       } else if(code == VK_LMENU) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(!(GetAsyncKeyState(VK_LMENU) & 0x8000)) key_status[VK_LMENU] &= 0x7f;
+# else            
                if(!(GetAsyncKeyState(VK_LMENU, modkey_status) & 0x8000)) key_status[VK_LMENU] &= 0x7f;
+# endif           
+       } else if(code == VK_RMENU) {
+# if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN)
+               if(!(GetAsyncKeyState(VK_RMENU) & 0x8000)) key_status[VK_RMENU] &= 0x7f;
+# else            
                if(!(GetAsyncKeyState(VK_RMENU, modkey_status) & 0x8000)) key_status[VK_RMENU] &= 0x7f;
-       } else
-#else 
-       if((code == VK_LSHIFT) || (code == VK_RSHIFT)) {
-                       key_status[code] &= 0x7f;
-       } else if(code == VK_SHIFT) {
-                       key_status[code] &= 0x7f;
-                       key_status[VK_LSHIFT] &= 0x7f;
-       } else if((code == VK_LCONTROL) || (code == VK_RCONTROL)) {
-                       key_status[code] &= 0x7f;
-       } else if(code == VK_CONTROL) {
-                       key_status[code] &= 0x7f;
-                       key_status[VK_LCONTROL] &= 0x7f;
-       } else if((code == VK_LMENU) || (code == VK_RMENU)) {
-                       key_status[code] &= 0x7f;
-       } else if(code == VK_MENU) {
-                       key_status[code] &= 0x7f;
-                       key_status[VK_LMENU] &= 0x7f;
-       } else
-#endif
-     {
-          key_status[code] &= 0x7f;
-#ifdef NOTIFY_KEY_DOWN
-          vm->key_up(code);
-#endif
-     }
-
+# endif           
+       }
 
 #ifdef USE_SHIFT_NUMPAD_KEY
        if((code == VK_SHIFT) || (code == VK_RSHIFT) || (code == VK_LSHIFT)) {
@@ -636,24 +559,18 @@ void EMU::key_up(int sym)
        }
    
 #endif
-       if(!(code == VK_SHIFT || code == VK_CONTROL || code == VK_MENU)) {
+       if(!(code == VK_CONTROL || code == VK_MENU || code == VK_SHIFT || code == VK_LSHIFT || code == VK_RSHIFT)) {
                code = keycode_conv[code];
        }
-       if(key_status[code]) {
-               key_status[code] &= 0x7f;
+       key_status[code] &= 0x7f;
 #ifdef NOTIFY_KEY_DOWN
-               if(!key_status[code]) {
                        vm->key_up(code);
-               }
 #endif
-       }
-
 }
 
 #ifdef USE_BUTTON
 void EMU::press_button(int num)
 {
-#if 1
        int code = buttons[num].code;
        
        if(code) {
@@ -663,25 +580,30 @@ void EMU::press_button(int num)
                // code=0: reset virtual machine
                vm->reset();
        }
-#endif
 }
 #endif
 
+
 void EMU::enable_mouse()
 {
        // enable mouse emulation
        if(!mouse_enabled) {
-#if 0
-               // hide mouse cursor
-               ShowCursor(FALSE);
-               // move mouse cursor to the center of window
-               POINT pt;
-               pt.x = display_width / 2;
-               pt.y = display_height / 2;
-               ClientToScreen(main_window_handle, &pt);
-               SetCursorPos(pt.x, pt.y);
-#endif
+               QCursor cursor;
+               QPoint pos;
+               mouse_oldx = mouse_ptrx = SCREEN_WIDTH / 2;
+               mouse_oldy = mouse_ptry = SCREEN_HEIGHT / 2;
+               cursor = instance_handle->cursor();
+               pos.setX(instance_handle->width() / 2);
+               pos.setY(instance_handle->height() / 2);
+               cursor.setPos(instance_handle->mapToGlobal(pos));
+               QApplication::setOverrideCursor(QCursor(Qt::BlankCursor));
+               //mouse_shape = cursor.shape();
+               //cursor.setShape(Qt::BlankCursor);
+               mouse_status[0] = 0;
+               mouse_status[1] = 0;
+               mouse_status[2] = mouse_button;
        }
+       instance_handle->setMouseTracking(true);
        mouse_enabled = true;
 
 }
@@ -690,13 +612,15 @@ void EMU::enable_mouse()
 
 void EMU::disenable_mouse()
 {
-#if 0
        // disenable mouse emulation
        if(mouse_enabled) {
-               ShowCursor(TRUE);
+               QCursor cursor;
+               cursor = instance_handle->cursor();
+               if(QApplication::overrideCursor() != NULL) QApplication::restoreOverrideCursor();
+               //QApplication::restoreOverrideCursor();
+               instance_handle->setMouseTracking(false);
        }
-#endif
-      mouse_enabled = false;
+       mouse_enabled = false;
 }
 
 void EMU::toggle_mouse()
@@ -738,7 +662,7 @@ static const int autokey_table[256] = {
 void EMU::start_auto_key()
 {
 #if 0
-        stop_auto_key();
+        stop_auto_key();
        
        if(OpenClipboard(NULL)) {
                HANDLE hClip = GetClipboardData(CF_TEXT);
@@ -785,178 +709,261 @@ void EMU::start_auto_key()
        }
 #endif
 }
-
+  
 void EMU::stop_auto_key()
 {
-#if 1
-        if(autokey_shift) {
+        if(autokey_shift) {
                key_up(VK_SHIFT);
        }
        autokey_phase = autokey_shift = 0;
-#endif
 }
 #endif
 
  
- JoyThreadClass::JoyThreadClass(QObject *parent) : QThread(parent)
- {
-   int i;
-   for(i = 0; i < 2; i++) joyhandle[i] = SDL_JoystickOpen(i);
-     joy_num = SDL_NumJoysticks();
-     AGAR_DebugLog(AGAR_LOG_DEBUG, "JoyThread : Start.");
-     bRunThread = true;
- }
- JoyThreadClass::~JoyThreadClass()
- {
-  int i;
-    for(i = 0; i < 2; i++) {
-      if(joyhandle[i] != NULL) SDL_JoystickClose(joyhandle[i]);
-    }
-    AGAR_DebugLog(AGAR_LOG_DEBUG, "JoyThread : EXIT");
- }
+JoyThreadClass::JoyThreadClass(QObject *parent) : QThread(parent)
+{
+       int i, j;
+       joy_num = SDL_NumJoysticks();
+       for(i = 0; i < 16; i++) {
+               joyhandle[i] = NULL;
+#if defined(USE_SDL2)  
+               for(j = 0; j < 16; j++) guid_list[i].data[j] = 0;
+               for(j = 0; j < 16; j++) guid_assign[i].data[j] = 0;
+#endif    
+               names[i] = QString::fromUtf8("");
+       }
+       if(joy_num > 0) {
+               if(joy_num >= 16) joy_num = 16;
+               for(i = 0; i < joy_num; i++) {
+                  
+                       joyhandle[i] = SDL_JoystickOpen(i);
+                       if(joyhandle[i] != NULL) {
+#if defined(USE_SDL2)                     
+                               guid_list[i] = SDL_JoystickGetGUID(joyhandle[i]);
+                               guid_assign[i] = SDL_JoystickGetGUID(joyhandle[i]);
+                               names[i] = QString::fromUtf8(SDL_JoystickNameForIndex(i));
+#else
+                               names[i] = QString::fromUtf8(SDL_JoystickName(i));
+#endif                    
+                               AGAR_DebugLog(AGAR_LOG_DEBUG, "JoyThread : Joystick %d : %s.", i, names[i].toUtf8().data());
+                       }
+               }
+               AGAR_DebugLog(AGAR_LOG_DEBUG, "JoyThread : Start.");
+               bRunThread = true;
+       } else {
+               AGAR_DebugLog(AGAR_LOG_DEBUG, "JoyThread : Any joysticks were not connected.");
+               bRunThread = false;
+       }
+}
+
+   
+JoyThreadClass::~JoyThreadClass()
+{
+       int i;
+       for(i = 0; i < 16; i++) {
+               if(joyhandle[i] != NULL) SDL_JoystickClose(joyhandle[i]);
+       }
+       AGAR_DebugLog(AGAR_LOG_DEBUG, "JoyThread : EXIT");
+}
  
 void JoyThreadClass::x_axis_changed(int index, int value)
 {
-   if(p_emu == NULL) return;
-   p_emu->LockVM();
-   uint32_t *joy_status = p_emu->getJoyStatPtr();
+       if(p_emu == NULL) return;
+       p_emu->LockVM();
+       uint32_t *joy_status = p_emu->getJoyStatPtr();
    
-   if(joy_status != NULL) {
-      if(value < -8192) { // left
-        joy_status[index] |= 0x04; joy_status[index] &= ~0x08;
-      } else if(value > 8192)  { // right
-        joy_status[index] |= 0x08; joy_status[index] &= ~0x04;
-      }  else { // center
-        joy_status[index] &= ~0x0c;
-      }
-   }
-   
-   p_emu->UnlockVM();
+       if(joy_status != NULL) {
+               if(value < -8192) { // left
+                       joy_status[index] |= 0x04; joy_status[index] &= ~0x08;
+               } else if(value > 8192)  { // right
+                       joy_status[index] |= 0x08; joy_status[index] &= ~0x04;
+               }  else { // center
+                       joy_status[index] &= ~0x0c;
+               }
+       }
+       p_emu->UnlockVM();
 }
           
 void JoyThreadClass::y_axis_changed(int index, int value)
 {
-   if(p_emu == NULL) return;
-   p_emu->LockVM();
-   uint32_t *joy_status = p_emu->getJoyStatPtr();
-   
-   if(joy_status != NULL) {
-      if(value < -8192) {// up
-        joy_status[index] |= 0x01; joy_status[index] &= ~0x02;
-      } else if(value > 8192)  {// down 
-        joy_status[index] |= 0x02; joy_status[index] &= ~0x01;
-      } else {
-        joy_status[index] &= ~0x03;
-      }
-   }
+       if(p_emu == NULL) return;
+       p_emu->LockVM();
+       uint32_t *joy_status = p_emu->getJoyStatPtr();
    
-   p_emu->UnlockVM();
+       if(joy_status != NULL) {
+               if(value < -8192) {// up
+                       joy_status[index] |= 0x01; joy_status[index] &= ~0x02;
+               } else if(value > 8192)  {// down 
+                       joy_status[index] |= 0x02; joy_status[index] &= ~0x01;
+               } else {
+                       joy_status[index] &= ~0x03;
+               }
+       }
+       p_emu->UnlockVM();
 }
 
 void JoyThreadClass::button_down(int index, unsigned int button)
 {
-      if(p_emu == NULL) return;
-      p_emu->LockVM();
-      uint32_t *joy_status = p_emu->getJoyStatPtr();
-      if(joy_status != NULL) {
-        joy_status[index] |= (1 << (button + 4));
-      }
-      p_emu->UnlockVM();
+       if(p_emu == NULL) return;
+       p_emu->LockVM();
+       uint32_t *joy_status = p_emu->getJoyStatPtr();
+       if(joy_status != NULL) {
+               joy_status[index] |= (1 << (button + 4));
+       }
+       p_emu->UnlockVM();
 }
 
 void JoyThreadClass::button_up(int index, unsigned int button)
 {
-   if(p_emu == NULL) return;
+       if(p_emu == NULL) return;
    
-   p_emu->LockVM();
-   uint32_t *joy_status = p_emu->getJoyStatPtr();
-      if(joy_status != NULL) {
-        joy_status[index] &= ~(1 << (button + 4));
-      }
-   p_emu->UnlockVM();
+       p_emu->LockVM();
+       uint32_t *joy_status = p_emu->getJoyStatPtr();
+       if(joy_status != NULL) {
+               joy_status[index] &= ~(1 << (button + 4));
+       }
+       p_emu->UnlockVM();
 }
-          
+
+#if defined(USE_SDL2)
 // SDL Event Handler
+bool JoyThreadClass::MatchJoyGUID(SDL_JoystickGUID *a, SDL_JoystickGUID *b)
+{ 
+       int i;
+       for(i = 0; i < 16; i++) {
+               if(a->data[i] != b->data[i]) return false;
+       }
+       return true;
+}
+
+bool JoyThreadClass::CheckJoyGUID(SDL_JoystickGUID *a)
+{ 
+       int i;
+       bool b = false;
+       for(i = 0; i < 16; i++) {
+               if(a->data[i] != 0) b = true;
+       }
+       return b;
+}
+#endif
+
 bool  JoyThreadClass::EventSDL(SDL_Event *eventQueue)
 {
-   //  SDL_Surface *p;
-   Sint16 value;
-   unsigned int button;
-   int vk;
-   uint32_t sym;
-   int i;
-   if(eventQueue == NULL) return false;
+       //      SDL_Surface *p;
+       Sint16 value;
+       unsigned int button;
+       int vk;
+       uint32_t sym;
+       uint32_t mod;
+#if defined(USE_SDL2)
+       SDL_JoystickGUID guid;
+#endif   
+       int i;
+       if(eventQueue == NULL) return false;
        /*
         * JoyStickなどはSDLが管理する
         */
-   switch (eventQueue->type){
-    case SDL_JOYAXISMOTION:
-      value = eventQueue->jaxis.value;
-      i = eventQueue->jaxis.which;
-      if((i < 0) || (i > 1)) break;
-
-      if(eventQueue->jaxis.axis == 0) { // X
-        x_axis_changed(i, value);
-      } else if(eventQueue->jaxis.axis == 1) { // Y
-        y_axis_changed(i, value);
-      }
-      break;
-    case SDL_JOYBUTTONDOWN:
-      button = eventQueue->jbutton.button;
-      i = eventQueue->jbutton.which;
-      if((i < 0) || (i > 1)) break;
-      button_down(i, button);
-      break;
-    case SDL_JOYBUTTONUP:
-      button = eventQueue->jbutton.button;
-      i = eventQueue->jbutton.which;
-      if((i < 0) || (i > 1)) break;
-      button_up(i, button);
-      break;
-    default:
-      break;
-   }
-   return true;
+       switch (eventQueue->type){
+               case SDL_JOYAXISMOTION:
+                       value = eventQueue->jaxis.value;
+                       i = eventQueue->jaxis.which;
+          
+#if defined(USE_SDL2)
+                       guid = SDL_JoystickGetDeviceGUID(i);
+                       if(!CheckJoyGUID(&guid)) break;
+                       for(i = 0; i < 2; i++) {
+                               if(MatchJoyGUID(&guid, &(guid_assign[i]))) {
+                                       if(eventQueue->jaxis.axis == 0) { // X
+                                               x_axis_changed(i, value);
+                                       } else if(eventQueue->jaxis.axis == 1) { // Y
+                                               y_axis_changed(i, value);
+                                       }
+                               }
+                       }
+#else
+                       if(eventQueue->jaxis.axis == 0) { // X
+                               x_axis_changed(i, value);
+                       } else if(eventQueue->jaxis.axis == 1) { // Y
+                               y_axis_changed(i, value);
+                       }
+#endif
+                       break;
+               case SDL_JOYBUTTONDOWN:
+                       button = eventQueue->jbutton.button;
+                       i = eventQueue->jbutton.which;
+#if defined(USE_SDL2)
+                       guid = SDL_JoystickGetDeviceGUID(i);
+                       if(!CheckJoyGUID(&guid)) break;
+                       for(i = 0; i < 2; i++) {
+                               if(MatchJoyGUID(&guid, &(guid_assign[i]))) {
+                                       button_down(i, button);
+                               }
+                       }
+#else     
+                       button_down(i, button);
+#endif    
+                       break;
+               case SDL_JOYBUTTONUP:      
+                       button = eventQueue->jbutton.button;
+                       i = eventQueue->jbutton.which;
+#if defined(USE_SDL2)
+                       guid = SDL_JoystickGetDeviceGUID(i);
+                       if(!CheckJoyGUID(&guid)) break;
+                       for(i = 0; i < 2; i++) {
+                               if(MatchJoyGUID(&guid, &(guid_assign[i]))) {
+                                       button_up(i, button);
+                               }
+                       }
+#else     
+                       button_up(i, button);
+#endif    
+                       break;
+               default:
+                       break;
+       }
+       return true;
 }
 
 
 void JoyThreadClass::doWork(const QString &params)
 {
-  do {
-  if(bRunThread == false) {
-    return;
-  }
-  while(SDL_PollEvent(&event) == 1) {
-    EventSDL(&event);
-  }
-     SDL_Delay(10);
-  } while(1);
-   
-  //timer.setInterval(5);
-  return;
+       do {
+               if(bRunThread == false) {
+                       break;
+               }
+               while(SDL_PollEvent(&event)) {
+                       EventSDL(&event);
+               }
+               msleep(10);
+       } while(1);
+       this->quit();
 }
+          
 
 void JoyThreadClass::doExit(void)
 {
-    bRunThread = false;
+       bRunThread = false;
+       //this->quit();
 }
 
 
 void Ui_MainWindow::LaunchJoyThread(void)
 {
-    hRunJoy = new JoyThreadClass(this);
-    hRunJoy->SetEmu(emu);
-    connect(this, SIGNAL(quit_joy_thread()), hRunJoy, SLOT(doExit()));
-    hRunJoy->setObjectName("JoyThread");
-    hRunJoy->start();
+       hRunJoy = new JoyThreadClass(this);
+       hRunJoy->SetEmu(emu);
+       connect(this, SIGNAL(quit_joy_thread()), hRunJoy, SLOT(doExit()));
+       //connect(this, SIGNAL(quit_joy_thread()), hRunJoy, SLOT(terminate()));
+       //connect(hRunJoy, SIGNAL(finished()), hRunJoy, SLOT(quit()));
+       hRunJoy->setObjectName("JoyThread");
+       hRunJoy->start();
 }
-void Ui_MainWindow::StopJoyThread(void) {
-    emit quit_joy_thread();
+void Ui_MainWindow::StopJoyThread(void)
+{
+       emit quit_joy_thread();
 }
 
 void Ui_MainWindow::delete_joy_thread(void)
 {
-  //    delete hRunJoyThread;
-  //  delete hRunJoy;
+       //    delete hRunJoyThread;
+       //  delete hRunJoy;
 }