Description: Enable Xinerama support for NX
 This patch adds Xinerama awareness to NX agent windows.
 .
 The advantage of Xinerama awareness is that an NX session window
 will only maximize to the dimensions of the active physical
 display.
Forwarded: pending
Author: Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de>
Last-Update: 2012-01-13
--- a/nx-X11/config/cf/host.def
+++ b/nx-X11/config/cf/host.def
@@ -686,7 +686,7 @@
  *
 #define BuildXinerama		NO
  */
-#define BuildXinerama		NO
+#define BuildXinerama		YES
 
 /*
  * If you don't want to build support for the GLX extension, uncomment this.
--- a/nx-X11/config/cf/X11.tmpl
+++ b/nx-X11/config/cf/X11.tmpl
@@ -456,7 +456,7 @@
 #define BuildXinerama		NO
 #endif
 #ifndef BuildXineramaLibrary
-#define BuildXineramaLibrary	(BuildXinerama && !BuildServersOnly)
+#define BuildXineramaLibrary	(BuildXinerama)
 #endif
 #ifndef BuildDmxDevelTools
 #define BuildDmxDevelTools	NO
--- a/nx-X11/lib/Xinerama/Xinerama.c
+++ b/nx-X11/lib/Xinerama/Xinerama.c
@@ -34,7 +34,7 @@
 #include <X11/extensions/panoramiXext.h>
 #include <X11/extensions/panoramiXproto.h>
 #include <X11/extensions/Xinerama.h>
-
+#include <stdio.h>
 
 static XExtensionInfo _panoramiX_ext_info_data;
 static XExtensionInfo *panoramiX_ext_info = &_panoramiX_ext_info_data;
@@ -249,6 +249,16 @@
     xXineramaIsActiveReq  	*req;
     XExtDisplayInfo 		*info = find_display (dpy);
 
+
+    FILE* fptr;
+    if((fptr=fopen(getenv("NX_XINERAMA_CONF"),"r"))!=NULL) {
+	fclose (fptr);
+	return True;
+    }
+    else {
+	return False;
+    }
+
     if(!XextHasExtension(info))
 	return False;  /* server doesn't even have the extension */
 
@@ -266,7 +276,6 @@
     return rep.state;
 }
 
-#include <stdio.h>
 
 XineramaScreenInfo * 
 XineramaQueryScreens(
@@ -279,39 +288,72 @@
     xXineramaQueryScreensReq	*req;
     XineramaScreenInfo		*scrnInfo = NULL;
 
-    PanoramiXCheckExtension (dpy, info, 0);
+    int i;
+    int x,y,w,h;
+    FILE* fptr;
+    if((fptr=fopen(getenv("NX_XINERAMA_CONF"),"r"))==NULL) {
+	PanoramiXCheckExtension (dpy, info, 0);
+	LockDisplay (dpy);
+	GetReq (XineramaQueryScreens, req);
+	req->reqType = info->codes->major_opcode;
+	req->panoramiXReqType = X_XineramaQueryScreens;
+	if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) {
+	    UnlockDisplay (dpy);
+	    SyncHandle ();
+	    return NULL;
+	}
+	if(rep.number) {
+	    if((scrnInfo = Xmalloc(sizeof(XineramaScreenInfo) * rep.number))) {
+		xXineramaScreenInfo scratch;
+		int i;
+
+		for(i = 0; i < rep.number; i++) {
+		    _XRead(dpy, (char*)(&scratch), sz_XineramaScreenInfo);
+		    scrnInfo[i].screen_number = i;
+		    scrnInfo[i].x_org    = scratch.x_org;
+		    scrnInfo[i].y_org    = scratch.y_org;
+		    scrnInfo[i].width    = scratch.width;
+		    scrnInfo[i].height           = scratch.height;
+		}
+
+		*number = rep.number;
+	    } else {
+		_XEatData(dpy, rep.length << 2);
+	    }
+	}
 
-    LockDisplay (dpy);
-    GetReq (XineramaQueryScreens, req);
-    req->reqType = info->codes->major_opcode;
-    req->panoramiXReqType = X_XineramaQueryScreens;
-    if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) {
 	UnlockDisplay (dpy);
 	SyncHandle ();
-	return NULL;
-    }
 
-    if(rep.number) {
-	if((scrnInfo = Xmalloc(sizeof(XineramaScreenInfo) * rep.number))) {
-	    xXineramaScreenInfo scratch;
-	    int i;
-
-	    for(i = 0; i < rep.number; i++) {
-		_XRead(dpy, (char*)(&scratch), sz_XineramaScreenInfo);
-		scrnInfo[i].screen_number = i;
-		scrnInfo[i].x_org 	  = scratch.x_org;
-		scrnInfo[i].y_org 	  = scratch.y_org;
-		scrnInfo[i].width 	  = scratch.width;
-		scrnInfo[i].height 	  = scratch.height;
-	    }
+    } else {
 
-	    *number = rep.number;
-	} else
-	    _XEatData(dpy, rep.length << 2);
+	i=0;
+	while(!feof(fptr)) {
+	    w=h=0;
+	    fscanf(fptr,"%d %d %d %d",&x,&y,&w,&h);
+	    if(w&&h)
+	    i++;
+	}
+	rewind(fptr);
+	*number=i;
+	if((scrnInfo = Xmalloc(sizeof(XineramaScreenInfo) * i))) {
+	    i=0;
+	    while(!feof(fptr)){
+		w=h=0;
+		fscanf(fptr,"%d %d %d %d",&x,&y,&w,&h);
+		if(w&&h){
+		    scrnInfo[i].screen_number=i;
+		    scrnInfo[i].x_org=x;
+		    scrnInfo[i].y_org=y;
+		    scrnInfo[i].width=w;
+		    scrnInfo[i].height=h;
+		    i++;
+		}
+	    }
+	}
+	fclose(fptr);
     }
 
