]> git.eshelyaron.com Git - emacs.git/commitdiff
Update Android port
authorPo Lu <luangruo@yahoo.com>
Sat, 8 Jul 2023 02:15:38 +0000 (10:15 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 8 Jul 2023 02:15:38 +0000 (10:15 +0800)
* java/org/gnu/emacs/EmacsService.java (DEBUG_IC)
(DEBUG_THREADS): Improve commentary.
* src/androidterm.c (handle_one_android_event): Signal
completion of IME events that have lost their frames.
(requestCursorUpdates): Don't set an edit counter as this event
won't be passed to the text conversion machinery.

java/org/gnu/emacs/EmacsService.java
src/androidterm.c

index 37048960f25010796921c92dc8542c8ed906db61..62fd27402860dae33a9c304a5fece8b306909b77 100644 (file)
@@ -96,11 +96,11 @@ public final class EmacsService extends Service
   public DisplayMetrics metrics;
 
   /* Flag that says whether or not to print verbose debugging
-     information.  */
+     information when responding to an input method.  */
   public static final boolean DEBUG_IC = false;
 
-  /* Flag that says whether or not to perform extra checks on threads
-     performing drawing calls.  */
+  /* Flag that says whether or not to stringently check that only the
+     Emacs thread is performing drawing calls.  */
   private static final boolean DEBUG_THREADS = false;
 
   /* Atomic integer used for synchronization between
index 20a8860a9136c18efeb9b3259be9cfa3592cfa96..466a99a1e28d59cbbd39c241f9315a3e153ed07e 100644 (file)
@@ -774,6 +774,11 @@ android_handle_ime_event (union android_event *event, struct frame *f)
     }
 }
 
+\f
+
+/* Forward declaration.  */
+static void android_notify_conversion (unsigned long);
+
 static int
 handle_one_android_event (struct android_display_info *dpyinfo,
                          union android_event *event, int *finish,
@@ -1659,8 +1664,21 @@ handle_one_android_event (struct android_display_info *dpyinfo,
     case ANDROID_INPUT_METHOD:
 
       if (!any)
-       /* Free any text allocated for this event.  */
-       xfree (event->ime.text);
+       {
+         /* Free any text allocated for this event.  */
+         xfree (event->ime.text);
+
+         /* If edits associated with this event haven't been
+            processed yet, signal their completion to avoid delays
+            the next time a call to `android_sync_edit' is made.
+
+            If events for a deleted frame are interleaved with events
+            for another frame, the edit counter may be prematurely
+            incremented before edits associated with the other frames
+            are processed.  This is not a problem in practice.  */
+
+         android_notify_conversion (event->ime.counter);
+       }
       else
        android_handle_ime_event (event, any);
 
@@ -4585,10 +4603,12 @@ static void
 android_sync_edit (void)
 {
   struct timespec start, end, rem;
+  unsigned long counter;
+
+  counter = __atomic_load_n (&last_edit_counter,
+                            __ATOMIC_SEQ_CST);
 
-  if (__atomic_load_n (&last_edit_counter,
-                      __ATOMIC_SEQ_CST)
-      == edit_counter)
+  if (counter == edit_counter)
     return;
 
   start = current_timespec ();
@@ -5618,7 +5638,10 @@ NATIVE_NAME (requestCursorUpdates) (JNIEnv *env, jobject object,
   event.ime.length = mode;
   event.ime.position = 0;
   event.ime.text = NULL;
-  event.ime.counter = ++edit_counter;
+
+  /* Since this does not affect the state of the buffer text, there is
+     no need to apply synchronization to this event.  */
+  event.ime.counter = 0;
 
   android_write_event (&event);
 }