diff options
| author | Po Lu | 2023-01-15 11:57:10 +0800 |
|---|---|---|
| committer | Po Lu | 2023-01-15 11:57:10 +0800 |
| commit | 6e2bc91d924fbeb0ad5728e0424eabc905c0d366 (patch) | |
| tree | f2835948a308d9d0898b9ef868893560048f6812 /src/android.c | |
| parent | c02a7b2ff48746fab891db16f58ccdc11d161745 (diff) | |
| download | emacs-6e2bc91d924fbeb0ad5728e0424eabc905c0d366.tar.gz emacs-6e2bc91d924fbeb0ad5728e0424eabc905c0d366.zip | |
Implement toolkit menus on Android
* java/org/gnu/emacs/EmacsActivity.java (onContextMenuClosed):
New function.
* java/org/gnu/emacs/EmacsContextMenu.java (EmacsContextMenu):
New field `itemAlreadySelected'.
(onMenuItemClick): New function.
(inflateMenuItems): Attach onClickListener as appropriate.
(display1): Clear itemAlreadySelected.
(display): Fix runnable synchronization.
* java/org/gnu/emacs/EmacsNative.java (sendContextMenu): New
function.
* java/org/gnu/emacs/EmacsView.java (popupMenu):
(cancelPopupMenu): Set popupactive correctly.
* src/android.c (android_run_select_thread): Fix android_select
again.
(android_wait_event): New function.
* src/android.h: Update prototypes.
* src/androidgui.h (enum android_event_type): New
`ANDROID_CONTEXT_MENU' event.
(struct android_menu_event, union android_event): Add new event.
* src/androidmenu.c (struct android_emacs_context_menu): New
structure.
(android_init_emacs_context_menu): Add `dismiss' method.
(struct android_dismiss_menu_data): New structure.
(android_dismiss_menu, android_process_events_for_menu): New
functions.
(android_menu_show): Set an actual item ID.
(popup_activated): Define when stubify as well.
(Fmenu_or_popup_active_p): New function.
(syms_of_androidmenu): New function.
* src/androidterm.c (handle_one_android_event): Handle context
menu events.
* src/androidterm.h (struct android_display_info): New field for
menu item ID.
* src/emacs.c (android_emacs_init): Call syms_of_androidmenu.
* src/xdisp.c (note_mouse_highlight): Return if popup_activated
on Android as well.
Diffstat (limited to 'src/android.c')
| -rw-r--r-- | src/android.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/src/android.c b/src/android.c index 5e5e28c60ca..ed162a903ba 100644 --- a/src/android.c +++ b/src/android.c | |||
| @@ -236,7 +236,7 @@ static sem_t android_pselect_sem, android_pselect_start_sem; | |||
| 236 | static void * | 236 | static void * |
| 237 | android_run_select_thread (void *data) | 237 | android_run_select_thread (void *data) |
| 238 | { | 238 | { |
| 239 | sigset_t signals; | 239 | sigset_t signals, sigset; |
| 240 | int rc; | 240 | int rc; |
| 241 | 241 | ||
| 242 | sigfillset (&signals); | 242 | sigfillset (&signals); |
| @@ -259,7 +259,11 @@ android_run_select_thread (void *data) | |||
| 259 | 259 | ||
| 260 | /* Make sure SIGUSR1 can always wake pselect up. */ | 260 | /* Make sure SIGUSR1 can always wake pselect up. */ |
| 261 | if (android_pselect_sigset) | 261 | if (android_pselect_sigset) |
| 262 | sigdelset (android_pselect_sigset, SIGUSR1); | 262 | { |
| 263 | sigset = *android_pselect_sigset; | ||
| 264 | sigdelset (&sigset, SIGUSR1); | ||
| 265 | android_pselect_sigset = &sigset; | ||
| 266 | } | ||
| 263 | else | 267 | else |
| 264 | android_pselect_sigset = &signals; | 268 | android_pselect_sigset = &signals; |
| 265 | 269 | ||
| @@ -356,6 +360,23 @@ android_pending (void) | |||
| 356 | return i; | 360 | return i; |
| 357 | } | 361 | } |
| 358 | 362 | ||
| 363 | /* Wait for events to become available synchronously. Return once an | ||
| 364 | event arrives. */ | ||
| 365 | |||
| 366 | void | ||
| 367 | android_wait_event (void) | ||
| 368 | { | ||
| 369 | pthread_mutex_lock (&event_queue.mutex); | ||
| 370 | |||
| 371 | /* Wait for events to appear if there are none available to | ||
| 372 | read. */ | ||
| 373 | if (!event_queue.num_events) | ||
| 374 | pthread_cond_wait (&event_queue.read_var, | ||
| 375 | &event_queue.mutex); | ||
| 376 | |||
| 377 | pthread_mutex_unlock (&event_queue.mutex); | ||
| 378 | } | ||
| 379 | |||
| 359 | void | 380 | void |
| 360 | android_next_event (union android_event *event_return) | 381 | android_next_event (union android_event *event_return) |
| 361 | { | 382 | { |
| @@ -1472,6 +1493,8 @@ NATIVE_NAME (sendIconified) (JNIEnv *env, jobject object, | |||
| 1472 | 1493 | ||
| 1473 | event.iconified.type = ANDROID_ICONIFIED; | 1494 | event.iconified.type = ANDROID_ICONIFIED; |
| 1474 | event.iconified.window = window; | 1495 | event.iconified.window = window; |
| 1496 | |||
| 1497 | android_write_event (&event); | ||
| 1475 | } | 1498 | } |
| 1476 | 1499 | ||
| 1477 | extern JNIEXPORT void JNICALL | 1500 | extern JNIEXPORT void JNICALL |
| @@ -1482,6 +1505,21 @@ NATIVE_NAME (sendDeiconified) (JNIEnv *env, jobject object, | |||
| 1482 | 1505 | ||
| 1483 | event.iconified.type = ANDROID_DEICONIFIED; | 1506 | event.iconified.type = ANDROID_DEICONIFIED; |
| 1484 | event.iconified.window = window; | 1507 | event.iconified.window = window; |
| 1508 | |||
| 1509 | android_write_event (&event); | ||
| 1510 | } | ||
| 1511 | |||
| 1512 | extern JNIEXPORT void JNICALL | ||
| 1513 | NATIVE_NAME (sendContextMenu) (JNIEnv *env, jobject object, | ||
| 1514 | jshort window, jint menu_event_id) | ||
| 1515 | { | ||
| 1516 | union android_event event; | ||
| 1517 | |||
| 1518 | event.menu.type = ANDROID_CONTEXT_MENU; | ||
| 1519 | event.menu.window = window; | ||
| 1520 | event.menu.menu_event_id = menu_event_id; | ||
| 1521 | |||
| 1522 | android_write_event (&event); | ||
| 1485 | } | 1523 | } |
| 1486 | 1524 | ||
| 1487 | #pragma clang diagnostic pop | 1525 | #pragma clang diagnostic pop |