diff options
Diffstat (limited to 'src/marker.c')
-rw-r--r-- | src/marker.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/marker.c b/src/marker.c index d220dd82692..2abc951fc76 100644 --- a/src/marker.c +++ b/src/marker.c @@ -20,9 +20,15 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ #include <config.h> +/* Work around GCC bug 113253. */ +#if __GNUC__ == 13 +# pragma GCC diagnostic ignored "-Wanalyzer-deref-before-check" +#endif + #include "lisp.h" #include "character.h" #include "buffer.h" +#include "window.h" /* Record one cached position found recently by buf_charpos_to_bytepos or buf_bytepos_to_charpos. */ @@ -457,6 +463,18 @@ DEFUN ("marker-position", Fmarker_position, Smarker_position, 1, 1, 0, return Qnil; } +DEFUN ("marker-last-position", Fmarker_last_position, Smarker_last_position, 1, 1, 0, + doc: /* Return last position of MARKER in its buffer. +This is like `marker-position' with one exception: If the buffer of +MARKER is dead, it returns the last position of MARKER in that buffer +before it was killed. */) + (Lisp_Object marker) +{ + CHECK_MARKER (marker); + + return make_fixnum (XMARKER (marker)->charpos); +} + /* Change M so it points to B at CHARPOS and BYTEPOS. */ static void @@ -566,6 +584,31 @@ set_marker_internal (Lisp_Object marker, Lisp_Object position, attach_marker (m, b, charpos, bytepos); } + +#ifdef HAVE_TEXT_CONVERSION + + /* If B is the buffer's mark and there is a window displaying B, and + text conversion is enabled while the mark is active, redisplay + the buffer. + + propagate_window_redisplay will propagate this redisplay to the + window, which will eventually reach + mark_window_display_accurate_1. At that point, + report_point_change will be told to update the mark as seen by + the input method. + + This is done all the way in (the seemingly irrelevant) redisplay + because the selection reported to the input method is actually what + is visible on screen, namely w->last_point. */ + + if (m->buffer + && EQ (marker, BVAR (m->buffer, mark)) + && !NILP (BVAR (m->buffer, mark_active)) + && buffer_window_count (m->buffer)) + bset_redisplay (m->buffer); + +#endif + return marker; } @@ -799,6 +842,7 @@ void syms_of_marker (void) { defsubr (&Smarker_position); + defsubr (&Smarker_last_position); defsubr (&Smarker_buffer); defsubr (&Sset_marker); defsubr (&Scopy_marker); |