[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43070] trunk/blender: Mode switching for GHOST under X11: adds the ability to change screen resolutions in the blenderplayer on GNU/ Linux.

Alex Fraser alex at phatcore.com
Mon Jan 2 13:25:25 CET 2012


Revision: 43070
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43070
Author:   z0r
Date:     2012-01-02 12:25:14 +0000 (Mon, 02 Jan 2012)
Log Message:
-----------
Mode switching for GHOST under X11: adds the ability to change screen resolutions in the blenderplayer on GNU/Linux.
Code ported from Quake 2.

Modified Paths:
--------------
    trunk/blender/CMakeLists.txt
    trunk/blender/intern/ghost/CMakeLists.txt
    trunk/blender/intern/ghost/intern/GHOST_DisplayManagerX11.cpp

Modified: trunk/blender/CMakeLists.txt
===================================================================
--- trunk/blender/CMakeLists.txt	2012-01-02 12:10:50 UTC (rev 43069)
+++ trunk/blender/CMakeLists.txt	2012-01-02 12:25:14 UTC (rev 43070)
@@ -156,6 +156,7 @@
 
 if(UNIX AND NOT APPLE)
 	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_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)
 	mark_as_advanced(WITH_XDG_USER_DIRS)
@@ -584,6 +585,17 @@
 		if(WITH_X11_XINPUT)
 			set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xinput_LIB}")
 		endif()
+
+		if(WITH_X11_XF86VMODE)
+			# XXX, why dont cmake make this available?
+			FIND_LIBRARY(X11_Xxf86vmode_LIB Xxf86vm   ${X11_LIB_SEARCH_PATH})
+			mark_as_advanced(X11_Xxf86vmode_LIB)
+			if(X11_Xxf86vmode_LIB)
+				set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xxf86vmode_LIB}")
+			else()
+				set(WITH_X11_XF86VMODE OFF)
+			endif()
+		endif()
 	endif()
 
 	if(CMAKE_SYSTEM_NAME MATCHES "Linux")
@@ -1547,6 +1559,7 @@
 
 	info_cfg_text("System Options:")
 	info_cfg_option(WITH_INSTALL_PORTABLE)
+	info_cfg_option(WITH_X11_XF86VMODE)
 	info_cfg_option(WITH_X11_XINPUT)
 	info_cfg_option(WITH_BUILTIN_GLEW)
 

Modified: trunk/blender/intern/ghost/CMakeLists.txt
===================================================================
--- trunk/blender/intern/ghost/CMakeLists.txt	2012-01-02 12:10:50 UTC (rev 43069)
+++ trunk/blender/intern/ghost/CMakeLists.txt	2012-01-02 12:25:14 UTC (rev 43070)
@@ -234,6 +234,13 @@
 		)
 	endif()
 
+	if(WITH_X11_XF86VMODE)
+		add_definitions(-DWITH_X11_XF86VMODE)
+		list(APPEND INC_SYS
+			${X11_xf86vmode_INCLUDE_PATH}
+		)
+	endif()
+
 	if(WITH_INPUT_NDOF)
 		list(APPEND SRC
 			intern/GHOST_NDOFManagerX11.cpp

Modified: trunk/blender/intern/ghost/intern/GHOST_DisplayManagerX11.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_DisplayManagerX11.cpp	2012-01-02 12:10:50 UTC (rev 43069)
+++ trunk/blender/intern/ghost/intern/GHOST_DisplayManagerX11.cpp	2012-01-02 12:25:14 UTC (rev 43070)
@@ -20,7 +20,9 @@
  *
  * The Original Code is: all of this file.
  *
- * Contributor(s): none yet.
+ * Video mode switching
+ * Copyright (C) 1997-2001 Id Software, Inc.
+ * Ported from Quake 2 by Alex Fraser <alex at phatcore.com>
  *
  * ***** END GPL LICENSE BLOCK *****
  */
@@ -29,6 +31,10 @@
  *  \ingroup GHOST
  */
 
+#ifdef WITH_X11_XF86VMODE
+#  include <X11/Xlib.h>
+#  include <X11/extensions/xf86vmode.h>
+#endif
 
 #include "GHOST_DisplayManagerX11.h"
 #include "GHOST_SystemX11.h"
@@ -112,12 +118,74 @@
 	GHOST_TUns8 display,
 	const GHOST_DisplaySetting& setting
 ){
-	// This is never going to work robustly in X 
-	// but it's currently part of the full screen interface
+#ifdef WITH_X11_XF86VMODE
+	//
+	// Mode switching code ported from Quake 2:
+	// ftp://ftp.idsoftware.com/idstuff/source/q2source-3.21.zip
+	// See linux/gl_glx.c:GLimp_SetMode
+	//
+	int majorVersion, minorVersion;
+	XF86VidModeModeInfo **vidmodes;
+	Display *dpy = m_system->getXDisplay();
+	int scrnum, num_vidmodes;
+	int best_fit, best_dist, dist, x, y;
 
-	// we fudge it for now.
+	scrnum = DefaultScreen(dpy);
 
+	// Get video mode list
+	majorVersion = minorVersion = 0;
+	if (!XF86VidModeQueryVersion(dpy, &majorVersion, &minorVersion)) {
+		fprintf(stderr, "Error: XF86VidMode extension missing!\n");
+		return GHOST_kFailure;
+	}
+#  ifdef _DEBUG
+	printf("Using XFree86-VidModeExtension Version %d.%d\n",
+			majorVersion, minorVersion);
+#  endif
+
+	XF86VidModeGetAllModeLines(dpy, scrnum, &num_vidmodes, &vidmodes);
+
+	best_dist = 9999999;
+	best_fit = -1;
+
+	for (int i = 0; i < num_vidmodes; i++) {
+		if (setting.xPixels > vidmodes[i]->hdisplay ||
+			setting.yPixels > vidmodes[i]->vdisplay)
+			continue;
+
+		x = setting.xPixels - vidmodes[i]->hdisplay;
+		y = setting.yPixels - vidmodes[i]->vdisplay;
+		dist = (x * x) + (y * y);
+		if (dist < best_dist) {
+			best_dist = dist;
+			best_fit = i;
+		}
+	}
+
+	if (best_fit != -1) {
+#  ifdef _DEBUG
+		int actualWidth, actualHeight;
+		actualWidth = vidmodes[best_fit]->hdisplay;
+		actualHeight = vidmodes[best_fit]->vdisplay;
+		printf("Switching to video mode %dx%d\n",
+				actualWidth, actualHeight);
+#  endif
+
+		// change to the mode
+		XF86VidModeSwitchToMode(dpy, scrnum, vidmodes[best_fit]);
+
+		// Move the viewport to top left
+		XF86VidModeSetViewPort(dpy, scrnum, 0, 0);
+	} else
+		return GHOST_kFailure;
+
+	XFlush(dpy);
 	return GHOST_kSuccess;
+
+#else
+	// Just pretend the request was successful.
+	return GHOST_kSuccess;
+#endif
 }
 
 




More information about the Bf-blender-cvs mailing list