]> git.eshelyaron.com Git - emacs.git/commitdiff
Update Android port
authorPo Lu <luangruo@yahoo.com>
Mon, 5 Jun 2023 02:38:25 +0000 (10:38 +0800)
committerPo Lu <luangruo@yahoo.com>
Mon, 5 Jun 2023 02:38:25 +0000 (10:38 +0800)
* java/org/gnu/emacs/EmacsNative.java (EmacsNative): New
function clearInputFlags.
* java/org/gnu/emacs/EmacsView.java (onCreateInputConnection):
Stop reporting changes after a new input method connection is
established.
* src/androidterm.c (android_handle_ime_event): Implement that
change.
(JNICALL): New function.

java/org/gnu/emacs/EmacsNative.java
java/org/gnu/emacs/EmacsView.java
src/androidterm.c

index f03736fe614ce55480f3ea48fe06848defa34ccf..cb1c6caa79a224b6c1a4431ec2a38a07c597f874 100644 (file)
@@ -221,6 +221,7 @@ public final class EmacsNative
                                                       int flags);
   public static native void requestSelectionUpdate (short window);
   public static native void requestCursorUpdates (short window, int mode);
+  public static native void clearInputFlags (short window);
 
 \f
   /* Return the current value of the selection, or -1 upon
index c223dfa7911b7bad97361005daf27fd6f3cd2dd3..a78dec08839429b7fec66b13f70942862b12e353 100644 (file)
@@ -627,6 +627,10 @@ public final class EmacsView extends ViewGroup
        return null;
       }
 
+    /* Reset flags set by the previous input method.  */
+
+    EmacsNative.clearInputFlags (window.handle);
+
     /* Obtain the current position of point and set it as the
        selection.  Don't do this under one specific situation: if
        `android_update_ic' is being called in the main thread, trying
@@ -663,10 +667,6 @@ public final class EmacsView extends ViewGroup
 
     if (inputConnection == null)
       inputConnection = new EmacsInputConnection (this);
-    else
-      /* Reset the composing region, in case there is still composing
-        text.  */
-      inputConnection.finishComposingText ();
 
     /* Return the input connection.  */
     return inputConnection;
index d8a8b4c2d71a9760a53e738491cd2dc15ddcffff..afa10a1b94b72d96be66caf7efc7c4f8bf5d766f 100644 (file)
@@ -675,6 +675,7 @@ static void
 android_handle_ime_event (union android_event *event, struct frame *f)
 {
   Lisp_Object text UNINIT;
+  struct android_output *output;
 
   /* First, decode the text if necessary.  */
 
@@ -707,8 +708,23 @@ android_handle_ime_event (union android_event *event, struct frame *f)
       break;
 
     case ANDROID_IME_FINISH_COMPOSING_TEXT:
+
+      if (event->ime.length == 2)
+       {
+         output = FRAME_ANDROID_OUTPUT (f);
+
+         /* A new input method has connected to Emacs.  Stop
+            reporting changes that the previous input method has
+            asked to monitor.  */
+
+         output->extracted_text_flags = 0;
+         output->extracted_text_token = 0;
+         output->extracted_text_hint = 0;
+         output->need_cursor_updates = false;
+       }
+
       finish_composing_text (f, event->ime.counter,
-                            event->ime.length);
+                            event->ime.length == 1);
       break;
 
     case ANDROID_IME_SET_COMPOSING_TEXT:
@@ -5580,6 +5596,36 @@ NATIVE_NAME (requestCursorUpdates) (JNIEnv *env, jobject object,
   android_write_event (&event);
 }
 
+/* Notice that a new input method connection has been initialized and
+   clear cursor update requests, extracted text requests, and the
+   composing region.  */
+
+JNIEXPORT void JNICALL
+NATIVE_NAME (clearInputFlags) (JNIEnv *env, jobject object,
+                              jshort window)
+{
+  JNI_STACK_ALIGNMENT_PROLOGUE;
+
+  union android_event event;
+
+  event.ime.type = ANDROID_INPUT_METHOD;
+  event.ime.serial = ++event_serial;
+  event.ime.window = window;
+  event.ime.operation = ANDROID_IME_FINISH_COMPOSING_TEXT;
+  event.ime.start = 0;
+  event.ime.end = 0;
+
+  /* This value of `length' means that updates to the cursor position
+     and extracted text should not be reported anymore.  */
+
+  event.ime.length = 2;
+  event.ime.position = 0;
+  event.ime.text = NULL;
+  event.ime.counter = ++edit_counter;
+
+  android_write_event (&event);
+}
+
 #ifdef __clang__
 #pragma clang diagnostic pop
 #else