aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/Xinerama/Xinerama.c
diff options
context:
space:
mode:
authorOleksandr Shneyder <oleksandr.shneyder@obviously-nice.de>2015-02-10 19:23:16 +0100
committerMike Gabriel <mike.gabriel@das-netzwerkteam.de>2015-02-10 19:40:54 +0100
commitd26930d59838e2a8305c66b67aaa163db157920c (patch)
treed927b29830bcbe4e57b30656790b76584132c02f /nx-X11/lib/Xinerama/Xinerama.c
parent6aa18cc28c4adee20b7a6494c8acb430380c4c98 (diff)
downloadnx-libs-d26930d59838e2a8305c66b67aaa163db157920c.tar.gz
nx-libs-d26930d59838e2a8305c66b67aaa163db157920c.tar.bz2
nx-libs-d26930d59838e2a8305c66b67aaa163db157920c.zip
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.
Diffstat (limited to 'nx-X11/lib/Xinerama/Xinerama.c')
-rw-r--r--nx-X11/lib/Xinerama/Xinerama.c98
1 files changed, 70 insertions, 28 deletions
diff --git a/nx-X11/lib/Xinerama/Xinerama.c b/nx-X11/lib/Xinerama/Xinerama.c
index 43084b213..fd717dd22 100644
--- a/nx-X11/lib/Xinerama/Xinerama.c
+++ b/nx-X11/lib/Xinerama/Xinerama.c
@@ -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;
}