]> git.eshelyaron.com Git - emacs.git/commitdiff
Prevent crashes upon trying to focus a child frame on click
authorPo Lu <luangruo@yahoo.com>
Mon, 14 Nov 2022 06:07:04 +0000 (14:07 +0800)
committerPo Lu <luangruo@yahoo.com>
Mon, 14 Nov 2022 06:07:04 +0000 (14:07 +0800)
* 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

index 48ddd175681fd676307e8d94208ae5112b9a5f8b..7a1fd6086cffa938ee65e15bb643ea4efbeb5f3d 100644 (file)
@@ -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)