| Attached Files | 
- 
  xinerama-spring.patch (5,859 bytes)  2009-09-09 14:24  
diff --unified -N rts/build/cmake/FindXinerama.cmake rts/build/cmake/FindXinerama.cmake
--- rts/build/cmake/FindXinerama.cmake	1970-01-01 01:00:00.000000000 +0100
+++ rts/build/cmake/FindXinerama.cmake	2009-09-09 02:38:55.000000000 +0200
@@ -0,0 +1,46 @@
+# - Find the Xinerama include file and library
+#
+
+SET(Xinerama_INC_SEARCH_PATH
+/usr/X11R6/include
+/usr/local/include
+/usr/include/X11
+/usr/openwin/include
+/usr/openwin/share/include
+/opt/graphics/OpenGL/include
+/usr/include)
+
+SET(Xinerama_LIB_SEARCH_PATH
+/usr/X11R6/lib
+/usr/local/lib
+/usr/openwin/lib
+/usr/lib)
+
+
+FIND_PATH(Xinerama_INCLUDE_DIR X11/extensions/Xinerama.h
+${Xinerama_INC_SEARCH_PATH})
+
+FIND_LIBRARY(Xinerama_LIBRARIES NAMES Xinerama PATH ${Xinerama_LIB_SEARCH_PATH})
+
+IF(Xinerama_INCLUDE_DIR AND Xinerama_LIBRARIES)
+SET(Xinerama_FOUND TRUE)
+ELSE(Xinerama_INCLUDE_DIR AND Xinerama_LIBRARIES)
+SET(Xinerama_FOUND FALSE)
+ENDIF(Xinerama_INCLUDE_DIR AND Xinerama_LIBRARIES)
+
+IF(Xinerama_FOUND)
+INCLUDE(CheckLibraryExists)
+
+CHECK_LIBRARY_EXISTS(${Xinerama_LIBRARIES}
+"XineramaQueryScreens"
+${Xinerama_LIBRARIES}
+Xinerama_HAS_QUERY)
+
+IF(NOT Xinerama_HAS_QUERY AND Xinerama_FIND_REQUIRED)
+MESSAGE(FATAL_ERROR "Could NOT find Xinerama")
+ENDIF(NOT Xinerama_HAS_QUERY AND Xinerama_FIND_REQUIRED)
+ENDIF(Xinerama_FOUND)
+
+MARK_AS_ADVANCED(Xinerama_INCLUDE_DIR Xinerama_LIBRARIES)
+
+
--- rts/Game/UI/MiniMap.cpp	2009-09-09 14:02:08.000000000 +0200
+++ rts/Game/UI/MiniMap.cpp	2009-09-09 13:39:37.000000000 +0200
@@ -61,6 +61,11 @@
 #include "TooltipConsole.h"
 #include <boost/cstdint.hpp>
 
+#ifdef USE_XINERAMA
+#include <X11/Xlib.h>
+#include <X11/extensions/Xinerama.h>
+#endif
+
 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
 //////////////////////////////////////////////////////////////////////
@@ -94,6 +99,27 @@
 		height = gu->viewSizeY;
 		xpos = (gu->viewSizeX - gu->viewPosX);
 		ypos = 0;
