diff options
author | Olivier Fourdan <fourdan@xfce.org> | 2019-05-02 13:12:53 +0200 |
---|---|---|
committer | Olivier Fourdan <fourdan@xfce.org> | 2019-05-02 16:01:26 +0200 |
commit | e8e920cb170645449dc2367a29175f2bbbd4e61e (patch) | |
tree | c06769ca35d2a877e007951ec51e242bc47c6f1b | |
parent | ba3ed23733edb9b96bfab89a67d3cea5afc73e1b (diff) | |
download | xfwm4-e8e920cb170645449dc2367a29175f2bbbd4e61e.tar.gz |
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 <fourdan@xfce.org>
-rw-r--r-- | src/client.c | 11 | ||||
-rw-r--r-- | src/events.c | 2 | ||||
-rw-r--r-- | src/focus.c | 8 | ||||
-rw-r--r-- | src/menu.c | 4 | ||||
-rw-r--r-- | src/misc.c | 4 | ||||
-rw-r--r-- | src/screen.c | 10 |
6 files changed, 32 insertions, 7 deletions
diff --git a/src/client.c b/src/client.c index b924f015c..a1254b8a7 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 ba58c19f9..155281f17 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 8f0c5d6c3..1549fdc50 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 af99d97b7..d6e5da833 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 3685916d9..080b1f096 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 2536a3026..5349e312c 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); |