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 #include #include + #include #if !defined(GLES) #include @@ -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());