Fix monitor notifications on X11

Fixes #288.
This commit is contained in:
Camilla Berglund 2015-06-14 21:05:42 +02:00
parent 154b01e8cf
commit d95b77ebec
4 changed files with 30 additions and 28 deletions

View File

@ -69,6 +69,7 @@ used by the tests and examples and are not required to build the library.
- Added `GLFW_TRUE` and `GLFW_FALSE` as client API independent boolean values - Added `GLFW_TRUE` and `GLFW_FALSE` as client API independent boolean values
- Removed dependency on external OpenGL or OpenGL ES headers - Removed dependency on external OpenGL or OpenGL ES headers
- [Cocoa] Removed support for OS X 10.6 - [Cocoa] Removed support for OS X 10.6
- [X11] Bugfix: Monitor connection and disconnection events were not reported
- [WGL] Removed dependency on external WGL headers - [WGL] Removed dependency on external WGL headers
- [GLX] Removed dependency on external GLX headers - [GLX] Removed dependency on external GLX headers
- [EGL] Removed dependency on external EGL headers - [EGL] Removed dependency on external EGL headers

View File

@ -1374,9 +1374,6 @@ GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor);
* @return The previously set callback, or `NULL` if no callback was set or the * @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init). * library had not been [initialized](@ref intro_init).
* *
* @bug __X11:__ This callback is not yet called on monitor configuration
* changes.
*
* @par Thread Safety * @par Thread Safety
* This function may only be called from the main thread. * This function may only be called from the main thread.
* *

View File

@ -486,29 +486,29 @@ static GLFWbool initExtensions(void)
#endif /*_GLFW_HAS_XF86VM*/ #endif /*_GLFW_HAS_XF86VM*/
// Check for RandR extension // Check for RandR extension
_glfw.x11.randr.available = if (XRRQueryExtension(_glfw.x11.display,
XRRQueryExtension(_glfw.x11.display,
&_glfw.x11.randr.eventBase, &_glfw.x11.randr.eventBase,
&_glfw.x11.randr.errorBase); &_glfw.x11.randr.errorBase))
if (_glfw.x11.randr.available)
{ {
XRRScreenResources* sr; if (XRRQueryVersion(_glfw.x11.display,
if (!XRRQueryVersion(_glfw.x11.display,
&_glfw.x11.randr.major, &_glfw.x11.randr.major,
&_glfw.x11.randr.minor)) &_glfw.x11.randr.minor))
{
// The GLFW RandR path requires at least version 1.3
if (_glfw.x11.randr.major > 1 || _glfw.x11.randr.minor >= 3)
_glfw.x11.randr.available = GLFW_TRUE;
}
else
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"X11: Failed to query RandR version"); "X11: Failed to query RandR version");
return GLFW_FALSE; }
} }
// The GLFW RandR path requires at least version 1.3 if (_glfw.x11.randr.available)
if (_glfw.x11.randr.major == 1 && _glfw.x11.randr.minor < 3) {
_glfw.x11.randr.available = GLFW_FALSE; XRRScreenResources* sr = XRRGetScreenResources(_glfw.x11.display,
_glfw.x11.root);
sr = XRRGetScreenResources(_glfw.x11.display, _glfw.x11.root);
if (!sr->ncrtc || !XRRGetCrtcGammaSize(_glfw.x11.display, sr->crtcs[0])) if (!sr->ncrtc || !XRRGetCrtcGammaSize(_glfw.x11.display, sr->crtcs[0]))
{ {
@ -522,6 +522,9 @@ static GLFWbool initExtensions(void)
} }
XRRFreeScreenResources(sr); XRRFreeScreenResources(sr);
XRRSelectInput(_glfw.x11.display, _glfw.x11.root,
RROutputChangeNotifyMask);
} }
if (XineramaQueryExtension(_glfw.x11.display, if (XineramaQueryExtension(_glfw.x11.display,

View File

@ -480,9 +480,6 @@ static GLFWbool createWindow(_GLFWwindow* window,
_glfwPlatformSetWindowTitle(window, wndconfig->title); _glfwPlatformSetWindowTitle(window, wndconfig->title);
XRRSelectInput(_glfw.x11.display, window->x11.handle,
RRScreenChangeNotifyMask);
if (_glfw.x11.im) if (_glfw.x11.im)
{ {
window->x11.ic = XCreateIC(_glfw.x11.im, window->x11.ic = XCreateIC(_glfw.x11.im,
@ -852,6 +849,16 @@ static void processEvent(XEvent *event)
if (_glfw.x11.im) if (_glfw.x11.im)
filtered = XFilterEvent(event, None); filtered = XFilterEvent(event, None);
if (_glfw.x11.randr.available)
{
if (event->type == _glfw.x11.randr.eventBase + RRNotify)
{
XRRUpdateConfiguration(event);
_glfwInputMonitorChange();
return;
}
}
if (event->type != GenericEvent) if (event->type != GenericEvent)
{ {
window = findWindowByHandle(event->xany.window); window = findWindowByHandle(event->xany.window);
@ -1412,12 +1419,6 @@ static void processEvent(XEvent *event)
} }
#endif /*_GLFW_HAS_XINPUT*/ #endif /*_GLFW_HAS_XINPUT*/
} }
if (event->type - _glfw.x11.randr.eventBase == RRScreenChangeNotify)
{
XRRUpdateConfiguration(event);
return;
}
} }