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 0f9d973..f097cef 100644 (file)
@@ -11,7 +11,7 @@
 
 #include <Qt>
 #include <QApplication>
-#include <SDL2/SDL.h>
+#include <SDL.h>
 #include "emu.h"
 #include "vm/vm.h"
 #include "fifo.h"
@@ -115,8 +115,39 @@ void EMU::update_input()
                        vm->key_up(VK_SHIFT);
 # endif
                        // 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;
@@ -154,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
@@ -188,7 +219,15 @@ void EMU::update_input()
 #endif
 #endif
 
-#endif
+       // 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);
+               }
+       }
+
 #if defined(USE_BUTTON)
        if(!press_flag && !release_flag) {
                int ii;
@@ -235,31 +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
+# ifdef NOTIFY_KEY_DOWN
                        if(shift && !autokey_shift) {
                                key_down(VK_SHIFT, false);
                        } else if(!shift && autokey_shift) {
                                key_up(VK_SHIFT);
                        }
-#endif            
+# endif                   
                        autokey_shift = shift;
                        autokey_phase++;
                        break;
                }
        case 3:
-#ifdef NOTIFY_KEY_DOWN
+# ifdef NOTIFY_KEY_DOWN
                if(autokey_buffer && !autokey_buffer->empty()) {
                        key_down(autokey_buffer->read_not_remove(0) & 0xff, false);
                }
-#endif    
+# endif           
                autokey_phase++;
                break;
        case USE_AUTO_KEY:
-#ifdef NOTIFY_KEY_DOWN
+# ifdef NOTIFY_KEY_DOWN
                if(autokey_buffer && !autokey_buffer->empty()) {
                        key_up(autokey_buffer->read_not_remove(0) & 0xff);
                }
-#endif    
+# endif           
                autokey_phase++;
                break;
        case USE_AUTO_KEY_RELEASE:
@@ -315,31 +354,76 @@ void EMU::key_down(int sym, bool repeat)
        uint8 code = sym;
        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){
 #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;
@@ -366,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
@@ -392,30 +476,76 @@ void EMU::key_up(int sym)
        uint8 code = sym;
        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 {
-               key_status[code] &= 0x7f;
-#ifdef NOTIFY_KEY_DOWN
-               vm->key_up(code);
-#endif
+# endif           
        }
 
 #ifdef USE_SHIFT_NUMPAD_KEY
@@ -429,18 +559,13 @@ 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
@@ -587,29 +712,55 @@ void EMU::start_auto_key()
   
 void EMU::stop_auto_key()
 {
-#if 1
         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);
+       int i, j;
        joy_num = SDL_NumJoysticks();
-       AGAR_DebugLog(AGAR_LOG_DEBUG, "JoyThread : Start.");
-       bRunThread = true;
+       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 < 2; i++) {
+       for(i = 0; i < 16; i++) {
                if(joyhandle[i] != NULL) SDL_JoystickClose(joyhandle[i]);
        }
        AGAR_DebugLog(AGAR_LOG_DEBUG, "JoyThread : EXIT");
@@ -673,8 +824,29 @@ void JoyThreadClass::button_up(int index, unsigned int button)
        }
        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;
@@ -683,6 +855,9 @@ bool  JoyThreadClass::EventSDL(SDL_Event *eventQueue)
        int vk;
        uint32_t sym;
        uint32_t mod;
+#if defined(USE_SDL2)
+       SDL_JoystickGUID guid;
+#endif   
        int i;
        if(eventQueue == NULL) return false;
        /*
@@ -692,25 +867,56 @@ bool  JoyThreadClass::EventSDL(SDL_Event *eventQueue)
                case SDL_JOYAXISMOTION:
                        value = eventQueue->jaxis.value;
                        i = eventQueue->jaxis.which;
-                       if((i < 0) || (i > 1)) break;
-                       
+          
+#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((i < 0) || (i > 1)) break;
+#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:
+               case SDL_JOYBUTTONUP:      
                        button = eventQueue->jbutton.button;
                        i = eventQueue->jbutton.which;
-                       if((i < 0) || (i > 1)) break;
+#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;
@@ -725,7 +931,7 @@ void JoyThreadClass::doWork(const QString &params)
                if(bRunThread == false) {
                        break;
                }
-               while(SDL_PollEvent(&event) == 1) {
+               while(SDL_PollEvent(&event)) {
                        EventSDL(&event);
                }
                msleep(10);