emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master c2d714886ef: Implement tooltip_reuse_hidden_frame for Android


From: Po Lu
Subject: master c2d714886ef: Implement tooltip_reuse_hidden_frame for Android
Date: Sat, 17 Feb 2024 23:49:37 -0500 (EST)

branch: master
commit c2d714886ef139f601d89463675b0d5b49d18ff9
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Implement tooltip_reuse_hidden_frame for Android
    
    * java/org/gnu/emacs/EmacsWindow.java
    (findSuitableActivityContext): Return Activity rather than
    Context.
    (mapWindow): Provide window token manually.
    
    * src/androidfns.c (Fx_show_tip, Fx_hide_tip): Respect
    tooltip_reuse_hidden_frame.
---
 java/org/gnu/emacs/EmacsWindow.java | 27 +++++++++++++++----
 src/androidfns.c                    | 53 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 74 insertions(+), 6 deletions(-)

diff --git a/java/org/gnu/emacs/EmacsWindow.java 
b/java/org/gnu/emacs/EmacsWindow.java
index 978891ba619..427a1a92332 100644
--- a/java/org/gnu/emacs/EmacsWindow.java
+++ b/java/org/gnu/emacs/EmacsWindow.java
@@ -27,6 +27,8 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import android.app.Activity;
+
 import android.content.ClipData;
 import android.content.ClipDescription;
 import android.content.Context;
@@ -362,6 +364,9 @@ public final class EmacsWindow extends EmacsHandleObject
     requestViewLayout ();
   }
 
+  /* Return WM layout parameters for an override redirect window with
+     the geometry provided here.  */
+
   private WindowManager.LayoutParams
   getWindowLayoutParams ()
   {
@@ -384,15 +389,15 @@ public final class EmacsWindow extends EmacsHandleObject
     return params;
   }
 
-  private Context
+  private Activity
   findSuitableActivityContext ()
   {
     /* Find a recently focused activity.  */
     if (!EmacsActivity.focusedActivities.isEmpty ())
       return EmacsActivity.focusedActivities.get (0);
 
-    /* Return the service context, which probably won't work.  */
-    return EmacsService.SERVICE;
+    /* Resort to the last activity to be focused.  */
+    return EmacsActivity.lastFocusedActivity;
   }
 
   public synchronized void
@@ -416,7 +421,7 @@ public final class EmacsWindow extends EmacsHandleObject
            {
              EmacsWindowAttachmentManager manager;
              WindowManager windowManager;
-             Context ctx;
+             Activity ctx;
              Object tem;
              WindowManager.LayoutParams params;
 
@@ -447,11 +452,23 @@ public final class EmacsWindow extends EmacsHandleObject
                        activity using the system window manager.  */
 
                  ctx = findSuitableActivityContext ();
+
+                 if (ctx == null)
+                   {
+                     Log.w (TAG, "failed to attach override-redirect window"
+                            + " for want of activity");
+                     return;
+                   }
+
                  tem = ctx.getSystemService (Context.WINDOW_SERVICE);
                  windowManager = (WindowManager) tem;
 
-                 /* Calculate layout parameters.  */
+                 /* Calculate layout parameters and propagate the
+                    activity's token into it.  */
+
                  params = getWindowLayoutParams ();
+                 params.token = (ctx.findViewById (android.R.id.content)
+                                 .getWindowToken ());
                  view.setLayoutParams (params);
 
                  /* Attach the view.  */
diff --git a/src/androidfns.c b/src/androidfns.c
index ea3d5f71c7c..0675a0a3c98 100644
--- a/src/androidfns.c
+++ b/src/androidfns.c
@@ -2287,6 +2287,57 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
 
          goto start_timer;
        }
+      else if (tooltip_reuse_hidden_frame && BASE_EQ (frame, tip_last_frame))
+       {
+         bool delete = false;
+         Lisp_Object tail, elt, parm, last;
+
+         /* Check if every parameter in PARMS has the same value in
+            tip_last_parms.  This may destruct tip_last_parms which,
+            however, will be recreated below.  */
+         for (tail = parms; CONSP (tail); tail = XCDR (tail))
+           {
+             elt = XCAR (tail);
+             parm = CAR (elt);
+             /* The left, top, right and bottom parameters are handled
+                by compute_tip_xy so they can be ignored here.  */
+             if (!EQ (parm, Qleft) && !EQ (parm, Qtop)
+                 && !EQ (parm, Qright) && !EQ (parm, Qbottom))
+               {
+                 last = Fassq (parm, tip_last_parms);
+                 if (NILP (Fequal (CDR (elt), CDR (last))))
+                   {
+                     /* We lost, delete the old tooltip.  */
+                     delete = true;
+                     break;
+                   }
+                 else
+                   tip_last_parms
+                     = call2 (Qassq_delete_all, parm, tip_last_parms);
+               }
+             else
+               tip_last_parms
+                 = call2 (Qassq_delete_all, parm, tip_last_parms);
+           }
+
+         /* Now check if every parameter in what is left of
+            tip_last_parms with a non-nil value has an association in
+            PARMS.  */
+         for (tail = tip_last_parms; CONSP (tail); tail = XCDR (tail))
+           {
+             elt = XCAR (tail);
+             parm = CAR (elt);
+             if (!EQ (parm, Qleft) && !EQ (parm, Qtop) && !EQ (parm, Qright)
+                 && !EQ (parm, Qbottom) && !NILP (CDR (elt)))
+               {
+                 /* We lost, delete the old tooltip.  */
+                 delete = true;
+                 break;
+               }
+           }
+
+         android_hide_tip (delete);
+       }
       else
        android_hide_tip (true);
     }
@@ -2453,7 +2504,7 @@ DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0,
 #endif /* 0 */
   return Qnil;
 #else /* !ANDROID_STUBIFY */
-  return android_hide_tip (true);
+  return android_hide_tip (!tooltip_reuse_hidden_frame);
 #endif /* ANDROID_STUBIFY */
 }
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]