From 83a497ee879959cd1b052fa9138adb79b480394d Mon Sep 17 00:00:00 2001 From: Po Lu Date: Mon, 14 Nov 2022 14:07:04 +0800 Subject: Prevent crashes upon trying to focus a child frame on click * src/xterm.c (handle_one_xevent): Do not try to activate override-redirect frames. Explain why. (x_focus_frame): Catch errors around XSetInputFocus. --- src/xterm.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/xterm.c') diff --git a/src/xterm.c b/src/xterm.c index 48ddd175681..7a1fd6086cf 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -21135,8 +21135,11 @@ handle_one_xevent (struct x_display_info *dpyinfo, if (FRAME_PARENT_FRAME (f) || (hf && frame_ancestor_p (f, hf))) { + x_ignore_errors_for_next_request (dpyinfo); XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), RevertToParent, event->xbutton.time); + x_stop_ignoring_errors (dpyinfo); + if (FRAME_PARENT_FRAME (f)) XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f)); } @@ -22838,9 +22841,13 @@ handle_one_xevent (struct x_display_info *dpyinfo, } #else /* Non-no toolkit builds without GTK 3 use core - events to handle focus. */ + events to handle focus. Errors are still + caught here in case the window is not + viewable. */ + x_ignore_errors_for_next_request (dpyinfo); XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), RevertToParent, xev->time); + x_stop_ignoring_errors (dpyinfo); #endif if (FRAME_PARENT_FRAME (f)) XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f)); @@ -27602,6 +27609,10 @@ x_focus_frame (struct frame *f, bool noactivate) else { if (!noactivate + /* If F is override-redirect, use SetInputFocus instead. + Override-redirect frames are not subject to window + management. */ + && !FRAME_OVERRIDE_REDIRECT (f) /* If F is a child frame, use SetInputFocus instead. This may not work if its parent is not activated. */ && !FRAME_PARENT_FRAME (f) -- cgit v1.2.1