[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/android ce238de2b11 2/2: Correctly report start and end in extra
From: |
Po Lu |
Subject: |
feature/android ce238de2b11 2/2: Correctly report start and end in extracted text |
Date: |
Wed, 31 May 2023 20:31:50 -0400 (EDT) |
branch: feature/android
commit ce238de2b1126bb1f356285c9713d8efefae3d59
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Correctly report start and end in extracted text
* src/androidterm.c (struct android_get_extracted_text_context):
New field `start_offset' and `end_offset'. Delete `offset'.
(android_get_extracted_text, android_build_extracted_text):
Replace `offset' with new args `start_offset' and `end_offset'.
(NATIVE_NAME): Set `start_offset' and `end_offset'.
(android_update_selection): Likewise.
* src/textconv.c (get_extracted_text): Likewise.
* src/textconv.h: Update prototypes.
---
src/androidterm.c | 32 +++++++++++++++++++-------------
src/textconv.c | 24 +++++++++++++++++-------
src/textconv.h | 3 ++-
3 files changed, 38 insertions(+), 21 deletions(-)
diff --git a/src/androidterm.c b/src/androidterm.c
index 6f7c06875ca..a9b5834c08f 100644
--- a/src/androidterm.c
+++ b/src/androidterm.c
@@ -5196,7 +5196,7 @@ struct android_get_extracted_text_context
ptrdiff_t length, bytes;
/* Offsets into that text. */
- ptrdiff_t start, offset;
+ ptrdiff_t start, start_offset, end_offset;
/* The window. */
android_window window;
@@ -5222,8 +5222,9 @@ android_get_extracted_text (void *data)
/* Now get the extracted text. */
request->text
= get_extracted_text (f, min (request->hint_max_chars, 600),
- &request->start, &request->offset,
- &request->length, &request->bytes);
+ &request->start, &request->start_offset,
+ &request->end_offset, &request->length,
+ &request->bytes);
/* See if request->flags & GET_EXTRACTED_TEXT_MONITOR. If so, then
the input method has asked to monitor changes to the extracted
@@ -5268,8 +5269,9 @@ struct android_extracted_text_class text_class;
/* Return an ExtractedText object corresponding to the extracted text
TEXT. START is a character position describing the offset of the
- first character in TEXT. OFFSET is the offset of point relative to
- START.
+ 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.
Assume that request_class and text_class have already been
initialized.
@@ -5279,7 +5281,8 @@ struct android_extracted_text_class text_class;
static jobject
android_build_extracted_text (jstring text, ptrdiff_t start,
- ptrdiff_t offset)
+ ptrdiff_t start_offset,
+ ptrdiff_t end_offset)
{
JNIEnv *env;
jobject object;
@@ -5299,9 +5302,9 @@ android_build_extracted_text (jstring text, ptrdiff_t
start,
(*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,
- min (offset, TYPE_MAXIMUM (jint)));
+ min (start_offset, TYPE_MAXIMUM (jint)));
(*env)->SetIntField (env, object, text_class.selection_end,
- min (offset, TYPE_MAXIMUM (jint)));
+ min (end_offset, TYPE_MAXIMUM (jint)));
/* Subtract 1 from start: point indices in Emacs start from 1, but
Android expects 0. */
@@ -5404,9 +5407,9 @@ NATIVE_NAME (getExtractedText) (JNIEnv *env, jobject
ignored_object,
(*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,
- min (context.offset, TYPE_MAXIMUM (jint)));
+ min (context.start_offset, TYPE_MAXIMUM (jint)));
(*env)->SetIntField (env, object, text_class.selection_end,
- min (context.offset, TYPE_MAXIMUM (jint)));
+ min (context.end_offset, TYPE_MAXIMUM (jint)));
/* Subtract 1 from start: point indices in Emacs start from 1, but
Android expects 0. */
@@ -5507,7 +5510,8 @@ NATIVE_NAME (requestCursorUpdates) (JNIEnv *env, jobject
object,
static void
android_update_selection (struct frame *f, struct window *w)
{
- ptrdiff_t start, end, point, mark, offset, length, bytes;
+ ptrdiff_t start, end, point, mark, start_offset, end_offset;
+ ptrdiff_t length, bytes;
struct buffer *b;
int hint, token;
char *text;
@@ -5560,7 +5564,8 @@ android_update_selection (struct frame *f, struct window
*w)
hint = FRAME_ANDROID_OUTPUT (f)->extracted_text_hint;
token = FRAME_ANDROID_OUTPUT (f)->extracted_text_token;
text = get_extracted_text (f, min (hint, 600), &start,
- &offset, &length, &bytes);
+ &start_offset, &end_offset,
+ &length, &bytes);
if (text)
{
@@ -5572,7 +5577,8 @@ android_update_selection (struct frame *f, struct window
*w)
/* Make extracted text out of that string. */
extracted = android_build_extracted_text (string, start,
- offset);
+ start_offset,
+ end_offset);
android_exception_check_1 (string);
ANDROID_DELETE_LOCAL_REF (string);
diff --git a/src/textconv.c b/src/textconv.c
index a2c790d5374..dcf016104fe 100644
--- a/src/textconv.c
+++ b/src/textconv.c
@@ -1513,21 +1513,23 @@ request_point_update (struct frame *f, unsigned long
counter)
that the mark is active.
Set *N to the actual number of characters returned, *START_RETURN
- to the position of the first character returned, *OFFSET to the
- offset of point within that text, *LENGTH to the actual number of
- characters returned, and *BYTES to the actual number of bytes
- returned.
+ 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.
Value is NULL upon failure, and a malloced string upon success. */
char *
get_extracted_text (struct frame *f, ptrdiff_t n,
ptrdiff_t *start_return,
- ptrdiff_t *offset, ptrdiff_t *length,
+ ptrdiff_t *start_offset,
+ ptrdiff_t *end_offset, ptrdiff_t *length,
ptrdiff_t *bytes)
{
specpdl_ref count;
- ptrdiff_t start, end, start_byte, end_byte;
+ ptrdiff_t start, end, start_byte, end_byte, mark;
char *buffer;
if (!WINDOW_LIVE_P (f->old_selected_window))
@@ -1595,9 +1597,17 @@ get_extracted_text (struct frame *f, ptrdiff_t n,
copy_buffer (start, start_byte, end, end_byte,
buffer);
+ /* Get the mark. If it's not active, use PT. */
+
+ mark = get_mark ();
+
+ if (mark == -1)
+ mark = PT;
+
/* Return the offsets. */
*start_return = start;
- *offset = PT - start;
+ *start_offset = min (mark - start, PT - start);
+ *end_offset = max (mark - start, PT - start);
*length = end - start;
*bytes = end_byte - start_byte;
diff --git a/src/textconv.h b/src/textconv.h
index 6abca97bc52..055bf251651 100644
--- a/src/textconv.h
+++ b/src/textconv.h
@@ -139,7 +139,8 @@ extern void delete_surrounding_text (struct frame *,
ptrdiff_t,
ptrdiff_t, unsigned long);
extern void request_point_update (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 *, ptrdiff_t *,
+ ptrdiff_t *);
extern bool conversion_disabled_p (void);
extern void register_textconv_interface (struct textconv_interface *);