emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 629ac0803f: Fix crash on some compositing managers


From: Po Lu
Subject: master 629ac0803f: Fix crash on some compositing managers
Date: Sat, 19 Mar 2022 23:26:03 -0400 (EDT)

branch: master
commit 629ac0803f29dcc9b5be5f704c0892b121f6adf5
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Fix crash on some compositing managers
    
    * src/xterm.c (x_dnd_get_target_window): Catch errors around
    CompositeReleaseOverlayWindow.
---
 src/xterm.c | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/src/xterm.c b/src/xterm.c
index 3e888407b3..3e7b51e4db 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -911,27 +911,34 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
       if (XGetSelectionOwner (dpyinfo->display,
                              dpyinfo->Xatom_NET_WM_CM_Sn) != None)
        {
+         x_catch_errors (dpyinfo->display);
          overlay_window = XCompositeGetOverlayWindow (dpyinfo->display,
                                                       dpyinfo->root_window);
          XCompositeReleaseOverlayWindow (dpyinfo->display,
                                          dpyinfo->root_window);
-         XGetWindowAttributes (dpyinfo->display, overlay_window, &attrs);
-
-         if (attrs.map_state == IsViewable)
+         if (!x_had_errors_p (dpyinfo->display))
            {
-             proxy = x_dnd_get_window_proxy (dpyinfo, overlay_window);
+             XGetWindowAttributes (dpyinfo->display, overlay_window, &attrs);
 
-             if (proxy != None)
+             if (attrs.map_state == IsViewable)
                {
-                 proto = x_dnd_get_window_proto (dpyinfo, proxy);
+                 proxy = x_dnd_get_window_proxy (dpyinfo, overlay_window);
 
-                 if (proto != -1)
+                 if (proxy != None)
                    {
-                     *proto_out = proto;
-                     return proxy;
+                     proto = x_dnd_get_window_proto (dpyinfo, proxy);
+
+                     if (proto != -1)
+                       {
+                         *proto_out = proto;
+                         x_uncatch_errors_after_check ();
+
+                         return proxy;
+                       }
                    }
                }
            }
+         x_uncatch_errors_after_check ();
        }
     }
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]