+#ifdef USE_XINERAMA
+		Display* display = XOpenDisplay(NULL);
+		int number;
+		XineramaScreenInfo* screenInfo = XineramaQueryScreens(display, &number);
+
+		if (number >1) {
+			if (gu->dualScreenMiniMapOnLeft) {
+				xpos   = screenInfo[0].x_org;
+				width  = screenInfo[0].width;
+				height = screenInfo[0].height;
+				ypos   = gu->viewSizeY - (height + screenInfo[0].y_org);
+			} else {
+				xpos   = screenInfo[1].x_org;
+				width  = screenInfo[1].width;
+				height = screenInfo[1].height;
+				ypos   = gu->viewSizeY - (height + screenInfo[1].y_org);
+			}
+		}
+		if (screenInfo)
+			XFree(screenInfo);
+#endif
 	}
 	else {
 		const std::string geodef = "2 2 200 200";
@@ -480,7 +506,7 @@
 		ypos -= dy;
 		xpos = std::max(0, xpos);
 		if (gu->dualScreenMode) {
-			xpos = std::min((2 * gu->viewSizeX) - width, xpos);
+			xpos = std::min((gu->winSizeX) - width, xpos);
 		} else {
 			xpos = std::min(gu->viewSizeX - width, xpos);
 		}
@@ -495,7 +521,7 @@
 		height += dy;
 		height = std::min(gu->viewSizeY, height);
 		if (gu->dualScreenMode) {
-			width = std::min(2 * gu->viewSizeX, width);
+			width = std::min(gu->winSizeX, width);
 		} else {
 			width = std::min(gu->viewSizeX, width);
 		}
@@ -571,6 +597,27 @@
 		height = gu->viewSizeY;
 		xpos = (gu->viewSizeX - gu->viewPosX);
 		ypos = 0;
+#ifdef USE_XINERAMA
+		Display* display = XOpenDisplay(NULL);
+		int number;
+		XineramaScreenInfo* screenInfo = XineramaQueryScreens(display, &number);
+
+		if (number >1) {
+			if (gu->dualScreenMiniMapOnLeft) {
+				xpos   = screenInfo[0].x_org;
+				width  = screenInfo[0].width;
+				height = screenInfo[0].height;
+				ypos   = gu->viewSizeY - (height + screenInfo[0].y_org);
+			} else {
+				xpos   = screenInfo[1].x_org;
+				width  = screenInfo[1].width;
+				height = screenInfo[1].height;
+				ypos   = gu->viewSizeY - (height + screenInfo[1].y_org);
+			}
+		}
+		if (screenInfo)
+			XFree(screenInfo);
+#endif
 	}
 	else if (maximized) {
 		SetMaximizedGeometry();
--- rts/System/SpringApp.cpp	2009-09-09 14:02:08.000000000 +0200
+++ rts/System/SpringApp.cpp	2009-09-09 13:48:37.000000000 +0200
@@ -69,6 +69,10 @@
 extern gmlClientServer<void, int,CUnit*> *gmlProcessor;
 #endif
 
+#ifdef USE_XINERAMA
+#include <X11/extensions/Xinerama.h>
+#endif
+
 using std::string;
 
 CGameController* activeController = 0;
@@ -514,6 +518,37 @@
 			gu->viewPosX = 0;
 			gu->viewPosY = 0;
 		}
+#ifdef USE_XINERAMA
+
+		SDL_SysWMinfo info;
+		SDL_VERSION(&info.version);
+
+		if (SDL_GetWMInfo(&info)) {
+			info.info.x11.lock_func();
+			{
+				Display* display = info.info.x11.display;
+				int number;
+				XineramaScreenInfo* screenInfo = XineramaQueryScreens(display, &number);
+
+				if (number >1) {
+					if (gu->dualScreenMiniMapOnLeft) {
+						gu->viewPosX  = screenInfo[1].x_org;
+						gu->viewSizeX = screenInfo[1].width;
+						gu->viewSizeY = screenInfo[1].height;
+						gu->viewPosY  = gu->winSizeY - (gu->viewSizeY + screenInfo[1].y_org);
+					} else {
+						gu->viewPosX  = screenInfo[0].x_org;
+						gu->viewSizeX = screenInfo[0].width;
+						gu->viewSizeY = screenInfo[0].height;
+						gu->viewPosY  = gu->winSizeY - (gu->viewSizeY + screenInfo[0].y_org);
+					}
+				}
+				if (screenInfo)
+					XFree(screenInfo);
+			}
+		info.info.x11.unlock_func();
+		}
+#endif
 	}
 
 	agui::gui->UpdateScreenGeometry(gu->viewSizeX, gu->viewSizeY);
--- rts/CMakeLists.txt	2009-09-04 19:32:07.000000000 +0200
+++ rts/CMakeLists.txt	2009-09-09 02:40:07.000000000 +0200
@@ -21,6 +21,13 @@
 	ADD_DEFINITIONS(-DUSE_MMGR)
 endif (USE_MMGR)
 
+SET(USE_XINERAMA TRUE CACHE BOOL "Use xinerama?")
+if (USE_XINERAMA)
+	ADD_DEFINITIONS(-DUSE_XINERAMA)
+	FIND_PACKAGE(Xinerama REQUIRED)
+	LIST(APPEND spring_libraries ${Xinerama_LIBRARIES})
+endif (USE_XINERAMA)
+
 SET(USE_GML FALSE CACHE BOOL "Use the GML OpenGL threading library?")
 if (USE_GML)
 	ADD_DEFINITIONS(-DUSE_GML)
 
 
- 
  xinerama-spring-v2.patch (4,402 bytes)  2010-01-15 14:31  
diff --git a/rts/CMakeLists.txt b/rts/CMakeLists.txt
index 26c4d57..6f2b510 100644
--- a/rts/CMakeLists.txt
+++ b/rts/CMakeLists.txt
@@ -15,6 +15,13 @@ if (USE_MMGR)
 	ADD_DEFINITIONS(-DUSE_MMGR)
 endif (USE_MMGR)
 
+SET(USE_XINERAMA FALSE CACHE BOOL "Use xinerama?")
+if (USE_XINERAMA)
+       ADD_DEFINITIONS(-DUSE_XINERAMA)
+       FIND_PACKAGE(Xinerama REQUIRED)
+       LIST(APPEND spring_libraries ${Xinerama_LIBRARIES})
+endif (USE_XINERAMA)
+
 SET(USE_GML FALSE CACHE BOOL "Use the GML OpenGL threading library?")
 if (USE_GML)
 	ADD_DEFINITIONS(-DUSE_GML)
diff --git a/rts/Game/UI/MiniMap.cpp b/rts/Game/UI/MiniMap.cpp
index 1b1e02b..72456a3 100644
--- a/rts/Game/UI/MiniMap.cpp
+++ b/rts/Game/UI/MiniMap.cpp
@@ -52,6 +52,10 @@
 #include "TooltipConsole.h"
 #include <boost/cstdint.hpp>
 
+#ifdef USE_XINERAMA
+#include "System/Platform/Linux/Xinerama.h"
+#endif
+
 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
 //////////////////////////////////////////////////////////////////////
@@ -85,6 +89,9 @@ CMiniMap::CMiniMap()
 		height = gu->viewSizeY;
 		xpos = (gu->viewSizeX - gu->viewPosX);
 		ypos = 0;
+#ifdef USE_XINERAMA
+		getXineramaPosition(gu->dualScreenMiniMapOnLeft, &xpos, &ypos, &width, &height);
+#endif
 	}
 	else {
 		const std::string geodef = "2 2 200 200";
@@ -471,7 +478,7 @@ void CMiniMap::MouseMove(int x, int y, int dx, int dy, int button)
 		ypos -= dy;
 		xpos = std::max(0, xpos);
 		if (gu->dualScreenMode) {
-			xpos = std::min((2 * gu->viewSizeX) - width, xpos);
+			xpos = std::min(gu->winSizeX - width, xpos);
 		} else {
 			xpos = std::min(gu->viewSizeX - width, xpos);
 		}
@@ -486,7 +493,7 @@ void CMiniMap::MouseMove(int x, int y, int dx, int dy, int button)
 		height += dy;
 		height = std::min(gu->viewSizeY, height);
 		if (gu->dualScreenMode) {
-			width = std::min(2 * gu->viewSizeX, width);
+			width = std::min(gu->winSizeX, width);
 		} else {
 			width = std::min(gu->viewSizeX, width);
 		}
@@ -562,6 +569,9 @@ void CMiniMap::UpdateGeometry()
 		height = gu->viewSizeY;
 		xpos = (gu->viewSizeX - gu->viewPosX);
 		ypos = 0;
+#ifdef USE_XINERAMA
+		getXineramaPosition(gu->dualScreenMiniMapOnLeft, &xpos, &ypos, &width, &height);
+#endif
 	}
 	else if (maximized) {
 		SetMaximizedGeometry();
diff --git a/rts/System/Platform/Linux/Xinerama.cpp b/rts/System/Platform/Linux/Xinerama.cpp
new file mode 100644
index 0000000..24d1ecc
--- /dev/null
+++ b/rts/System/Platform/Linux/Xinerama.cpp
@@ -0,0 +1,30 @@
+#include "Xinerama.h"
+#include <X11/Xlib.h>
+#include <X11/extensions/Xinerama.h>
+#include <algorithm>
+
+void getXineramaPosition(bool left, int *xpos, int *ypos, int *width, int *height){
+	Display* display = XOpenDisplay(NULL);
+	int number;
+	int screen;
+	XineramaScreenInfo* screenInfo = XineramaQueryScreens(display, &number);
+	if (number >1) {
+		if (screenInfo[0].x_org < screenInfo[1].x_org){
+			if (left)
+				screen = 0;
+			else
+				screen = 1;
+		} else {
+			if (left)
+				screen = 1;
+			else
+				screen = 0;
+		}
+		*xpos   = screenInfo[screen].x_org;
+		*width  = screenInfo[screen].width;
+		*height = screenInfo[screen].height;
+		*ypos   = std::max(screenInfo[0].height,screenInfo[1].height)- (*height + screenInfo[screen].y_org);
+	}
+	if (screenInfo)
+		XFree(screenInfo);
+}
diff --git a/rts/System/Platform/Linux/Xinerama.h b/rts/System/Platform/Linux/Xinerama.h
new file mode 100644
index 0000000..a119523
--- /dev/null
+++ b/rts/System/Platform/Linux/Xinerama.h
@@ -0,0 +1,5 @@
+#ifndef XINERAMASPRING_H
+#define XINERAMASPRING_H
+
+void getXineramaPosition(bool left, int *xpos, int *ypos, int *width, int *height);
+#endif //XINERAMASPRING_H
diff --git a/rts/System/SpringApp.cpp b/rts/System/SpringApp.cpp
index 9582222..7a2ef12 100644
--- a/rts/System/SpringApp.cpp
+++ b/rts/System/SpringApp.cpp
@@ -65,6 +65,10 @@
 	#include "Platform/Win/WinVersion.h"
 #endif // WIN32
 
+#ifdef USE_XINERAMA
+#include "System/Platform/Linux/Xinerama.h"
+#endif
+
 #ifdef USE_GML
 #include "lib/gml/gmlsrv.h"
 extern gmlClientServer<void, int,CUnit*> *gmlProcessor;
@@ -529,6 +533,9 @@ void SpringApp::SetupViewportGeometry()
 			gu->viewPosX = 0;
 			gu->viewPosY = 0;
 		}
