From 891ddb76b92fa89b3e2a8eeab123fcf9cbc10451 Mon Sep 17 00:00:00 2001 From: Ivan Dmitrievich Yartsev Date: Fri, 20 Feb 2026 16:21:39 +0600 Subject: [PATCH] Log autoscroll fix --- source/ubinstall-gtk-log.c | 31 +++++++++++++++++++++++++++++++ source/ubinstall-gtk.h | 5 ++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/source/ubinstall-gtk-log.c b/source/ubinstall-gtk-log.c index 09e88e3..7fe12e9 100644 --- a/source/ubinstall-gtk-log.c +++ b/source/ubinstall-gtk-log.c @@ -11,8 +11,17 @@ void on_log_closed(GtkWidget *, log_window *window){ window->Window=NULL; } +gboolean on_log_window_exit(GtkWidget *,GdkEvent*, log_window *window){ + if (window->timer_id){ + g_source_remove(window->timer_id); + window->timer_id=0; + } + return 0; +} + log_window *yon_log_window_new(){ log_window *window = malloc(sizeof(log_window)); + memset(window,0,sizeof(log_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_log_view); window->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); window->ScrollWindow = yon_gtk_builder_get_widget(builder,"ScrollWindow"); @@ -21,10 +30,22 @@ log_window *yon_log_window_new(){ window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); window->ScrollToEndCheck = yon_gtk_builder_get_widget(builder,"ScrollToEndCheck"); window->monitor = NULL; + g_signal_connect(G_OBJECT(window->ScrollWindow),"scroll-child",G_CALLBACK(yon_log_scroll),window); + g_signal_connect(G_OBJECT(window->Window),"delete-event",G_CALLBACK(on_log_window_exit),window); + gtk_widget_show(window->Window); return window; } +gboolean yon_log_scroll(log_window *window){ + GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(window->ScrollWindow)); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->ScrollToEndCheck))){ + gtk_adjustment_set_value(adj, + gtk_adjustment_get_upper(adj)); + } + return G_SOURCE_CONTINUE; +} + void yon_read_log(GFileMonitor *,GFile *,GFile *,GFileMonitorEvent ,log_window *window){ if (window->Window){ int size; @@ -35,7 +56,13 @@ void yon_read_log(GFileMonitor *,GFile *,GFile *,GFileMonitorEvent ,log_window * char *final = yon_char_parsed_to_string(parsed,size,""); gtk_label_set_text(GTK_LABEL(window->LogLabel),final); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->ScrollToEndCheck))){ + if (!window->timer_id){ + window->timer_id = g_idle_add((GSourceFunc)yon_log_scroll,window); + } gtk_adjustment_set_value(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(window->ScrollWindow)),gtk_adjustment_get_upper(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(window->ScrollWindow)))); + } else if (window->timer_id){ + g_source_remove(window->timer_id); + window->timer_id=0; } free(final); yon_char_parsed_free(parsed,size); @@ -48,6 +75,10 @@ void yon_read_log(GFileMonitor *,GFile *,GFile *,GFileMonitorEvent ,log_window * g_mutex_unlock(&main_config.install_mutex); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->ScrollToEndCheck),0); gtk_widget_set_sensitive(window->ScrollToEndCheck,0); + if (window->timer_id){ + g_source_remove(window->timer_id); + window->timer_id=0; + } } } return ; diff --git a/source/ubinstall-gtk.h b/source/ubinstall-gtk.h index feb9d41..6c03c0a 100755 --- a/source/ubinstall-gtk.h +++ b/source/ubinstall-gtk.h @@ -885,6 +885,8 @@ typedef struct GtkWidget *ScrollToEndCheck; GFileMonitor *monitor; + guint timer_id; + char *command; } log_window; @@ -1521,4 +1523,5 @@ int yon_installation_check_packages_size(main_window *widgets); config_str yon_os_components_get_modules(int *size); int yon_os_components_check_packages_size(GtkWidget *, main_window *widgets); void on_pacman_search_enter(GtkEntry *self, main_window *widgets); -void yon_log_scroll(GtkScrolledWindow* self, GtkScrollType* scroll, gboolean horizontal,log_window *window); \ No newline at end of file +gboolean yon_log_scroll(log_window *window); +gboolean on_log_window_exit(GtkWidget *,GdkEvent*, log_window *window); \ No newline at end of file