From 6a83475ec5d104363ad127f8b2aefcc7bc3066b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Offenh=C3=A4user?= Date: Thu, 3 Dec 2020 22:18:28 +0100 Subject: [PATCH] LibVT: Auto-scroll the terminal TerminalWidget will now automatically scroll up or down when the user drags the mouse out of its bounds while selecting text. This happens at a fixed speed. --- Libraries/LibVT/TerminalWidget.cpp | 21 +++++++++++++++++++++ Libraries/LibVT/TerminalWidget.h | 9 +++++++++ 2 files changed, 30 insertions(+) diff --git a/Libraries/LibVT/TerminalWidget.cpp b/Libraries/LibVT/TerminalWidget.cpp index ae8a42062c0..7af21ac9843 100644 --- a/Libraries/LibVT/TerminalWidget.cpp +++ b/Libraries/LibVT/TerminalWidget.cpp @@ -101,6 +101,7 @@ TerminalWidget::TerminalWidget(int ptm_fd, bool automatic_size_policy, RefPtr(); m_visual_beep_timer = add(); + m_auto_scroll_timer = add(); m_scrollbar = add(Orientation::Vertical); m_scrollbar->set_relative_rect(0, 0, 16, 0); @@ -118,6 +119,15 @@ TerminalWidget::TerminalWidget(int ptm_fd, bool automatic_size_policy, RefPtrset_interval(50); + m_auto_scroll_timer->on_timeout = [this] { + if (m_auto_scroll_direction != AutoScrollDirection::None) { + int scroll_amount = m_auto_scroll_direction == AutoScrollDirection::Up ? -1 : 1; + m_scrollbar->set_value(m_scrollbar->value() + scroll_amount); + } + }; + m_auto_scroll_timer->start(); + auto font_entry = m_config->read_entry("Text", "Font", "default"); if (font_entry == "default") set_font(Gfx::Font::default_fixed_width_font()); @@ -180,6 +190,7 @@ void TerminalWidget::set_logical_focus(bool focus) m_cursor_blink_state = true; m_cursor_blink_timer->start(); } + m_auto_scroll_direction = AutoScrollDirection::None; invalidate_cursor(); update(); } @@ -579,6 +590,7 @@ void TerminalWidget::mouseup_event(GUI::MouseEvent& event) m_active_href_id = {}; update(); } + m_auto_scroll_direction = AutoScrollDirection::None; } } @@ -662,6 +674,14 @@ void TerminalWidget::mousemove_event(GUI::MouseEvent& event) return; } + auto adjusted_position = event.position().translated(-(frame_thickness() + m_inset), -(frame_thickness() + m_inset)); + if (adjusted_position.y() < 0) + m_auto_scroll_direction = AutoScrollDirection::Up; + else if (adjusted_position.y() > m_terminal.rows() * m_line_height) + m_auto_scroll_direction = AutoScrollDirection::Down; + else + m_auto_scroll_direction = AutoScrollDirection::None; + auto old_selection_end = m_selection_end; m_selection_end = position; if (old_selection_end != m_selection_end) @@ -681,6 +701,7 @@ void TerminalWidget::mousewheel_event(GUI::MouseEvent& event) { if (!is_scrollable()) return; + m_auto_scroll_direction = AutoScrollDirection::None; m_scrollbar->set_value(m_scrollbar->value() + event.wheel_delta() * scroll_length()); GUI::Frame::mousewheel_event(event); } diff --git a/Libraries/LibVT/TerminalWidget.h b/Libraries/LibVT/TerminalWidget.h index 0c869156f2c..82d354f25d9 100644 --- a/Libraries/LibVT/TerminalWidget.h +++ b/Libraries/LibVT/TerminalWidget.h @@ -175,8 +175,17 @@ private: int m_glyph_width { 0 }; + enum class AutoScrollDirection { + None, + Up, + Down + }; + + AutoScrollDirection m_auto_scroll_direction { AutoScrollDirection::None }; + RefPtr m_cursor_blink_timer; RefPtr m_visual_beep_timer; + RefPtr m_auto_scroll_timer; RefPtr m_config; RefPtr m_scrollbar;