+#ifdef USE_XINERAMA
+		getXineramaPosition(!gu->dualScreenMiniMapOnLeft, &gu->viewPosX, &gu->viewPosY, &gu->viewSizeX, &gu->viewSizeY);
+#endif
 	}
 
 	agui::gui->UpdateScreenGeometry(
 
 
- 
  xinerama-small-viewSizeY.patch (14,860 bytes)  2010-01-18 11:53  
diff --git a/rts/Game/Game.cpp b/rts/Game/Game.cpp
index 485a786..b52857c 100644
--- a/rts/Game/Game.cpp
+++ b/rts/Game/Game.cpp
@@ -3099,7 +3099,7 @@ bool CGame::Draw() {
 			if (FBO::IsSupported())
 				FBO::Unbind();
 
-			glViewport(gu->viewPosX, 0, gu->viewSizeX, gu->viewSizeY);
+			glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 		}
 	}
 
@@ -4381,11 +4381,11 @@ void CGame::UpdateUI(bool updateCam)
 		if (( fullscreen && fullscreenEdgeMove) ||
 		    (!fullscreen && windowedEdgeMove)) {
 
-			const int screenW = gu->dualScreenMode ? (gu->viewSizeX << 1): gu->viewSizeX;
+			const int screenW = gu->dualScreenMode ? (gu->winSizeX ): gu->viewSizeX;
 			disableTracker = false;
 
 			if (mouse->lasty <                  2 ) { movement.y += gu->lastFrameTime; disableTracker = true; }
-			if (mouse->lasty > (gu->viewSizeY - 2)) { movement.y -= gu->lastFrameTime; disableTracker = true; }
+			if (mouse->lasty > (gu->winSizeY - 2)) { movement.y -= gu->lastFrameTime; disableTracker = true; }
 			if (mouse->lastx >       (screenW - 2)) { movement.x += gu->lastFrameTime; disableTracker = true; }
 			if (mouse->lastx <                  2 ) { movement.x -= gu->lastFrameTime; disableTracker = true; }
 
diff --git a/rts/Game/UI/CursorIcons.cpp b/rts/Game/UI/CursorIcons.cpp
index b2d467d..85bb6d1 100644
--- a/rts/Game/UI/CursorIcons.cpp
+++ b/rts/Game/UI/CursorIcons.cpp
@@ -123,7 +123,7 @@ void CCursorIcons::DrawCursors()
 
 void CCursorIcons::DrawTexts()
 {
-	glViewport(gu->viewPosX, 0, gu->viewSizeX, gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 	glColor4f(1.0f,  1.0f, 1.0f, 1.0f);
 
 	const float fontScale = 1.0f;
@@ -152,7 +152,7 @@ void CCursorIcons::DrawTexts()
 
 void CCursorIcons::DrawBuilds()
 {
-	glViewport(gu->viewPosX, 0, gu->viewSizeX, gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 
 	glEnable(GL_DEPTH_TEST);
 	glColor4f(1.0f, 1.0f, 1.0f, 0.3f);
diff --git a/rts/Game/UI/MiniMap.cpp b/rts/Game/UI/MiniMap.cpp
index 72456a3..f3f0ffe 100644
--- a/rts/Game/UI/MiniMap.cpp
+++ b/rts/Game/UI/MiniMap.cpp
@@ -479,10 +479,11 @@ void CMiniMap::MouseMove(int x, int y, int dx, int dy, int button)
 		xpos = std::max(0, xpos);
 		if (gu->dualScreenMode) {
 			xpos = std::min(gu->winSizeX - width, xpos);
+			ypos = std::max(5, std::min(gu->winSizeY - height, ypos));
 		} else {
 			xpos = std::min(gu->viewSizeX - width, xpos);
+			ypos = std::max(5, std::min(gu->viewSizeY - height, ypos));
 		}
-		ypos = std::max(5, std::min(gu->viewSizeY - height, ypos));
 		UpdateGeometry();
 		return;
 	}
@@ -656,7 +657,7 @@ void CMiniMap::MoveView(int x, int y)
 	}
 	float3 clickPos;
 	clickPos.x = (float(x - xpos)) / width * gs->mapx * 8;
-	clickPos.z = (float(y - (gu->viewSizeY - ypos - height))) / height * gs->mapy * 8;
+	clickPos.z = (float(y - ((gu->dualScreenMode ? (gu->winSizeY ):gu->viewSizeY) - ypos - height))) / height * gs->mapy * 8;
 	camHandler->GetCurrentController().SetPos(clickPos);
 	unitTracker.Disable();
 }
@@ -809,7 +810,7 @@ float3 CMiniMap::GetMapPosition(int x, int y) const
 	const float mapX = gs->mapx * SQUARE_SIZE;
 	const float mapY = gs->mapy * SQUARE_SIZE;
 	const float3 pos(mapX * float(x - xpos) / width, mapHeight,
-	                 mapY * float(y - (gu->viewSizeY - ypos - height)) / height);
+	                 mapY * float(y - ((gu->dualScreenMode ? (gu->winSizeY ):gu->viewSizeY) - ypos - height)) / height);
 	return pos;
 }
 
