From 16ffc3a64a55e445b1d9aba34eec405f07a07f9d Mon Sep 17 00:00:00 2001 From: Silver Date: Thu, 9 Oct 2025 14:16:52 +0100 Subject: [PATCH 1/3] Allow dragging right click --- src/input_handler.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/input_handler.cc b/src/input_handler.cc index d8ca04c754..9c73306336 100644 --- a/src/input_handler.cc +++ b/src/input_handler.cc @@ -1,6 +1,7 @@ #include "input_handler.hh" #include "buffer.hh" +#include "context.hh" #include "debug.hh" #include "command_manager.hh" #include "client.hh" @@ -15,7 +16,6 @@ #include "window.hh" #include "word_db.hh" -#include #include #include @@ -127,19 +127,24 @@ struct MouseHandler switch (key.mouse_button()) { case Key::MouseButton::Right: { - m_dragging.reset(); + m_dragging.reset(new ScopedSelectionEdition{context}); auto cursor = context.window().buffer_coord(key.coord()); if (not cursor) { context.ensure_cursor_visible = false; return true; } - ScopedSelectionEdition selection_edition{context}; auto& selections = context.selections(); if (key.modifiers & Key::Modifiers::Control) - selections = {{selections.begin()->anchor(), *cursor}}; + { + m_anchor = selections.begin()->anchor(); + selections = {{m_anchor, *cursor}}; + } else - selections.main() = {selections.main().anchor(), *cursor}; + { + m_anchor = selections.main().anchor(); + selections.main() = {m_anchor, *cursor}; + } selections.sort_and_merge_overlapping(); return true; } @@ -154,7 +159,7 @@ struct MouseHandler } m_anchor = *anchor; if (not (key.modifiers & Key::Modifiers::Control)) - context.selections_write_only() = { buffer, m_anchor}; + context.selections_write_only() = {buffer, m_anchor}; else { auto& selections = context.selections(); From b67c972014d2c2b00d1b0037b6b86069c6c8e627 Mon Sep 17 00:00:00 2001 From: Silver Date: Fri, 10 Oct 2025 01:46:36 +0100 Subject: [PATCH 2/3] Make shift + left click extend selections like right click --- src/input_handler.cc | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/input_handler.cc b/src/input_handler.cc index 9c73306336..821bb0c02b 100644 --- a/src/input_handler.cc +++ b/src/input_handler.cc @@ -123,17 +123,18 @@ struct MouseHandler switch ((key.modifiers & ~modifiers).value) { - case Key::Modifiers::MousePress: - switch (key.mouse_button()) + case Key::Modifiers::MousePress: { + m_dragging.reset(new ScopedSelectionEdition{context}); + auto cursor = context.window().buffer_coord(key.coord()); + if (not cursor) + { + context.ensure_cursor_visible = false; + return true; + } + + if (key.mouse_button() == Key::MouseButton::Right or + (key.mouse_button() == Key::MouseButton::Left and key.modifiers & Key::Modifiers::Shift)) { - case Key::MouseButton::Right: { - m_dragging.reset(new ScopedSelectionEdition{context}); - auto cursor = context.window().buffer_coord(key.coord()); - if (not cursor) - { - context.ensure_cursor_visible = false; - return true; - } auto& selections = context.selections(); if (key.modifiers & Key::Modifiers::Control) { @@ -146,18 +147,10 @@ struct MouseHandler selections.main() = {m_anchor, *cursor}; } selections.sort_and_merge_overlapping(); - return true; } - - case Key::MouseButton::Left: { - m_dragging.reset(new ScopedSelectionEdition{context}); - auto anchor = context.window().buffer_coord(key.coord()); - if (not anchor) - { - context.ensure_cursor_visible = false; - return true; - } - m_anchor = *anchor; + else if (key.mouse_button() == Key::MouseButton::Left) + { + m_anchor = *cursor; if (not (key.modifiers & Key::Modifiers::Control)) context.selections_write_only() = {buffer, m_anchor}; else @@ -168,11 +161,10 @@ struct MouseHandler selections.set_main_index(main); selections.sort_and_merge_overlapping(); } - return true; } - default: return true; - } + return true; + } case Key::Modifiers::MouseRelease: { auto cursor = context.window().buffer_coord(key.coord()); From beee436f88c332c8e08ed8e38ed9985780a81d9e Mon Sep 17 00:00:00 2001 From: Silver Date: Wed, 15 Oct 2025 15:44:04 +0100 Subject: [PATCH 3/3] Clamp mouse coordinates instead of ignoring clicks below the end of the buffer --- src/window.cc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/window.cc b/src/window.cc index 4e80239105..80d5b2e005 100644 --- a/src/window.cc +++ b/src/window.cc @@ -309,12 +309,11 @@ Optional Window::buffer_coord(DisplayCoord coord) const if (m_display_buffer.timestamp() != buffer().timestamp() or m_display_buffer.lines().empty()) return {}; - if (coord <= 0_line) - return {}; - if ((size_t)coord.line >= m_display_buffer.lines().size()) + if (coord < 0_line) return {}; - return find_buffer_coord(m_display_buffer.lines()[(int)coord.line], + auto line = std::min((size_t)coord.line, m_display_buffer.lines().size() - 1); + return find_buffer_coord(m_display_buffer.lines()[line], buffer(), coord.column); }