[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