@@ -931,7 +932,7 @@ std::string CMiniMap::GetTooltip(int x, int y)
 	}
 
 	const float3 pos(float(x-xpos)/width*gs->mapx*SQUARE_SIZE, 500,
-	                 float(y-(gu->viewSizeY-ypos-height))/height*gs->mapx*SQUARE_SIZE);
+	                 float(y-((gu->dualScreenMode ? (gu->winSizeY ):gu->viewSizeY)-ypos-height))/height*gs->mapx*SQUARE_SIZE);
 	return CTooltipConsole::MakeGroundString(pos);
 }
 
@@ -1212,7 +1213,7 @@ void CMiniMap::DrawForReal()
 		glLineWidth(1.0f);
 	}
 
-	glViewport(gu->viewPosX, 0, gu->viewSizeX, gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 
 	cursorIcons.Enable(true);
 	setSurfaceCircleFunc(NULL);
@@ -1257,7 +1258,7 @@ void CMiniMap::DrawMinimizedButton()
 	glLineWidth(1.0f);
 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 
-	glViewport(gu->viewPosX, 0, gu->viewSizeX, gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 }
 
 
diff --git a/rts/Game/UI/MouseCursor.cpp b/rts/Game/UI/MouseCursor.cpp
index f67734b..2ba3d57 100644
--- a/rts/Game/UI/MouseCursor.cpp
+++ b/rts/Game/UI/MouseCursor.cpp
@@ -303,7 +303,7 @@ void CMouseCursor::Draw(int x, int y, float scale)
 	glAlphaFunc(GL_GREATER, 0.01f);
 	glColor4f(1,1,1,1);
 
-	glViewport(xp, gu->viewSizeY - yp, xs, ys);
+	glViewport(xp, gu->winSizeY - yp, xs, ys);
 
 	glBegin(GL_QUADS);
 		glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f);
@@ -312,7 +312,7 @@ void CMouseCursor::Draw(int x, int y, float scale)
 		glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 0.0f, 0.0f);
 	glEnd();
 
-	glViewport(gu->viewPosX, 0, gu->viewSizeX, gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 }
 
 
@@ -328,7 +328,7 @@ void CMouseCursor::DrawQuad(int x, int y)
 	const int xp = int(float(x) - (float(xofs) * scale));
 	const int yp = int(float(y) - (float(ys) - (float(yofs) * scale)));
 
-	glViewport(gu->viewPosX + xp, yp, xs, ys);
+	glViewport(gu->viewPosX + xp, gu->viewPosY + yp, xs, ys);
 
 	glBegin(GL_QUADS);
 	 	glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f);
diff --git a/rts/Game/UI/MouseHandler.cpp b/rts/Game/UI/MouseHandler.cpp
index 86c9d34..470fa59 100644
--- a/rts/Game/UI/MouseHandler.cpp
+++ b/rts/Game/UI/MouseHandler.cpp
@@ -169,7 +169,8 @@ void CMouseHandler::MouseMove(int x, int y)
 		lasty = y;
 
 		int dx = lastx - (gu->viewSizeX / 2 + gu->viewPosX);
-		int dy = lasty - (gu->viewSizeY / 2 + gu->viewPosY);
+		int dy = lasty - (gu->viewSizeY / 2 /*+ gu->viewPosY*/);
+		//FIXME: this does not work if the viewport is not at the top of the display
 
 		float3 move;
 		move.x = dx;
@@ -558,7 +559,8 @@ void CMouseHandler::WarpMouse(int x, int y)
 {
 	if (!locked) {
 		lastx = x + gu->viewPosX;
-		lasty = y + gu->viewPosY;
+		lasty = y /*+ gu->viewPosY*/;
+		//FIXME: this does not work if the viewport is not at the top of the display
 		mouseInput->SetPos(int2(lastx, lasty));
 	}
 }
@@ -635,7 +637,8 @@ void CMouseHandler::EmptyMsgQueUpdate()
 	}
 
 	lastx = gu->viewSizeX / 2 + gu->viewPosX;
-	lasty = gu->viewSizeY / 2 + gu->viewPosY;
+	lasty = gu->viewSizeY / 2 /*+ gu->viewPosY*/;
+	//FIXME: this does not work if the viewport is not at the top of the display
 
 	if (gu->active) {
 		mouseInput->SetPos(int2(lastx, lasty));
@@ -666,7 +669,8 @@ void CMouseHandler::HideMouse()
 		SDL_ShowCursor(SDL_DISABLE);
 		mouseInput->SetWMMouseCursor(NULL);
 		lastx = gu->viewSizeX / 2 + gu->viewPosX;
-		lasty = gu->viewSizeY / 2 + gu->viewPosY;
+		lasty = gu->viewSizeY / 2 /*+ gu->viewPosY*/;
+		//FIXME: this does not work if the viewport is not at the top of the display
 		mouseInput->SetPos(int2(lastx, lasty));
 		hide = true;
 	}
diff --git a/rts/Lua/LuaUnsyncedRead.cpp b/rts/Lua/LuaUnsyncedRead.cpp
index 52cd5fd..63a425c 100644
--- a/rts/Lua/LuaUnsyncedRead.cpp
+++ b/rts/Lua/LuaUnsyncedRead.cpp
@@ -1217,7 +1217,7 @@ int LuaUnsyncedRead::TraceScreenRay(lua_State* L)
 	const bool useMiniMap = (lua_isboolean(L, 4) && lua_toboolean(L, 4));
 
 	const int wx = mx + gu->viewPosX;
-	const int wy = gu->viewSizeY - 1 - my - gu->viewPosY;
+	const int wy = gu->viewSizeY - 1 - my /*- gu->viewPosY*/;
 
 	if (useMiniMap && (minimap != NULL) && !minimap->GetMinimized()) {
 		const int px = minimap->GetPosX() - gu->viewPosX; // for left dualscreen
diff --git a/rts/Rendering/Env/AdvSky.cpp b/rts/Rendering/Env/AdvSky.cpp
index f5a909e..30dc053 100644
--- a/rts/Rendering/Env/AdvSky.cpp
+++ b/rts/Rendering/Env/AdvSky.cpp
@@ -797,7 +797,7 @@ void CAdvSky::CreateDetailTex(void)
 //	SwapBuffers(hDC);
 //	SleepEx(500,true);
 
-	glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 	glEnable(GL_DEPTH_TEST);
 }
 
diff --git a/rts/Rendering/Env/AdvTreeGenerator.cpp b/rts/Rendering/Env/AdvTreeGenerator.cpp
index ed2f5a5..caf5a7b 100644
--- a/rts/Rendering/Env/AdvTreeGenerator.cpp
+++ b/rts/Rendering/Env/AdvTreeGenerator.cpp
@@ -355,7 +355,7 @@ void CAdvTreeGenerator::CreateFarTex()
 	glDisable( GL_VERTEX_PROGRAM_ARB );
 	glDisable(GL_ALPHA_TEST);
 
-	glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 	glMatrixMode(GL_PROJECTION);
 	glPopMatrix();
 	glMatrixMode(GL_MODELVIEW);
@@ -824,7 +824,7 @@ void CAdvTreeGenerator::CreateLeafTex(unsigned int baseTex, int xpos, int ypos,u
 		}
 	}
 
-	glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 	glMatrixMode(GL_PROJECTION);
 	glPopMatrix();
 	glMatrixMode(GL_MODELVIEW);
