summaryrefslogtreecommitdiff
path: root/pcr/reicast-multilib-git/enable_joystick_support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'pcr/reicast-multilib-git/enable_joystick_support.patch')
-rw-r--r--pcr/reicast-multilib-git/enable_joystick_support.patch346
1 files changed, 346 insertions, 0 deletions
diff --git a/pcr/reicast-multilib-git/enable_joystick_support.patch b/pcr/reicast-multilib-git/enable_joystick_support.patch
new file mode 100644
index 000000000..0fbb59ac7
--- /dev/null
+++ b/pcr/reicast-multilib-git/enable_joystick_support.patch
@@ -0,0 +1,346 @@
+diff -Nur reicast-emulator.orig/core/linux-dist/main.cpp reicast-emulator/core/linux-dist/main.cpp
+--- reicast-emulator.orig/core/linux-dist/main.cpp 2015-06-29 21:42:22.674278849 -0300
++++ reicast-emulator/core/linux-dist/main.cpp 2015-06-29 22:08:38.780500620 -0300
+@@ -22,6 +22,7 @@
+ #include <X11/Xlib.h>
+ #include <X11/Xatom.h>
+ #include <X11/Xutil.h>
++ #include <X11/XKBlib.h>
+
+ #if !defined(GLES)
+ #include <GL/gl.h>
+@@ -49,6 +50,34 @@
+ #endif
+ #define WINDOW_HEIGHT 480
+
++/*****************************************************************/
++/****************** Configure Controls ***************************/
++/*****************************************************************/
++
++// Use XEV in terminal window to find keycodes to configure buttons.
++#define XANA_UP (25)
++#define XANA_DOWN (39)
++#define XANA_LEFT (38)
++#define XANA_RIGHT (40)
++#define XANA_LT (79)
++#define XANA_RT (81)
++#define XDPAD_UP (31)
++#define XDPAD_DOWN (45)
++#define XDPAD_LEFT (44)
++#define XDPAD_RIGHT (46)
++#define XBTN_Y (80)
++#define XBTN_X (83)
++#define XBTN_B (85)
++#define XBTN_A (84)
++#define XBTN_START (36)
++
++/*******************************************************************/
++
++u8 temp_joyx = 0;
++u8 temp_joyy = 0;
++u8 temp_lt = 0;
++u8 temp_rt = 0;
++
+ void* x11_win=0,* x11_disp=0;
+ void* libPvr_GetRenderTarget()
+ {
+@@ -124,8 +153,8 @@
+ { Btn_A,Btn_B,Btn_X,Btn_Y,0,0,0,Btn_Start,0,0 };
+
+ const u32 JMapAxis_360[MAP_SIZE] =
+- { Axis_X,Axis_Y,Axis_LT,0,0,Axis_RT,DPad_Left,DPad_Up,0,0 };
+-
++ //{ Axis_X,Axis_Y,Axis_LT,0,0,Axis_RT,DPad_Left,DPad_Up,0,0 };
++ { Axis_X,Axis_Y,0,0,Axis_RT,Axis_LT,DPad_Left,DPad_Up,0,0 };
+ const u32* JMapBtn=JMapBtn_USB;
+ const u32* JMapAxis=JMapAxis_USB;
+
+@@ -180,7 +209,7 @@
+
+ printf("SDK: Found '%s' joystick with %d axis and %d buttons\n",Name,AxisCount,ButtonCount);
+
+- if (strcmp(Name,"Microsoft X-Box 360 pad")==0)
++ if (strcmp(Name,"Microsoft X-Box 360 pad")==0 || strcmp(Name,"Xbox Gamepad (userspace driver)")==0)
+ {
+ JMapBtn=JMapBtn_360;
+ JMapAxis=JMapAxis_360;
+@@ -414,9 +443,20 @@
+ {
+ static char key = 0;
+
+- kcode[port]= x11_dc_buttons;
+- rt[port]=0;
+- lt[port]=0;
++ if (cfgLoadInt("config","usejoypad",0)==1)
++ {
++ HandleJoystick(port);
++ return;
++ }
++ else
++ {
++ kcode[port]= x11_dc_buttons;
++ joyx[0] = temp_joyx;
++ joyy[0] = temp_joyy;
++ lt[0] = temp_lt;
++ rt[0] = temp_rt;
++ return;
++ }
+
+ #if defined(TARGET_GCW0) || defined(TARGET_PANDORA)
+ HandleJoystick(port);
+@@ -472,7 +512,13 @@
+ void os_DoEvents()
+ {
+ #if defined(SUPPORT_X11)
+- if (x11_win) {
++
++ static bool ana_up = false;
++ static bool ana_down = false;
++ static bool ana_left = false;
++ static bool ana_right = false;
++
++ if (x11_win) {
+ //Handle X11
+ XEvent e;
+ if(XCheckWindowEvent((Display*)x11_disp, (Window)x11_win, KeyPressMask | KeyReleaseMask, &e))
+@@ -483,6 +529,103 @@
+ case KeyPress:
+ case KeyRelease:
+ {
++
++ //Detect up press
++ if(e.xkey.keycode == XANA_UP)
++ {
++ if(e.type == KeyPress)
++ {
++ ana_up = true;
++ }
++ else if(e.type == KeyRelease)
++ {
++ ana_up = false;
++ }
++ else
++ {
++ }
++ }
++
++ //Detect down Press
++ if(e.xkey.keycode == XANA_DOWN)
++ {
++ if(e.type == KeyPress)
++ {
++ ana_down = true;
++ }
++ else if(e.type == KeyRelease)
++ {
++ ana_down = false;
++ }
++ else
++ {
++ }
++ }
++
++ //Detect left press
++ if(e.xkey.keycode == XANA_LEFT)
++ {
++ if(e.type == KeyPress)
++ {
++ ana_left = true;
++ }
++ else if(e.type == KeyRelease)
++ {
++ ana_left = false;
++ }
++ else
++ {
++ }
++ }
++
++ //Detect right Press
++ if(e.xkey.keycode == XANA_RIGHT)
++ {
++ if(e.type == KeyPress)
++ {
++ ana_right = true;
++ }
++ else if(e.type == KeyRelease)
++ {
++ ana_right = false;
++ }
++ else
++ {
++ }
++ }
++
++ //detect LT press
++ if (e.xkey.keycode == XANA_LT)
++ {
++ if (e.type == KeyPress)
++ {
++ temp_lt = 255;
++ }
++ else if (e.type == KeyRelease)
++ {
++ temp_lt = 0;
++ }
++ else
++ {
++ }
++ }
++
++ //detect RT press
++ if (e.xkey.keycode == XANA_RT)
++ {
++ if (e.type == KeyPress)
++ {
++ temp_rt = 255;
++ }
++ else if (e.type == KeyRelease)
++ {
++ temp_rt = 0;
++ }
++ else
++ {
++ }
++ }
++
+ int dc_key = x11_keymap[e.xkey.keycode];
+
+ if (e.type == KeyPress)
+@@ -494,14 +637,44 @@
+ }
+ break;
+
+-
++ default:
+ {
+ printf("KEYRELEASE\n");
+ }
+ break;
+
+ }
+- }
++ }
++
++ /* Check analogue control states (up/down) */
++ if((ana_up == true) && (ana_down == false))
++ {
++ temp_joyy = -127;
++ }
++ else if((ana_up == false) && (ana_down == true))
++ {
++ temp_joyy = 127;
++ }
++ else
++ {
++ /* Either both pressed simultaniously or neither pressed */
++ temp_joyy = 0;
++ }
++
++ /* Check analogue control states (left/right) */
++ if((ana_left == true) && (ana_right == false))
++ {
++ temp_joyx = -127;
++ }
++ else if((ana_left == false) && (ana_right == true))
++ {
++ temp_joyx = 127;
++ }
++ else
++ {
++ /* Either both pressed simultaniously or neither pressed */
++ temp_joyx = 0;
++ }
+ }
+ #endif
+ }
+@@ -527,6 +700,9 @@
+ void os_CreateWindow()
+ {
+ #if defined(SUPPORT_X11)
++
++ Bool ar_set, ar_supp = false;
++
+ if (cfgLoadInt("pvr","nox11",0)==0)
+ {
+ XInitThreads();
+@@ -636,7 +812,8 @@
+ int height=cfgLoadInt("x11","height", WINDOW_HEIGHT);
+ #endif
+
+- if (width==-1)
++ //if (width==-1)
++ if (cfgLoadInt("x11","fullscreen",0)==1)
+ {
+ width=XDisplayWidth(x11Display,x11Screen);
+ height=XDisplayHeight(x11Display,x11Screen);
+@@ -653,8 +830,21 @@
+
+ XMapRaised(x11Display, x11Window);
+ #else
+- XMapWindow(x11Display, x11Window);
+-
++
++ if (cfgLoadInt("x11","fullscreen",0)==1)
++ {
++ // fullscreen
++ Atom wmState = XInternAtom(x11Display, "_NET_WM_STATE", False);
++ Atom wmFullscreen = XInternAtom(x11Display, "_NET_WM_STATE_FULLSCREEN", False);
++ XChangeProperty(x11Display, x11Window, wmState, XA_ATOM, 32, PropModeReplace, (unsigned char *)&wmFullscreen, 1);
++ }
++
++ XMapWindow(x11Display, x11Window);
++
++ //This 1 second delay is important. Without it the GLX code can execute before the window
++ //resize completes causing a black border at the top of the screen....
++ sleep(1);
++
+ #if !defined(GLES)
+
+ #define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
+@@ -690,6 +880,11 @@
+ //(EGLNativeDisplayType)x11Display;
+ x11_disp=(void*)x11Display;
+ x11_win=(void*)x11Window;
++
++ ar_set = XkbSetDetectableAutoRepeat(x11Display, True, &ar_supp);
++ printf("XkbSetDetectableAutoRepeat returns %u, supported = %u\n",ar_set, ar_supp);
++
++
+ }
+ else
+ printf("Not creating X11 window ..\n");
+@@ -805,16 +1000,16 @@
+ #endif
+
+ #if defined(SUPPORT_X11)
+- x11_keymap[113] = DPad_Left;
+- x11_keymap[114] = DPad_Right;
++ x11_keymap[XDPAD_LEFT] = DPad_Left;
++ x11_keymap[XDPAD_RIGHT] = DPad_Right;
+
+- x11_keymap[111] = DPad_Up;
+- x11_keymap[116] = DPad_Down;
++ x11_keymap[XDPAD_UP] = DPad_Up;
++ x11_keymap[XDPAD_DOWN] = DPad_Down;
+
+- x11_keymap[52] = Btn_Y;
+- x11_keymap[53] = Btn_X;
+- x11_keymap[54] = Btn_B;
+- x11_keymap[55] = Btn_A;
++ x11_keymap[XBTN_Y] = Btn_Y;
++ x11_keymap[XBTN_X] = Btn_X;
++ x11_keymap[XBTN_B] = Btn_B;
++ x11_keymap[XBTN_A] = Btn_A;
+
+ /*
+ //TODO: Fix sliders
+@@ -822,7 +1017,7 @@
+ x11_keymap[39] = DPad_Down;
+ */
+
+- x11_keymap[36] = Btn_Start;
++ x11_keymap[XBTN_START] = Btn_Start;
+ #endif
+
+ printf("Home dir is: %s\n",GetPath("/").c_str());