diff --git a/src/x11/platform.h b/src/x11/platform.h index c11c8048..1ce57e6b 100644 --- a/src/x11/platform.h +++ b/src/x11/platform.h @@ -203,8 +203,6 @@ typedef struct _GLFWwindowX11 // Platform specific window resources Colormap colormap; // Window colormap Window window; // Window - Window root; // Root window for screen - int screen; // Screen ID Atom wmDeleteWindow; // WM_DELETE_WINDOW atom Atom wmPing; // _NET_WM_PING atom Atom wmState; // _NET_WM_STATE atom @@ -230,6 +228,8 @@ typedef struct _GLFWwindowX11 typedef struct _GLFWlibraryX11 { Display* display; + int screen; + Window root; // Server-side GLX version int glxMajor, glxMinor; diff --git a/src/x11/x11_glext.c b/src/x11/x11_glext.c index 434ac4d9..aaef1583 100644 --- a/src/x11/x11_glext.c +++ b/src/x11/x11_glext.c @@ -67,7 +67,7 @@ int _glfwPlatformExtensionSupported(const char* extension) // Get list of GLX extensions // Yuck extensions = (const GLubyte*) glXQueryExtensionsString(_glfwLibrary.X11.display, - _glfwLibrary.window->X11.screen); + _glfwLibrary.X11.screen); if (extensions != NULL) { if (_glfwStringInExtensionString(extension, extensions)) diff --git a/src/x11/x11_init.c b/src/x11/x11_init.c index 150c94ae..3641874c 100644 --- a/src/x11/x11_init.c +++ b/src/x11/x11_init.c @@ -90,6 +90,12 @@ static GLboolean initDisplay(void) return GL_FALSE; } + // As the API currently doesn't understand multiple display devices, we hardcode + // this choice and hope for the best + _glfwLibrary.X11.screen = DefaultScreen(_glfwLibrary.X11.display); + _glfwLibrary.X11.root = RootWindow(_glfwLibrary.X11.display, + _glfwLibrary.X11.screen); + // Check for XF86VidMode extension #ifdef _GLFW_HAS_XF86VIDMODE _glfwLibrary.X11.XF86VidMode.available = @@ -139,7 +145,6 @@ static GLboolean initDisplay(void) static void terminateDisplay(void) { - // Open display if (_glfwLibrary.X11.display) { XCloseDisplay(_glfwLibrary.X11.display); diff --git a/src/x11/x11_window.c b/src/x11/x11_window.c index 60835c0d..fa0ed1d2 100644 --- a/src/x11/x11_window.c +++ b/src/x11/x11_window.c @@ -144,7 +144,7 @@ static GLboolean checkForEWMH(_GLFWwindow* window) return GL_FALSE; // Then we look for the _NET_SUPPORTING_WM_CHECK property of the root window - if (getWindowProperty(window->X11.root, + if (getWindowProperty(_glfwLibrary.X11.root, supportingWmCheck, XA_WINDOW, (unsigned char**) &windowFromRoot) != 1) @@ -182,7 +182,7 @@ static GLboolean checkForEWMH(_GLFWwindow* window) unsigned long atomCount; // Now we need to check the _NET_SUPPORTED property of the root window - atomCount = getWindowProperty(window->X11.root, + atomCount = getWindowProperty(_glfwLibrary.X11.root, wmSupported, XA_ATOM, (unsigned char**) &supportedAtoms); @@ -429,7 +429,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) if (window->GLX.has_GLX_SGIX_fbconfig) { fbconfigs = window->GLX.ChooseFBConfigSGIX(_glfwLibrary.X11.display, - window->X11.screen, + _glfwLibrary.X11.screen, NULL, &count); if (!count) @@ -441,7 +441,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) } else { - fbconfigs = glXGetFBConfigs(_glfwLibrary.X11.display, window->X11.screen, &count); + fbconfigs = glXGetFBConfigs(_glfwLibrary.X11.display, _glfwLibrary.X11.screen, &count); if (!count) { fprintf(stderr, "No GLXFBConfigs returned\n"); @@ -534,14 +534,14 @@ static int createContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, G if (window->GLX.has_GLX_SGIX_fbconfig) { fbconfig = window->GLX.ChooseFBConfigSGIX(_glfwLibrary.X11.display, - window->X11.screen, + _glfwLibrary.X11.screen, attribs, &dummy); } else { fbconfig = glXChooseFBConfig(_glfwLibrary.X11.display, - window->X11.screen, + _glfwLibrary.X11.screen, attribs, &dummy); } @@ -732,7 +732,7 @@ static GLboolean createWindow(_GLFWwindow* window, // Create one based on the visual used by the current context window->X11.colormap = XCreateColormap(_glfwLibrary.X11.display, - window->X11.root, + _glfwLibrary.X11.root, window->GLX.visual->visual, AllocNone); @@ -751,13 +751,13 @@ static GLboolean createWindow(_GLFWwindow* window, // The /only/ reason we are setting the background pixel here is // that otherwise our window wont get any decorations on systems // using Compiz on Intel hardware - wa.background_pixel = BlackPixel(_glfwLibrary.X11.display, window->X11.screen); + wa.background_pixel = BlackPixel(_glfwLibrary.X11.display, _glfwLibrary.X11.screen); wamask |= CWBackPixel; } window->X11.window = XCreateWindow( _glfwLibrary.X11.display, - window->X11.root, + _glfwLibrary.X11.root, 0, 0, // Upper left corner of this window on root window->width, window->height, 0, // Border width @@ -898,7 +898,7 @@ static void enterFullscreenMode(_GLFWwindow* window) _glfwLibrary.X11.saver.changed = GL_TRUE; } - _glfwSetVideoMode(window->X11.screen, + _glfwSetVideoMode(_glfwLibrary.X11.screen, &window->width, &window->height, &window->refreshRate); @@ -923,7 +923,7 @@ static void enterFullscreenMode(_GLFWwindow* window) event.xclient.data.l[1] = 0; // We don't really know the timestamp XSendEvent(_glfwLibrary.X11.display, - window->X11.root, + _glfwLibrary.X11.root, False, SubstructureNotifyMask | SubstructureRedirectMask, &event); @@ -946,7 +946,7 @@ static void enterFullscreenMode(_GLFWwindow* window) event.xclient.data.l[3] = 1; // Sender is a normal application XSendEvent(_glfwLibrary.X11.display, - window->X11.root, + _glfwLibrary.X11.root, False, SubstructureNotifyMask | SubstructureRedirectMask, &event); @@ -981,7 +981,7 @@ static void enterFullscreenMode(_GLFWwindow* window) static void leaveFullscreenMode(_GLFWwindow* window) { - _glfwRestoreVideoMode(window->X11.screen); + _glfwRestoreVideoMode(_glfwLibrary.X11.screen); // Did we change the screen saver setting? if (_glfwLibrary.X11.saver.changed) @@ -1016,7 +1016,7 @@ static void leaveFullscreenMode(_GLFWwindow* window) event.xclient.data.l[3] = 1; // Sender is a normal application XSendEvent(_glfwLibrary.X11.display, - window->X11.root, + _glfwLibrary.X11.root, False, SubstructureNotifyMask | SubstructureRedirectMask, &event); @@ -1216,7 +1216,7 @@ static GLboolean processSingleEvent(void) // The window manager is pinging us to make sure we are still // responding to events - event.xclient.window = window->X11.root; + event.xclient.window = _glfwLibrary.X11.root; XSendEvent(_glfwLibrary.X11.display, event.xclient.window, False, @@ -1324,13 +1324,8 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, window->refreshRate = wndconfig->refreshRate; window->windowNoResize = wndconfig->windowNoResize; - // As the 2.x API doesn't understand multiple display devices, we hardcode - // this choice and hope for the best - window->X11.screen = DefaultScreen(_glfwLibrary.X11.display); - window->X11.root = RootWindow(_glfwLibrary.X11.display, window->X11.screen); - // Create the invisible cursor for hidden cursor mode - window->X11.cursor = createNULLCursor(_glfwLibrary.X11.display, window->X11.root); + window->X11.cursor = createNULLCursor(_glfwLibrary.X11.display, _glfwLibrary.X11.root); initGLXExtensions(window); @@ -1489,7 +1484,7 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) if (window->mode == GLFW_FULLSCREEN) { // Get the closest matching video mode for the specified window size - mode = _glfwGetClosestVideoMode(window->X11.screen, &width, &height, &rate); + mode = _glfwGetClosestVideoMode(_glfwLibrary.X11.screen, &width, &height, &rate); } if (window->windowNoResize) @@ -1516,7 +1511,7 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) if (window->mode == GLFW_FULLSCREEN) { // Change video mode, keeping current refresh rate - _glfwSetVideoModeMODE(window->X11.screen, mode, window->refreshRate); + _glfwSetVideoModeMODE(_glfwLibrary.X11.screen, mode, window->refreshRate); } // Set window size (if not already changed) @@ -1548,7 +1543,7 @@ void _glfwPlatformIconifyWindow(_GLFWwindow* window) return; } - XIconifyWindow(_glfwLibrary.X11.display, window->X11.window, window->X11.screen); + XIconifyWindow(_glfwLibrary.X11.display, window->X11.window, _glfwLibrary.X11.screen); } @@ -1615,14 +1610,14 @@ void _glfwPlatformRefreshWindowParams(void) if (window->GLX.has_GLX_SGIX_fbconfig) { fbconfig = window->GLX.ChooseFBConfigSGIX(_glfwLibrary.X11.display, - window->X11.screen, + _glfwLibrary.X11.screen, attribs, &dummy); } else { fbconfig = glXChooseFBConfig(_glfwLibrary.X11.display, - window->X11.screen, + _glfwLibrary.X11.screen, attribs, &dummy); } @@ -1669,7 +1664,7 @@ void _glfwPlatformRefreshWindowParams(void) #if defined(_GLFW_HAS_XRANDR) if (_glfwLibrary.X11.XRandR.available) { - sc = XRRGetScreenInfo(_glfwLibrary.X11.display, window->X11.root); + sc = XRRGetScreenInfo(_glfwLibrary.X11.display, _glfwLibrary.X11.root); window->refreshRate = XRRConfigCurrentRate(sc); XRRFreeScreenConfigInfo(sc); } @@ -1677,7 +1672,7 @@ void _glfwPlatformRefreshWindowParams(void) if (_glfwLibrary.X11.XF86VidMode.available) { // Use the XF86VidMode extension to get current video mode - XF86VidModeGetModeLine(_glfwLibrary.X11.display, window->X11.screen, + XF86VidModeGetModeLine(_glfwLibrary.X11.display, _glfwLibrary.X11.screen, &dotclock, &modeline); pixels_per_second = 1000.0f * (float) dotclock; pixels_per_frame = (float) modeline.htotal * modeline.vtotal;