summaryrefslogtreecommitdiff
path: root/src/dispnew.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2017-10-28 16:51:46 +0300
committerEli Zaretskii <eliz@gnu.org>2017-10-28 16:51:46 +0300
commita8e67410662e653e60e8dcc7aaf27042492afee8 (patch)
tree96648b688548081b339bba5fc588d4c252c80265 /src/dispnew.c
parentd43b486f6c334ba88c4ecfc485b8d1102b8d20a3 (diff)
downloademacs-a8e67410662e653e60e8dcc7aaf27042492afee8.tar.gz
Fix conversion of pixel coordinates to buffer position
* src/dispnew.c (buffer_posn_from_coords): Adapt to auto-hscroll-mode == current-line.
Diffstat (limited to 'src/dispnew.c')
-rw-r--r--src/dispnew.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/dispnew.c b/src/dispnew.c
index cb32f09b7c6..065d06813b8 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -5149,6 +5149,29 @@ buffer_posn_from_coords (struct window *w, int *x, int *y, struct display_pos *p
include the hscroll. */
to_x += it.first_visible_x;
+ /* If we are hscrolling only the current line, and Y is at the line
+ containing point, augment TO_X with the hscroll amount of the
+ current line. */
+ if (it.line_wrap == TRUNCATE
+ && EQ (automatic_hscrolling, Qcurrent_line) && IT_CHARPOS (it) < PT)
+ {
+ struct it it2 = it;
+ void *it2data = bidi_shelve_cache ();
+ it2.last_visible_x = 1000000;
+ /* If the line at Y shows point, the call below to
+ move_it_in_display_line will succeed in reaching point. */
+ move_it_in_display_line (&it2, PT, -1, MOVE_TO_POS);
+ if (IT_CHARPOS (it2) >= PT)
+ {
+ to_x += (w->hscroll - w->min_hscroll) * FRAME_COLUMN_WIDTH (it.f);
+ /* We need to pretend the window is hscrolled, so that
+ move_it_in_display_line below will DTRT with TO_X. */
+ it.first_visible_x += w->hscroll * FRAME_COLUMN_WIDTH (it.f);
+ it.last_visible_x += w->hscroll * FRAME_COLUMN_WIDTH (it.f);
+ }
+ bidi_unshelve_cache (it2data, 0);
+ }
+
/* Now move horizontally in the row to the glyph under *X. Second
argument is ZV to prevent move_it_in_display_line from matching
based on buffer positions. */