Browse Source

Terminal: now only scrolls to end of new text when scrollbar is at bottom

pipelines/235045657
eidheim 5 years ago
parent
commit
cf8f050e90
  1. 16
      src/source_base.cpp
  2. 3
      src/source_base.hpp
  3. 6
      src/terminal.cpp
  4. 17
      src/window.cpp

16
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<Gsv::Language> &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) {

3
src/source_base.hpp

@ -40,6 +40,9 @@ namespace Source {
std::function<void(int number)> update_search_occurrences;
protected:
bool on_key_press_event(GdkEventKey *key) override;
private:
GtkSourceSearchContext *search_context;
GtkSourceSearchSettings *search_settings;

6
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

17
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<bool>(true);
terminal_scrolled_window->get_vadjustment()->signal_value_changed().connect([terminal_scrolled_window, scrolled_to_bottom] {
auto adjustment = terminal_scrolled_window->get_vadjustment();
*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]() {

Loading…
Cancel
Save