aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
authorPo Lu2023-02-11 10:26:34 +0800
committerPo Lu2023-02-11 10:26:34 +0800
commitab48881a2fb72df016f2a00bc107e5a35a411a9d (patch)
treef2cc50a7ac906e40562e080a725ac98daf9ed484 /java
parentc4c34f72a123c4177a21c934c4e414cfe9e3c553 (diff)
downloademacs-ab48881a2fb72df016f2a00bc107e5a35a411a9d.tar.gz
emacs-ab48881a2fb72df016f2a00bc107e5a35a411a9d.zip
Fix displaying popup menus from a menu entry on Android
* java/org/gnu/emacs/EmacsActivity.java (EmacsActivity, onDestroy) (onWindowFocusChanged): Keep track of the last focused activity. * java/org/gnu/emacs/EmacsDialog.java (display1): Use it if there is no current focus.
Diffstat (limited to 'java')
-rw-r--r--java/org/gnu/emacs/EmacsActivity.java13
-rw-r--r--java/org/gnu/emacs/EmacsDialog.java26
2 files changed, 35 insertions, 4 deletions
diff --git a/java/org/gnu/emacs/EmacsActivity.java b/java/org/gnu/emacs/EmacsActivity.java
index 30eaf85805a..3156a144a0f 100644
--- a/java/org/gnu/emacs/EmacsActivity.java
+++ b/java/org/gnu/emacs/EmacsActivity.java
@@ -47,6 +47,9 @@ public class EmacsActivity extends Activity
47 /* List of activities with focus. */ 47 /* List of activities with focus. */
48 public static List<EmacsActivity> focusedActivities; 48 public static List<EmacsActivity> focusedActivities;
49 49
50 /* The last activity to have been focused. */
51 public static EmacsActivity lastFocusedActivity;
52
50 /* The currently focused window. */ 53 /* The currently focused window. */
51 public static EmacsWindow focusedWindow; 54 public static EmacsWindow focusedWindow;
52 55
@@ -215,6 +218,11 @@ public class EmacsActivity extends Activity
215 manager.removeWindowConsumer (this, isMultitask || isFinishing ()); 218 manager.removeWindowConsumer (this, isMultitask || isFinishing ());
216 focusedActivities.remove (this); 219 focusedActivities.remove (this);
217 invalidateFocus (); 220 invalidateFocus ();
221
222 /* Remove this activity from the static field, lest it leak. */
223 if (lastFocusedActivity == this)
224 lastFocusedActivity = null;
225
218 super.onDestroy (); 226 super.onDestroy ();
219 } 227 }
220 228
@@ -223,7 +231,10 @@ public class EmacsActivity extends Activity
223 onWindowFocusChanged (boolean isFocused) 231 onWindowFocusChanged (boolean isFocused)
224 { 232 {
225 if (isFocused && !focusedActivities.contains (this)) 233 if (isFocused && !focusedActivities.contains (this))
226 focusedActivities.add (this); 234 {
235 focusedActivities.add (this);
236 lastFocusedActivity = this;
237 }
227 else 238 else
228 focusedActivities.remove (this); 239 focusedActivities.remove (this);
229 240
diff --git a/java/org/gnu/emacs/EmacsDialog.java b/java/org/gnu/emacs/EmacsDialog.java
index 7d88a23c58f..bd5e9ba8ee7 100644
--- a/java/org/gnu/emacs/EmacsDialog.java
+++ b/java/org/gnu/emacs/EmacsDialog.java
@@ -230,11 +230,31 @@ public class EmacsDialog implements DialogInterface.OnDismissListener
230 AlertDialog dialog; 230 AlertDialog dialog;
231 231
232 if (EmacsActivity.focusedActivities.isEmpty ()) 232 if (EmacsActivity.focusedActivities.isEmpty ())
233 return false; 233 {
234 /* If focusedActivities is empty then this dialog may have
235 been displayed immediately after a popup dialog is
236 dismissed. */
237
238 activity = EmacsActivity.lastFocusedActivity;
239
240 if (activity == null)
241 return false;
242 }
243 else
244 activity = EmacsActivity.focusedActivities.get (0);
234 245
235 activity = EmacsActivity.focusedActivities.get (0);
236 dialog = dismissDialog = toAlertDialog (activity); 246 dialog = dismissDialog = toAlertDialog (activity);
237 dismissDialog.show (); 247
248 try
249 {
250 dismissDialog.show ();
251 }
252 catch (Exception exception)
253 {
254 /* This can happen when the system decides Emacs is not in the
255 foreground any longer. */
256 return false;
257 }
238 258
239 /* If there are less than four buttons, then they must be 259 /* If there are less than four buttons, then they must be
240 individually enabled or disabled after the dialog is 260 individually enabled or disabled after the dialog is