diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLInit.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLInit.cpp index 79b8bebad4..b0f0e63c1c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLInit.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLInit.cpp @@ -89,35 +89,8 @@ BOOL Callback_PeekMessages() } return TRUE; #else // GLX - XEvent event; - while (XPending(GLWin.dpy) > 0) { - XNextEvent(GLWin.dpy, &event); - switch(event.type) - { - case KeyPress: - case KeyRelease: - case ButtonPress: - case ButtonRelease: - XPutBackEvent(GLWin.dpy, &event); // We Don't want to deal with these types, This is a video plugin! - break; - case ConfigureNotify: - Window winDummy; - unsigned int borderDummy; - XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, - &GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth); - nBackbufferWidth = GLWin.width; - nBackbufferHeight = GLWin.height; - break; - case ClientMessage: //TODO: We aren't reading this correctly, It could be anything, highest change is that it's a close event though - Video_Shutdown(); // Calling from here since returning false does nothing - return false; - break; - default: - //TODO: Should we put the event back if we don't handle it? - break; - } - } - return TRUE; + // This is called from Outside of our video thread, from EmuThread + // The calls are NOT thread safe, so it breaks everything #endif } @@ -406,8 +379,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight /* create a fullscreen window */ GLWin.attr.override_redirect = True; - GLWin.attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | - StructureNotifyMask | ResizeRedirectMask; + GLWin.attr.event_mask = ExposureMask | StructureNotifyMask | ResizeRedirectMask; GLWin.win = XCreateWindow(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen), 0, 0, dpyWidth, dpyHeight, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect, @@ -435,7 +407,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight //int Y = (rcdesktop.bottom-rcdesktop.top)/2 - (rc.bottom-rc.top)/2; // create a window in window mode - GLWin.attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | + GLWin.attr.event_mask = ExposureMask | StructureNotifyMask | ResizeRedirectMask; GLWin.win = XCreateWindow(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen), 0, 0, _twidth, _theight, 0, vi->depth, InputOutput, vi->visual, @@ -502,8 +474,7 @@ bool OpenGL_MakeCurrent() ERROR_LOG("no Direct Rendering possible!"); // better for pad plugin key input (thc) - XSelectInput(GLWin.dpy, GLWin.win, ExposureMask | KeyPressMask | KeyReleaseMask | - ButtonPressMask | StructureNotifyMask | EnterWindowMask | LeaveWindowMask | + XSelectInput(GLWin.dpy, GLWin.win, ExposureMask | StructureNotifyMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask ); #endif return true; @@ -530,7 +501,38 @@ void OpenGL_Update() nBackbufferHeight = height; #else // GLX - // We do our resizing inside of the Callback function + // We just check all of our events here + XEvent event; + while (XPending(GLWin.dpy) > 0) { + XNextEvent(GLWin.dpy, &event); + switch(event.type) + { + case KeyPress: + case KeyRelease: + case ButtonPress: + case ButtonRelease: + printf("You have reached a section of code that you should never reach in a video plugin\n If you think that you are not in error, please contact the devs\n"); + //XPutBackEvent(GLWin.dpy, &event); // We Don't want to deal with these types, This is a video plugin! + break; + case ConfigureNotify: + Window winDummy; + unsigned int borderDummy; + XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, + &GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth); + nBackbufferWidth = GLWin.width; + nBackbufferHeight = GLWin.height; + break; + case ClientMessage: //TODO: We aren't reading this correctly, It could be anything, highest change is that it's a close event though + Video_Shutdown(); // Calling from here since returning false does nothing + return; + break; + default: + //TODO: Should we put the event back if we don't handle it? + // I think we handle all the needed ones, the rest shouldn't matter + break; + } + } + return; #endif float FactorW = 640.0f / (float)nBackbufferWidth; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index 1692d7acc0..f313ee4dc5 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -119,29 +119,30 @@ void DllConfig(HWND _hParent) glXQueryVersion(GLWin.dpy, &glxMajorVersion, &glxMinorVersion); XF86VidModeQueryVersion(GLWin.dpy, &vidModeMajorVersion, &vidModeMinorVersion); //Get all full screen resos for the config dialog - XF86VidModeModeInfo **modes = NULL; - int modeNum = 0; - int bestMode = 0; + XF86VidModeModeInfo **modes = NULL; + int modeNum = 0; + int bestMode = 0; - //set best mode to current - bestMode = 0; - XF86VidModeGetAllModeLines(GLWin.dpy, GLWin.screen, &modeNum, &modes); - int px = 0, py = 0; - if (modeNum > 0 && modes != NULL) - { - for (int i = 0; i < modeNum; i++) - { - if(px != modes[i]->hdisplay && py != modes[i]->vdisplay) - { - char temp[32]; - sprintf(temp,"%dx%d", modes[i]->hdisplay, modes[i]->vdisplay); - frame.AddFSReso(temp); - frame.AddWindowReso(temp);//Add same to Window ones, since they should be nearly all that's needed - px = modes[i]->hdisplay;//Used to remove repeating from different screen depths - py = modes[i]->vdisplay; - } - } + //set best mode to current + bestMode = 0; + XF86VidModeGetAllModeLines(GLWin.dpy, GLWin.screen, &modeNum, &modes); + int px = 0, py = 0; + if (modeNum > 0 && modes != NULL) + { + for (int i = 0; i < modeNum; i++) + { + if(px != modes[i]->hdisplay && py != modes[i]->vdisplay) + { + char temp[32]; + sprintf(temp,"%dx%d", modes[i]->hdisplay, modes[i]->vdisplay); + frame.AddFSReso(temp); + frame.AddWindowReso(temp);//Add same to Window ones, since they should be nearly all that's needed + px = modes[i]->hdisplay;//Used to remove repeating from different screen depths + py = modes[i]->vdisplay; + } + } } + XFree(modes); frame.ShowModal(); #else