From 5b1fa445813d296b436989ddb564d41fae293f0e Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 5 Mar 2025 16:12:37 +0600 Subject: [PATCH] Driver installation progress bar rework --- source/ubl-settings-video.c | 71 +++++++++++++++++++++++++++---------- source/ubl-settings-video.h | 8 ++++- 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/source/ubl-settings-video.c b/source/ubl-settings-video.c index 1c3579d..098e2a8 100644 --- a/source/ubl-settings-video.c +++ b/source/ubl-settings-video.c @@ -42,9 +42,43 @@ static void child_ready(VteTerminal *terminal, GPid pid, GError *, gpointer user else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data)); } -void on_terminal_check_progress(VteTerminal *, main_window *){ - // char *text = vte_terminal_get_text(terminal,NULL,NULL,NULL); - // gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(widgets->TerminalInfoLabel),(double)yon_char_count(text,"::")/4); +gboolean on_terminal_check_progress(main_window *widgets){ + char *text = vte_terminal_get_text_format(VTE_TERMINAL(widgets->terminal),VTE_FORMAT_TEXT); + GRegex *regex = g_regex_new("\\d?\\d?\\d%",0,0,NULL); + + GMatchInfo *match = NULL; + g_regex_match(regex,text,0,&match); + g_regex_unref(regex); + double percentage = 0.0; + char *last_match = NULL; + while (g_match_info_matches(match)) { + char *current_match = g_match_info_fetch(match, 0); + if (last_match) { + g_free(last_match); + } + last_match = current_match; + g_match_info_next(match, NULL); + } + + if (last_match) { + yon_char_remove_last_symbol(last_match,'%'); + percentage = atof(last_match); + yon_debug_output("%s\n", text); + yon_debug_output("%s\n", last_match); + + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(widgets->TerminalInfoLabel), percentage / 100); + g_free(last_match); + } + g_match_info_unref(match); + + g_mutex_lock(&main_config.progress_mutex); + if (!main_config.progress_active){ + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(widgets->TerminalInfoLabel),0); + g_mutex_unlock(&main_config.progress_mutex); + return G_SOURCE_REMOVE; + } + g_mutex_unlock(&main_config.progress_mutex); + return G_SOURCE_CONTINUE; } void yon_terminal_start(main_window *widgets, char *usr_command){ @@ -64,22 +98,22 @@ void yon_terminal_start(main_window *widgets, char *usr_command){ widgets->TerminalScroll = yon_gtk_builder_get_widget(builder, "TerminalScroll"); widgets->TerminalInfoLabel = yon_gtk_builder_get_widget(builder, "TerminalInfoLabel"); - GtkWidget *terminal = yon_gtk_builder_get_widget(builder, "TerminalTerminal"); + widgets->terminal = yon_gtk_builder_get_widget(builder, "TerminalTerminal"); gtk_button_set_label(GTK_BUTTON(widgets->TerminalMoreButton),MORE_LABEL); - vte_terminal_set_size(VTE_TERMINAL(terminal),10,15); - gtk_widget_set_app_paintable(terminal,1); - gtk_style_context_add_class(gtk_widget_get_style_context(terminal),"opacited"); - gtk_style_context_add_class(gtk_widget_get_style_context(terminal),"workingbg"); + vte_terminal_set_size(VTE_TERMINAL(widgets->terminal),10,15); + gtk_widget_set_app_paintable(widgets->terminal,1); + gtk_style_context_add_class(gtk_widget_get_style_context(widgets->terminal),"opacited"); + gtk_style_context_add_class(gtk_widget_get_style_context(widgets->terminal),"workingbg"); gtk_overlay_add_overlay(GTK_OVERLAY(widgets->TerminalOverlay),widgets->TerminalRevealer); - g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(on_terminal_done), widgets); - g_signal_connect(G_OBJECT(terminal), "contents-changed", G_CALLBACK(on_terminal_check_progress), widgets); + g_signal_connect(G_OBJECT(widgets->terminal), "child-exited", G_CALLBACK(on_terminal_done), widgets); + // g_signal_connect(G_OBJECT(widgets->terminal), "contents-changed", G_CALLBACK(on_terminal_check_progress), widgets); g_signal_connect(G_OBJECT(widgets->TerminalMoreButton), "clicked", G_CALLBACK(on_terminal_more), widgets); - g_signal_connect(G_OBJECT(terminal), "destroy", G_CALLBACK(on_terminal_destroy), widgets); + g_signal_connect(G_OBJECT(widgets->terminal), "destroy", G_CALLBACK(on_terminal_destroy), widgets); gtk_revealer_set_reveal_child(GTK_REVEALER(widgets->TerminalRevealer),1); VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL); - vte_terminal_set_pty(VTE_TERMINAL(terminal),pty); + vte_terminal_set_pty(VTE_TERMINAL(widgets->terminal),pty); char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",usr_command," ; sleep 5;exit 0","\n",NULL); - vte_terminal_spawn_async(VTE_TERMINAL(terminal), + vte_terminal_spawn_async(VTE_TERMINAL(widgets->terminal), VTE_PTY_DEFAULT, NULL, command, @@ -102,10 +136,12 @@ void yon_terminal_start(main_window *widgets, char *usr_command){ NULL, NULL, NULL); - vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), 100); - vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE); - vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE); + vte_terminal_set_scrollback_lines(VTE_TERMINAL(widgets->terminal), 100); + vte_terminal_set_scroll_on_output(VTE_TERMINAL(widgets->terminal), TRUE); + vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(widgets->terminal), TRUE); gtk_widget_show_all(widgets->TerminalRevealer); + main_config.progress_active=1; + g_idle_add((GSourceFunc)on_terminal_check_progress,widgets); } void on_driver_pack_selection_change(GtkWidget *, main_window *widgets){ @@ -187,11 +223,9 @@ void on_pack_install_activate(GtkCellRendererToggle* ,gchar* path,main_window *w } void on_module_install_activate(GtkCellRendererToggle* ,gchar* path,main_window *widgets){ - GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(widgets->DriversTree)); GtkTreeIter iter; if (!GTK_IS_TREE_MODEL_FILTER(model)){ - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(main_config.list),&iter,path); } else { GtkTreeIter itar; @@ -1509,6 +1543,7 @@ void config_init(){ main_config.lock_save_global=0; main_config.lock_save_local=0; main_config.load_mode=1; + main_config.progress_active=0; } int main(int argc, char *argv[]){ diff --git a/source/ubl-settings-video.h b/source/ubl-settings-video.h index 9f6e015..7f1c19c 100644 --- a/source/ubl-settings-video.h +++ b/source/ubl-settings-video.h @@ -198,6 +198,8 @@ typedef struct GtkWidget *TerminalMoreRevieler; GtkWidget *MenusTab; + GtkWidget *terminal; + GtkWidget *LoadDriversButton; } main_window; @@ -232,6 +234,10 @@ typedef struct int dblock; int save_config; main_window *widgets; + + GMutex progress_mutex; + int progress_active; + } config; typedef struct @@ -336,7 +342,7 @@ void yon_proprietary_get_thread(GtkWidget *self,main_window *widgets); void on_terminal_done(GtkWidget *terminal, int size, main_window *widgets); void on_terminal_more(GtkWidget *self, main_window *widgets); void on_terminal_destroy(GtkWidget *self, main_window *widgets); -void on_terminal_check_progress(VteTerminal *terminal, main_window *widgets); +gboolean on_terminal_check_progress(main_window *widgets); void yon_terminal_start(main_window *widgets, char *usr_command); void on_driver_pack_selection_change(GtkWidget *self, main_window *widgets); void on_driver_pack_info(GtkWidget *self, main_window *widgets);