diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt index 6e21b81153..3e573f3379 100644 --- a/Source/Core/DolphinWX/CMakeLists.txt +++ b/Source/Core/DolphinWX/CMakeLists.txt @@ -84,7 +84,8 @@ else() endif() if(USE_EGL) - set(SRCS ${SRCS} Src/GLInterface/EGL.cpp) + set(SRCS ${SRCS} Src/GLInterface/EGL.cpp + Src/GLInterface/X11_Util.cpp) else() if(WIN32) set(SRCS ${SRCS} Src/GLInterface/GLW.cpp) @@ -95,7 +96,9 @@ else() set(SRCS ${SRCS} Src/GLInterface/AGL.cpp) endif() else() - set(SRCS ${SRCS} Src/GLInterface/GLX.cpp) + set(SRCS ${SRCS} Src/GLInterface/GLX.cpp + Src/GLInterface/X11_Util.cpp) + endif() endif() diff --git a/Source/Core/DolphinWX/Src/GLInterface.h b/Source/Core/DolphinWX/Src/GLInterface.h index a7c069df4e..a81f17104c 100644 --- a/Source/Core/DolphinWX/Src/GLInterface.h +++ b/Source/Core/DolphinWX/Src/GLInterface.h @@ -34,8 +34,8 @@ typedef struct { #if defined(USE_EGL) && USE_EGL // This is currently a X11/EGL implementation for desktop int screen; - Display *x_dpy; - Display *x_evdpy; + Display *dpy; + Display *evdpy; Window win; Window parent; EGLSurface egl_surf; diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp index 49a77636f8..b8716ab467 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp @@ -15,208 +15,16 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#include "VideoConfig.h" #include "Host.h" #include "RenderBase.h" -#include "VertexShaderManager.h" #include "../GLInterface.h" #include "EGL.h" -void cInterfaceEGL::CreateXWindow(void) -{ - Atom wmProtocols[1]; - - // Setup window attributes - GLWin.attr.colormap = XCreateColormap(GLWin.x_evdpy, - GLWin.parent, GLWin.vi->visual, AllocNone); - GLWin.attr.event_mask = KeyPressMask | StructureNotifyMask | FocusChangeMask; - GLWin.attr.background_pixel = BlackPixel(GLWin.x_evdpy, GLWin.screen); - GLWin.attr.border_pixel = 0; - - // Create the window - GLWin.win = XCreateWindow(GLWin.x_evdpy, GLWin.parent, - GLWin.x, GLWin.y, GLWin.width, GLWin.height, 0, - GLWin.vi->depth, InputOutput, GLWin.vi->visual, - CWBorderPixel | CWBackPixel | CWColormap | CWEventMask, &GLWin.attr); - wmProtocols[0] = XInternAtom(GLWin.x_evdpy, "WM_DELETE_WINDOW", True); - XSetWMProtocols(GLWin.x_evdpy, GLWin.win, wmProtocols, 1); - XSetStandardProperties(GLWin.x_evdpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL); - XMapRaised(GLWin.x_evdpy, GLWin.win); - XSync(GLWin.x_evdpy, True); - - GLWin.xEventThread = std::thread(&cInterfaceEGL::XEventThread, this); -} - -void cInterfaceEGL::DestroyXWindow(void) -{ - XUnmapWindow(GLWin.x_dpy, GLWin.win); - GLWin.win = 0; - if (GLWin.xEventThread.joinable()) - GLWin.xEventThread.join(); - XFreeColormap(GLWin.x_dpy, GLWin.attr.colormap); -} - -void cInterfaceEGL::XEventThread() -{ - // Free look variables - static bool mouseLookEnabled = false; - static bool mouseMoveEnabled = false; - static float lastMouse[2]; - while (GLWin.win) - { - XEvent event; - KeySym key; - for (int num_events = XPending(GLWin.x_evdpy); num_events > 0; num_events--) - { - XNextEvent(GLWin.x_evdpy, &event); - switch(event.type) { - case KeyPress: - key = XLookupKeysym((XKeyEvent*)&event, 0); - switch (key) - { - case XK_3: - OSDChoice = 1; - // Toggle native resolution - g_Config.iEFBScale = g_Config.iEFBScale + 1; - if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0; - break; - case XK_4: - OSDChoice = 2; - // Toggle aspect ratio - g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; - break; - case XK_5: - OSDChoice = 3; - // Toggle EFB copy - if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) - { - g_Config.bEFBCopyEnable ^= true; - g_Config.bCopyEFBToTexture = false; - } - else - { - g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; - } - break; - case XK_6: - OSDChoice = 4; - g_Config.bDisableFog = !g_Config.bDisableFog; - break; - default: - break; - } - if (g_Config.bFreeLook) - { - static float debugSpeed = 1.0f; - switch (key) - { - case XK_parenleft: - debugSpeed /= 2.0f; - break; - case XK_parenright: - debugSpeed *= 2.0f; - break; - case XK_w: - VertexShaderManager::TranslateView(0.0f, debugSpeed); - break; - case XK_s: - VertexShaderManager::TranslateView(0.0f, -debugSpeed); - break; - case XK_a: - VertexShaderManager::TranslateView(debugSpeed, 0.0f); - break; - case XK_d: - VertexShaderManager::TranslateView(-debugSpeed, 0.0f); - break; - case XK_r: - VertexShaderManager::ResetView(); - break; - } - } - break; - case ButtonPress: - if (g_Config.bFreeLook) - { - switch (event.xbutton.button) - { - case 2: // Middle button - lastMouse[0] = event.xbutton.x; - lastMouse[1] = event.xbutton.y; - mouseMoveEnabled = true; - break; - case 3: // Right button - lastMouse[0] = event.xbutton.x; - lastMouse[1] = event.xbutton.y; - mouseLookEnabled = true; - break; - } - } - break; - case ButtonRelease: - if (g_Config.bFreeLook) - { - switch (event.xbutton.button) - { - case 2: // Middle button - mouseMoveEnabled = false; - break; - case 3: // Right button - mouseLookEnabled = false; - break; - } - } - break; - case MotionNotify: - if (g_Config.bFreeLook) - { - if (mouseLookEnabled) - { - VertexShaderManager::RotateView((event.xmotion.x - lastMouse[0]) / 200.0f, - (event.xmotion.y - lastMouse[1]) / 200.0f); - lastMouse[0] = event.xmotion.x; - lastMouse[1] = event.xmotion.y; - } - - if (mouseMoveEnabled) - { - VertexShaderManager::TranslateView((event.xmotion.x - lastMouse[0]) / 50.0f, - (event.xmotion.y - lastMouse[1]) / 50.0f); - lastMouse[0] = event.xmotion.x; - lastMouse[1] = event.xmotion.y; - } - } - break; - case ConfigureNotify: - Window winDummy; - unsigned int borderDummy, depthDummy; - XGetGeometry(GLWin.x_dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, - &GLWin.width, &GLWin.height, &borderDummy, &depthDummy); - s_backbuffer_width = GLWin.width; - s_backbuffer_height = GLWin.height; - break; - case ClientMessage: - if ((unsigned long) event.xclient.data.l[0] == - XInternAtom(GLWin.x_dpy, "WM_DELETE_WINDOW", False)) - Host_Message(WM_USER_STOP); - if ((unsigned long) event.xclient.data.l[0] == - XInternAtom(GLWin.x_dpy, "RESIZE", False)) - XMoveResizeWindow(GLWin.x_dpy, GLWin.win, - event.xclient.data.l[1], event.xclient.data.l[2], - event.xclient.data.l[3], event.xclient.data.l[4]); - break; - default: - break; - } - } - Common::SleepCurrentThread(20); - } -} - // Show the current FPS void cInterfaceEGL::UpdateFPSDisplay(const char *text) { - XStoreName(GLWin.x_dpy, GLWin.win, text); + XStoreName(GLWin.dpy, GLWin.win, text); } void cInterfaceEGL::Swap() { @@ -237,14 +45,14 @@ bool cInterfaceEGL::Create(void *&window_handle) const char *s; EGLint egl_major, egl_minor; - GLWin.x_dpy = XOpenDisplay(NULL); + GLWin.dpy = XOpenDisplay(NULL); - if (!GLWin.x_dpy) { + if (!GLWin.dpy) { printf("Error: couldn't open display\n"); return false; } - GLWin.egl_dpy = eglGetDisplay(GLWin.x_dpy); + GLWin.egl_dpy = eglGetDisplay(GLWin.dpy); if (!GLWin.egl_dpy) { printf("Error: eglGetDisplay() failed\n"); return false; @@ -288,11 +96,11 @@ bool cInterfaceEGL::Create(void *&window_handle) EGL_NONE }; - GLWin.x_evdpy = XOpenDisplay(NULL); + GLWin.evdpy = XOpenDisplay(NULL); GLWin.parent = (Window)window_handle; - GLWin.screen = DefaultScreen(GLWin.x_dpy); + GLWin.screen = DefaultScreen(GLWin.dpy); if (GLWin.parent == 0) - GLWin.parent = RootWindow(GLWin.x_dpy, GLWin.screen); + GLWin.parent = RootWindow(GLWin.dpy, GLWin.screen); XVisualInfo visTemplate; int num_visuals; @@ -312,7 +120,7 @@ bool cInterfaceEGL::Create(void *&window_handle) /* The X window visual must match the EGL config */ visTemplate.visualid = vid; - GLWin.vi = XGetVisualInfo(GLWin.x_dpy, VisualIDMask, &visTemplate, &num_visuals); + GLWin.vi = XGetVisualInfo(GLWin.dpy, VisualIDMask, &visTemplate, &num_visuals); if (!GLWin.vi) { printf("Error: couldn't get X visual\n"); exit(1); @@ -323,7 +131,7 @@ bool cInterfaceEGL::Create(void *&window_handle) GLWin.width = _twidth; GLWin.height = _theight; - CreateXWindow(); + XWindow.CreateXWindow(); #ifdef USE_GLES eglBindAPI(EGL_OPENGL_ES_API); #else @@ -368,7 +176,7 @@ bool cInterfaceEGL::MakeCurrent() // Close backend void cInterfaceEGL::Shutdown() { - DestroyXWindow(); + XWindow.DestroyXWindow(); if (GLWin.egl_ctx && !eglMakeCurrent(GLWin.egl_dpy, GLWin.egl_surf, GLWin.egl_surf, GLWin.egl_ctx)) NOTICE_LOG(VIDEO, "Could not release drawing context."); if (GLWin.egl_ctx) diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.h b/Source/Core/DolphinWX/Src/GLInterface/EGL.h index 0e0adcd6d7..c4b6a00b6c 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.h @@ -24,15 +24,16 @@ #include #include #endif + +#include "X11_Util.h" #include "InterfaceBase.h" class cInterfaceEGL : public cInterfaceBase { private: - void CreateXWindow(); - void DestroyXWindow(); - void XEventThread(); + cX11Window XWindow; public: + friend class cX11Window; void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp index cb6d814db3..ef60873531 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp @@ -15,204 +15,13 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#include "VideoConfig.h" #include "Host.h" #include "RenderBase.h" +#include "VideoConfig.h" -#include "VertexShaderManager.h" #include "../GLInterface.h" #include "GLX.h" -void cInterfaceGLX::CreateXWindow(void) -{ - Atom wmProtocols[1]; - - // Setup window attributes - GLWin.attr.colormap = XCreateColormap(GLWin.evdpy, - GLWin.parent, GLWin.vi->visual, AllocNone); - GLWin.attr.event_mask = KeyPressMask | StructureNotifyMask | FocusChangeMask; - GLWin.attr.background_pixel = BlackPixel(GLWin.evdpy, GLWin.screen); - GLWin.attr.border_pixel = 0; - - // Create the window - GLWin.win = XCreateWindow(GLWin.evdpy, GLWin.parent, - GLWin.x, GLWin.y, GLWin.width, GLWin.height, 0, - GLWin.vi->depth, InputOutput, GLWin.vi->visual, - CWBorderPixel | CWBackPixel | CWColormap | CWEventMask, &GLWin.attr); - wmProtocols[0] = XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", True); - XSetWMProtocols(GLWin.evdpy, GLWin.win, wmProtocols, 1); - XSetStandardProperties(GLWin.evdpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL); - XMapRaised(GLWin.evdpy, GLWin.win); - XSync(GLWin.evdpy, True); - - GLWin.xEventThread = std::thread(&cInterfaceGLX::XEventThread, this); -} - -void cInterfaceGLX::DestroyXWindow(void) -{ - XUnmapWindow(GLWin.dpy, GLWin.win); - GLWin.win = 0; - if (GLWin.xEventThread.joinable()) - GLWin.xEventThread.join(); - XFreeColormap(GLWin.evdpy, GLWin.attr.colormap); -} - -void cInterfaceGLX::XEventThread() -{ - // Free look variables - static bool mouseLookEnabled = false; - static bool mouseMoveEnabled = false; - static float lastMouse[2]; - while (GLWin.win) - { - XEvent event; - KeySym key; - for (int num_events = XPending(GLWin.evdpy); num_events > 0; num_events--) - { - XNextEvent(GLWin.evdpy, &event); - switch(event.type) { - case KeyPress: - key = XLookupKeysym((XKeyEvent*)&event, 0); - switch (key) - { - case XK_3: - OSDChoice = 1; - // Toggle native resolution - g_Config.iEFBScale = g_Config.iEFBScale + 1; - if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0; - break; - case XK_4: - OSDChoice = 2; - // Toggle aspect ratio - g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; - break; - case XK_5: - OSDChoice = 3; - // Toggle EFB copy - if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) - { - g_Config.bEFBCopyEnable ^= true; - g_Config.bCopyEFBToTexture = false; - } - else - { - g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; - } - break; - case XK_6: - OSDChoice = 4; - g_Config.bDisableFog = !g_Config.bDisableFog; - break; - default: - break; - } - if (g_Config.bFreeLook) - { - static float debugSpeed = 1.0f; - switch (key) - { - case XK_parenleft: - debugSpeed /= 2.0f; - break; - case XK_parenright: - debugSpeed *= 2.0f; - break; - case XK_w: - VertexShaderManager::TranslateView(0.0f, debugSpeed); - break; - case XK_s: - VertexShaderManager::TranslateView(0.0f, -debugSpeed); - break; - case XK_a: - VertexShaderManager::TranslateView(debugSpeed, 0.0f); - break; - case XK_d: - VertexShaderManager::TranslateView(-debugSpeed, 0.0f); - break; - case XK_r: - VertexShaderManager::ResetView(); - break; - } - } - break; - case ButtonPress: - if (g_Config.bFreeLook) - { - switch (event.xbutton.button) - { - case 2: // Middle button - lastMouse[0] = event.xbutton.x; - lastMouse[1] = event.xbutton.y; - mouseMoveEnabled = true; - break; - case 3: // Right button - lastMouse[0] = event.xbutton.x; - lastMouse[1] = event.xbutton.y; - mouseLookEnabled = true; - break; - } - } - break; - case ButtonRelease: - if (g_Config.bFreeLook) - { - switch (event.xbutton.button) - { - case 2: // Middle button - mouseMoveEnabled = false; - break; - case 3: // Right button - mouseLookEnabled = false; - break; - } - } - break; - case MotionNotify: - if (g_Config.bFreeLook) - { - if (mouseLookEnabled) - { - VertexShaderManager::RotateView((event.xmotion.x - lastMouse[0]) / 200.0f, - (event.xmotion.y - lastMouse[1]) / 200.0f); - lastMouse[0] = event.xmotion.x; - lastMouse[1] = event.xmotion.y; - } - - if (mouseMoveEnabled) - { - VertexShaderManager::TranslateView((event.xmotion.x - lastMouse[0]) / 50.0f, - (event.xmotion.y - lastMouse[1]) / 50.0f); - lastMouse[0] = event.xmotion.x; - lastMouse[1] = event.xmotion.y; - } - } - break; - case ConfigureNotify: - Window winDummy; - unsigned int borderDummy, depthDummy; - XGetGeometry(GLWin.evdpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, - &GLWin.width, &GLWin.height, &borderDummy, &depthDummy); - s_backbuffer_width = GLWin.width; - s_backbuffer_height = GLWin.height; - break; - case ClientMessage: - if ((unsigned long) event.xclient.data.l[0] == - XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", False)) - Host_Message(WM_USER_STOP); - if ((unsigned long) event.xclient.data.l[0] == - XInternAtom(GLWin.evdpy, "RESIZE", False)) - XMoveResizeWindow(GLWin.evdpy, GLWin.win, - event.xclient.data.l[1], event.xclient.data.l[2], - event.xclient.data.l[3], event.xclient.data.l[4]); - break; - default: - break; - } - } - Common::SleepCurrentThread(20); - } -} - // Show the current FPS void cInterfaceGLX::UpdateFPSDisplay(const char *text) { @@ -309,7 +118,7 @@ bool cInterfaceGLX::Create(void *&window_handle) GLWin.width = _twidth; GLWin.height = _theight; - CreateXWindow(); + XWindow.CreateXWindow(); window_handle = (void *)GLWin.win; return true; } @@ -328,7 +137,7 @@ bool cInterfaceGLX::MakeCurrent() // Close backend void cInterfaceGLX::Shutdown() { - DestroyXWindow(); + XWindow.DestroyXWindow(); if (GLWin.ctx && !glXMakeCurrent(GLWin.dpy, None, NULL)) NOTICE_LOG(VIDEO, "Could not release drawing context."); if (GLWin.ctx) diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.h b/Source/Core/DolphinWX/Src/GLInterface/GLX.h index 5a37695f4e..73a6690ec5 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.h +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.h @@ -22,15 +22,15 @@ #include #include +#include "X11_Util.h" #include "InterfaceBase.h" class cInterfaceGLX : public cInterfaceBase { private: - void CreateXWindow(); - void DestroyXWindow(); - void XEventThread(); + cX11Window XWindow; public: + friend class cX11Window; void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); diff --git a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h index 40b17e8083..3e4f10fcd4 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h +++ b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h @@ -31,6 +31,7 @@ public: virtual u32 GetBackBufferWidth() { return s_backbuffer_width; } virtual u32 GetBackBufferHeight() { return s_backbuffer_height; } + virtual void SetBackBufferDimensions(u32 W, u32 H) {s_backbuffer_width = W; s_backbuffer_height = H; } virtual void Update() { } virtual bool PeekMessages() { return false; } }; diff --git a/Source/Core/DolphinWX/Src/GLInterface/X11_Util.cpp b/Source/Core/DolphinWX/Src/GLInterface/X11_Util.cpp new file mode 100644 index 0000000000..9372c4d644 --- /dev/null +++ b/Source/Core/DolphinWX/Src/GLInterface/X11_Util.cpp @@ -0,0 +1,213 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Host.h" +#include "RenderBase.h" +#include "VideoConfig.h" +#include "../GLInterface.h" +#include "VertexShaderManager.h" + +void cX11Window::CreateXWindow(void) +{ + Atom wmProtocols[1]; + + // Setup window attributes + GLWin.attr.colormap = XCreateColormap(GLWin.evdpy, + GLWin.parent, GLWin.vi->visual, AllocNone); + GLWin.attr.event_mask = KeyPressMask | StructureNotifyMask | FocusChangeMask; + GLWin.attr.background_pixel = BlackPixel(GLWin.evdpy, GLWin.screen); + GLWin.attr.border_pixel = 0; + + // Create the window + GLWin.win = XCreateWindow(GLWin.evdpy, GLWin.parent, + GLWin.x, GLWin.y, GLWin.width, GLWin.height, 0, + GLWin.vi->depth, InputOutput, GLWin.vi->visual, + CWBorderPixel | CWBackPixel | CWColormap | CWEventMask, &GLWin.attr); + wmProtocols[0] = XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", True); + XSetWMProtocols(GLWin.evdpy, GLWin.win, wmProtocols, 1); + XSetStandardProperties(GLWin.evdpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL); + XMapRaised(GLWin.evdpy, GLWin.win); + XSync(GLWin.evdpy, True); + + GLWin.xEventThread = std::thread(&cX11Window::XEventThread, this); +} + +void cX11Window::DestroyXWindow(void) +{ + XUnmapWindow(GLWin.dpy, GLWin.win); + GLWin.win = 0; + if (GLWin.xEventThread.joinable()) + GLWin.xEventThread.join(); + XFreeColormap(GLWin.evdpy, GLWin.attr.colormap); +} + +void cX11Window::XEventThread() +{ + // Free look variables + static bool mouseLookEnabled = false; + static bool mouseMoveEnabled = false; + static float lastMouse[2]; + while (GLWin.win) + { + XEvent event; + KeySym key; + for (int num_events = XPending(GLWin.evdpy); num_events > 0; num_events--) + { + XNextEvent(GLWin.evdpy, &event); + switch(event.type) { + case KeyPress: + key = XLookupKeysym((XKeyEvent*)&event, 0); + switch (key) + { + case XK_3: + OSDChoice = 1; + // Toggle native resolution + g_Config.iEFBScale = g_Config.iEFBScale + 1; + if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0; + break; + case XK_4: + OSDChoice = 2; + // Toggle aspect ratio + g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; + break; + case XK_5: + OSDChoice = 3; + // Toggle EFB copy + if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) + { + g_Config.bEFBCopyEnable ^= true; + g_Config.bCopyEFBToTexture = false; + } + else + { + g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; + } + break; + case XK_6: + OSDChoice = 4; + g_Config.bDisableFog = !g_Config.bDisableFog; + break; + default: + break; + } + if (g_Config.bFreeLook) + { + static float debugSpeed = 1.0f; + switch (key) + { + case XK_parenleft: + debugSpeed /= 2.0f; + break; + case XK_parenright: + debugSpeed *= 2.0f; + break; + case XK_w: + VertexShaderManager::TranslateView(0.0f, debugSpeed); + break; + case XK_s: + VertexShaderManager::TranslateView(0.0f, -debugSpeed); + break; + case XK_a: + VertexShaderManager::TranslateView(debugSpeed, 0.0f); + break; + case XK_d: + VertexShaderManager::TranslateView(-debugSpeed, 0.0f); + break; + case XK_r: + VertexShaderManager::ResetView(); + break; + } + } + break; + case ButtonPress: + if (g_Config.bFreeLook) + { + switch (event.xbutton.button) + { + case 2: // Middle button + lastMouse[0] = event.xbutton.x; + lastMouse[1] = event.xbutton.y; + mouseMoveEnabled = true; + break; + case 3: // Right button + lastMouse[0] = event.xbutton.x; + lastMouse[1] = event.xbutton.y; + mouseLookEnabled = true; + break; + } + } + break; + case ButtonRelease: + if (g_Config.bFreeLook) + { + switch (event.xbutton.button) + { + case 2: // Middle button + mouseMoveEnabled = false; + break; + case 3: // Right button + mouseLookEnabled = false; + break; + } + } + break; + case MotionNotify: + if (g_Config.bFreeLook) + { + if (mouseLookEnabled) + { + VertexShaderManager::RotateView((event.xmotion.x - lastMouse[0]) / 200.0f, + (event.xmotion.y - lastMouse[1]) / 200.0f); + lastMouse[0] = event.xmotion.x; + lastMouse[1] = event.xmotion.y; + } + + if (mouseMoveEnabled) + { + VertexShaderManager::TranslateView((event.xmotion.x - lastMouse[0]) / 50.0f, + (event.xmotion.y - lastMouse[1]) / 50.0f); + lastMouse[0] = event.xmotion.x; + lastMouse[1] = event.xmotion.y; + } + } + break; + case ConfigureNotify: + Window winDummy; + unsigned int borderDummy, depthDummy; + XGetGeometry(GLWin.evdpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, + &GLWin.width, &GLWin.height, &borderDummy, &depthDummy); + GLInterface->SetBackBufferDimensions(GLWin.width, GLWin.height); + break; + case ClientMessage: + if ((unsigned long) event.xclient.data.l[0] == + XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", False)) + Host_Message(WM_USER_STOP); + if ((unsigned long) event.xclient.data.l[0] == + XInternAtom(GLWin.evdpy, "RESIZE", False)) + XMoveResizeWindow(GLWin.evdpy, GLWin.win, + event.xclient.data.l[1], event.xclient.data.l[2], + event.xclient.data.l[3], event.xclient.data.l[4]); + break; + default: + break; + } + } + Common::SleepCurrentThread(20); + } +} + + diff --git a/Source/Core/DolphinWX/Src/GLInterface/X11_Util.h b/Source/Core/DolphinWX/Src/GLInterface/X11_Util.h new file mode 100644 index 0000000000..9e6f6d5e3c --- /dev/null +++ b/Source/Core/DolphinWX/Src/GLInterface/X11_Util.h @@ -0,0 +1,31 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _X11_UTIL_H_ +#define _X11_UTIL_H_ + +#include +#include + +class cX11Window +{ +private: + void XEventThread(); +public: + void CreateXWindow(void); + void DestroyXWindow(void); +}; +#endif