This is an automated email from the git hooks/post-receive script. o l i v i e r p u s h e d a c o m m i t t o b r a n c h m a s t e r in repository xfce/xfwm4.
commit e8e920cb170645449dc2367a29175f2bbbd4e61e Author: Olivier Fourdan <[email protected]> Date: Thu May 2 13:12:53 2019 +0200 events: Catch more XErrors Many operations such as XI2's grab/ungrab can cause an XError for various reasons, and X11 being asynchronous, those may end up being caught in gdk's own code, causing the termination of xfwm4. Catch XErrors in the relevant portions in xfwm4 code with error trap push/pop before gdk get them. Signed-off-by: Olivier Fourdan <[email protected]> --- src/client.c | 11 ++++++++++- src/events.c | 2 ++ src/focus.c | 8 ++++++-- src/menu.c | 4 ---- src/misc.c | 4 ++++ src/screen.c | 10 ++++++++++ 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/client.c b/src/client.c index b924f01..a1254b8 100644 --- a/src/client.c +++ b/src/client.c @@ -341,9 +341,10 @@ clientUngrabButtons (Client *c) { g_return_if_fail (c != NULL); TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - + myDisplayErrorTrapPush (c->screen_info->display_info); xfwm_device_ungrab_button (c->screen_info->display_info->devices, clientGetXDisplay (c), AnyButton, AnyModifier, c->window); + myDisplayErrorTrapPopIgnored (c->screen_info->display_info); } static gboolean @@ -2035,6 +2036,8 @@ clientUnframe (Client *c, gboolean remap) compositorSetClient (display_info, c->frame, NULL); myDisplayGrabServer (display_info); + myDisplayErrorTrapPush (display_info); + clientRemoveUserTimeWin (c); clientUngrabButtons (c); XUnmapWindow (display_info->dpy, c->frame); @@ -2094,6 +2097,7 @@ clientUnframe (Client *c, gboolean remap) } XDestroyWindow (display_info->dpy, c->frame); + myDisplayErrorTrapPopIgnored (display_info); myDisplayUngrabServer (display_info); clientFree (c); } @@ -3851,11 +3855,14 @@ clientButtonPress (Client *c, Window w, XfwmEventButton *event) screen_info = c->screen_info; display_info = screen_info->display_info; + myDisplayErrorTrapPush (display_info); g1 = xfwm_device_grab (display_info->devices, &display_info->devices->pointer, display_info->dpy, w, FALSE, ButtonReleaseMask | EnterWindowMask | LeaveWindowMask, GrabModeAsync, screen_info->xroot, None, myDisplayGetCurrentTime (display_info)); + myDisplayErrorTrapPopIgnored (display_info); + if (!g1) { TRACE ("grab failed in clientButtonPress"); @@ -3875,8 +3882,10 @@ clientButtonPress (Client *c, Window w, XfwmEventButton *event) eventFilterPop (display_info->xfilter); TRACE ("leaving button press loop"); + myDisplayErrorTrapPush (display_info); xfwm_device_ungrab (display_info->devices, &display_info->devices->pointer, display_info->dpy, myDisplayGetCurrentTime (display_info)); + myDisplayErrorTrapPopIgnored (display_info); if (c->button_status[b] == BUTTON_STATE_PRESSED) { diff --git a/src/events.c b/src/events.c index ba58c19..155281f 100644 --- a/src/events.c +++ b/src/events.c @@ -1087,9 +1087,11 @@ handleButtonPress (DisplayInfo *display_info, XfwmEventButton *event) } else { + myDisplayErrorTrapPush (display_info); xfwm_device_ungrab (display_info->devices, &display_info->devices->pointer, display_info->dpy, event->time); XSendEvent (display_info->dpy, screen_info->xfwm4_win, FALSE, SubstructureNotifyMask, event->meta.x); + myDisplayErrorTrapPopIgnored (display_info); } } } diff --git a/src/focus.c b/src/focus.c index 8f0c5d6..1549fdc 100644 --- a/src/focus.c +++ b/src/focus.c @@ -702,16 +702,18 @@ clientGrabMouseButton (Client * c) TRACE ("client \"%s\" (0x%lx)", c->name, c->window); screen_info = c->screen_info; + myDisplayErrorTrapPush (screen_info->display_info); if (screen_info->params->raise_with_any_button) { - grabButton (c->screen_info->display_info->devices, clientGetXDisplay (c), + grabButton (screen_info->display_info->devices, clientGetXDisplay (c), AnyButton, AnyModifier, c->window); } else { - grabButton (c->screen_info->display_info->devices, clientGetXDisplay (c), + grabButton (screen_info->display_info->devices, clientGetXDisplay (c), Button1, AnyModifier, c->window); } + myDisplayErrorTrapPopIgnored (screen_info->display_info); } void @@ -720,10 +722,12 @@ clientUngrabMouseButton (Client * c) g_return_if_fail (c != NULL); TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + myDisplayErrorTrapPush (c->screen_info->display_info); ungrabButton (c->screen_info->display_info->devices, clientGetXDisplay (c), AnyButton, AnyModifier, c->window); /* We've ungrabbed way too much, so regrab the regular buttons/modifiers */ clientGrabButtons (c); + myDisplayErrorTrapPopIgnored (c->screen_info->display_info); } void diff --git a/src/menu.c b/src/menu.c index af99d97..d6e5da8 100644 --- a/src/menu.c +++ b/src/menu.c @@ -173,8 +173,6 @@ menu_closed (GtkMenu * widget, gpointer data) eventFilterPop (menu->filter_setup); (*menu->func) (menu, 0, menu->xid, menu->data, NULL); - myDisplayErrorTrapPopIgnored (myDisplayGetDefault ()); - return (FALSE); } @@ -559,8 +557,6 @@ menu_popup (Menu *menu, gint root_x, gint root_y, guint button, guint32 timestam return FALSE; } } - myDisplayErrorTrapPush (myDisplayGetDefault ()); - return TRUE; } diff --git a/src/misc.c b/src/misc.c index 3685916..080b1f0 100644 --- a/src/misc.c +++ b/src/misc.c @@ -53,7 +53,9 @@ getMouseXY (ScreenInfo *screen_info, Window w, gint *x2, gint *y2) TRACE ("window (0x%lx)", w); + myDisplayErrorTrapPush (screen_info->display_info); XQueryPointer (myScreenGetXDisplay (screen_info), w, &w1, &w2, &x1, &y1, x2, y2, &mask); + myDisplayErrorTrapPopIgnored (screen_info->display_info); return mask; } @@ -108,7 +110,9 @@ sendClientMessage (ScreenInfo *screen_info, Window w, int atom_id, guint32 times ev.send_event = TRUE; ev.data.l[0] = display_info->atoms[atom_id]; ev.data.l[1] = timestamp; + myDisplayErrorTrapPush (screen_info->display_info); XSendEvent (myScreenGetXDisplay (screen_info), w, FALSE, 0L, (XEvent *)&ev); + myDisplayErrorTrapPopIgnored (screen_info->display_info); } void diff --git a/src/screen.c b/src/screen.c index 2536a30..5349e31 100644 --- a/src/screen.c +++ b/src/screen.c @@ -434,11 +434,13 @@ myScreenGrabKeyboard (ScreenInfo *screen_info, guint event_mask, guint32 timesta grab = TRUE; if (screen_info->key_grabs == 0) { + myDisplayErrorTrapPush (screen_info->display_info); grab = xfwm_device_grab (screen_info->display_info->devices, &screen_info->display_info->devices->keyboard, myScreenGetXDisplay (screen_info), screen_info->xroot, TRUE, event_mask, GrabModeAsync, screen_info->xroot, None, (Time) timestamp); + myDisplayErrorTrapPopIgnored (screen_info->display_info); } screen_info->key_grabs++; TRACE ("global key grabs %i", screen_info->key_grabs); @@ -458,11 +460,13 @@ myScreenGrabPointer (ScreenInfo *screen_info, gboolean owner_events, grab = TRUE; if (screen_info->pointer_grabs == 0) { + myDisplayErrorTrapPush (screen_info->display_info); grab = xfwm_device_grab (screen_info->display_info->devices, &screen_info->display_info->devices->pointer, myScreenGetXDisplay (screen_info), screen_info->xroot, owner_events, event_mask, GrabModeAsync, screen_info->xroot, cursor, (Time) timestamp); + myDisplayErrorTrapPopIgnored (screen_info->display_info); } screen_info->pointer_grabs++; TRACE ("global pointer grabs %i", screen_info->pointer_grabs); @@ -482,6 +486,7 @@ myScreenChangeGrabPointer (ScreenInfo *screen_info, gboolean owner_events, grab = FALSE; if (screen_info->pointer_grabs > 0) { + myDisplayErrorTrapPush (screen_info->display_info); if (screen_info->display_info->devices->pointer.xi2_device == None) { grab = (XChangeActivePointerGrab (myScreenGetXDisplay (screen_info), @@ -495,6 +500,7 @@ myScreenChangeGrabPointer (ScreenInfo *screen_info, gboolean owner_events, owner_events, event_mask, GrabModeAsync, screen_info->xroot, cursor, (Time) timestamp); } + myDisplayErrorTrapPopIgnored (screen_info->display_info); } return grab; @@ -513,9 +519,11 @@ myScreenUngrabKeyboard (ScreenInfo *screen_info, guint32 timestamp) } if (screen_info->key_grabs == 0) { + myDisplayErrorTrapPush (screen_info->display_info); xfwm_device_ungrab (screen_info->display_info->devices, &screen_info->display_info->devices->keyboard, myScreenGetXDisplay (screen_info), (Time) timestamp); + myDisplayErrorTrapPopIgnored (screen_info->display_info); } TRACE ("global key grabs %i", screen_info->key_grabs); @@ -535,9 +543,11 @@ myScreenUngrabPointer (ScreenInfo *screen_info, guint32 timestamp) } if (screen_info->pointer_grabs == 0) { + myDisplayErrorTrapPush (screen_info->display_info); xfwm_device_ungrab (screen_info->display_info->devices, &screen_info->display_info->devices->pointer, myScreenGetXDisplay (screen_info), (Time) timestamp); + myDisplayErrorTrapPopIgnored (screen_info->display_info); } TRACE ("global pointer grabs %i", screen_info->pointer_grabs); -- To stop receiving notification emails like this one, please contact the administrator of this repository. _______________________________________________ Xfce4-commits mailing list [email protected] https://mail.xfce.org/mailman/listinfo/xfce4-commits
