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:
parent
98d62c5f76
commit
c1f8fe09e6
2 changed files with 26 additions and 10 deletions
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Reference in a new issue