diff --git a/src/source_base.cpp b/src/source_base.cpp index 675c01e..1e4245c 100644 --- a/src/source_base.cpp +++ b/src/source_base.cpp @@ -122,6 +122,20 @@ void Source::SearchView::search_occurrences_updated(GtkWidget *widget, GParamSpe view->update_search_occurrences(gtk_source_search_context_get_occurrences_count(view->search_context)); } +bool Source::SearchView::on_key_press_event(GdkEventKey *event) { + if(event->keyval == GDK_KEY_Home && event->state & GDK_CONTROL_MASK) { + auto iter = get_buffer()->begin(); + scroll_to(iter); // Home key should always scroll to start, even though cursor does not move + return Gsv::View::on_key_press_event(event); + } + else if(event->keyval == GDK_KEY_End && event->state & GDK_CONTROL_MASK) { + auto iter = get_buffer()->end(); + scroll_to(iter); // End key should always scroll to start, even though cursor does not move + return Gsv::View::on_key_press_event(event); + } + return Gsv::View::on_key_press_event(event); +} + Source::BaseView::BaseView(const boost::filesystem::path &file_path, const Glib::RefPtr &language) : SearchView(), file_path(file_path), language(language), status_diagnostics(0, 0, 0) { get_style_context()->add_class("juci_source_view"); @@ -1065,7 +1079,7 @@ bool Source::BaseView::on_key_press_event(GdkEventKey *key) { return true; } - return Gsv::View::on_key_press_event(key); + return Source::SearchView::on_key_press_event(key); } bool Source::BaseView::on_key_press_event_extra_cursors(GdkEventKey *key) { diff --git a/src/source_base.hpp b/src/source_base.hpp index f268ff6..d6fe2e1 100644 --- a/src/source_base.hpp +++ b/src/source_base.hpp @@ -40,6 +40,9 @@ namespace Source { std::function update_search_occurrences; + protected: + bool on_key_press_event(GdkEventKey *key) override; + private: GtkSourceSearchContext *search_context; GtkSourceSearchSettings *search_settings; diff --git a/src/terminal.cpp b/src/terminal.cpp index 6d8b639..68308dc 100644 --- a/src/terminal.cpp +++ b/src/terminal.cpp @@ -383,6 +383,12 @@ bool Terminal::on_button_press_event(GdkEventButton *button_event) { } bool Terminal::on_key_press_event(GdkEventKey *event) { + if(event->keyval == GDK_KEY_Home || event->keyval == GDK_KEY_End || + event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down || + event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down || + event->keyval == GDK_KEY_Left || event->keyval == GDK_KEY_Right) + return Source::SearchView::on_key_press_event(event); + LockGuard lock(processes_mutex); bool debug_is_running = false; #ifdef JUCI_ENABLE_DEBUG diff --git a/src/window.cpp b/src/window.cpp index 20b6fc7..0682642 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1732,11 +1732,24 @@ void Window::add_widgets() { EntryBox::get().hide(); Info::get().hide(); - //Scroll to end of terminal whenever info is printed - Terminal::get().signal_size_allocate().connect([terminal_scrolled_window](Gtk::Allocation &allocation) { + // Scroll to end of terminal whenever info is printed and end of terminal is shown + auto scrolled_to_bottom = std::make_shared(true); + terminal_scrolled_window->get_vadjustment()->signal_value_changed().connect([terminal_scrolled_window, scrolled_to_bottom] { auto adjustment = terminal_scrolled_window->get_vadjustment(); - adjustment->set_value(adjustment->get_upper() - adjustment->get_page_size()); - Terminal::get().queue_draw(); + *scrolled_to_bottom = adjustment->get_value() == adjustment->get_upper() - adjustment->get_page_size(); + }); + terminal_scrolled_window->get_vadjustment()->signal_changed().connect([terminal_scrolled_window, scrolled_to_bottom] { + auto adjustment = terminal_scrolled_window->get_vadjustment(); + if(adjustment->get_value() == adjustment->get_upper() - adjustment->get_page_size()) // If for instance the terminal has been cleared + *scrolled_to_bottom = true; + }); + Terminal::get().signal_size_allocate().connect([terminal_scrolled_window, scrolled_to_bottom](Gtk::Allocation &allocation) mutable { + if(*scrolled_to_bottom) { + auto adjustment = terminal_scrolled_window->get_vadjustment(); + adjustment->set_value(adjustment->get_upper() - adjustment->get_page_size()); + *scrolled_to_bottom = true; + Terminal::get().queue_draw(); + } }); EntryBox::get().signal_show().connect([hpaned, notebook_and_terminal_vpaned, notebook_vbox]() {