emacs-diffs
[Top][All Lists]
Advanced

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

feature/android a696ed5c30f: Update Android port


From: Po Lu
Subject: feature/android a696ed5c30f: Update Android port
Date: Fri, 2 Jun 2023 22:16:52 -0400 (EDT)

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

    Update Android port
    
    * src/androidterm.c (struct android_get_extracted_text_context):
    New field `mark_active'.
    (android_get_extracted_text): Set that field.
    (struct android_extracted_text_class): New field `flags'.
    (android_build_extracted_text): New argument `mark_active'.  Set
    flags appropriately.
    (NATIVE_NAME, android_update_selection): Likewise.
    * src/textconv.c (get_extracted_text): New argument
    `mark_active'.  Set it if the mark is active.
    * src/textconv.h: Update prototypes.
---
 src/androidterm.c | 27 +++++++++++++++++++++------
 src/textconv.c    | 13 +++++++++----
 src/textconv.h    |  2 +-
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/src/androidterm.c b/src/androidterm.c
index 211faabf5c2..2894a58e6b9 100644
--- a/src/androidterm.c
+++ b/src/androidterm.c
@@ -5274,10 +5274,13 @@ struct android_get_extracted_text_context
 
   /* The window.  */
   android_window window;
+
+  /* Whether or not the mark is active.  */
+  bool mark_active;
 };
 
 /* Return the extracted text in the extracted text context specified
-   by DATA.  */
+   by DATA.  Save its flags and token into its frame's state.  */
 
 static void
 android_get_extracted_text (void *data)
