diff --git a/src/input_handler.cc b/src/input_handler.cc index d8ca04c754..821bb0c02b 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 @@ -123,38 +123,36 @@ 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) { - case Key::MouseButton::Right: { - m_dragging.reset(); - 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}}; - else - selections.main() = {selections.main().anchor(), *cursor}; - selections.sort_and_merge_overlapping(); + context.ensure_cursor_visible = false; return true; } - case Key::MouseButton::Left: { - m_dragging.reset(new ScopedSelectionEdition{context}); - auto anchor = context.window().buffer_coord(key.coord()); - if (not anchor) + if (key.mouse_button() == Key::MouseButton::Right or + (key.mouse_button() == Key::MouseButton::Left and key.modifiers & Key::Modifiers::Shift)) + { + auto& selections = context.selections(); + if (key.modifiers & Key::Modifiers::Control) { - context.ensure_cursor_visible = false; - return true; + m_anchor = selections.begin()->anchor(); + selections = {{m_anchor, *cursor}}; } - m_anchor = *anchor; + else + { + m_anchor = selections.main().anchor(); + selections.main() = {m_anchor, *cursor}; + } + selections.sort_and_merge_overlapping(); + } + 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}; + context.selections_write_only() = {buffer, m_anchor}; else { auto& selections = context.selections(); @@ -163,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()); 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); }