[Bug 1846] New: xinerama gives unexpeccted results on unified walls

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Sat Nov 13 21:10:20 PST 2004


Please do not reply to this email: if you want to comment on the bug, go to          
the URL shown below and enter yourcomments there.   
 
https://freedesktop.org/bugzilla/show_bug.cgi?id=1846        
   
           Summary: xinerama gives unexpeccted results on unified walls
           Product: xorg
           Version: CVS_head
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Lib/Xext
        AssignedTo: xorg-bugzilla-noise at freedesktop.org
        ReportedBy: dsouth at llnl.gov


Window managers and other clients that use the Xinerama extensions produce
unexpected results on large, "unified" display walls and projectors.  These
displays generally appear to the user as a single screen, but xinerama
aware apps treat each individual display pane as a seperate screen for
purposes of maximizaion and toolbar/control center placement.  This
in turn can cause issues with window movement.  This is most obvious
when running large Xdmx walls, but also on mutiple-input montiors:

 http://www.llnl.gov/icc/sdd/img/displaywall.shtml
 http://www.llnl.gov/icc/sdd/img/highres.shtml

We've addressed this internally by patching the Xdmx xinerama code
to add a new "+xineramawall" command-line option.  This mode is
identical to +xinerama, but does not report the underlying screens
to xinerama clients, instead reporting that xinerama is not active
and that there is only a single screen.

Since this patch is in the xinerama code, we are submitting to the dmx
project as well as X.org and XF86.  Patch for X.org is below

Index: programs/Xserver/Xserver.man
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/Xserver.man,v
retrieving revision 1.2
diff -u -r1.2 Xserver.man
--- programs/Xserver/Xserver.man        23 Apr 2004 18:44:35 -0000      1.2
+++ programs/Xserver/Xserver.man        13 Nov 2004 22:36:42 -0000
@@ -264,6 +264,9 @@
 .B [+-]xinerama
 enables(+) or disables(-) the XINERAMA extension.  The default state is
 platform and configuration specific.
+.B +xineramawall
+enables the XINERAMA extensions and forces it to report only a large
+single screen to clients.
 .SH SERVER DEPENDENT OPTIONS
 Some X servers accept the following options:
 .TP 8
Index: programs/Xserver/Xext/panoramiX.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/Xext/panoramiX.c,v
retrieving revision 1.3
diff -u -r1.3 panoramiX.c
--- programs/Xserver/Xext/panoramiX.c   30 Jun 2004 20:06:53 -0000      1.3
+++ programs/Xserver/Xext/panoramiX.c   13 Nov 2004 22:36:42 -0000
@@ -1037,7 +1037,11 @@
     rep.type = X_Reply;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