diff --git a/rts/Rendering/Env/AdvWater.cpp b/rts/Rendering/Env/AdvWater.cpp
index 991f357..2f1baec 100644
--- a/rts/Rendering/Env/AdvWater.cpp
+++ b/rts/Rendering/Env/AdvWater.cpp
@@ -330,7 +330,7 @@ void CAdvWater::UpdateWater(CGame* game)
 
 	FBO::Unbind();
 
-	glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 	glClearColor(mapInfo->atmosphere.fogColor[0],mapInfo->atmosphere.fogColor[1],mapInfo->atmosphere.fogColor[2],1);
 
 //	delete camera;
diff --git a/rts/Rendering/Env/BumpWater.cpp b/rts/Rendering/Env/BumpWater.cpp
index 4aabdba..bbd443d 100644
--- a/rts/Rendering/Env/BumpWater.cpp
+++ b/rts/Rendering/Env/BumpWater.cpp
@@ -727,7 +727,7 @@ void CBumpWater::UpdateWater(CGame* game)
 	if (reflection>0) DrawReflection(game);
 	if (reflection || refraction) {
 		FBO::Unbind();
-		glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+		glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 	}
 	glPopAttrib();
 }
@@ -1077,7 +1077,7 @@ void CBumpWater::UpdateCoastmap()
 	glGenerateMipmapEXT(GL_TEXTURE_2D);
 
 	glUseProgram(0);
-	glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 
 	//coastFBO.Unattach(GL_COLOR_ATTACHMENT1_EXT);
 	coastFBO.Unbind();
@@ -1151,7 +1151,7 @@ void CBumpWater::UpdateDynWaves(const bool initialize)
 		glPopMatrix();
 	glMatrixMode(GL_MODELVIEW);
 		glPopMatrix();
-	glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 
 	dynWavesFBO.Unbind();
 
diff --git a/rts/Rendering/Env/CubeMapHandler.cpp b/rts/Rendering/Env/CubeMapHandler.cpp
index 566a88a..13e4fc6 100644
--- a/rts/Rendering/Env/CubeMapHandler.cpp
+++ b/rts/Rendering/Env/CubeMapHandler.cpp
@@ -147,7 +147,7 @@ void CubeMapHandler::CreateReflectionFace(unsigned int glType, const float3& cam
 
 	//! we do this later to save render context switches (this is one of the slowest opengl operations!)
 	// reflectionCubeFBO.Unbind();
-	// glViewport(gu->viewPosX, 0, gu->viewSizeX, gu->viewSizeY);
+	// glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 	glPopAttrib();
 
 	game->SetDrawMode(CGame::normalDraw);
diff --git a/rts/Rendering/Env/DynWater.cpp b/rts/Rendering/Env/DynWater.cpp
index 006bce4..aa5ff92 100644
--- a/rts/Rendering/Env/DynWater.cpp
+++ b/rts/Rendering/Env/DynWater.cpp
@@ -482,7 +482,7 @@ void CDynWater::DrawReflection(CGame* game)
 	drawReflection=false;
 	glDisable(GL_CLIP_PLANE2);
 
-	glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 	glClearColor(mapInfo->atmosphere.fogColor[0],mapInfo->atmosphere.fogColor[1],mapInfo->atmosphere.fogColor[2],1);
 
 //	delete camera;
@@ -537,7 +537,7 @@ void CDynWater::DrawRefraction(CGame* game)
 	drawRefraction=false;
 
 
-	glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 	glClearColor(mapInfo->atmosphere.fogColor[0],mapInfo->atmosphere.fogColor[1],mapInfo->atmosphere.fogColor[2],1);
 
 	unitDrawer->unitSunColor=oldsun;
diff --git a/rts/Rendering/Env/GrassDrawer.cpp b/rts/Rendering/Env/GrassDrawer.cpp
index 2756ead..45cbadc 100644
--- a/rts/Rendering/Env/GrassDrawer.cpp
+++ b/rts/Rendering/Env/GrassDrawer.cpp
@@ -774,7 +774,7 @@ void CGrassDrawer::CreateFarTex(void)
 //	CBitmap bm(buf,1024*sizeMod,64*sizeMod);
 //	bm.Save("fartex.bmp");
 
-	glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 	glMatrixMode(GL_PROJECTION);
 	glPopMatrix();
 	glMatrixMode(GL_MODELVIEW);
diff --git a/rts/Rendering/FartextureHandler.cpp b/rts/Rendering/FartextureHandler.cpp
index d74efeb..072426c 100644
--- a/rts/Rendering/FartextureHandler.cpp
+++ b/rts/Rendering/FartextureHandler.cpp
@@ -190,7 +190,7 @@ void CFartextureHandler::ReallyCreateFarTexture(S3DModel* model)
 	}
 	unitDrawer->CleanUpUnitDrawing();
 
