Thanks Erik
---
# From: Rik Faith # Subject: Xinerama, extensions, and x2x # Date: Tue, 18 Mar 2003 09:19:10 -0800
[This was posted to [EMAIL PROTECTED] last week, but I didn't get a reply. Sorry if you've seen it twice...]
I recently noticed that several extensions are not "xinerama-aware". For example, Extended-Visual-Information will report visuals for two "screens" even when xdpyinfo reports only one screen present (i.e., because of Xinerama). I suspect an issue with MIT-SCREEN-SAVER but have not investigated -- does anyone use an MIT-SCREEN-SAVER client with Xinerama (beforelight seems to be the only one).
The XTEST extension performs computations relative to the internal screens, even though a client (e.g., x2x) obtains information about a single large Xinerama screen. Below is a patch to Xserver/Xext/test.c that will fix this problem (against the xtest.c that should be in the XFree86 4.3.0 tree). I have verified this patch does not alter the results of the X Test Suite when it is configured to run with the XT_EXTENSIONS=Yes flag. I have also verified that x2x works as expected with this patch, and not without it.
I used: http://www.netsw.org/x11/extensions/x2x/x2x-1.27.tar.gz
(Note that because of the way the other XTEST code (e.g., IIRC, the client-side library) is written, I was unable to write a xinerama-aware client that could do anything to trick XTEST into doing the expected thing. For simplicity, I suggest fixing it here.)
Thanks for your help, Rik Faith
--- xtest.c 14 Dec 2002 03:09:57 -0000 1.1.1.1 +++ xtest.c 13 Mar 2003 21:05:20 -0000 @@ -59,6 +59,11 @@ static unsigned char XTestReqCode; extern int DeviceValuator; #endif /* XINPUT */
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+
static void XTestResetProc(
#if NeedFunctionPrototypes
ExtensionEntry * /* extEntry */
@@ -378,6 +383,33 @@ ProcXTestFakeInput(client)
client->errorValue = ev->u.u.detail;
return BadValue;
}
+
+#ifdef PANORAMIX
+ if (!noPanoramiXExtension) {
+ ScreenPtr pScreen = root->drawable.pScreen;
+ BoxRec box;
+ int i;
+ int x = ev->u.keyButtonPointer.rootX + panoramiXdataPtr[0].x;
+ int y = ev->u.keyButtonPointer.rootY + panoramiXdataPtr[0].y;
+ if (!POINT_IN_REGION(root, &XineramaScreenRegions[pScreen->myNum],
+ x, y, &box)) {
+ FOR_NSCREENS(i) {
+ if (i == pScreen->myNum) continue;
+ if (POINT_IN_REGION(pScreen,
+ &XineramaScreenRegions[i],
+ x, y, &box)) {
+ root = WindowTable[i];
+ x -= panoramiXdataPtr[i].x;
+ y -= panoramiXdataPtr[i].y;
+ ev->u.keyButtonPointer.rootX = x;
+ ev->u.keyButtonPointer.rootY = y;
+ break;
+ }
+ }
+ }
+ }
+#endif
+
if (ev->u.keyButtonPointer.rootX < 0)
ev->u.keyButtonPointer.rootX = 0;
else if (ev->u.keyButtonPointer.rootX >= root->drawable.width)
@@ -386,7 +418,15 @@ ProcXTestFakeInput(client)
ev->u.keyButtonPointer.rootY = 0;
else if (ev->u.keyButtonPointer.rootY >= root->drawable.height)
ev->u.keyButtonPointer.rootY = root->drawable.height - 1;
+
+#ifdef PANORAMIX
+ if ((!noPanoramiXExtension
+ && root->drawable.pScreen->myNum != XineramaGetCursorScreen())
+ || (noPanoramiXExtension && root != GetCurrentRootWindow()))
+
+#else
if (root != GetCurrentRootWindow())
+#endif
{
NewCurrentScreen(root->drawable.pScreen,
ev->u.keyButtonPointer.rootX,
_______________________________________________ Devel mailing list [EMAIL PROTECTED] http://XFree86.Org/mailman/listinfo/devel
