Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 May 2010 15:27:09 +0200
From:      Alexey Shuvaev <shuvaev@physik.uni-wuerzburg.de>
To:        freebsd-x11@freebsd.org
Cc:        Tom Russo <russo@bogodyn.org>, freebsd-ports@freebsd.org
Subject:   Xorg 7.5 and Openmotif applications.
Message-ID:  <20100511132709.GA47986@wep4035.physik.uni-wuerzburg.de>

next in thread | raw e-mail | index | archive | help

--82I3+IH0IqGh5yIs
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hello list!

There seems to be a known/fixed bug in new xserver that leads to
(many|all?) motif-based applications to malfunction:
https://bugs.freedesktop.org/show_bug.cgi?id=25400

There are already at least 2 PRs opened against individual ports:
http://www.freebsd.org/cgi/query-pr.cgi?pr=146383
http://www.freebsd.org/cgi/query-pr.cgi?pr=146380

I think it is wrong to patch applications when the fault seems to be
in the server. Now I am running patched xserver with the patch pulled
from the upstream git master:
http://cgit.freedesktop.org/xorg/xserver/commit/?id=1c612acca8568fcdf9761d23f112adaf4d496f1b

I confirm that math/grace now works OK (PR 141383).
I'll watch if the patch causes any side effects (nothing so far).
What about dropping attached patch to x11-servers/xorg-server/files?

Cross-posting to ports@ as the bug already leaked in the individual
ports' PRs.

Thanks,
Alexey.

--82I3+IH0IqGh5yIs
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="patch-dix-events.c"

>From 1c612acca8568fcdf9761d23f112adaf4d496f1b Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Wed, 17 Mar 2010 04:32:38 +0000
Subject: dix: if owner-events is true for passive grabs, add the window mask (#25400)

A client requesting a GrabModeSync button grab, owner-events true, with only
the ButtonRelease mask set would never receive the press event even if the
grab window had the ButtonPress mask set.

The protocol requires that if owner-events is true, then the delivery mask
is the combination of the grab mask + the window event mask.

X.Org Bug 25400 <http://bugs.freedesktop.org/show_bug.cgi?id=25400>;

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Tested-by: Jim Ramsay <i.am@jimramsay.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
---
diff --git a/dix/events.c b/dix/events.c
index 0e9bc31..6541652 100644
--- dix/events.c.orig
+++ dix/events.c
@@ -3552,6 +3552,8 @@ CheckPassiveGrabsOnWindow(
                 xE = &core;
                 count = 1;
                 mask = grab->eventMask;
+                if (grab->ownerEvents)
+                    mask |= pWin->eventMask;
             } else if (match & XI2_MATCH)
             {
                 rc = EventToXI2((InternalEvent*)event, &xE);
@@ -3573,6 +3575,24 @@ CheckPassiveGrabsOnWindow(
                     mask = grab->xi2mask[device->id][((xGenericEvent*)xE)->evtype/8];
                 else if (event->type == XI_Enter || event->type == XI_FocusIn)
                     mask = grab->xi2mask[device->id][event->type/8];
+
+                if (grab->ownerEvents && wOtherInputMasks(grab->window))
+                {
+                    InputClientsPtr icp =
+                        wOtherInputMasks(grab->window)->inputClients;
+
+                    while(icp)
+                    {
+                        if (rClient(icp) == rClient(grab))
+                        {
+                            int evtype = (xE) ? ((xGenericEvent*)xE)->evtype : event->type;
+                            mask |= icp->xi2mask[device->id][evtype/8];
+                            break;
+                        }
+
+                        icp = icp->next;
+                    }
+                }
             } else
             {
                 rc = EventToXI((InternalEvent*)event, &xE, &count);
@@ -3584,6 +3604,22 @@ CheckPassiveGrabsOnWindow(
                     continue;
                 }
                 mask = grab->eventMask;
+                if (grab->ownerEvents && wOtherInputMasks(grab->window))
+                {
+                    InputClientsPtr icp =
+                        wOtherInputMasks(grab->window)->inputClients;
+
+                    while(icp)
+                    {
+                        if (rClient(icp) == rClient(grab))
+                        {
+                            mask |= icp->mask[device->id];
+                            break;
+                        }
+
+                        icp = icp->next;
+                    }
+                }
             }
 
 	    (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE);

--82I3+IH0IqGh5yIs--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100511132709.GA47986>