aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-07-24 10:42:02 +0800
committerPo Lu2022-07-24 10:42:02 +0800
commit235045f712ef5c0dea12c5005cc07118971f413f (patch)
treeaee4b6f6734a7e15638f04fcff3287ef2f7b78f0 /src
parent1b99f2908b7d2c17dc1231f83f499fe460ba926a (diff)
downloademacs-235045f712ef5c0dea12c5005cc07118971f413f.tar.gz
emacs-235045f712ef5c0dea12c5005cc07118971f413f.zip
Prevent exposing tooltip frames to Lisp code during drag-and-drop
* src/xterm.c (x_dnd_compute_toplevels): Ignore tooltip frames. (x_tooltip_window_to_frame): Allow unrelated_tooltip_p to be NULL. (handle_one_xevent): Ignore DND events to tooltip frames.
Diffstat (limited to 'src')
-rw-r--r--src/xterm.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/xterm.c b/src/xterm.c
index 45a81a3fdb4..67a7de42134 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -2937,7 +2937,7 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo)
2937 Window *toplevels; 2937 Window *toplevels;
2938 int format, rc; 2938 int format, rc;
2939 unsigned long nitems, bytes_after; 2939 unsigned long nitems, bytes_after;
2940 unsigned long i; 2940 unsigned long i, real_nitems;
2941 unsigned char *data = NULL; 2941 unsigned char *data = NULL;
2942 int frame_extents[4]; 2942 int frame_extents[4];
2943 2943
@@ -3001,6 +3001,16 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo)
3001 3001
3002 toplevels = (Window *) data; 3002 toplevels = (Window *) data;
3003 3003
3004 for (i = 0, real_nitems = 0; i < nitems; ++i)
3005 {
3006 /* Some window managers with built in compositors end up putting
3007 tooltips in the client list, which is silly. */
3008 if (!x_tooltip_window_to_frame (dpyinfo, toplevels[i], NULL))
3009 toplevels[real_nitems++] = toplevels[i];
3010 }
3011
3012 nitems = real_nitems;
3013
3004#ifdef USE_XCB 3014#ifdef USE_XCB
3005 USE_SAFE_ALLOCA; 3015 USE_SAFE_ALLOCA;
3006 3016
@@ -11072,7 +11082,8 @@ x_tooltip_window_to_frame (struct x_display_info *dpyinfo,
11072 GdkWindow *tooltip_window; 11082 GdkWindow *tooltip_window;
11073#endif 11083#endif
11074 11084
11075 *unrelated_tooltip_p = false; 11085 if (unrelated_tooltip_p)
11086 *unrelated_tooltip_p = false;
11076 11087
11077 FOR_EACH_FRAME (tail, frame) 11088 FOR_EACH_FRAME (tail, frame)
11078 { 11089 {
@@ -11101,14 +11112,16 @@ x_tooltip_window_to_frame (struct x_display_info *dpyinfo,
11101 if (tooltip_window 11112 if (tooltip_window
11102 && (gdk_x11_window_get_xid (tooltip_window) == wdesc)) 11113 && (gdk_x11_window_get_xid (tooltip_window) == wdesc))
11103 { 11114 {
11104 *unrelated_tooltip_p = true; 11115 if (unrelated_tooltip_p)
11116 *unrelated_tooltip_p = true;
11105 break; 11117 break;
11106 } 11118 }
11107#else 11119#else
11108 if (tooltip_window 11120 if (tooltip_window
11109 && (GDK_WINDOW_XID (tooltip_window) == wdesc)) 11121 && (GDK_WINDOW_XID (tooltip_window) == wdesc))
11110 { 11122 {
11111 *unrelated_tooltip_p = true; 11123 if (unrelated_tooltip_p)
11124 *unrelated_tooltip_p = true;
11112 break; 11125 break;
11113 } 11126 }
11114#endif 11127#endif
@@ -16972,7 +16985,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
16972 xft_settings_event (dpyinfo, event); 16985 xft_settings_event (dpyinfo, event);
16973 16986
16974 f = any; 16987 f = any;
16975 if (!f) 16988 /* We don't want to ever leak tooltip frames to Lisp code. */
16989 if (!f || FRAME_TOOLTIP_P (f))
16976 goto OTHER; 16990 goto OTHER;
16977 16991
16978 /* These values are always used initialized, but GCC doesn't 16992 /* These values are always used initialized, but GCC doesn't