-    rep.state = !noPanoramiXExtension;
+    if (XineramaWall) {
+        rep.state = FALSE;
+    } else {
+        rep.state = !noPanoramiXExtension;
+    }
     if (client->swapped) {
        register int n;
        swaps (&rep.sequenceNumber, n);
@@ -1059,7 +1063,11 @@
 
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.number = (noPanoramiXExtension) ? 0 : PanoramiXNumScreens;
+    if (XineramaWall) {
+        rep.number = (noPanoramiXExtension) ? 0 : 1;
+    } else {
+        rep.number = (noPanoramiXExtension) ? 0 : PanoramiXNumScreens;
+    }
     rep.length = rep.number * sz_XineramaScreenInfo >> 2;
     if (client->swapped) {
        register int n;
@@ -1073,12 +1081,11 @@
        xXineramaScreenInfo scratch;
        int i;
 
-       for(i = 0; i < PanoramiXNumScreens; i++) {
-           scratch.x_org  = panoramiXdataPtr[i].x;
-           scratch.y_org  = panoramiXdataPtr[i].y;
-           scratch.width  = panoramiXdataPtr[i].width;
-           scratch.height = panoramiXdataPtr[i].height;
-
+        if (XineramaWall) {
+            scratch.x_org  = 0;
+            scratch.y_org  = 0;
+            scratch.width  = PanoramiXPixWidth;
+            scratch.height = PanoramiXPixHeight;
            if(client->swapped) {
                register int n;
                swaps (&scratch.x_org, n);
@@ -1087,6 +1094,21 @@
                swaps (&scratch.height, n);
            }
            WriteToClient (client, sz_XineramaScreenInfo, (char *) &scratch);
+        } else {
+            for(i = 0; i < PanoramiXNumScreens; i++) {
+                scratch.x_org  = panoramiXdataPtr[i].x;
+                scratch.y_org  = panoramiXdataPtr[i].y;
+                scratch.width  = panoramiXdataPtr[i].width;
+                scratch.height = panoramiXdataPtr[i].height;
+                if(client->swapped) {
+                    register int n;
+                    swaps (&scratch.x_org, n);
+                    swaps (&scratch.y_org, n);
+                    swaps (&scratch.width, n);
+                    swaps (&scratch.height, n);
+                }
+                WriteToClient (client, sz_XineramaScreenInfo, (char *) &scratch
);
+            }
        }
     }
 
Index: programs/Xserver/hw/dmx/Xdmx.man
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/dmx/Xdmx.man,v
retrieving revision 1.1
diff -u -r1.1 Xdmx.man
--- programs/Xserver/hw/dmx/Xdmx.man    30 Jun 2004 20:06:53 -0000      1.1
+++ programs/Xserver/hw/dmx/Xdmx.man    13 Nov 2004 22:36:43 -0000
@@ -43,6 +43,14 @@
 configuration.  If Xinerama is enabled (e.g., with
 .B +xinerama
 on the command line), the clients see a single large screen.
+If xineramawall is enabled with
+.B +xineramawall
+on the command line, Xinerama will be enabled and
+.I Xdmx
+will only report the single, unified screen back to the clients
+when queried though the Xinerama extensions.  This can be useful
+for forcing "xinerama-aware" window managers to treat the large
+screen as a single desktop.
 .PP
 .I Xdmx
 communicates to the back-end X servers using the standard X11 protocol,
Index: programs/Xserver/include/globals.h
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/include/globals.h,v
retrieving revision 1.5
diff -u -r1.5 globals.h
--- programs/Xserver/include/globals.h  14 Sep 2004 00:51:24 -0000      1.5
+++ programs/Xserver/include/globals.h  13 Nov 2004 22:36:45 -0000
@@ -187,6 +187,7 @@
 
 #ifdef PANORAMIX
 extern Bool noPanoramiXExtension;
+extern Bool XineramaWall;
 #endif
 
 #ifdef XINPUT
Index: programs/Xserver/os/utils.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/os/utils.c,v
retrieving revision 1.9
diff -u -r1.9 utils.c
--- programs/Xserver/os/utils.c 29 Sep 2004 04:17:44 -0000      1.9
+++ programs/Xserver/os/utils.c 13 Nov 2004 22:36:46 -0000
@@ -229,6 +229,7 @@
 #ifdef PANORAMIX
 /* Xinerama is disabled by default unless enabled via +xinerama */
 Bool noPanoramiXExtension = TRUE;
+Bool XineramaWall = FALSE;
 #endif
 #ifdef XINPUT
 Bool noXInputExtension = FALSE;
@@ -665,6 +666,7 @@
 #ifdef PANORAMIX
     ErrorF("+xinerama              Enable XINERAMA extension\n");
     ErrorF("-xinerama              Disable XINERAMA extension\n");
+    ErrorF("+xineramawall          Enable XINERAMA in single screen mode\n");
 #endif
 #ifdef SMART_SCHEDULE
     ErrorF("-dumbSched             Disable smart scheduling, enable old behavio
r\n");
@@ -1028,6 +1030,10 @@
        else if ( strcmp( argv[i], "+xinerama") == 0){
            noPanoramiXExtension = FALSE;
        }
+        else if ( strcmp( argv[i], "+xineramawall") == 0){
+            noPanoramiXExtension = FALSE;
+            XineramaWall = TRUE;
+        }
        else if ( strcmp( argv[i], "-xinerama") == 0){
            noPanoramiXExtension = TRUE;
        }        
   
   
--         
Configure bugmail: https://freedesktop.org/bugzilla/userprefs.cgi?tab=email       
   
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.


More information about the xorg-bugzilla-noise mailing list