]> git.eshelyaron.com Git - emacs.git/commitdiff
Prevent focus "stalemates" on Android
authorPo Lu <luangruo@yahoo.com>
Tue, 26 Mar 2024 02:54:39 +0000 (10:54 +0800)
committerEshel Yaron <me@eshelyaron.com>
Wed, 27 Mar 2024 20:38:46 +0000 (21:38 +0100)
* java/org/gnu/emacs/EmacsActivity.java (invalidateFocus1): New
argument resetWhenChildless.
(invalidateFocus): If a toplevel window has no focus window,
transfer focus to the toplevel itself.

(cherry picked from commit b7b9a0a5c1afae07b8168e85dcf1fc37d29e98ef)

java/org/gnu/emacs/EmacsActivity.java

index 06b9c0f005d60400f717577c111f30e9bf1b79d3..6ab6a709bef9e3653284c65dd1152c6d59d1ed3a 100644 (file)
@@ -84,7 +84,7 @@ public class EmacsActivity extends Activity
   };
 
   public static void
-  invalidateFocus1 (EmacsWindow window)
+  invalidateFocus1 (EmacsWindow window, boolean resetWhenChildless)
   {
     if (window.view.isFocused ())
       focusedWindow = window;
@@ -92,7 +92,18 @@ public class EmacsActivity extends Activity
     synchronized (window.children)
       {
        for (EmacsWindow child : window.children)
-         invalidateFocus1 (child);
+         invalidateFocus1 (child, false);
+
+       /* If no focused window was previously detected among WINDOW's
+          children and RESETWHENCHILDLESS is set (implying it is a
+          toplevel window), request that it be focused, to avoid
+          creating a situation where no windows exist focused or can be
+          transferred the input focus by user action.  */
+       if (focusedWindow == null && resetWhenChildless)
+         {
+           window.view.requestFocus ();
+           focusedWindow = window;
+         }
       }
   }
 
@@ -110,7 +121,7 @@ public class EmacsActivity extends Activity
     for (EmacsActivity activity : focusedActivities)
       {
        if (activity.window != null)
-         invalidateFocus1 (activity.window);
+         invalidateFocus1 (activity.window, focusedWindow == null);
       }
 
     /* Send focus in- and out- events to the previous and current