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:
parent
745890de52
commit
e859a14bee
9 changed files with 66 additions and 18 deletions
|
|
@ -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 ();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue