]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix frame focus tracking under Android
authorPo Lu <luangruo@yahoo.com>
Mon, 5 Feb 2024 10:34:22 +0000 (18:34 +0800)
committerEshel Yaron <me@eshelyaron.com>
Wed, 7 Feb 2024 10:51:49 +0000 (11:51 +0100)
* 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.

(cherry picked from commit c1f8fe09e6641cc6c1195edcb8666ace1e6e8829)

java/org/gnu/emacs/EmacsActivity.java
java/org/gnu/emacs/EmacsWindow.java

index 3237f650240855c005e1d22ad77f5938ebc67d0c..b821694b18ab50c51cfec2be337b8233ec802565 100644 (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
index 304304a328b7f0f6ef75391bf00c9315f96307e5..b75d96b2b5a59bc12344b2a5d52074ff1784eb41 100644 (file)
@@ -240,7 +240,7 @@ public final class EmacsWindow extends EmacsHandleObject
          }
       }
 
-    EmacsActivity.invalidateFocus ();
+    EmacsActivity.invalidateFocus (4);
 
     if (!children.isEmpty ())
       throw new IllegalStateException ("Trying to destroy window with "
@@ -760,7 +760,7 @@ public final class EmacsWindow extends EmacsHandleObject
   public void
   onFocusChanged (boolean gainFocus)
   {
-    EmacsActivity.invalidateFocus ();
+    EmacsActivity.invalidateFocus (gainFocus ? 6 : 5);
   }
 
   /* Notice that the activity has been detached or destroyed.