diff --git a/kitty/screen.c b/kitty/screen.c index 788e32190..dd40b458b 100644 --- a/kitty/screen.c +++ b/kitty/screen.c @@ -2495,7 +2495,7 @@ add_url_range(Screen *self, index_type start_x, index_type start_y, index_type e memset(r, 0, sizeof(Selection)); A(start.x, start_x); A(end.x, end_x); A(start.y, start_y); A(end.y, end_y); A(start_scrolled_by, self->scrolled_by); A(end_scrolled_by, self->scrolled_by); - A(start.in_left_half_of_cell, true); A(end.in_left_half_of_cell, start_x == end_x && start_y == end_y); + A(start.in_left_half_of_cell, true); #undef A } @@ -2532,7 +2532,9 @@ mark_hyperlinks_in_line(Screen *self, Line *line, hyperlink_id_type id) { static int compare_ranges(const void *a_, const void* b_) { const Selection *a = a_, *b = b_; - return (a->sort_y - b->sort_y) || (a->sort_x - b->sort_x); + int ans = a->sort_y - b->sort_y; + if (!ans) ans = a->sort_x - b->sort_x; + return ans; } static void @@ -2558,8 +2560,8 @@ screen_mark_hyperlink(Screen *self, index_type x, index_type y) { if (ypos == 0) break; ypos--; line = screen_visual_line(self, ypos); - } while ( last_marked_line - ypos < 5); - ypos = y; last_marked_line = y; + } while (last_marked_line - ypos < 5); + ypos = y + 1; last_marked_line = y; while (ypos < self->lines - 1 && ypos - last_marked_line < 5) { line = screen_visual_line(self, ypos); if (mark_hyperlinks_in_line(self, line, id)) last_marked_line = ypos; diff --git a/kitty_tests/screen.py b/kitty_tests/screen.py index 9a89ea895..9a58d9e9b 100644 --- a/kitty_tests/screen.py +++ b/kitty_tests/screen.py @@ -591,3 +591,22 @@ class TestScreen(BaseTest): set_link('2'), s.draw('2') set_link('1'), s.draw('1') self.ae([(':2', 2), (':1', 1)], s.hyperlinks_as_list()) + + s = self.create_screen() + set_link('1'), s.draw('12'), set_link(), s.draw('X'), set_link('1'), s.draw('3') + s.linefeed(), s.carriage_return() + s.draw('abc') + s.linefeed(), s.carriage_return() + set_link(), s.draw('Z ') + set_link('1'), s.draw('xyz') + s.linefeed(), s.carriage_return() + set_link('2'), s.draw('Z Z') + self.assertIsNone(s.current_url_text()) + self.assertIsNone(s.hyperlink_at(0, 4)) + self.assertIsNone(s.current_url_text()) + self.ae(s.hyperlink_at(0, 0), '1') + self.ae(s.current_url_text(), '123abcxyz') + self.ae('1', s.hyperlink_at(3, 2)) + self.ae(s.current_url_text(), '123abcxyz') + self.ae('2', s.hyperlink_at(1, 3)) + self.ae(s.current_url_text(), 'Z Z')