unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: liuhui1610@gmail.com
Cc: 45837@debbugs.gnu.org
Subject: bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t
Date: Mon, 18 Jan 2021 19:14:10 +0200	[thread overview]
Message-ID: <83a6t688wt.fsf@gnu.org> (raw)
In-Reply-To: <834kjiboqb.fsf@gnu.org> (message from Eli Zaretskii on Fri, 15 Jan 2021 10:15:08 +0200)

> Date: Fri, 15 Jan 2021 10:15:08 +0200
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: 45837@debbugs.gnu.org
> 
> > From: Liu Hui <liuhui1610@gmail.com>
> > Date: Fri, 15 Jan 2021 15:28:33 +0800
> > Cc: 45837@debbugs.gnu.org
> > 
> > I have tested the patch and found that the condition `(= (cdr (nth 2
> > (posn-at-point))) orig-y)` was sometimes too strict. `posn-at-point`
> > may give slightly different y positions for characters on the same
> > line when different fonts were used (examples can be found in the
> > HELLO file). If there are inline graphics (e.g. latex previews), the y
> > position can also be different.
> 
> Hmm... you are right.  But that sounds like a bug in posn-at-point, I
> will look into fixing it soon.

Upon looking into this, it isn't a bug: posn-at-point is working as
designed and documented:

  Return nil if POS is not visible in WINDOW.  Otherwise,
  the return value is similar to that returned by ‘event-start’ for
  a mouse click at the upper left corner of the glyph corresponding
  to POS:       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

"At the upper left corner of the glyph".  IOW, if we ask about a glyph
from a small font on an otherwise tall visual line, posn-at-point will
try to adjust the Y coordinate for the fact that the glyph is smaller,
and thus its upper left corner is further down from the window top.

So using the (X . Y) part of what posn-at-point returns is unworkable
for the purpose of this issue: a character about which we are asking
can be arbitrarily small, and thus to work in all the cases, we will
have to allow for a very large tolerance, and that could miss some
situations where we really end up on the next visual line.

However, posn-at-point also returns the coordinates in (COLUMN . ROW)
units, and we can use that instead.  So I propose to fix the current
code on master as below.  WDYT?

diff --git a/lisp/simple.el b/lisp/simple.el
index 37c0885dcc..2c6e3916cd 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -7338,10 +7338,7 @@ kill-visual-line
   ;; of the kill before killing.
   (let ((opoint (point))
         (kill-whole-line (and kill-whole-line (bolp)))
-        (orig-y (cdr (nth 2 (posn-at-point))))
-        ;; FIXME: This tolerance should be zero!  It isn't due to a
-        ;; bug in posn-at-point, see bug#45837.
-        (tol (/ (line-pixel-height) 2)))
+        (orig-vlnum (cdr (nth 6 (posn-at-point)))))
     (if arg
 	(vertical-motion (prefix-numeric-value arg))
       (end-of-visual-line 1)
@@ -7352,8 +7349,8 @@ kill-visual-line
         ;; end-of-visual-line didn't overshoot due to complications
         ;; like display or overlay strings, intangible text, etc.:
         ;; otherwise, we don't want to kill a character that's
-        ;; unrelated to the place where the visual line wrapped.
-        (and (< (abs (- (cdr (nth 2 (posn-at-point))) orig-y)) tol)
+        ;; unrelated to the place where the visual line wraps.
+        (and (= (cdr (nth 6 (posn-at-point))) orig-vlnum)
              ;; Make sure we delete the character where the line wraps
              ;; under visual-line-mode, be it whitespace or a
              ;; character whose category set allows to wrap at it.





  reply	other threads:[~2021-01-18 17:14 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-13  2:27 bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t Liu Hui
2021-01-13 14:47 ` Eli Zaretskii
2021-01-14  4:51   ` Liu Hui
2021-01-14 13:51     ` Eli Zaretskii
2021-01-15  7:28       ` Liu Hui
2021-01-15  8:15         ` Eli Zaretskii
2021-01-18 17:14           ` Eli Zaretskii [this message]
2021-01-21  3:07             ` Liu Hui
2021-01-21 14:22               ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=83a6t688wt.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=45837@debbugs.gnu.org \
    --cc=liuhui1610@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).