#include <Qt>
#include <QApplication>
-#include <SDL2/SDL.h>
+#include <SDL.h>
#include "emu.h"
#include "vm/vm.h"
#include "fifo.h"
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;
}
}
lost_focus = false;
-#if 1
+
// update joystick status
#ifdef USE_KEY_TO_JOY
// emulate joystick #1 with keyboard
#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;
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:
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;
}
#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
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
}
#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::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");
}
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;
int vk;
uint32_t sym;
uint32_t mod;
+#if defined(USE_SDL2)
+ SDL_JoystickGUID guid;
+#endif
int i;
if(eventQueue == NULL) return false;
/*
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;
if(bRunThread == false) {
break;
}
- while(SDL_PollEvent(&event) == 1) {
+ while(SDL_PollEvent(&event)) {
EventSDL(&event);
}
msleep(10);