diff options
author | Po Lu <luangruo@yahoo.com> | 2022-11-14 14:07:04 +0800 |
---|---|---|
committer | Po Lu <luangruo@yahoo.com> | 2022-11-14 14:07:04 +0800 |
commit | 83a497ee879959cd1b052fa9138adb79b480394d (patch) | |
tree | 55e0f28e3fd49595df290d6c962ff4df281da189 /src/xterm.c | |
parent | c0474ca21dd76cafbd1a04fd32d4a0bd42de6351 (diff) | |
download | emacs-83a497ee879959cd1b052fa9138adb79b480394d.tar.gz |
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.
Diffstat (limited to 'src/xterm.c')
-rw-r--r-- | src/xterm.c | 13 |
1 files changed, 12 insertions, 1 deletions
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) |