On 06/08/2012 08:17 PM, Kristian Høgsberg wrote:
On Fri, Jun 08, 2012 at 08:10:49PM +0300, Tiago Vignatti wrote:
Signed-off-by: Tiago Vignatti<[email protected]>
---
I haven't thought much whether xwm now will really need to grab the pointer
during move/resize.
Ah, this was only half of what we discussed in IRC. This still sends
button release events to happens to receive the pointer.
so it turned out that X is not sending those unwanted synthetic release
events with my patch after all. It's posting the events at
pointer_handle_enter when buttons are down, which happens, if I
understood correctly, only when a grab is being performed i.e. exactly when:
1) a click happened at the title-bar
2) mod+click binding is triggered to move the window
but on 2) the compositor is never going to send the events for xwayland
cause the binding swallows it (that was what we were missing in our IRC
chat last Fri). So the synthetic event ends up generated in fact only
for 1), which address the problem we're having.
Now I'm not sure if we need to change a bit our grab logic to make X
behave "as expected", sending the synthetic event at 2) as well. Seems
we'd need to swap weston_compositor_run_button_binding with
grab->interface->button() inside notify_button, and then go for the
solution of grabbing the device inside X to not send the event. But I
don't see a reason for that now.
Tiago
We just need
to clear the state, not send out events, since the buttons have
already been released. How about just
dev->button->down = 0;
Kristian
hw/xfree86/xwayland/xwayland-input.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/hw/xfree86/xwayland/xwayland-input.c
b/hw/xfree86/xwayland/xwayland-input.c
index 517ad30..079ba4f 100644
--- a/hw/xfree86/xwayland/xwayland-input.c
+++ b/hw/xfree86/xwayland/xwayland-input.c
@@ -275,10 +275,18 @@ pointer_handle_enter(void *data, struct wl_pointer
*pointer,
xwl_seat->xwl_screen->serial = serial;
xwl_seat->pointer_enter_serial = serial;
+ DeviceIntPtr dev = xwl_seat->pointer;
+ int i;
xwl_seat->focus_window = wl_surface_get_user_data(surface);
SetDeviceRedirectWindow(xwl_seat->pointer,
xwl_seat->focus_window->window);
+
+ /* grab swallows all events until it's over, so we need to send synthetic
+ * release events on this case */
+ for (i = 0; i< dev->button->numButtons; i++)
+ if (BitIsOn(dev->button->down, i))
+ xf86PostButtonEvent(dev, TRUE, i, 0, 0, 0);
}
static void
--
1.7.9.5
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel