diff options
| author | Po Lu | 2023-02-11 10:26:34 +0800 |
|---|---|---|
| committer | Po Lu | 2023-02-11 10:26:34 +0800 |
| commit | ab48881a2fb72df016f2a00bc107e5a35a411a9d (patch) | |
| tree | f2cc50a7ac906e40562e080a725ac98daf9ed484 /java | |
| parent | c4c34f72a123c4177a21c934c4e414cfe9e3c553 (diff) | |
| download | emacs-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.java | 13 | ||||
| -rw-r--r-- | java/org/gnu/emacs/EmacsDialog.java | 26 |
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 |