From: Po Lu Date: Thu, 1 Jun 2023 00:29:48 +0000 (+0800) Subject: Correctly report start and end in extracted text X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ce238de2b1126bb1f356285c9713d8efefae3d59;p=emacs.git 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. --- 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 *);