Subject: 27.1; Sometimes two cursors are unexpectedly shown

From: Markus Triska <[email-masked]>
Date: Sat, 19 Aug 2023 14:11:57 +0200

To reproduce this issue, please save the forms below in the file
duplicate_cursor.el, and then open the file in Emacs with:

    $ emacs -Q duplicate_cursor.el

Next, evaluate the forms in the file with:

    M-x eval-buffer RET

The function `duplicate-cursor' is now defined. Invoke this function
with:

    M-x duplicate-cursor RET

A new buffer called duplicated-cursor is now selected. So far,
everything works as intended, and a single cursor is shown in the
penultimate line of the window, as expected, at the position of point.

Now the issue: Invoke `duplicate-cursor' again, i.e., please do again:

    M-x duplicate-cursor RET

Unexpectedly, two cursors now appear in the buffer duplicated-cursor:
One, as before, in the penultimate line of the window, and a second
cursor in the last line of the window. This second cursor is unexpected
and does not appear at the position of point, but one line below it.

If I then press C-p, a cursor is shown in the antepenultimate line of
the window. This works as expected. However, a second cursor is again
unexpectedly shown in the last line of the window. This second cursor
is also unexpectedly shown when I press C-p repeatedly from then on.

The expected situation in all cases above is that only a single cursor
is shown at all times, located at the position of point.

Please find below the forms I used to elicit this issue. Alternatively,
you can download duplicate_cursor.el from:

    https://www.metalevel.at/ei/duplicate_cursor.el

Can you reproduce the issue with this information? Please let me know if
anything else is needed.

Thank you and all the best,
Markus

(defface duplicated-cursor
  '((t
     (:height 151)))
  "Face for frame to illustrate the issue")

(set-frame-font (face-font 'duplicated-cursor))

(defun insert-height (h ascent)
  ;; use a PBM image, due to problems with XBM (see #36337)
  (insert-image `(image :type pbm
                        :data ,(format "P1\n1 %s\n%s" h (make-string h ?0))
                        :ascent ,ascent) "t"))

(defun goto-last-window-line ()
  (while (pos-visible-in-window-p)
    (insert "\n"))
  (delete-char -1))

(defun duplicate-cursor ()
  (interactive)
  (switch-to-buffer (get-buffer-create "duplicated-cursor"))
  (erase-buffer)
  (insert "\n\n")
  (insert-height 160 80)
  (let ((m (point-marker)))
    (insert-height 125 'center)
    (goto-last-window-line)
    (redisplay)
    (delete-region (point) m)
    (insert-height 112 'center)
    (insert "\n\n")
    (insert-height 6 100)
    (insert (propertize "\n"
                        'face '(:height 1)
                        'line-height t
                        'rear-nonsticky t))
    (goto-last-window-line)
    (previous-line)))

In GNU Emacs 27.1 (build 1, x86_64-apple-darwin15.3.0, X toolkit, Xaw scroll bars)
 of 2020-12-12 built on macbook
Windowing system distributor 'The X.Org Foundation', version 11.0.11502000
System Description:  Mac OS X 10.11.3

Configured using:
 'configure --prefix=/opt/local --disable-silent-rules --without-ns
 --without-dbus --without-gconf --without-libotf --without-m17n-flt
 --with-gmp --with-gnutls --with-json --with-xml2 --with-modules
 --infodir /opt/local/share/info/emacs --with-x-toolkit=lucid
 --without-xaw3d --without-imagemagick --with-xpm --with-jpeg
 --with-tiff --with-gif --with-png --with-lcms2 --without-rsvg
 --with-xft 'CFLAGS=-pipe -Os -arch x86_64'
 CPPFLAGS=-I/opt/local/include 'LDFLAGS=-L/opt/local/lib
 -Wl,-headerpad_max_install_names -lfreetype -lfontconfig -Wl,-no_pie
 -arch x86_64''

Configured features:
XPM JPEG TIFF GIF PNG GSETTINGS GLIB NOTIFY KQUEUE ACL GNUTLS LIBXML2
FREETYPE HARFBUZZ XFT ZLIB TOOLKIT_SCROLL_BARS LUCID X11 XDBE XIM
MODULES THREADS JSON PDUMPER LCMS2 GMP