From: Po Lu Date: Sun, 24 Jul 2022 02:42:02 +0000 (+0800) Subject: Prevent exposing tooltip frames to Lisp code during drag-and-drop X-Git-Tag: emacs-29.0.90~1447^2~773 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=235045f712ef5c0dea12c5005cc07118971f413f;p=emacs.git 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. --- 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) Window *toplevels; int format, rc; unsigned long nitems, bytes_after; - unsigned long i; + unsigned long i, real_nitems; unsigned char *data = NULL; int frame_extents[4]; @@ -3001,6 +3001,16 @@ x_dnd_compute_toplevels (struct x_display_info *dpyinfo) toplevels = (Window *) data; + for (i = 0, real_nitems = 0; i < nitems; ++i) + { + /* Some window managers with built in compositors end up putting + tooltips in the client list, which is silly. */ + if (!x_tooltip_window_to_frame (dpyinfo, toplevels[i], NULL)) + toplevels[real_nitems++] = toplevels[i]; + } + + nitems = real_nitems; + #ifdef USE_XCB USE_SAFE_ALLOCA; @@ -11072,7 +11082,8 @@ x_tooltip_window_to_frame (struct x_display_info *dpyinfo, GdkWindow *tooltip_window; #endif - *unrelated_tooltip_p = false; + if (unrelated_tooltip_p) + *unrelated_tooltip_p = false; FOR_EACH_FRAME (tail, frame) { @@ -11101,14 +11112,16 @@ x_tooltip_window_to_frame (struct x_display_info *dpyinfo, if (tooltip_window && (gdk_x11_window_get_xid (tooltip_window) == wdesc)) { - *unrelated_tooltip_p = true; + if (unrelated_tooltip_p) + *unrelated_tooltip_p = true; break; } #else if (tooltip_window && (GDK_WINDOW_XID (tooltip_window) == wdesc)) { - *unrelated_tooltip_p = true; + if (unrelated_tooltip_p) + *unrelated_tooltip_p = true; break; } #endif @@ -16972,7 +16985,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, xft_settings_event (dpyinfo, event); f = any; - if (!f) + /* We don't want to ever leak tooltip frames to Lisp code. */ + if (!f || FRAME_TOOLTIP_P (f)) goto OTHER; /* These values are always used initialized, but GCC doesn't