From ebd5725e0b2f7e1dcf6dcb068bef638edd7f0cb4 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 24 Mar 2022 11:41:29 +0800 Subject: [PATCH] Fix an infinite loop if the window manager pings Emacs during DND * src/xterm.c (handle_one_xevent): Work around _NET_WM_PING infinite loop during drag and drop. --- src/xterm.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/xterm.c b/src/xterm.c index 0543f152eda..fcc1f55ccb6 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -11014,7 +11014,19 @@ handle_one_xevent (struct x_display_info *dpyinfo, send_event.xclient.window = dpyinfo->root_window; XSendEvent (dpyinfo->display, dpyinfo->root_window, False, - SubstructureRedirectMask | SubstructureNotifyMask, + /* FIXME: handling window stacking changes + during drag-and-drop requires Emacs to + select for SubstructureNotifyMask, + which in turn causes the message to be + sent to Emacs itself using the event + mask specified by the EWMH. To avoid + an infinite loop, just use + SubstructureRedirectMask when a + drag-and-drop operation is in + progress. */ + ((x_dnd_in_progress || x_dnd_waiting_for_finish) + ? SubstructureRedirectMask + : SubstructureRedirectMask | SubstructureNotifyMask), &send_event); *finish = X_EVENT_DROP; -- 2.39.5