Fix frame focus tracking under Android

* java/org/gnu/emacs/EmacsActivity.java (invalidateFocus): New
argument WHENCE, a unique number identifying the circumstances
leading up to the call.  All callers changed.
(attachWindow): Call `invalidateFocus' from the UI thread.
(onWindowFocusChanged): Don't remove activity from
`focusedActivities' if it already exists should `hasWindowFocus'
return true.
This commit is contained in:
Po Lu 2024-02-05 18:34:22 +08:00
parent 98d62c5f76
commit c1f8fe09e6
2 changed files with 26 additions and 10 deletions

View file

@ -97,7 +97,7 @@ public class EmacsActivity extends Activity
}
public static void
invalidateFocus ()
invalidateFocus (int whence)
{
EmacsWindow oldFocus;
@ -144,7 +144,7 @@ public class EmacsActivity extends Activity
layout.removeView (window.view);
window = null;
invalidateFocus ();
invalidateFocus (0);
}
}
@ -172,8 +172,17 @@ public class EmacsActivity extends Activity
if (isPaused)
window.noticeIconified ();
/* Invalidate the focus. */
invalidateFocus ();
/* Invalidate the focus. Since attachWindow may be called from
either the main or the UI thread, post this to the UI thread. */
runOnUiThread (new Runnable () {
@Override
public void
run ()
{
invalidateFocus (1);
}
});
}
@Override
@ -261,7 +270,7 @@ public class EmacsActivity extends Activity
isMultitask = this instanceof EmacsMultitaskActivity;
manager.removeWindowConsumer (this, isMultitask || isFinishing ());
focusedActivities.remove (this);
invalidateFocus ();
invalidateFocus (2);
/* Remove this activity from the static field, lest it leak. */
if (lastFocusedActivity == this)
@ -274,9 +283,16 @@ public class EmacsActivity extends Activity
public final void
onWindowFocusChanged (boolean isFocused)
{
if (isFocused && !focusedActivities.contains (this))
/* At times and on certain versions of Android ISFOCUSED does not
reflect whether the window actually holds focus, so replace it
with the value of `hasWindowFocus'. */
isFocused = hasWindowFocus ();
if (isFocused)
{
focusedActivities.add (this);
if (!focusedActivities.contains (this))
focusedActivities.add (this);
lastFocusedActivity = this;
/* Update the window insets as the focus change may have
@ -291,7 +307,7 @@ public class EmacsActivity extends Activity
else
focusedActivities.remove (this);
invalidateFocus ();
invalidateFocus (3);
}
@Override

View file

@ -240,7 +240,7 @@ private static class Coordinate
}
}
EmacsActivity.invalidateFocus ();
EmacsActivity.invalidateFocus (4);
if (!children.isEmpty ())
throw new IllegalStateException ("Trying to destroy window with "
@ -760,7 +760,7 @@ private static class Coordinate
public void
onFocusChanged (boolean gainFocus)
{
EmacsActivity.invalidateFocus ();
EmacsActivity.invalidateFocus (gainFocus ? 6 : 5);
}
/* Notice that the activity has been detached or destroyed.