]> git.eshelyaron.com Git - emacs.git/commitdiff
Notify input methods when editing fails
authorPo Lu <luangruo@yahoo.com>
Sat, 18 Feb 2023 06:48:08 +0000 (14:48 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 18 Feb 2023 06:48:08 +0000 (14:48 +0800)
* INSTALL.android: Clarify build instructions.
* src/textconv.c (struct complete_edit_check_context): New
structure.
(complete_edit_check): New function.
(handle_pending_conversion_events_1): If the window is known,
then ensure that any editing failures are reported to the input
method.

INSTALL.android
src/textconv.c

index ab39a55eaf312c05f41b9c8db8c47c9fee0cb213..442bfef64229600ff468498e657d716bc4816f75 100644 (file)
@@ -555,8 +555,9 @@ libtasn1, p11-kit) which can be built with the ndk-build system can be
 found at https://sourceforge.net/projects/android-ports-for-gnu-emacs.
 
 They have only been tested on arm64 Android systems running Android
-5.0 or later, so your mileage may vary, especially if you are trying
-to build Emacs for another kind of machine.
+5.0 or later, and armv7l systems running Android 13 or later, so your
+mileage may vary, especially if you are trying to build Emacs for
+another kind of machine.
 
 To build Emacs with GnuTLS, you must unpack each of the following tar
 archives in that site:
@@ -567,7 +568,9 @@ archives in that site:
   p11-kit-0.24.1-emacs.tar.gz
   nettle-3.8-emacs.tar.gz
 
-and add the resulting folders to ``--with-ndk-path''.
+and add the resulting folders to ``--with-ndk-path''.  Note that you
+should not try to build these packages separately using any
+`configure' script or Makefiles inside.
 
 \f
 
index 7704f1b62a6155b67a57e93b7468039d9b7b4b0f..50146820dce7dca2bfff8160b6020b2db054aee5 100644 (file)
@@ -978,6 +978,52 @@ complete_edit (void *token)
     text_interface->notify_conversion (*(unsigned long *) token);
 }
 
+/* Context for complete_edit_check.  */
+
+struct complete_edit_check_context
+{
+  /* The window.  */
+  struct window *w;
+
+  /* Whether or not editing was successful.  */
+  bool check;
+};
+
+/* If CONTEXT->check is false, then update W's ephemeral last point
+   and give it to the input method, the assumption being that an
+   editing operation signalled.  */
+
+static void
+complete_edit_check (void *ptr)
+{
+  struct complete_edit_check_context *context;
+  struct frame *f;
+
+  context = ptr;
+
+  if (!context->check)
+    {
+      /* Figure out the new position of point.  */
+      context->w->ephemeral_last_point
+       = window_point (context->w);
+
+      /* See if the frame is still alive.  */
+
+      f = WINDOW_XFRAME (context->w);
+
+      if (!FRAME_LIVE_P (f))
+       return;
+
+      if (text_interface && text_interface->point_changed)
+       {
+         if (f->conversion.batch_edit_count > 0)
+           f->conversion.batch_edit_flags |= PENDING_POINT_CHANGE;
+         else
+           text_interface->point_changed (f, context->w, NULL);
+       }
+    }
+}
+
 /* Process and free the text conversion ACTION.  F must be the frame
    on which ACTION will be performed.
 
@@ -993,6 +1039,7 @@ handle_pending_conversion_events_1 (struct frame *f,
   struct window *w;
   specpdl_ref count;
   unsigned long token;
+  struct complete_edit_check_context context;
 
   /* Next, process this action and free it.  */
 
@@ -1008,6 +1055,10 @@ handle_pending_conversion_events_1 (struct frame *f,
   if (conversion_disabled_p ())
     return NULL;
 
+  /* check is a flag used by complete_edit_check to determine whether
+     or not the editing operation completed successfully.  */
+  context.check = false;
+
   /* Make sure completion is signalled.  */
   count = SPECPDL_INDEX ();
   record_unwind_protect_ptr (complete_edit, &token);
@@ -1017,6 +1068,10 @@ handle_pending_conversion_events_1 (struct frame *f,
     {
       w = XWINDOW (f->old_selected_window);
       buffer = XBUFFER (WINDOW_BUFFER (w));
+      context.w = w;
+
+      /* Notify the input method of any editing failures.  */
+      record_unwind_protect_ptr (complete_edit_check, &context);
     }
 
   switch (operation)
@@ -1070,6 +1125,8 @@ handle_pending_conversion_events_1 (struct frame *f,
       break;
     }
 
+  /* Signal success.  */
+  context.check = true;
   unbind_to (count, Qnil);
 
   return w;