[Xfce4-commits] [xfce/xfwm4] 02/03: events: Catch more XErrors

noreply at xfce.org noreply at xfce.org
Thu May 2 16:42:22 CEST 2019


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 <fourdan at xfce.org>
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 <fourdan at xfce.org>
---
 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.


More information about the Xfce4-commits mailing list