In linux only read keyboard and mouse input when the emulator window has focus.

Also other code clean up.


git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5053 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Glenn Rice 2010-02-13 23:56:24 +00:00
parent 5e6eecf0af
commit e5afde67ce
11 changed files with 56 additions and 28 deletions

View File

@ -404,6 +404,9 @@ THREAD_RETURN EmuThread(void *pArg)
// Load and init GCPadPlugin // Load and init GCPadPlugin
SPADInitialize PADInitialize; SPADInitialize PADInitialize;
PADInitialize.hWnd = g_pWindowHandle; PADInitialize.hWnd = g_pWindowHandle;
#if defined(HAVE_X11) && HAVE_X11
PADInitialize.pXWindow = g_pXWindow;
#endif
PADInitialize.pLog = Callback_PADLog; PADInitialize.pLog = Callback_PADLog;
// This is may be needed to avoid a SDL problem // This is may be needed to avoid a SDL problem
//Plugins.FreeWiimote(); //Plugins.FreeWiimote();

View File

@ -34,6 +34,9 @@ typedef void (*TLog)(const char* _pMessage);
typedef struct typedef struct
{ {
HWND hWnd; HWND hWnd;
#if defined HAVE_X11 && HAVE_X11
void *pXWindow;
#endif
TLog pLog; TLog pLog;
} SPADInitialize; } SPADInitialize;

View File

