summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <fourdan@xfce.org>2019-05-02 13:12:53 +0200
committerOlivier Fourdan <fourdan@xfce.org>2019-05-02 16:01:26 +0200
commite8e920cb170645449dc2367a29175f2bbbd4e61e (patch)
treec06769ca35d2a877e007951ec51e242bc47c6f1b
parentba3ed23733edb9b96bfab89a67d3cea5afc73e1b (diff)
downloadxfwm4-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.c11
-rw-r--r--src/events.c2
-rw-r--r--src/focus.c8
-rw-r--r--src/menu.c4
-rw-r--r--src/misc.c4
-rw-r--r--src/screen.c10
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);