From: Po Lu Date: Tue, 26 Mar 2024 02:54:39 +0000 (+0800) Subject: Prevent focus "stalemates" on Android X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3dbc62ded403ede190774646dec7137d6ba07bf1;p=emacs.git Prevent focus "stalemates" on Android * 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) --- diff --git a/java/org/gnu/emacs/EmacsActivity.java b/java/org/gnu/emacs/EmacsActivity.java index 06b9c0f005d..6ab6a709bef 100644 --- a/java/org/gnu/emacs/EmacsActivity.java +++ b/java/org/gnu/emacs/EmacsActivity.java @@ -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