@ -19,7 +19,7 @@ typedef void (*TWiimoteInput)(int _number, u16 _channelID, const void* _pData, u
typedef struct typedef struct
{ {
HWND hWnd; HWND hWnd;
#ifdef __linux__ #if defined HAVE_X11 && HAVE_X11
void *pXWindow; void *pXWindow;
#endif #endif
u32 ISOId; u32 ISOId;

View File

@ -596,6 +596,17 @@ void UpdatePadState(CONTROLLER_MAPPING_GC &_GCiMapping)
} }
} }
#if defined(HAVE_X11) && HAVE_X11
bool HaveFocus (void)
{
Window GLWin = *(Window *)g_PADInitialize->pXWindow;
Window FocusWin;
int Revert;
XGetInputFocus(GCdisplay, &FocusWin, &Revert);
return (GLWin != 0 && GLWin == FocusWin);
}
#endif
// Multi System Input Status Check // Multi System Input Status Check
bool IsKey(int Key) bool IsKey(int Key)
{ {
@ -609,7 +620,7 @@ bool IsKey(int Key)
} }
else if (MapKey < 0x1100) else if (MapKey < 0x1100)
#elif defined HAVE_X11 && HAVE_X11 #elif defined HAVE_X11 && HAVE_X11
if (MapKey < 256 || MapKey > 0xf000) if (HaveFocus() && (MapKey < 256 || MapKey > 0xf000))
{ {
char keys[32]; char keys[32];
KeyCode keyCode; KeyCode keyCode;

View File

@ -360,7 +360,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight
/* create a fullscreen window */ /* create a fullscreen window */
GLWin.attr.override_redirect = True; GLWin.attr.override_redirect = True;
GLWin.attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | KeyReleaseMask | ButtonReleaseMask | StructureNotifyMask; GLWin.attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | StructureNotifyMask;
GLWin.win = XCreateWindow(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen), GLWin.win = XCreateWindow(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen),
0, 0, dpyWidth, dpyHeight, 0, vi->depth, InputOutput, vi->visual, 0, 0, dpyWidth, dpyHeight, 0, vi->depth, InputOutput, vi->visual,
CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect, CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect,
@ -368,7 +368,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight
XWarpPointer(GLWin.dpy, None, GLWin.win, 0, 0, 0, 0, 0, 0); XWarpPointer(GLWin.dpy, None, GLWin.win, 0, 0, 0, 0, 0, 0);
XMapRaised(GLWin.dpy, GLWin.win); XMapRaised(GLWin.dpy, GLWin.win);
XGrabKeyboard(GLWin.dpy, GLWin.win, True, GrabModeAsync, GrabModeAsync, CurrentTime); XGrabKeyboard(GLWin.dpy, GLWin.win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
XGrabPointer(GLWin.dpy, GLWin.win, True, ButtonPressMask, XGrabPointer(GLWin.dpy, GLWin.win, True, NULL,
GrabModeAsync, GrabModeAsync, GLWin.win, None, CurrentTime); GrabModeAsync, GrabModeAsync, GLWin.win, None, CurrentTime);
} }
else { else {
@ -388,7 +388,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight
//int Y = (rcdesktop.bottom-rcdesktop.top)/2 - (rc.bottom-rc.top)/2; //int Y = (rcdesktop.bottom-rcdesktop.top)/2 - (rc.bottom-rc.top)/2;
// create a window in window mode // create a window in window mode
GLWin.attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | KeyReleaseMask | ButtonReleaseMask | GLWin.attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
StructureNotifyMask | ResizeRedirectMask; StructureNotifyMask | ResizeRedirectMask;
GLWin.win = XCreateWindow(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen), GLWin.win = XCreateWindow(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen),
0, 0, _twidth, _theight, 0, vi->depth, InputOutput, vi->visual, 0, 0, _twidth, _theight, 0, vi->depth, InputOutput, vi->visual,

View File

@ -42,12 +42,11 @@
CWII_IPC_HLE_Device_usb_oh1_57e_305::Update() CWII_IPC_HLE_Device_usb_oh1_57e_305::Update()
*/ */
#include "pluginspecs_wiimote.h"
#include <vector> #include <vector>
#include <string> #include <string>
#include "Common.h" // Common #include "Common.h" // Common
#include "pluginspecs_wiimote.h"
#include "StringUtil.h" // for ArrayToString #include "StringUtil.h" // for ArrayToString
#include "wiimote_hid.h" // Local #include "wiimote_hid.h" // Local

View File

@ -21,8 +21,8 @@
#include <vector> #include <vector>
#include <string> #include <string>
#include "pluginspecs_wiimote.h"
#include "Common.h" #include "Common.h"
#include "pluginspecs_wiimote.h"
#include "wiimote_hid.h" #include "wiimote_hid.h"
#include "EmuDefinitions.h" #include "EmuDefinitions.h"
#include "Encryption.h" #include "Encryption.h"

View File

@ -196,6 +196,17 @@ void LoadRecordedMovements()
} }
} }
#if defined(HAVE_X11) && HAVE_X11
bool HaveFocus (void)
{
Window GLWin = *(Window *)g_WiimoteInitialize.pXWindow;
Window FocusWin;
int Revert;
XGetInputFocus(WMdisplay, &FocusWin, &Revert);
return (GLWin != 0 && GLWin == FocusWin);
}
#endif
/* Calibrate the mouse position to the emulation window. g_WiimoteInitialize.hWnd is the rendering window handle. */ /* Calibrate the mouse position to the emulation window. g_WiimoteInitialize.hWnd is the rendering window handle. */
void GetMousePos(float& x, float& y) void GetMousePos(float& x, float& y)
{ {
@ -216,12 +227,13 @@ void GetMousePos(float& x, float& y)
float PictureWidth = WinWidth, PictureHeight = WinHeight; float PictureWidth = WinWidth, PictureHeight = WinHeight;
#else #else
#if defined(HAVE_X11) && HAVE_X11 #if defined(HAVE_X11) && HAVE_X11
Window GLWin = *(Window *)g_WiimoteInitialize.pXWindow;
float WinWidth = 0, WinHeight = 0; float WinWidth = 0, WinHeight = 0;
float XOffset = 0, YOffset = 0; float XOffset = 0, YOffset = 0;
int root_x, root_y, win_x, win_y; int root_x, root_y, win_x, win_y;
Window GLWin = *(Window *)g_WiimoteInitialize.pXWindow; if (HaveFocus())
if (GLWin != 0)
{ {
Window GLWin = *(Window *)g_WiimoteInitialize.pXWindow;
XWindowAttributes WinAttribs; XWindowAttributes WinAttribs;
XGetWindowAttributes (WMdisplay, GLWin, &WinAttribs); XGetWindowAttributes (WMdisplay, GLWin, &WinAttribs);
WinWidth = (float)WinAttribs.width; WinWidth = (float)WinAttribs.width;

View File

@ -42,9 +42,12 @@ void InterruptChannel(int _number, u16 _channelID, const void* _pData, u32 _Size
void ControlChannel(int _number, u16 _channelID, const void* _pData, u32 _Size) ; void ControlChannel(int _number, u16 _channelID, const void* _pData, u32 _Size) ;
void Update(int _number); void Update(int _number);
void DoState(PointerWrap &p); void DoState(PointerWrap &p);
//void ReadLinuxKeyboard();
bool IsKey(int Key); bool IsKey(int Key);
#if defined(HAVE_X11) && HAVE_X11
bool HaveFocus (void);
#endif
// Recordings // Recordings
void LoadRecordedMovements(); void LoadRecordedMovements();
void GetMousePos(float& x, float& y); void GetMousePos(float& x, float& y);

View File

@ -17,8 +17,8 @@
// http://code.google.com/p/dolphin-emu/ // http://code.google.com/p/dolphin-emu/
#include "pluginspecs_wiimote.h"
#include "Common.h" #include "Common.h"
#include "pluginspecs_wiimote.h"
#include "Encryption.h" #include "Encryption.h"

View File

@ -310,7 +310,7 @@ bool IsKey(int Key)
} }
else if (MapKey < 0x1100) else if (MapKey < 0x1100)
#elif defined(HAVE_X11) && HAVE_X11 #elif defined(HAVE_X11) && HAVE_X11
if (MapKey < 256 || MapKey >= 0xf000) if (HaveFocus() && (MapKey < 256 || MapKey >= 0xf000))
{ {
char keys[32]; char keys[32];
KeyCode keyCode; KeyCode keyCode;
@ -346,23 +346,20 @@ bool IsKey(int Key)
} }
#endif #endif
#if defined(HAVE_X11) && HAVE_X11 #if defined(HAVE_X11) && HAVE_X11
if ((Key == EWM_SHAKE) || (Key == EWM_A) || (Key == EWM_B)) if ((Key == EWM_SHAKE || Key == EWM_A || Key == EWM_B) && HaveFocus())
{ {
Window GLWin = *(Window *)g_WiimoteInitialize.pXWindow; Window GLWin = *(Window *)g_WiimoteInitialize.pXWindow;
if (GLWin != 0) int root_x, root_y, win_x, win_y;
Window rootDummy, childWin;
unsigned int mask;
XQueryPointer(WMdisplay, GLWin, &rootDummy, &childWin, &root_x, &root_y, &win_x, &win_y, &mask);
if (((Key == EWM_A) && (mask & Button1Mask))
|| ((Key == EWM_B) && (mask & Button3Mask))
|| ((Key == EWM_SHAKE) && (mask & Button3Mask)))
{ {
int root_x, root_y, win_x, win_y; float x, y;
Window rootDummy, childWin; GetMousePos(x, y);
unsigned int mask; Ret = !(x < 0 || x > 1 || y < 0 || y > 1);
XQueryPointer(WMdisplay, GLWin, &rootDummy, &childWin, &root_x, &root_y, &win_x, &win_y, &mask);
if (((Key == EWM_A) && (mask & Button1Mask))
|| ((Key == EWM_B) && (mask & Button3Mask))
|| ((Key == EWM_SHAKE) && (mask & Button3Mask)))
{
float x, y;
GetMousePos(x, y);
Ret = !(x < 0 || x > 1 || y < 0 || y > 1);
}
} }
} }
#endif #endif