Made RandR and VidMode work in parallel.

This commit is contained in:
Camilla Berglund 2010-10-13 23:01:17 +02:00
parent 0150a1544a
commit 215742af60
3 changed files with 61 additions and 47 deletions

View File

@ -183,7 +183,8 @@ typedef struct _GLFWlibraryX11
int oldWidth; int oldWidth;
int oldHeight; int oldHeight;
Rotation oldRotation; Rotation oldRotation;
#elif defined(_GLFW_HAS_XF86VIDMODE) #endif
#if defined(_GLFW_HAS_XF86VIDMODE)
XF86VidModeModeInfo oldMode; XF86VidModeModeInfo oldMode;
#endif #endif
} FS; } FS;

View File

@ -44,14 +44,20 @@
int _glfwGetClosestVideoMode(int screen, int* width, int* height, int* rate) int _glfwGetClosestVideoMode(int screen, int* width, int* height, int* rate)
{ {
#if defined(_GLFW_HAS_XRANDR)
int i, match, bestmatch; int i, match, bestmatch;
#if defined(_GLFW_HAS_XRANDR)
int sizecount, bestsize; int sizecount, bestsize;
int ratecount, bestrate; int ratecount, bestrate;
short* ratelist; short* ratelist;
XRRScreenConfiguration* sc; XRRScreenConfiguration* sc;
XRRScreenSize* sizelist; XRRScreenSize* sizelist;
#endif
#if defined(_GLFW_HAS_XF86VIDMODE)
XF86VidModeModeInfo** modelist;
int bestmode, modecount;
#endif
#if defined(_GLFW_HAS_XRANDR)
if (_glfwLibrary.X11.XRandR.available) if (_glfwLibrary.X11.XRandR.available)
{ {
sc = XRRGetScreenInfo(_glfwLibrary.X11.display, sc = XRRGetScreenInfo(_glfwLibrary.X11.display,
@ -108,15 +114,15 @@ int _glfwGetClosestVideoMode(int screen, int* width, int* height, int* rate)
if (bestsize != -1) if (bestsize != -1)
return bestsize; return bestsize;
} }
#elif defined(_GLFW_HAS_XF86VIDMODE) #endif
XF86VidModeModeInfo** modelist;
int modecount, i, bestmode, bestmatch, match;
#if defined(_GLFW_HAS_XF86VIDMODE)
// Use the XF86VidMode extension to control video resolution // Use the XF86VidMode extension to control video resolution
if (_glfwLibrary.XF86VidMode.available) if (_glfwLibrary.X11.XF86VidMode.available &&
!_glfwLibrary.X11.XRandR.available)
{ {
// Get a list of all available display modes // Get a list of all available display modes
XF86VidModeGetAllModeLines(_glfwLibrary.display, screen, XF86VidModeGetAllModeLines(_glfwLibrary.X11.display, screen,
&modecount, &modelist); &modecount, &modelist);
// Find the best matching mode // Find the best matching mode
@ -167,7 +173,13 @@ void _glfwSetVideoModeMODE(int screen, int mode, int rate)
#if defined(_GLFW_HAS_XRANDR) #if defined(_GLFW_HAS_XRANDR)
XRRScreenConfiguration* sc; XRRScreenConfiguration* sc;
Window root; Window root;
#endif
#if defined(_GLFW_HAS_XF86VIDMODE)
XF86VidModeModeInfo **modelist;
int modecount;
#endif
#if defined(_GLFW_HAS_XRANDR)
if (_glfwLibrary.X11.XRandR.available) if (_glfwLibrary.X11.XRandR.available)
{ {
root = RootWindow(_glfwLibrary.X11.display, screen); root = RootWindow(_glfwLibrary.X11.display, screen);
@ -207,12 +219,12 @@ void _glfwSetVideoModeMODE(int screen, int mode, int rate)
XRRFreeScreenConfigInfo(sc); XRRFreeScreenConfigInfo(sc);
} }
#elif defined(_GLFW_HAS_XF86VIDMODE) #endif
XF86VidModeModeInfo **modelist;
int modecount;
#if defined(_GLFW_HAS_XF86VIDMODE)
// Use the XF86VidMode extension to control video resolution // Use the XF86VidMode extension to control video resolution
if (_glfwLibrary.X11.XF86VidMode.available) if (_glfwLibrary.X11.XF86VidMode.available &&
!_glfwLibrary.X11.XRandR.available)
{ {
// Get a list of all available display modes // Get a list of all available display modes
XF86VidModeGetAllModeLines(_glfwLibrary.X11.display, screen, XF86VidModeGetAllModeLines(_glfwLibrary.X11.display, screen,
@ -271,19 +283,18 @@ void _glfwRestoreVideoMode(int screen)
if (_glfwLibrary.X11.FS.modeChanged) if (_glfwLibrary.X11.FS.modeChanged)
{ {
#if defined(_GLFW_HAS_XRANDR) #if defined(_GLFW_HAS_XRANDR)
Window root = RootWindow(_glfwLibrary.X11.display, screen);
if (_glfwLibrary.X11.XRandR.available) if (_glfwLibrary.X11.XRandR.available)
{ {
XRRScreenConfiguration* sc; XRRScreenConfiguration* sc;
if (_glfwLibrary.X11.XRandR.available) if (_glfwLibrary.X11.XRandR.available)
{ {
sc = XRRGetScreenInfo(_glfwLibrary.X11.display, root); sc = XRRGetScreenInfo(_glfwLibrary.X11.display,
_glfwLibrary.X11.root);
XRRSetScreenConfig(_glfwLibrary.X11.display, XRRSetScreenConfig(_glfwLibrary.X11.display,
sc, sc,
root, _glfwLibrary.X11.root,
_glfwLibrary.X11.FS.oldSizeID, _glfwLibrary.X11.FS.oldSizeID,
_glfwLibrary.X11.FS.oldRotation, _glfwLibrary.X11.FS.oldRotation,
CurrentTime); CurrentTime);
@ -291,8 +302,10 @@ void _glfwRestoreVideoMode(int screen)
XRRFreeScreenConfigInfo(sc); XRRFreeScreenConfigInfo(sc);
} }
} }
#elif defined(_GLFW_HAS_XF86VIDMODE) #endif
if (_glfwLibrary.X11.XF86VidMode.available) #if defined(_GLFW_HAS_XF86VIDMODE)
if (_glfwLibrary.X11.XF86VidMode.available &&
!_glfwLibrary.X11.XRandR.available)
{ {
// Unlock mode switch // Unlock mode switch
XF86VidModeLockModeSwitch(_glfwLibrary.X11.display, screen, 0); XF86VidModeLockModeSwitch(_glfwLibrary.X11.display, screen, 0);
@ -303,6 +316,7 @@ void _glfwRestoreVideoMode(int screen)
&_glfwLibrary.X11.FS.oldMode); &_glfwLibrary.X11.FS.oldMode);
} }
#endif #endif
_glfwLibrary.X11.FS.modeChanged = GL_FALSE; _glfwLibrary.X11.FS.modeChanged = GL_FALSE;
} }
} }
@ -326,7 +340,6 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount)
{ {
int count, k, l, r, g, b, rgba, gl; int count, k, l, r, g, b, rgba, gl;
int depth, screen; int depth, screen;
Display* dpy;
XVisualInfo* vislist; XVisualInfo* vislist;
XVisualInfo dummy; XVisualInfo dummy;
int viscount, rgbcount, rescount; int viscount, rgbcount, rescount;
@ -336,17 +349,14 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount)
XRRScreenConfiguration* sc; XRRScreenConfiguration* sc;
XRRScreenSize* sizelist; XRRScreenSize* sizelist;
int sizecount; int sizecount;
#elif defined(_GLFW_HAS_XF86VIDMODE) #endif
#if defined(_GLFW_HAS_XF86VIDMODE)
XF86VidModeModeInfo** modelist; XF86VidModeModeInfo** modelist;
int modecount, width, height; int modecount, width, height;
#endif #endif
// Get display and screen
dpy = _glfwLibrary.X11.display;
screen = DefaultScreen(dpy);
// Get list of visuals // Get list of visuals
vislist = XGetVisualInfo(dpy, 0, &dummy, &viscount); vislist = XGetVisualInfo(_glfwLibrary.X11.display, 0, &dummy, &viscount);
if (vislist == NULL) if (vislist == NULL)
{ {
// TODO: Figure out which error this is // TODO: Figure out which error this is
@ -360,8 +370,8 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount)
for (k = 0; k < viscount; k++) for (k = 0; k < viscount; k++)
{ {
// Does the visual support OpenGL & true color? // Does the visual support OpenGL & true color?
glXGetConfig(dpy, &vislist[k], GLX_USE_GL, &gl); glXGetConfig(_glfwLibrary.X11.display, &vislist[k], GLX_USE_GL, &gl);
glXGetConfig(dpy, &vislist[k], GLX_RGBA, &rgba); glXGetConfig(_glfwLibrary.X11.display, &vislist[k], GLX_RGBA, &rgba);
if (gl && rgba) if (gl && rgba)
{ {
// Get color depth for this visual // Get color depth for this visual
@ -393,7 +403,7 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount)
#if defined(_GLFW_HAS_XRANDR) #if defined(_GLFW_HAS_XRANDR)
if (_glfwLibrary.X11.XRandR.available) if (_glfwLibrary.X11.XRandR.available)
{ {
sc = XRRGetScreenInfo(dpy, RootWindow(dpy, screen)); sc = XRRGetScreenInfo(_glfwLibrary.X11.display, _glfwLibrary.X11.root);
sizelist = XRRConfigSizes(sc, &sizecount); sizelist = XRRConfigSizes(sc, &sizecount);
resarray = (struct _glfwResolution*) malloc(sizeof(struct _glfwResolution) * sizecount); resarray = (struct _glfwResolution*) malloc(sizeof(struct _glfwResolution) * sizecount);
@ -407,10 +417,13 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount)
XRRFreeScreenConfigInfo(sc); XRRFreeScreenConfigInfo(sc);
} }
#elif defined(_GLFW_HAS_XF86VIDMODE) #endif
if (_glfwLibrary.XF86VidMode.available)
#if defined(_GLFW_HAS_XF86VIDMODE)
if (_glfwLibrary.X11.XF86VidMode.available &&
!_glfwLibrary.X11.XRandR.available)
{ {
XF86VidModeGetAllModeLines(dpy, screen, &modecount, &modelist); XF86VidModeGetAllModeLines(_glfwLibrary.X11.display, screen, &modecount, &modelist);
resarray = (struct _glfwResolution*) malloc(sizeof(struct _glfwResolution) * modecount); resarray = (struct _glfwResolution*) malloc(sizeof(struct _glfwResolution) * modecount);
@ -443,8 +456,8 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount)
rescount = 1; rescount = 1;
resarray = (struct _glfwResolution*) malloc(sizeof(struct _glfwResolution) * rescount); resarray = (struct _glfwResolution*) malloc(sizeof(struct _glfwResolution) * rescount);
resarray[0].width = DisplayWidth(dpy, screen); resarray[0].width = DisplayWidth(_glfwLibrary.X11.display, screen);
resarray[0].height = DisplayHeight(dpy, screen); resarray[0].height = DisplayHeight(_glfwLibrary.X11.display, screen);
} }
// Build permutations of colors and resolutions // Build permutations of colors and resolutions
@ -478,19 +491,14 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount)
void _glfwPlatformGetDesktopMode(GLFWvidmode* mode) void _glfwPlatformGetDesktopMode(GLFWvidmode* mode)
{ {
Display* dpy;
int bpp, screen; int bpp, screen;
#if !defined(_GLFW_HAS_XRANDR) && defined(_GLFW_HAS_XF86VIDMODE) #if defined(_GLFW_HAS_XF86VIDMODE)
XF86VidModeModeInfo** modelist; XF86VidModeModeInfo** modelist;
int modecount; int modecount;
#endif #endif
// Get display and screen
dpy = _glfwLibrary.X11.display;
screen = DefaultScreen(dpy);
// Get display depth // Get display depth
bpp = DefaultDepth(dpy, screen); bpp = DefaultDepth(_glfwLibrary.X11.display, screen);
// Convert BPP to RGB bits // Convert BPP to RGB bits
_glfwSplitBPP(bpp, &mode->redBits, &mode->greenBits, &mode->blueBits); _glfwSplitBPP(bpp, &mode->redBits, &mode->greenBits, &mode->blueBits);
@ -505,8 +513,10 @@ void _glfwPlatformGetDesktopMode(GLFWvidmode* mode)
return; return;
} }
} }
#elif defined(_GLFW_HAS_XF86VIDMODE) #endif
if (_glfwLibrary.X11.XF86VidMode.available) #if defined(_GLFW_HAS_XF86VIDMODE)
if (_glfwLibrary.X11.XF86VidMode.available &&
!_glfwLibrary.X11.XRandR.available)
{ {
if (_glfwLibrary.X11.FS.modeChanged) if (_glfwLibrary.X11.FS.modeChanged)
{ {
@ -517,7 +527,7 @@ void _glfwPlatformGetDesktopMode(GLFWvidmode* mode)
else else
{ {
// Use the XF86VidMode extension to get list of video modes // Use the XF86VidMode extension to get list of video modes
XF86VidModeGetAllModeLines(dpy, screen, &modecount, &modelist); XF86VidModeGetAllModeLines(_glfwLibrary.X11.display, screen, &modecount, &modelist);
// The first mode in the list is the current (desktio) mode // The first mode in the list is the current (desktio) mode
mode->width = modelist[0]->hdisplay; mode->width = modelist[0]->hdisplay;
@ -532,7 +542,7 @@ void _glfwPlatformGetDesktopMode(GLFWvidmode* mode)
#endif #endif
// Get current display width and height // Get current display width and height
mode->width = DisplayWidth(dpy, screen); mode->width = DisplayWidth(_glfwLibrary.X11.display, screen);
mode->height = DisplayHeight(dpy, screen); mode->height = DisplayHeight(_glfwLibrary.X11.display, screen);
} }

View File

@ -1670,7 +1670,8 @@ void _glfwPlatformRefreshWindowParams(void)
GLXFBConfig* fbconfig; GLXFBConfig* fbconfig;
#if defined(_GLFW_HAS_XRANDR) #if defined(_GLFW_HAS_XRANDR)
XRRScreenConfiguration* sc; XRRScreenConfiguration* sc;
#elif defined(_GLFW_HAS_XF86VIDMODE) #endif
#if defined(_GLFW_HAS_XF86VIDMODE)
XF86VidModeModeLine modeline; XF86VidModeModeLine modeline;
int dotclock; int dotclock;
float pixels_per_second, pixels_per_frame; float pixels_per_second, pixels_per_frame;
@ -1740,8 +1741,10 @@ void _glfwPlatformRefreshWindowParams(void)
window->refreshRate = XRRConfigCurrentRate(sc); window->refreshRate = XRRConfigCurrentRate(sc);
XRRFreeScreenConfigInfo(sc); XRRFreeScreenConfigInfo(sc);
} }
#elif defined(_GLFW_HAS_XF86VIDMODE) #endif
if (_glfwLibrary.X11.XF86VidMode.available) #if defined(_GLFW_HAS_XF86VIDMODE)
if (_glfwLibrary.X11.XF86VidMode.available &&
!_glfwLibrary.X11.XRandR.available)
{ {
// Use the XF86VidMode extension to get current video mode // Use the XF86VidMode extension to get current video mode
XF86VidModeGetModeLine(_glfwLibrary.X11.display, _glfwLibrary.X11.screen, XF86VidModeGetModeLine(_glfwLibrary.X11.display, _glfwLibrary.X11.screen,