From f5da3d6622c22246ac367bd80fc24ea08c9baa2e Mon Sep 17 00:00:00 2001 From: Viktor Odintsev <ninetls@xfce.org> Date: Sun, 14 Apr 2019 15:32:09 +0200 Subject: [PATCH] events: Fix implicit grabs Bug: 14741 With gtk+-3.x and XI2, pressing a window button and moving the pointer out of the window would keep the grab. Keep a reference of the window where the grab occurred to avoid the issue. --- src/client.c | 2 +- src/event_filter.c | 13 ++++++++++++- src/event_filter.h | 7 ++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/client.c b/src/client.c index 8d4569635..b6552ad67 100644 --- a/src/client.c +++ b/src/client.c @@ -3865,7 +3865,7 @@ clientButtonPress (Client *c, Window w, XfwmEventButton *event) frameQueueDraw (c, FALSE); TRACE ("entering button press loop"); - eventFilterPush (display_info->xfilter, clientButtonPressEventFilter, &passdata); + eventFilterPushGrab (display_info->xfilter, clientButtonPressEventFilter, w, &passdata); gtk_main (); eventFilterPop (display_info->xfilter); TRACE ("leaving button press loop"); diff --git a/src/event_filter.c b/src/event_filter.c index 920ede598..313c43445 100644 --- a/src/event_filter.c +++ b/src/event_filter.c @@ -172,7 +172,10 @@ eventXfwmFilter (GdkXEvent *gdk_xevent, GdkEvent *gevent, gpointer data) while ((filterelt) && (loop == EVENT_FILTER_CONTINUE)) { eventFilterStack *filterelt_next = filterelt->next; - loop = (*filterelt->filter) (event, filterelt->data); + if (filterelt->window == None || filterelt->window == event->meta.window) + { + loop = (*filterelt->filter) (event, filterelt->data); + } filterelt = filterelt_next; } @@ -182,6 +185,12 @@ eventXfwmFilter (GdkXEvent *gdk_xevent, GdkEvent *gevent, gpointer data) eventFilterStack * eventFilterPush (eventFilterSetup *setup, XfwmFilter filter, gpointer data) +{ + return eventFilterPushGrab (setup, filter, None, data); +} + +eventFilterStack * +eventFilterPushGrab (eventFilterSetup *setup, XfwmFilter filter, Window window, gpointer data) { g_assert (filter != NULL); if (setup->filterstack) @@ -189,6 +198,7 @@ eventFilterPush (eventFilterSetup *setup, XfwmFilter filter, gpointer data) eventFilterStack *newfilterstack = (eventFilterStack *) g_new (eventFilterStack, 1); newfilterstack->filter = filter; + newfilterstack->window = window; newfilterstack->data = data; newfilterstack->next = setup->filterstack; setup->filterstack = newfilterstack; @@ -198,6 +208,7 @@ eventFilterPush (eventFilterSetup *setup, XfwmFilter filter, gpointer data) setup->filterstack = (eventFilterStack *) g_new (eventFilterStack, 1); setup->filterstack->filter = filter; + setup->filterstack->window = window; setup->filterstack->data = data; setup->filterstack->next = NULL; } diff --git a/src/event_filter.h b/src/event_filter.h index b9f14d073..36cff6cf5 100644 --- a/src/event_filter.h +++ b/src/event_filter.h @@ -47,6 +47,7 @@ typedef eventFilterStatus (*XfwmFilter) (XfwmEvent *event, gpointer data); typedef struct eventFilterStack { XfwmFilter filter; + Window window; gpointer data; struct eventFilterStack *next; } @@ -64,7 +65,11 @@ GdkWindow *eventFilterAddWin (GdkScreen *, long); eventFilterStack *eventFilterPush (eventFilterSetup *, XfwmFilter, - gpointer ); + gpointer); +eventFilterStack *eventFilterPushGrab (eventFilterSetup *, + XfwmFilter, + Window, + gpointer); eventFilterStack *eventFilterPop (eventFilterSetup *); eventFilterSetup *eventFilterInit (XfwmDevices *, gpointer); -- GitLab