summaryrefslogtreecommitdiff
path: root/src/input_handler.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2023-02-14 22:00:12 +1100
committerMaxime Coste <mawww@kakoune.org>2023-02-14 22:00:12 +1100
commit0630b4f4f6f006702bbff973309f2487b9fab001 (patch)
treed3bba97d615e5e39f11e1c5319e47bfd0cce466e /src/input_handler.cc
parent458e3ef20ac3f8b815f1087675b9bf820ea8c3f5 (diff)
Fix scroll_window not ensuring cursor lies on a codepoint start
Fixes #4839
Diffstat (limited to 'src/input_handler.cc')
-rw-r--r--src/input_handler.cc12
1 files changed, 3 insertions, 9 deletions
diff --git a/src/input_handler.cc b/src/input_handler.cc
index 664490d6..2564529a 100644
--- a/src/input_handler.cc
+++ b/src/input_handler.cc
@@ -1820,21 +1820,15 @@ void scroll_window(Context& context, LineCount offset, bool mouse_dragging)
SelectionList& selections = context.selections();
Selection& main_selection = selections.main();
const BufferCoord anchor = main_selection.anchor();
- const BufferCoord cursor = main_selection.cursor();
+ const BufferCoordAndTarget cursor = main_selection.cursor();
auto cursor_off = mouse_dragging ? win_pos.line - window.position().line : 0;
auto line = clamp(cursor.line + cursor_off, win_pos.line + scrolloff.line,
win_pos.line + win_dim.line - 1 - scrolloff.line);
- line = clamp(line, 0_line, buffer.line_count() - 1);
- using std::min; using std::max;
- // This is not exactly a clamp, and must be done in this order as
- // byte_count_to could return line length
- auto col = min(max(cursor.column, buffer[line].byte_count_to(win_pos.column)),
- buffer[line].length()-1);
-
- BufferCoord new_cursor = { line, col };
+ const ColumnCount tabstop = context.options()["tabstop"].get<int>();
+ auto new_cursor = buffer.offset_coord(cursor, line - cursor.line, tabstop);
BufferCoord new_anchor = (mouse_dragging or new_cursor == cursor) ? anchor : new_cursor;
window.set_position(win_pos);