-    UnlockDisplay (dpy);
-    SyncHandle ();
     return scrnInfo;
 }
 
--- a/nx-X11/programs/Xserver/hw/nxagent/Imakefile
+++ b/nx-X11/programs/Xserver/hw/nxagent/Imakefile
@@ -206,7 +206,7 @@
           -UNX_DEBUG_INPUT \
 	  -DRANDR_10_INTERFACE \
 	  -DRANDR_12_INTERFACE \
-          -UPANORAMIX \
+          -DPANORAMIX \
           -UDEBUG_TREE
 
 all:: $(OBJS)
--- a/nx-X11/programs/Xserver/hw/nxagent/X/NXxvdisp.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/X/NXxvdisp.c
@@ -275,17 +275,19 @@
     case xv_PutVideo:
 #ifdef PANORAMIX
         if(!noPanoramiXExtension)
-            result = (XineramaXvPutVideo(client)); break;
+            result = (XineramaXvPutVideo(client));
         else
 #endif
-            result = (ProcXvPutVideo(client)); break;
+            result = (ProcXvPutVideo(client));
+            break;
     case xv_PutStill:
 #ifdef PANORAMIX
         if(!noPanoramiXExtension)
-            result = (XineramaXvPutStill(client)); break
+            result = (XineramaXvPutStill(client));
         else
 #endif
-    	    result = (ProcXvPutStill(client)); break;
+    	    result = (ProcXvPutStill(client));
+    	    break;
     case xv_GetVideo: result = (ProcXvGetVideo(client)); break;
     case xv_GetStill: result = (ProcXvGetStill(client)); break;
     case xv_GrabPort: result = (ProcXvGrabPort(client)); break;
@@ -295,35 +297,39 @@
     case xv_StopVideo: 
 #ifdef PANORAMIX
         if(!noPanoramiXExtension)
-	    result = (XineramaXvStopVideo(client)); break;
+	    result = (XineramaXvStopVideo(client));
 	else
 #endif
-	    result = (ProcXvStopVideo(client)); break;
+	    result = (ProcXvStopVideo(client));
+            break;
     case xv_SetPortAttribute: 
 #ifdef PANORAMIX
         if(!noPanoramiXExtension)
-	    result = (XineramaXvSetPortAttribute(client)); break;
+	    result = (XineramaXvSetPortAttribute(client));
 	else
 #endif
-	    result = (ProcXvSetPortAttribute(client)); break;
+	    result = (ProcXvSetPortAttribute(client));
+            break;
     case xv_GetPortAttribute: result = (ProcXvGetPortAttribute(client)); break;
     case xv_QueryBestSize: result = (ProcXvQueryBestSize(client)); break;
     case xv_QueryPortAttributes: result = (ProcXvQueryPortAttributes(client)); break;
     case xv_PutImage:
 #ifdef PANORAMIX
         if(!noPanoramiXExtension)
-	    result = (XineramaXvPutImage(client)); break;
+	    result = (XineramaXvPutImage(client));
 	else
 #endif
-	    result = (ProcXvPutImage(client)); break;
+	    result = (ProcXvPutImage(client));
+            break;
 #ifdef MITSHM
     case xv_ShmPutImage: 
 #ifdef PANORAMIX
         if(!noPanoramiXExtension)
-	    result = (XineramaXvShmPutImage(client)); break;
+	    result = (XineramaXvShmPutImage(client));
 	else
 #endif
-	    result = (ProcXvShmPutImage(client)); break;
+	    result = (ProcXvShmPutImage(client));
+	    break;
 #endif
     case xv_QueryImageAttributes: result = (ProcXvQueryImageAttributes(client)); break;
     case xv_ListImageFormats: result = (ProcXvListImageFormats(client)); break;
--- a/nx-X11/programs/Xserver/Imakefile
+++ b/nx-X11/programs/Xserver/Imakefile
@@ -1021,7 +1021,7 @@
 #else
 NXAGENTNXLIBS = -L ../../../nxcomp -L ../../../nxcompext -L ../../../nxcompshad \
                 -lXcomp -lXcompext -lXcompshad -lXrender -lX11 -lXext -lXfixes \
-                -L../../../nx-X11/exports/lib -lXtst -lXdamage -lXrandr -lXcomposite
+                -L../../../nx-X11/exports/lib -lXtst -lXdamage -lXrandr -lXcomposite -lXinerama
 #endif
 
 #endif
--- a/nx-X11/programs/Xserver/Xext/panoramiX.c
+++ b/nx-X11/programs/Xserver/Xext/panoramiX.c
@@ -1045,16 +1045,7 @@
     rep.type = X_Reply;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
-#if 1
-    {
-	/* The following hack fools clients into thinking that Xinerama
-	 * is disabled even though it is not. */
-	extern Bool PanoramiXExtensionDisabledHack;
-	rep.state = !noPanoramiXExtension && !PanoramiXExtensionDisabledHack;
-    }
-#else
     rep.state = !noPanoramiXExtension;
-#endif
     if (client->swapped) {
 	register int n;
 	swaps (&rep.sequenceNumber, n);
--- a/nx-X11/programs/Xserver/Xext/panoramiX.h
+++ b/nx-X11/programs/Xserver/Xext/panoramiX.h
@@ -44,7 +44,7 @@
 #define _PANORAMIX_H_
 
 #include <X11/extensions/panoramiXext.h>
-#include "gcstruct.h"
+/*#include "gcstruct.h"*/
 
 
 typedef struct _PanoramiXData {
