Commit d26930d5 authored by Oleksandr Shneyder's avatar Oleksandr Shneyder Committed by Mike Gabriel

Enable Xinerama support for NX (202_nx-X11_enable-xinerama.full.patch).

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.
parent 6aa18cc2
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 {
202_nx-X11_enable-xinerama.full.patch
203_nxagent_disable-rootless-exit.full.patch
204_nxagent_repaint-solidpict.full.patch
205_nxagent_refresh-adsl.full.patch
......
......@@ -456,7 +456,7 @@ XORGRELSTRING = XorgManVersionString
#define BuildXinerama NO
#endif
#ifndef BuildXineramaLibrary
#define BuildXineramaLibrary (BuildXinerama && !BuildServersOnly)
#define BuildXineramaLibrary (BuildXinerama)
#endif
#ifndef BuildDmxDevelTools
#define BuildDmxDevelTools NO
......
......@@ -686,7 +686,7 @@ XCOMM $XFree86: xc/config/cf/xf86site.def,v 3.186 2003/06/25 18:06:22 eich Exp $
*
#define BuildXinerama NO
*/
#define BuildXinerama NO
#define BuildXinerama YES
/*
* If you don't want to build support for the GLX extension, uncomment this.
......
......@@ -34,7 +34,7 @@ Equipment Corporation.
#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 @@ Bool XineramaIsActive(Display *dpy)
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 @@ Bool XineramaIsActive(Display *dpy)
return rep.state;
}
#include <stdio.h>
XineramaScreenInfo *
XineramaQueryScreens(
......@@ -279,39 +288,72 @@ XineramaQueryScreens(
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;
}
......
......@@ -1021,7 +1021,7 @@ NXAGENTNXLIBS = -L ../../../nxcomp -L ../../../nxcompext \
#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
......
......@@ -1045,16 +1045,7 @@ ProcXineramaIsActive(ClientPtr client)
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);
......
......@@ -44,7 +44,7 @@ Equipment Corporation.
#define _PANORAMIX_H_
#include <X11/extensions/panoramiXext.h>
#include "gcstruct.h"
/*#include "gcstruct.h"*/
typedef struct _PanoramiXData {
......
......@@ -206,7 +206,7 @@ DEFINES = -g $(OS_DEFINES) $(EXT_DEFINES) $(UPG_DEFINES) \
-UNX_DEBUG_INPUT \
-DRANDR_10_INTERFACE \
-DRANDR_12_INTERFACE \
-UPANORAMIX \
-DPANORAMIX \
-UDEBUG_TREE
all:: $(OBJS)
......
......@@ -275,17 +275,19 @@ ProcXvDispatch(ClientPtr client)
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 @@ ProcXvDispatch(ClientPtr client)
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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment