emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/android 776f1ca3e35 1/2: Update Android port


From: Po Lu
Subject: feature/android 776f1ca3e35 1/2: Update Android port
Date: Sun, 12 Mar 2023 07:37:35 -0400 (EDT)

branch: feature/android
commit 776f1ca3e3551b98569ab7daa58cd6921048881e
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Update Android port
    
    * src/android.c (android_check_if_event):
    * src/androidgui.h: New function.
    * src/androidterm.c (android_event_is_for_frame): New function.
    (android_reset_conversion): Free and unqueue all text conversion
    events for the given frame.
---
 src/android.c     | 34 ++++++++++++++++++++++++++++++++++
 src/androidgui.h  |  4 ++++
 src/androidterm.c | 35 +++++++++++++++++++++++++++++++++++
 3 files changed, 73 insertions(+)

diff --git a/src/android.c b/src/android.c
index e4f9dd0ffbe..a2c239736a7 100644
--- a/src/android.c
+++ b/src/android.c
@@ -601,6 +601,40 @@ android_next_event (union android_event *event_return)
   pthread_mutex_unlock (&event_queue.mutex);
 }
 
+bool
+android_check_if_event (union android_event *event_return,
+                       bool (*predicate) (union android_event *,
+                                          void *),
+                       void *arg)
+{
+  struct android_event_container *container;
+
+  pthread_mutex_lock (&event_queue.mutex);
+
+  /* Loop over each event.  */
+  container = event_queue.events.last;
+  for (; container != &event_queue.events; container = container->last)
+    {
+      /* See if the predicate matches.  */
+      if ((*predicate) (&container->event, arg))
+       {
+         /* Copy out the event and return true.  */
+         *event_return = container->event;
+         --event_queue.num_events;
+
+         /* Unlink container.  */
+         container->last->next = container->next;
+         container->next->last = container->last;
+         free (container);
+         pthread_mutex_unlock (&event_queue.mutex);
+         return true;
+       }
+    }
+
+  pthread_mutex_unlock (&event_queue.mutex);
+  return false;
+}
+
 void
 android_write_event (union android_event *event)
 {
diff --git a/src/androidgui.h b/src/androidgui.h
index 0e311b629c6..ddd8e9fcf72 100644
--- a/src/androidgui.h
+++ b/src/androidgui.h
@@ -524,6 +524,10 @@ enum android_ic_mode
 
 extern int android_pending (void);
 extern void android_next_event (union android_event *);
+extern bool android_check_if_event (union android_event *,
+                                   bool (*) (union android_event *,
+                                             void *),
+                                   void *);
 
 extern android_window android_create_window (android_window, int,
                                             int, int, int,
diff --git a/src/androidterm.c b/src/androidterm.c
index ed375ef53fe..72d81744128 100644
--- a/src/androidterm.c
+++ b/src/androidterm.c
@@ -5474,6 +5474,19 @@ android_update_selection (struct frame *f, struct window 
*w)
     }
 }
 
+/* Return whether or not EVENT is an input method event destined for
+   the frame (struct frame *) ARG.  */
+
+static bool
+android_event_is_for_frame (union android_event *event, void *arg)
+{
+  struct frame *f;
+
+  f = arg;
+  return (event->type == ANDROID_INPUT_METHOD
+         && event->ime.window == FRAME_ANDROID_WINDOW (f));
+}
+
 /* Notice that the input method connection to F should be reset as a
    result of a change to its contents.  */
 
@@ -5484,6 +5497,7 @@ android_reset_conversion (struct frame *f)
   struct window *w;
   struct buffer *buffer;
   Lisp_Object style;
+  union android_event event;
 
   /* Reset the input method.
 
@@ -5507,6 +5521,27 @@ android_reset_conversion (struct frame *f)
   else
     mode = ANDROID_IC_MODE_TEXT;
 
+  /* Remove any existing input method events that apply to FRAME from
+     the event queue.
+
+     There's a small window between this and the call to
+     android_reset_ic between which more events can be generated.  */
+
+  while (android_check_if_event (&event, android_event_is_for_frame, f))
+    {
+      switch (event.ime.operation)
+       {
+       case ANDROID_IME_COMMIT_TEXT:
+       case ANDROID_IME_FINISH_COMPOSING_TEXT:
+       case ANDROID_IME_SET_COMPOSING_TEXT:
+         xfree (event.ime.text);
+         break;
+
+       default:
+         break;
+       }
+    }
+
   android_reset_ic (FRAME_ANDROID_WINDOW (f), mode);
 
   /* Clear extracted text flags.  Since the IM has been reinitialised,



reply via email to

[Prev in Thread] Current Thread [Next in Thread]