aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-03-20 11:23:11 +0800
committerPo Lu2022-03-20 11:23:11 +0800
commit629ac0803f29dcc9b5be5f704c0892b121f6adf5 (patch)
tree4e12d06926e4d68a8c08e17ebd2a969249752023 /src
parent77f5eb874b70ab78ca4daf3adf30f18d002db439 (diff)
downloademacs-629ac0803f29dcc9b5be5f704c0892b121f6adf5.tar.gz
emacs-629ac0803f29dcc9b5be5f704c0892b121f6adf5.zip
Fix crash on some compositing managers
* src/xterm.c (x_dnd_get_target_window): Catch errors around CompositeReleaseOverlayWindow.
Diffstat (limited to 'src')
-rw-r--r--src/xterm.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/xterm.c b/src/xterm.c
index 3e888407b3b..3e7b51e4db3 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -911,27 +911,34 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
911 if (XGetSelectionOwner (dpyinfo->display, 911 if (XGetSelectionOwner (dpyinfo->display,
912 dpyinfo->Xatom_NET_WM_CM_Sn) != None) 912 dpyinfo->Xatom_NET_WM_CM_Sn) != None)
913 { 913 {
914 x_catch_errors (dpyinfo->display);
914 overlay_window = XCompositeGetOverlayWindow (dpyinfo->display, 915 overlay_window = XCompositeGetOverlayWindow (dpyinfo->display,
915 dpyinfo->root_window); 916 dpyinfo->root_window);
916 XCompositeReleaseOverlayWindow (dpyinfo->display, 917 XCompositeReleaseOverlayWindow (dpyinfo->display,
917 dpyinfo->root_window); 918 dpyinfo->root_window);
918 XGetWindowAttributes (dpyinfo->display, overlay_window, &attrs); 919 if (!x_had_errors_p (dpyinfo->display))
919
920 if (attrs.map_state == IsViewable)
921 { 920 {
922 proxy = x_dnd_get_window_proxy (dpyinfo, overlay_window); 921 XGetWindowAttributes (dpyinfo->display, overlay_window, &attrs);
923 922
924 if (proxy != None) 923 if (attrs.map_state == IsViewable)
925 { 924 {
926 proto = x_dnd_get_window_proto (dpyinfo, proxy); 925 proxy = x_dnd_get_window_proxy (dpyinfo, overlay_window);
927 926
928 if (proto != -1) 927 if (proxy != None)
929 { 928 {
930 *proto_out = proto; 929 proto = x_dnd_get_window_proto (dpyinfo, proxy);
931 return proxy; 930
931 if (proto != -1)
932 {
933 *proto_out = proto;
934 x_uncatch_errors_after_check ();
935
936 return proxy;
937 }
932 } 938 }
933 } 939 }
934 } 940 }
941 x_uncatch_errors_after_check ();
935 } 942 }
936 } 943 }
937 944