This is basicall linux code cleanup. We don not need to pass the X display handle from the video plugin anymore. The wiimote plugins now open their own display handles, and the GUI uses the display handle of the main window frame. Only the window handle from the video plugin is needed. The pWindowHandle variable now passes this instead of the display handle.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5884 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Glenn Rice 2010-07-16 14:14:57 +00:00
parent 665d83ed45
commit 02ce753b76
18 changed files with 40 additions and 98 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -7,7 +7,7 @@ namespace Xlib
void Init(std::vector<ControllerInterface::Device*>& 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)

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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()

View file

@ -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;

View file

@ -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;

View file

@ -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
}

View file

@ -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
}
// ___________________________________________________________________________