|
@@ -505,22 +505,63 @@ static GLFWbool initExtensions(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (XRRQueryExtension(_glfw.x11.display,
|
|
|
- &_glfw.x11.randr.eventBase,
|
|
|
- &_glfw.x11.randr.errorBase))
|
|
|
+ _glfw.x11.randr.handle = dlopen("libXrandr.so.2", RTLD_LAZY | RTLD_GLOBAL);
|
|
|
+ if (_glfw.x11.randr.handle)
|
|
|
{
|
|
|
- if (XRRQueryVersion(_glfw.x11.display,
|
|
|
- &_glfw.x11.randr.major,
|
|
|
- &_glfw.x11.randr.minor))
|
|
|
+ _glfw.x11.randr.AllocGamma = (PFN_XRRAllocGamma)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRAllocGamma");
|
|
|
+ _glfw.x11.randr.FreeGamma = (PFN_XRRFreeGamma)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRFreeGamma");
|
|
|
+ _glfw.x11.randr.FreeCrtcInfo = (PFN_XRRFreeCrtcInfo)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRFreeCrtcInfo");
|
|
|
+ _glfw.x11.randr.FreeGamma = (PFN_XRRFreeGamma)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRFreeGamma");
|
|
|
+ _glfw.x11.randr.FreeOutputInfo = (PFN_XRRFreeOutputInfo)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRFreeOutputInfo");
|
|
|
+ _glfw.x11.randr.FreeScreenResources = (PFN_XRRFreeScreenResources)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRFreeScreenResources");
|
|
|
+ _glfw.x11.randr.GetCrtcGamma = (PFN_XRRGetCrtcGamma)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRGetCrtcGamma");
|
|
|
+ _glfw.x11.randr.GetCrtcGammaSize = (PFN_XRRGetCrtcGammaSize)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRGetCrtcGammaSize");
|
|
|
+ _glfw.x11.randr.GetCrtcInfo = (PFN_XRRGetCrtcInfo)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRGetCrtcInfo");
|
|
|
+ _glfw.x11.randr.GetOutputInfo = (PFN_XRRGetOutputInfo)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRGetOutputInfo");
|
|
|
+ _glfw.x11.randr.GetOutputPrimary = (PFN_XRRGetOutputPrimary)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRGetOutputPrimary");
|
|
|
+ _glfw.x11.randr.GetScreenResourcesCurrent = (PFN_XRRGetScreenResourcesCurrent)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRGetScreenResourcesCurrent");
|
|
|
+ _glfw.x11.randr.QueryExtension = (PFN_XRRQueryExtension)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRQueryExtension");
|
|
|
+ _glfw.x11.randr.QueryVersion = (PFN_XRRQueryVersion)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRQueryVersion");
|
|
|
+ _glfw.x11.randr.SelectInput = (PFN_XRRSelectInput)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRSelectInput");
|
|
|
+ _glfw.x11.randr.SetCrtcConfig = (PFN_XRRSetCrtcConfig)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRSetCrtcConfig");
|
|
|
+ _glfw.x11.randr.SetCrtcGamma = (PFN_XRRSetCrtcGamma)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRSetCrtcGamma");
|
|
|
+ _glfw.x11.randr.UpdateConfiguration = (PFN_XRRUpdateConfiguration)
|
|
|
+ dlsym(_glfw.x11.randr.handle, "XRRUpdateConfiguration");
|
|
|
+
|
|
|
+ if (XRRQueryExtension(_glfw.x11.display,
|
|
|
+ &_glfw.x11.randr.eventBase,
|
|
|
+ &_glfw.x11.randr.errorBase))
|
|
|
{
|
|
|
- // 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,
|
|
|
- "X11: Failed to query RandR version");
|
|
|
+ if (XRRQueryVersion(_glfw.x11.display,
|
|
|
+ &_glfw.x11.randr.major,
|
|
|
+ &_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,
|
|
|
+ "X11: Failed to query RandR version");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -836,6 +877,12 @@ void _glfwPlatformTerminate(void)
|
|
|
_glfw.x11.x11xcb.handle = NULL;
|
|
|
}
|
|
|
|
|
|
+ if (_glfw.x11.randr.handle)
|
|
|
+ {
|
|
|
+ dlclose(_glfw.x11.randr.handle);
|
|
|
+ _glfw.x11.randr.handle = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
if (_glfw.x11.helperWindowHandle)
|
|
|
{
|
|
|
if (XGetSelectionOwner(_glfw.x11.display, _glfw.x11.CLIPBOARD) ==
|