aboutsummaryrefslogtreecommitdiffstats
path: root/src/android.c
diff options
context:
space:
mode:
authorPo Lu2023-01-15 11:57:10 +0800
committerPo Lu2023-01-15 11:57:10 +0800
commit6e2bc91d924fbeb0ad5728e0424eabc905c0d366 (patch)
treef2835948a308d9d0898b9ef868893560048f6812 /src/android.c
parentc02a7b2ff48746fab891db16f58ccdc11d161745 (diff)
downloademacs-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.c42
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;
236static void * 236static void *
237android_run_select_thread (void *data) 237android_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
366void
367android_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
359void 380void
360android_next_event (union android_event *event_return) 381android_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
1477extern JNIEXPORT void JNICALL 1500extern 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
1512extern JNIEXPORT void JNICALL
1513NATIVE_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