diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp index 344c878649..38a3944d5f 100644 --- a/Source/Core/Core/Src/Core.cpp +++ b/Source/Core/Core/Src/Core.cpp @@ -101,9 +101,7 @@ bool g_bStopping = false; bool g_bHwInit = false; bool g_bRealWiimote = false; HWND g_pWindowHandle = NULL; -#if defined(HAVE_X11) && HAVE_X11 -void *g_pXWindow = NULL; -#endif + Common::Thread* g_EmuThread = NULL; static Common::Thread* cpuThread = NULL; @@ -154,13 +152,6 @@ void *GetWindowHandle() return g_pWindowHandle; } -#if defined HAVE_X11 && HAVE_X11 -void *GetXWindow() -{ - return g_pXWindow; -} -#endif - bool GetRealWiimote() { return g_bRealWiimote; @@ -370,11 +361,8 @@ THREAD_RETURN EmuThread(void *pArg) Plugins.GetVideo()->Initialize(&VideoInitialize); // Call the dll - // Under linux, this is an X11 Display, not a HWND! + // Under linux, this is an X11 Window, not a HWND! g_pWindowHandle = (HWND)VideoInitialize.pWindowHandle; -#if defined(HAVE_X11) && HAVE_X11 - g_pXWindow = (void *)VideoInitialize.pXWindow; -#endif Callback_PeekMessages = VideoInitialize.pPeekMessages; g_pUpdateFPSDisplay = VideoInitialize.pUpdateFPSDisplay; @@ -397,20 +385,13 @@ THREAD_RETURN EmuThread(void *pArg) Plugins.GetDSP()->Initialize((void *)&dspInit); -#if defined(HAVE_X11) && HAVE_X11 - GCPad_Init(g_pXWindow); -#else GCPad_Init(g_pWindowHandle); -#endif // Load and Init WiimotePlugin - only if we are booting in wii mode if (_CoreParameter.bWii) { SWiimoteInitialize WiimoteInitialize; WiimoteInitialize.hWnd = g_pWindowHandle; -#if defined(HAVE_X11) && HAVE_X11 - WiimoteInitialize.pXWindow = g_pXWindow; -#endif WiimoteInitialize.ISOId = Ascii2Hex(_CoreParameter.m_strUniqueID); WiimoteInitialize.pLog = Callback_WiimoteLog; WiimoteInitialize.pWiimoteInterruptChannel = Callback_WiimoteInterruptChannel; diff --git a/Source/Core/Core/Src/Core.h b/Source/Core/Core/Src/Core.h index 25cb7dfe41..ec3cc9d5d2 100644 --- a/Source/Core/Core/Src/Core.h +++ b/Source/Core/Core/Src/Core.h @@ -62,9 +62,7 @@ namespace Core void Callback_WiimoteInterruptChannel(int _number, u16 _channelID, const void* _pData, u32 _Size); void* GetWindowHandle(); -#if defined HAVE_X11 && HAVE_X11 - void* GetXWindow(); -#endif + bool GetRealWiimote(); extern bool bReadTrace; diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index d1d9db6004..7fa9409712 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -880,7 +880,7 @@ void CFrame::OnKeyDown(wxKeyEvent& event) #ifdef _WIN32 PostMessage((HWND)Core::GetWindowHandle(), WM_USER, WM_USER_KEYDOWN, event.GetKeyCode()); #elif defined(HAVE_X11) && HAVE_X11 - X11Utils::SendKeyEvent(event.GetKeyCode()); + X11Utils::SendKeyEvent(X11Utils::XDisplayFromHandle(GetHandle()), event.GetKeyCode()); #endif } #ifdef _WIN32 diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index 4a93e23d66..2ec31b816f 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -702,7 +702,8 @@ void CFrame::OnRenderParentResize(wxSizeEvent& event) int x, y; m_RenderParent->GetSize(&width, &height); m_RenderParent->GetPosition(&x, &y); - X11Utils::SendClientEvent("RESIZE", x, y, width, height); + X11Utils::SendClientEvent(X11Utils::XDisplayFromHandle(GetHandle()), + "RESIZE", x, y, width, height); #endif } event.Skip(); @@ -956,7 +957,7 @@ void CFrame::OnPluginPAD(wxCommandEvent& WXUNUSED (event)) { #if defined(HAVE_X11) && HAVE_X11 Window win = X11Utils::XWindowFromHandle(GetHandle()); - GCPad_Init(&win); + GCPad_Init((void *)win); #else GCPad_Init(GetHandle()); #endif diff --git a/Source/Core/DolphinWX/Src/MainNoGUI.cpp b/Source/Core/DolphinWX/Src/MainNoGUI.cpp index 4af83d3df3..7ed9b69d81 100644 --- a/Source/Core/DolphinWX/Src/MainNoGUI.cpp +++ b/Source/Core/DolphinWX/Src/MainNoGUI.cpp @@ -139,7 +139,7 @@ void X11_MainLoop() updateMainFrameEvent.Wait(); Display *dpy = XOpenDisplay(0); - Window win = *(Window *)Core::GetXWindow(); + Window win = (Window)Core::GetWindowHandle(); XSelectInput(dpy, win, KeyPressMask | KeyReleaseMask | FocusChangeMask); #if defined(HAVE_XRANDR) && HAVE_XRANDR @@ -161,7 +161,7 @@ void X11_MainLoop() if (fullscreen) { - X11Utils::EWMH_Fullscreen(_NET_WM_STATE_TOGGLE); + X11Utils::EWMH_Fullscreen(dpy, _NET_WM_STATE_TOGGLE); #if defined(HAVE_XRANDR) && HAVE_XRANDR XRRConfig->ToggleDisplayMode(True); #endif @@ -197,7 +197,7 @@ void X11_MainLoop() else if ((key == XK_Return) && (event.xkey.state & Mod1Mask)) { fullscreen = !fullscreen; - X11Utils::EWMH_Fullscreen(_NET_WM_STATE_TOGGLE); + X11Utils::EWMH_Fullscreen(dpy, _NET_WM_STATE_TOGGLE); #if defined(HAVE_XRANDR) && HAVE_XRANDR XRRConfig->ToggleDisplayMode(fullscreen); #endif diff --git a/Source/Core/DolphinWX/Src/X11Utils.cpp b/Source/Core/DolphinWX/Src/X11Utils.cpp index bf3eab9164..513eae4b44 100644 --- a/Source/Core/DolphinWX/Src/X11Utils.cpp +++ b/Source/Core/DolphinWX/Src/X11Utils.cpp @@ -20,12 +20,11 @@ namespace X11Utils { -void SendClientEvent(const char *message, +void SendClientEvent(Display *dpy, const char *message, int data1, int data2, int data3, int data4) { XEvent event; - Display *dpy = (Display *)Core::GetWindowHandle(); - Window win = *(Window *)Core::GetXWindow(); + Window win = (Window)Core::GetWindowHandle(); // Init X event structure for client message event.xclient.type = ClientMessage; @@ -41,11 +40,10 @@ void SendClientEvent(const char *message, ERROR_LOG(VIDEO, "Failed to send message %s to the emulator window.", message); } -void SendKeyEvent(int key) +void SendKeyEvent(Display *dpy, int key) { XEvent event; - Display *dpy = (Display *)Core::GetWindowHandle(); - Window win = *(Window *)Core::GetXWindow(); + Window win = (Window)Core::GetWindowHandle(); // Init X event structure for key press event event.xkey.type = KeyPress; @@ -58,13 +56,12 @@ void SendKeyEvent(int key) ERROR_LOG(VIDEO, "Failed to send key press event to the emulator window."); } -void EWMH_Fullscreen(int action) +void EWMH_Fullscreen(Display *dpy, int action) { _assert_(action == _NET_WM_STATE_REMOVE || action == _NET_WM_STATE_ADD || action == _NET_WM_STATE_TOGGLE); - Display *dpy = (Display *)Core::GetWindowHandle(); - Window win = *(Window *)Core::GetXWindow(); + Window win = (Window)Core::GetWindowHandle(); // Init X event structure for _NET_WM_STATE_FULLSCREEN client message XEvent event; diff --git a/Source/Core/DolphinWX/Src/X11Utils.h b/Source/Core/DolphinWX/Src/X11Utils.h index d226b6cce4..2b1f6471ef 100644 --- a/Source/Core/DolphinWX/Src/X11Utils.h +++ b/Source/Core/DolphinWX/Src/X11Utils.h @@ -43,10 +43,10 @@ namespace X11Utils { -void SendClientEvent(const char *message, +void SendClientEvent(Display *dpy, const char *message, int data1, int data2, int data3, int data4); -void SendKeyEvent(int key); -void EWMH_Fullscreen(int action); +void SendKeyEvent(Display *dpy, int key); +void EWMH_Fullscreen(Display *dpy, int action); #if defined(HAVE_WX) && HAVE_WX Window XWindowFromHandle(void *Handle); Display *XDisplayFromHandle(void *Handle); diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.cpp b/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.cpp index 49574900a6..68294ebfc2 100644 --- a/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.cpp +++ b/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xlib.cpp @@ -7,7 +7,7 @@ namespace Xlib void Init(std::vector& devices, void* const hwnd) { - devices.push_back(new KeyboardMouse(*(Window*)hwnd)); + devices.push_back(new KeyboardMouse((Window)hwnd)); } KeyboardMouse::KeyboardMouse(Window window) : m_window(window) diff --git a/Source/PluginSpecs/pluginspecs_video.h b/Source/PluginSpecs/pluginspecs_video.h index 2821ace9fe..57b7828953 100644 --- a/Source/PluginSpecs/pluginspecs_video.h +++ b/Source/PluginSpecs/pluginspecs_video.h @@ -5,7 +5,6 @@ #ifndef _VIDEO_H_INCLUDED__ #define _VIDEO_H_INCLUDED__ -#include "Common.h" #include "PluginSpecs.h" #include "ExportProlog.h" @@ -71,9 +70,6 @@ typedef struct typedef struct { void *pWindowHandle; -#if defined(HAVE_X11) && HAVE_X11 - void *pXWindow; -#endif TSetInterrupt pSetInterrupt; TRegisterEvent pRegisterEvent; diff --git a/Source/PluginSpecs/pluginspecs_wiimote.h b/Source/PluginSpecs/pluginspecs_wiimote.h index d079d263b1..0d6711e11c 100644 --- a/Source/PluginSpecs/pluginspecs_wiimote.h +++ b/Source/PluginSpecs/pluginspecs_wiimote.h @@ -8,11 +8,6 @@ #include "PluginSpecs.h" #include "ExportProlog.h" -#if !defined _WIN32 && !defined __APPLE__ -#include "Config.h" -#endif - - typedef void (*TLogv)(const char* _pMessage, int _v); // This is called when the Wiimote sends input reports to the Core. @@ -24,9 +19,6 @@ typedef bool (*TRendererHasFocus)(void); typedef struct { HWND hWnd; -#if defined HAVE_X11 && HAVE_X11 - void *pXWindow; -#endif u32 ISOId; TLogv pLog; TWiimoteInterruptChannel pWiimoteInterruptChannel; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp index 7dcc4fa051..82ee13710a 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp @@ -127,7 +127,8 @@ void CreateXWindow (void) GLWin.attr.colormap = XCreateColormap(GLWin.dpy, GLWin.parent, GLWin.vi->visual, AllocNone); GLWin.attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | - StructureNotifyMask | ResizeRedirectMask; + StructureNotifyMask | ResizeRedirectMask | EnterWindowMask | + LeaveWindowMask | FocusChangeMask; GLWin.attr.background_pixel = BlackPixel(GLWin.dpy, GLWin.screen); GLWin.attr.border_pixel = 0; @@ -138,8 +139,6 @@ void CreateXWindow (void) wmProtocols[0] = XInternAtom(GLWin.dpy, "WM_DELETE_WINDOW", True); XSetWMProtocols(GLWin.dpy, GLWin.win, wmProtocols, 1); XSetStandardProperties(GLWin.dpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL); - XSelectInput(GLWin.dpy, GLWin.win, ExposureMask | KeyPressMask | KeyReleaseMask | - StructureNotifyMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask ); XMapRaised(GLWin.dpy, GLWin.win); XSync(GLWin.dpy, True); @@ -359,7 +358,6 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight GLWin.dpy = XOpenDisplay(0); GLWin.parent = (Window)g_VideoInitialize.pWindowHandle; - g_VideoInitialize.pWindowHandle = (Display *)GLWin.dpy; GLWin.screen = DefaultScreen(GLWin.dpy); if (GLWin.parent == 0) GLWin.parent = RootWindow(GLWin.dpy, GLWin.screen); @@ -404,7 +402,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight GLWin.height = _theight; CreateXWindow(); - g_VideoInitialize.pXWindow = (Window *) &GLWin.win; + g_VideoInitialize.pWindowHandle = (void *)GLWin.win; #endif return true; } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index 3f0d18b023..b68eca263f 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -226,9 +226,6 @@ void Initialize(void *init) // Now the window handle is written _pVideoInitialize->pWindowHandle = g_VideoInitialize.pWindowHandle; -#if defined(HAVE_X11) && HAVE_X11 - _pVideoInitialize->pXWindow = g_VideoInitialize.pXWindow; -#endif OSD::AddMessage("Dolphin OpenGL Video Plugin", 5000); } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.cpp index 3144851950..d325c0a59c 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/GLUtil.cpp @@ -271,7 +271,6 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _twidth, int _theight GLWin.dpy = XOpenDisplay(0); GLWin.parent = (Window)g_VideoInitialize.pWindowHandle; - g_VideoInitialize.pWindowHandle = (HWND)GLWin.dpy; GLWin.screen = DefaultScreen(GLWin.dpy); /* get an appropriate visual */ @@ -316,7 +315,8 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _twidth, int _theight // create a window in window mode GLWin.attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | - StructureNotifyMask | ResizeRedirectMask; + StructureNotifyMask | ResizeRedirectMask | EnterWindowMask | + LeaveWindowMask | FocusChangeMask; GLWin.win = XCreateWindow(GLWin.dpy, GLWin.parent, xPos, yPos, _twidth, _theight, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask, &GLWin.attr); @@ -327,7 +327,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _twidth, int _theight "GPU", None, NULL, 0, NULL); XMapRaised(GLWin.dpy, GLWin.win); - g_VideoInitialize.pXWindow = (Window *) &GLWin.win; + g_VideoInitialize.pWindowHandle = (void *)GLWin.win; #endif return true; } @@ -337,27 +337,11 @@ bool OpenGL_MakeCurrent() #if defined(USE_WX) && USE_WX GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); #elif defined(_WIN32) - if (!wglMakeCurrent(hDC,hRC)) { - PanicAlert("(5) Can't Activate The GL Rendering Context."); - return false; - } + return wglMakeCurrent(hDC,hRC) ? true : false; #elif defined(HAVE_X11) && HAVE_X11 - Window winDummy; - unsigned int borderDummy; - // connect the glx-context to the window - glXMakeCurrent(GLWin.dpy, GLWin.win, GLWin.ctx); - XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, - &GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth); - NOTICE_LOG(VIDEO, "GLWin Depth %d", GLWin.depth) - if (glXIsDirect(GLWin.dpy, GLWin.ctx)) { - NOTICE_LOG(VIDEO, "detected direct rendering"); - } else { - ERROR_LOG(VIDEO, "no Direct Rendering possible!"); - } - - // better for pad plugin key input (thc) - XSelectInput(GLWin.dpy, GLWin.win, ExposureMask | KeyPressMask | KeyReleaseMask | - StructureNotifyMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask ); + g_VideoInitialize.pRequestWindowSize(GLWin.x, GLWin.y, (int&)GLWin.width, (int&)GLWin.height); + XMoveResizeWindow(GLWin.dpy, GLWin.win, GLWin.x, GLWin.y, GLWin.width, GLWin.height); + return glXMakeCurrent(GLWin.dpy, GLWin.win, GLWin.ctx); #endif return true; } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/Renderer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/Renderer.cpp index 9088636965..52575900f3 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/Renderer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/Renderer.cpp @@ -40,9 +40,6 @@ void Renderer::Init(SVideoInitialize *_pVideoInitialize) _pVideoInitialize->pPeekMessages = g_VideoInitialize.pPeekMessages; _pVideoInitialize->pUpdateFPSDisplay = g_VideoInitialize.pUpdateFPSDisplay; _pVideoInitialize->pWindowHandle = g_VideoInitialize.pWindowHandle; -#if defined(HAVE_X11) && HAVE_X11 - _pVideoInitialize->pXWindow = g_VideoInitialize.pXWindow; -#endif } void Renderer::Shutdown() diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp index c10224a7d8..aed99e318f 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp @@ -230,7 +230,7 @@ void GetMousePos(float& x, float& y) int root_x, root_y, win_x, win_y; if (IsFocus()) { - Window GLWin = *(Window *)g_WiimoteInitialize.pXWindow; + Window GLWin = (Window)g_WiimoteInitialize.hWnd; XWindowAttributes WinAttribs; XGetWindowAttributes (WMdisplay, GLWin, &WinAttribs); WinWidth = (float)WinAttribs.width; diff --git a/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp b/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp index 66c1a214b4..8e43d91fd5 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp @@ -358,7 +358,7 @@ bool IsKey(int Key) #if defined(HAVE_X11) && HAVE_X11 if (Key == EWM_SHAKE || Key == EWM_A || Key == EWM_B) { - Window GLWin = *(Window *)g_WiimoteInitialize.pXWindow; + Window GLWin = (Window)g_WiimoteInitialize.hWnd; int root_x, root_y, win_x, win_y; Window rootDummy, childWin; unsigned int mask; diff --git a/Source/Plugins/Plugin_Wiimote/Src/main.cpp b/Source/Plugins/Plugin_Wiimote/Src/main.cpp index 0807219654..f7ecad1b8e 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/main.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/main.cpp @@ -40,7 +40,7 @@ #endif #if defined(HAVE_X11) && HAVE_X11 - Display* WMdisplay; + Display* WMdisplay = NULL; #endif SWiimoteInitialize g_WiimoteInitialize; PLUGIN_GLOBALS* globals = NULL; @@ -208,7 +208,7 @@ void Initialize(void *init) g_Config.Load(); #endif #if defined(HAVE_X11) && HAVE_X11 - WMdisplay = (Display*)g_WiimoteInitialize.hWnd; + WMdisplay = XOpenDisplay(NULL); #endif g_ISOId = g_WiimoteInitialize.ISOId; @@ -254,6 +254,11 @@ void Shutdown(void) WiiMoteReal::Shutdown(); #endif WiiMoteEmu::Shutdown(); + +#if defined(HAVE_X11) && HAVE_X11 + if (WMdisplay) + XCloseDisplay(WMdisplay); +#endif } diff --git a/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteNew.cpp b/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteNew.cpp index 6acf6538c3..46980ccb9f 100644 --- a/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteNew.cpp +++ b/Source/Plugins/Plugin_WiimoteNew/Src/WiimoteNew.cpp @@ -281,7 +281,7 @@ void DllConfig(HWND _hParent) { #if defined(HAVE_X11) && HAVE_X11 Window win = GDK_WINDOW_XID(GTK_WIDGET(_hParent)->window); - InitPlugin(&win); + InitPlugin((void *)win); #else InitPlugin(_hParent); #endif @@ -346,11 +346,7 @@ void Initialize(void *init) { g_WiimoteInitialize = *(SWiimoteInitialize*)init; if ( false == g_plugin.controller_interface.IsInit() ) -#if defined(HAVE_X11) && HAVE_X11 - InitPlugin( g_WiimoteInitialize.pXWindow ); -#else InitPlugin( g_WiimoteInitialize.hWnd ); -#endif } // ___________________________________________________________________________