diff options
| author | Po Lu | 2022-07-24 10:42:02 +0800 |
|---|---|---|
| committer | Po Lu | 2022-07-24 10:42:02 +0800 |
| commit | 235045f712ef5c0dea12c5005cc07118971f413f (patch) | |
| tree | aee4b6f6734a7e15638f04fcff3287ef2f7b78f0 /src | |
| parent | 1b99f2908b7d2c17dc1231f83f499fe460ba926a (diff) | |
| download | emacs-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.c | 24 |
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 |