-	glViewport(gu->viewPosX, 0, gu->viewSizeX, gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 
 	usedFarTextures++;
 
diff --git a/rts/Rendering/Screenshot.cpp b/rts/Rendering/Screenshot.cpp
index 5191347..fe232b4 100644
--- a/rts/Rendering/Screenshot.cpp
+++ b/rts/Rendering/Screenshot.cpp
@@ -107,7 +107,7 @@ void TakeScreenshot(std::string type)
 	if (filesystem.CreateDirectory("screenshots"))
 	{
 		FunctionArgs args;
-		args.x = gu->dualScreenMode? gu->viewSizeX << 1: gu->viewSizeX;
+		args.x = gu->dualScreenMode? gu->winSizeX : gu->viewSizeX;
 		args.y = gu->viewSizeY;
 
 		if (args.x % 4)
diff --git a/rts/Rendering/ShadowHandler.cpp b/rts/Rendering/ShadowHandler.cpp
index 0dbbdbe..165c555 100644
--- a/rts/Rendering/ShadowHandler.cpp
+++ b/rts/Rendering/ShadowHandler.cpp
@@ -262,7 +262,7 @@ void CShadowHandler::CreateShadows(void)
 
 	//we do this later to save render context switches (this is one of the slowest opengl operations!)
 	//fb.Unbind();
-	//glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	//glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 }
 
 
diff --git a/rts/Sim/Projectiles/ProjectileHandler.cpp b/rts/Sim/Projectiles/ProjectileHandler.cpp
index a02fa5b..cb723b2 100644
--- a/rts/Sim/Projectiles/ProjectileHandler.cpp
+++ b/rts/Sim/Projectiles/ProjectileHandler.cpp
@@ -1195,7 +1195,7 @@ void CProjectileHandler::UpdatePerlin()
 		size*=2;
 	}
 	perlinFB.Unbind();
-	glViewport(gu->viewPosX,0,gu->viewSizeX,gu->viewSizeY);
+	glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY);
 
 	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 	glEnable(GL_DEPTH_TEST);
 
 
- 
  xinerama-cmake.patch (1,327 bytes)  2010-01-20 18:29  
diff --git a/rts/build/cmake/FindXinerama.cmake b/rts/build/cmake/FindXinerama.cmake
new file mode 100644
index 0000000..1e579fc
--- /dev/null
+++ b/rts/build/cmake/FindXinerama.cmake
@@ -0,0 +1,45 @@
+# - Find the Xinerama include file and library
+#
+
+SET(Xinerama_INC_SEARCH_PATH
+/usr/X11R6/include
+/usr/local/include
+/usr/include/X11
+/usr/openwin/include
+/usr/openwin/share/include
+/opt/graphics/OpenGL/include
+/usr/include)
+
+SET(Xinerama_LIB_SEARCH_PATH
+/usr/X11R6/lib
+/usr/local/lib
+/usr/openwin/lib
+/usr/lib)
+
+
+FIND_PATH(Xinerama_INCLUDE_DIR X11/extensions/Xinerama.h
+${Xinerama_INC_SEARCH_PATH})
+
+FIND_LIBRARY(Xinerama_LIBRARIES NAMES Xinerama PATH ${Xinerama_LIB_SEARCH_PATH})
+
+IF(Xinerama_INCLUDE_DIR AND Xinerama_LIBRARIES)
+SET(Xinerama_FOUND TRUE)
+ELSE(Xinerama_INCLUDE_DIR AND Xinerama_LIBRARIES)
+SET(Xinerama_FOUND FALSE)
+ENDIF(Xinerama_INCLUDE_DIR AND Xinerama_LIBRARIES)
+
+IF(Xinerama_FOUND)
+INCLUDE(CheckLibraryExists)
+
+CHECK_LIBRARY_EXISTS(${Xinerama_LIBRARIES}
+"XineramaQueryScreens"
+${Xinerama_LIBRARIES}
+Xinerama_HAS_QUERY)
+
+IF(NOT Xinerama_HAS_QUERY AND Xinerama_FIND_REQUIRED)
+MESSAGE(FATAL_ERROR "Could NOT find Xinerama")
+ENDIF(NOT Xinerama_HAS_QUERY AND Xinerama_FIND_REQUIRED)
+ENDIF(Xinerama_FOUND)
+
+MARK_AS_ADVANCED(Xinerama_INCLUDE_DIR Xinerama_LIBRARIES)
+
 
 
  | 
|---|