1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-30 09:00:31 -08:00

Fix menu and popup race conditions on Android

* java/org/gnu/emacs/EmacsActivity.java (onContextMenuClosed):
* java/org/gnu/emacs/EmacsContextMenu.java (EmacsContextMenu)
(onMenuItemClick, run):
* java/org/gnu/emacs/EmacsDialog.java (EmacsDialog, onClick)
(createDialog, onDismiss): Take menu event serial, and pass it
along in context menu events.
* java/org/gnu/emacs/EmacsNative.java (sendContextMenu): New
argument.
* src/android.c (sendContextMenu): Pass serial number in event.

* src/androidgui.h (struct android_menu_event): New field
`menu_event_serial'.
* src/androidmenu.c (FIND_METHOD_STATIC)
(android_init_emacs_context_menu): Adjust method declarations.
(android_menu_show, android_dialog_show):
* src/androidterm.c (handle_one_android_event): Expect serial in
context menu events.
* src/androidterm.h: Update prototypes.
This commit is contained in:
Po Lu 2023-03-09 16:30:02 +08:00
parent 745890de52
commit e859a14bee
9 changed files with 66 additions and 18 deletions

View file

@ -49,6 +49,9 @@ public final class EmacsContextMenu
/* Whether or not a submenu was selected. */
public static boolean wasSubmenuSelected;
/* The serial ID of the last context menu to be displayed. */
public static int lastMenuEventSerial;
private static class Item implements MenuItem.OnMenuItemClickListener
{
public int itemID;
@ -106,7 +109,8 @@ public final class EmacsContextMenu
}
/* Send a context menu event. */
EmacsNative.sendContextMenu ((short) 0, itemID);
EmacsNative.sendContextMenu ((short) 0, itemID,
lastMenuEventSerial);
/* Say that an item has already been selected. */
itemAlreadySelected = true;
@ -293,12 +297,13 @@ public final class EmacsContextMenu
false);
}
/* Display this context menu on WINDOW, at xPosition and
yPosition. */
/* Display this context menu on WINDOW, at xPosition and yPosition.
SERIAL is a number that will be returned in any menu event
generated to identify this context menu. */
public boolean
display (final EmacsWindow window, final int xPosition,
final int yPosition)
final int yPosition, final int serial)
{
Runnable runnable;
final Holder<Boolean> rc;
@ -312,6 +317,7 @@ public final class EmacsContextMenu
{
synchronized (this)
{
lastMenuEventSerial = serial;
rc.thing = display1 (window, xPosition, yPosition);
notify ();
}