@@ -5298,7 +5301,7 @@ android_get_extracted_text (void *data)
     = get_extracted_text (f, min (request->hint_max_chars, 600),
                          &request->start, &request->start_offset,
                          &request->end_offset, &request->length,
-                         &request->bytes);
+                         &request->bytes, &request->mark_active);
 
   /* See if request->flags & GET_EXTRACTED_TEXT_MONITOR.  If so, then
      the input method has asked to monitor changes to the extracted
@@ -5326,6 +5329,7 @@ struct android_extracted_text_class
 {
   jclass class;
   jmethodID constructor;
+  jfieldID flags;
   jfieldID partial_start_offset;
   jfieldID partial_end_offset;
   jfieldID selection_start;
@@ -5345,7 +5349,8 @@ struct android_extracted_text_class text_class;
    TEXT.  START is a character position describing the offset of the
    first character in TEXT.  START_OFFSET is the offset of the lesser
    of point or mark relative to START, and END_OFFSET is that of the
-   greater of point or mark relative to START.
+   greater of point or mark relative to START.  MARK_ACTIVE specifies
+   whether or not the mark is currently active.
 
    Assume that request_class and text_class have already been
    initialized.
@@ -5356,7 +5361,7 @@ struct android_extracted_text_class text_class;
 static jobject
 android_build_extracted_text (jstring text, ptrdiff_t start,
                              ptrdiff_t start_offset,
-                             ptrdiff_t end_offset)
+                             ptrdiff_t end_offset, bool mark_active)
 {
   JNIEnv *env;
   jobject object;
@@ -5373,6 +5378,9 @@ android_build_extracted_text (jstring text, ptrdiff_t 
start,
   if (!object)
     return NULL;
 
+  (*env)->SetIntField (env, object, text_class.flags,
+                      /* ExtractedText.FLAG_SELECTING */
+                      mark_active ? 2 : 0);
   (*env)->SetIntField (env, object, text_class.partial_start_offset, -1);
   (*env)->SetIntField (env, object, text_class.partial_end_offset, -1);
   (*env)->SetIntField (env, object, text_class.selection_start,
@@ -5432,6 +5440,8 @@ NATIVE_NAME (getExtractedText) (JNIEnv *env, jobject 
ignored_object,
        = (*env)->NewGlobalRef (env, text_class.class);
       assert (text_class.class);
 
+      text_class.flags
+       = (*env)->GetFieldID (env, class, "flags", "I");
       text_class.partial_start_offset
        = (*env)->GetFieldID (env, class, "partialStartOffset", "I");
       text_class.partial_end_offset
@@ -5478,6 +5488,9 @@ NATIVE_NAME (getExtractedText) (JNIEnv *env, jobject 
ignored_object,
   if (!object)
     return NULL;
 
+  (*env)->SetIntField (env, object, text_class.flags,
+                      /* ExtractedText.FLAG_SELECTING */
+                      context.mark_active ? 2 : 0);
   (*env)->SetIntField (env, object, text_class.partial_start_offset, -1);
   (*env)->SetIntField (env, object, text_class.partial_end_offset, -1);
   (*env)->SetIntField (env, object, text_class.selection_start,
@@ -5591,6 +5604,7 @@ android_update_selection (struct frame *f, struct window 
*w)
   char *text;
   jobject extracted;
   jstring string;
+  bool mark_active;
 
   if (MARKERP (f->conversion.compose_region_start))
     {
@@ -5639,7 +5653,7 @@ android_update_selection (struct frame *f, struct window 
*w)
       token = FRAME_ANDROID_OUTPUT (f)->extracted_text_token;
       text = get_extracted_text (f, min (hint, 600), &start,
                                 &start_offset, &end_offset,
-                                &length, &bytes);
+                                &length, &bytes, &mark_active);
 
       if (text)
        {
@@ -5652,7 +5666,8 @@ android_update_selection (struct frame *f, struct window 
*w)
          /* Make extracted text out of that string.  */
          extracted = android_build_extracted_text (string, start,
                                                    start_offset,
-                                                   end_offset);
+                                                   end_offset,
+                                                   mark_active);
          android_exception_check_1 (string);
          ANDROID_DELETE_LOCAL_REF (string);
 
diff --git a/src/textconv.c b/src/textconv.c
index 9003816e191..e082eb6ee22 100644
--- a/src/textconv.c
+++ b/src/textconv.c
@@ -1573,8 +1573,9 @@ textconv_barrier (struct frame *f, unsigned long counter)
    to the position of the first character returned, *START_OFFSET to
    the offset of the lesser of mark and point within that text,
    *END_OFFSET to the greater of mark and point within that text, and
-   *LENGTH to the actual number of characters returned, and *BYTES to
-   the actual number of bytes returned.
+   *LENGTH to the actual number of characters returned, *BYTES to the
+   actual number of bytes returned, and *MARK_ACTIVE to whether or not
+   the mark is active.
 
    Value is NULL upon failure, and a malloced string upon success.  */
 
@@ -1583,7 +1584,7 @@ get_extracted_text (struct frame *f, ptrdiff_t n,
                    ptrdiff_t *start_return,
                    ptrdiff_t *start_offset,
                    ptrdiff_t *end_offset, ptrdiff_t *length,
-                   ptrdiff_t *bytes)
+                   ptrdiff_t *bytes, bool *mark_active)
 {
   specpdl_ref count;
   ptrdiff_t start, end, start_byte, end_byte, mark;
@@ -1657,9 +1658,13 @@ get_extracted_text (struct frame *f, ptrdiff_t n,
   /* Get the mark.  If it's not active, use PT.  */
 
   mark = get_mark ();
+  *mark_active = true;
 
   if (mark == -1)
-    mark = PT;
+    {
+      mark = PT;
+      *mark_active = false;
+    }
 
   /* Return the offsets.  */
   *start_return = start;
diff --git a/src/textconv.h b/src/textconv.h
index d4d0e9d7227..339cefdba92 100644
--- a/src/textconv.h
+++ b/src/textconv.h
@@ -142,7 +142,7 @@ extern void request_point_update (struct frame *, unsigned 
long);
 extern void textconv_barrier (struct frame *, unsigned long);
 extern char *get_extracted_text (struct frame *, ptrdiff_t, ptrdiff_t *,
                                 ptrdiff_t *, ptrdiff_t *, ptrdiff_t *,
-                                ptrdiff_t *);
+                                ptrdiff_t *, bool *);
 extern bool conversion_disabled_p (void);
 
 extern void register_textconv_interface (struct textconv_interface *);



reply via email to

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