diff --git a/Libraries/LibVT/TerminalWidget.cpp b/Libraries/LibVT/TerminalWidget.cpp index b3f937ca04..438ceb4ca9 100644 --- a/Libraries/LibVT/TerminalWidget.cpp +++ b/Libraries/LibVT/TerminalWidget.cpp @@ -469,6 +469,8 @@ VT::Position TerminalWidget::buffer_position_at(const Point& position) const void TerminalWidget::doubleclick_event(GMouseEvent& event) { if (event.button() == GMouseButton::Left) { + m_triple_click_timer.start(); + auto position = buffer_position_at(event.position()); auto& line = m_terminal.line(position.row()); bool want_whitespace = line.characters[position.column()] == ' '; @@ -496,8 +498,20 @@ void TerminalWidget::doubleclick_event(GMouseEvent& event) void TerminalWidget::mousedown_event(GMouseEvent& event) { if (event.button() == GMouseButton::Left) { - m_selection_start = buffer_position_at(event.position()); - m_selection_end = {}; + if (m_triple_click_timer.is_valid() && m_triple_click_timer.elapsed() < 250) { + int start_column = 0; + int end_column = m_terminal.columns() - 1; + + auto position = buffer_position_at(event.position()); + m_selection_start = { position.row(), start_column }; + m_selection_end = { position.row(), end_column }; + + if (has_selection()) + GClipboard::the().set_data(selected_text()); + } else { + m_selection_start = buffer_position_at(event.position()); + m_selection_end = {}; + } update(); } else if (event.button() == GMouseButton::Right) { if (m_ptm_fd == -1) diff --git a/Libraries/LibVT/TerminalWidget.h b/Libraries/LibVT/TerminalWidget.h index 829c98158a..8c06844840 100644 --- a/Libraries/LibVT/TerminalWidget.h +++ b/Libraries/LibVT/TerminalWidget.h @@ -118,4 +118,6 @@ private: RefPtr m_config; RefPtr m_scrollbar; + + CElapsedTimer m_triple_click_timer; };