From 42d1a4755a16fe7717f9d40018ede79f15cfa932 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 25 Feb 2020 11:24:17 +0530 Subject: [PATCH] Add tests for multiline movement --- kitty/mouse.c | 5 +++-- kitty/screen.c | 6 +++--- kitty_tests/mouse.py | 25 +++++++++++++++++++++---- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/kitty/mouse.c b/kitty/mouse.c index afb44040b..afa814a89 100644 --- a/kitty/mouse.c +++ b/kitty/mouse.c @@ -312,6 +312,7 @@ HANDLER(handle_move_event) { Screen *screen = w->render_data.screen; detect_url(screen, x, y); bool mouse_cell_changed = x != w->mouse_pos.cell_x || y != w->mouse_pos.cell_y; + bool cell_half_changed = in_left_half_of_cell != w->mouse_pos.in_left_half_of_cell; w->mouse_pos.cell_x = x; w->mouse_pos.cell_y = y; w->mouse_pos.in_left_half_of_cell = in_left_half_of_cell; bool in_tracking_mode = ( @@ -320,7 +321,7 @@ HANDLER(handle_move_event) { bool has_terminal_select_modifiers = modifiers == (int)OPT(terminal_select_modifiers) || modifiers == ((int)OPT(rectangle_select_modifiers) | (int)OPT(terminal_select_modifiers)); bool handle_in_kitty = !in_tracking_mode || has_terminal_select_modifiers; if (handle_in_kitty) { - handle_mouse_movement_in_kitty(w, button, mouse_cell_changed); + handle_mouse_movement_in_kitty(w, button, mouse_cell_changed | cell_half_changed); } else { if (!mouse_cell_changed) return; int sz = encode_mouse_event(w, MAX(0, button), button >=0 ? DRAG : MOVE, 0); @@ -700,7 +701,7 @@ send_mock_mouse_event_to_window(PyObject *self UNUSED, PyObject *args) { Window *w = PyCapsule_GetPointer(capsule, "Window"); if (!w) return NULL; if (clear_clicks) clear_click_queue(w); - bool mouse_cell_changed = x != w->mouse_pos.cell_x || y != w->mouse_pos.cell_y; + bool mouse_cell_changed = x != w->mouse_pos.cell_x || y != w->mouse_pos.cell_y || w->mouse_pos.in_left_half_of_cell != in_left_half_of_cell; w->mouse_pos.x = 10 * x; w->mouse_pos.y = 20 * y; w->mouse_pos.cell_x = x; w->mouse_pos.cell_y = y; w->mouse_pos.in_left_half_of_cell = in_left_half_of_cell; diff --git a/kitty/screen.c b/kitty/screen.c index d40dfc76b..95659c1da 100644 --- a/kitty/screen.c +++ b/kitty/screen.c @@ -1603,13 +1603,13 @@ iteration_data(const Screen *self, const Selection *sel, IterationData *ans, int // empty selection if (start->x == end->x && start_y == end_y && start->in_left_half_of_cell == end->in_left_half_of_cell) return; - bool left_to_right = selection_is_left_to_right(sel); if (sel->rectangle_select) { // empty selection if (start->x == end->x && (!start->in_left_half_of_cell || end->in_left_half_of_cell)) return; ans->y = MIN(start_y, end_y); ans->y_limit = MAX(start_y, end_y) + 1; index_type x, x_limit; + bool left_to_right = selection_is_left_to_right(sel); if (start->x == end->x) { x = start->x; x_limit = start->x + 1; @@ -1643,12 +1643,12 @@ iteration_data(const Screen *self, const Selection *sel, IterationData *ans, int ans->first.x = end->x + (end->in_left_half_of_cell ? 0 : 1); ans->first.x_limit = 1 + start->x + (start->in_left_half_of_cell ? -1 : 0); } - } else if (start_y < end_y) { + } else if (start_y < end_y) { // downwards ans->body.x_limit = line_limit; ans->first.x_limit = line_limit; ans->first.x = start->x + (start->in_left_half_of_cell ? 0 : 1); ans->last.x_limit = 1 + end->x + (end->in_left_half_of_cell ? -1 : 0); - } else { + } else { // upwards ans->body.x_limit = line_limit; ans->first.x_limit = line_limit; ans->first.x = end->x + (end->in_left_half_of_cell ? 0 : 1); diff --git a/kitty_tests/mouse.py b/kitty_tests/mouse.py index 6a1747569..90389379a 100644 --- a/kitty_tests/mouse.py +++ b/kitty_tests/mouse.py @@ -67,8 +67,11 @@ class TestMouse(BaseTest): clear_click_queue=True ) - def move(x=0, y=0, button=-1): + def move(x=0, y=0, button=-1, q=None): ev(x=x, y=y, button=button) + if q is not None: + s = sel() + self.ae(s, q, '{!r} != {!r} after movement to x={} y={}'.format(s, q, x, y)) def multi_click(x=0, y=0, count=2): while count > 0: @@ -78,16 +81,30 @@ class TestMouse(BaseTest): def scroll(x=0, y=0, up=True): move(x=x, y=y, button=-2 if up else -3) - # Simple, click, move, release test + # Single line click, move, release test init() press() - move(x=3.6) - self.ae(sel(), '1234') + move(x=3.6, q='1234') release(x=3.6) self.ae(sel(), '1234') press(x=4), release(x=0.6) self.ae(sel(), '234') + # multi line movement + init() + press(x=2, y=2) + move(x=2, y=1, q='890ab') + move(x=2.6, y=1, q='90ab') + move(y=1, q='67890ab') + move(x=4, y=1, q='0ab') + move(x=4.6, y=1, q='ab') + move(q='1234567890ab') + move(x=2, y=3, q='cdefg') + move(y=3, q='cde') + move(x=0.6, y=3, q='cdef') + move(x=2.6, y=3, q='cdefgh') + move(x=4.6, y=3, q='cdefghij') + # Single cell select init() press(), release(1)