Added mode-getting functions for GHOST under X11 (GNU/Linux).

Enabled xvidmode by default in cmake.
Patch approved by Campbell.
This commit is contained in:
Alex Fraser
2012-01-11 12:28:31 +00:00
parent 37fc8b4dbb
commit dcef7346eb
2 changed files with 61 additions and 3 deletions

View File

@@ -156,7 +156,7 @@ endif()
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
option(WITH_X11_XINPUT "Enable X11 Xinput (tablet support and unicode input)" ON) option(WITH_X11_XINPUT "Enable X11 Xinput (tablet support and unicode input)" ON)
option(WITH_X11_XF86VMODE "Enable X11 video mode switching" OFF) option(WITH_X11_XF86VMODE "Enable X11 video mode switching" ON)
option(WITH_BUILTIN_GLEW "Use GLEW OpenGL wrapper library bundled with blender" ON) option(WITH_BUILTIN_GLEW "Use GLEW OpenGL wrapper library bundled with blender" ON)
option(WITH_XDG_USER_DIRS "Build with XDG Base Directory Specification (only config and documents for now)" OFF) option(WITH_XDG_USER_DIRS "Build with XDG Base Directory Specification (only config and documents for now)" OFF)
mark_as_advanced(WITH_XDG_USER_DIRS) mark_as_advanced(WITH_XDG_USER_DIRS)

View File

@@ -67,10 +67,32 @@ getNumDisplaySettings(
GHOST_TUns8 display, GHOST_TUns8 display,
GHOST_TInt32& numSettings GHOST_TInt32& numSettings
) const{ ) const{
#ifdef WITH_X11_XF86VMODE
int majorVersion, minorVersion;
XF86VidModeModeInfo **vidmodes;
Display *dpy = m_system->getXDisplay();
GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n");
if (dpy == NULL)
return GHOST_kFailure;
majorVersion = minorVersion = 0;
if (!XF86VidModeQueryVersion(dpy, &majorVersion, &minorVersion)) {
fprintf(stderr, "Error: XF86VidMode extension missing!\n");
return GHOST_kFailure;
}
/* The X11 man page says vidmodes needs to be freed, but doing so causes a
* segfault. - z0r */
XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &numSettings, &vidmodes);
#else
// We only have one X11 setting at the moment. // We only have one X11 setting at the moment.
GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n"); GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n");
numSettings = GHOST_TInt32(1); numSettings = GHOST_TInt32(1);
#endif
return GHOST_kSuccess; return GHOST_kSuccess;
} }
@@ -81,7 +103,34 @@ getDisplaySetting(
GHOST_TInt32 index, GHOST_TInt32 index,
GHOST_DisplaySetting& setting GHOST_DisplaySetting& setting
) const { ) const {
#ifdef WITH_X11_XF86VMODE
int majorVersion, minorVersion;
XF86VidModeModeInfo **vidmodes;
Display *dpy = m_system->getXDisplay();
int numSettings;
GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n");
if (dpy == NULL)
return GHOST_kFailure;
majorVersion = minorVersion = 0;
if (!XF86VidModeQueryVersion(dpy, &majorVersion, &minorVersion)) {
fprintf(stderr, "Error: XF86VidMode extension missing!\n");
return GHOST_kFailure;
}
/* The X11 man page says vidmodes needs to be freed, but doing so causes a
* segfault. - z0r */
XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &numSettings, &vidmodes);
GHOST_ASSERT(index < numSettings, "Requested setting outside of valid range.\n");
setting.xPixels = vidmodes[index]->hdisplay;
setting.yPixels = vidmodes[index]->vdisplay;
setting.bpp = DefaultDepth(dpy,DefaultScreen(dpy));
#else
GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n"); GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n");
GHOST_ASSERT(index < 1, "Requested setting outside of valid range.\n"); GHOST_ASSERT(index < 1, "Requested setting outside of valid range.\n");
@@ -94,6 +143,7 @@ getDisplaySetting(
setting.xPixels = DisplayWidth(x_display, DefaultScreen(x_display)); setting.xPixels = DisplayWidth(x_display, DefaultScreen(x_display));
setting.yPixels = DisplayHeight(x_display, DefaultScreen(x_display)); setting.yPixels = DisplayHeight(x_display, DefaultScreen(x_display));
setting.bpp = DefaultDepth(x_display,DefaultScreen(x_display)); setting.bpp = DefaultDepth(x_display,DefaultScreen(x_display));
#endif
// Don't think it's possible to get this value from X! // Don't think it's possible to get this value from X!
// So let's guess!! // So let's guess!!
@@ -108,6 +158,9 @@ getCurrentDisplaySetting(
GHOST_TUns8 display, GHOST_TUns8 display,
GHOST_DisplaySetting& setting GHOST_DisplaySetting& setting
) const { ) const {
/* According to the xf86vidmodegetallmodelines man page,
* "The first element of the array corresponds to the current video mode."
*/
return getDisplaySetting(display,GHOST_TInt32(0),setting); return getDisplaySetting(display,GHOST_TInt32(0),setting);
} }
@@ -130,6 +183,9 @@ setCurrentDisplaySetting(
int scrnum, num_vidmodes; int scrnum, num_vidmodes;
int best_fit, best_dist, dist, x, y; int best_fit, best_dist, dist, x, y;
if (dpy == NULL)
return GHOST_kFailure;
scrnum = DefaultScreen(dpy); scrnum = DefaultScreen(dpy);
// Get video mode list // Get video mode list
@@ -143,6 +199,8 @@ setCurrentDisplaySetting(
majorVersion, minorVersion); majorVersion, minorVersion);
# endif # endif
/* The X11 man page says vidmodes needs to be freed, but doing so causes a
* segfault. - z0r */
XF86VidModeGetAllModeLines(dpy, scrnum, &num_vidmodes, &vidmodes); XF86VidModeGetAllModeLines(dpy, scrnum, &num_vidmodes, &vidmodes);
best_dist = 9999999; best_dist = 9999999;