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.
This commit is contained in:
Po Lu 2024-03-26 10:54:39 +08:00
parent 728bf2c9e5
commit b7b9a0a5c1

View 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