Driver installation progress bar rework

pull/89/head
Ivan Dmitrievich Yartsev 10 months ago
parent ea8b134480
commit 5b1fa44581

@ -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)); else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data));
} }
void on_terminal_check_progress(VteTerminal *, main_window *){ gboolean on_terminal_check_progress(main_window *widgets){
// char *text = vte_terminal_get_text(terminal,NULL,NULL,NULL); char *text = vte_terminal_get_text_format(VTE_TERMINAL(widgets->terminal),VTE_FORMAT_TEXT);
// gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(widgets->TerminalInfoLabel),(double)yon_char_count(text,"::")/4); 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){ 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->TerminalScroll = yon_gtk_builder_get_widget(builder, "TerminalScroll");
widgets->TerminalInfoLabel = yon_gtk_builder_get_widget(builder, "TerminalInfoLabel"); 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); gtk_button_set_label(GTK_BUTTON(widgets->TerminalMoreButton),MORE_LABEL);
vte_terminal_set_size(VTE_TERMINAL(terminal),10,15); vte_terminal_set_size(VTE_TERMINAL(widgets->terminal),10,15);
gtk_widget_set_app_paintable(terminal,1); gtk_widget_set_app_paintable(widgets->terminal,1);
gtk_style_context_add_class(gtk_widget_get_style_context(terminal),"opacited"); gtk_style_context_add_class(gtk_widget_get_style_context(widgets->terminal),"opacited");
gtk_style_context_add_class(gtk_widget_get_style_context(terminal),"workingbg"); gtk_style_context_add_class(gtk_widget_get_style_context(widgets->terminal),"workingbg");
gtk_overlay_add_overlay(GTK_OVERLAY(widgets->TerminalOverlay),widgets->TerminalRevealer); 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(widgets->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), "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(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); gtk_revealer_set_reveal_child(GTK_REVEALER(widgets->TerminalRevealer),1);
VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL); 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); 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, VTE_PTY_DEFAULT,
NULL, NULL,
command, command,
@ -102,10 +136,12 @@ void yon_terminal_start(main_window *widgets, char *usr_command){
NULL, NULL,
NULL, NULL,
NULL); NULL);
vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), 100); vte_terminal_set_scrollback_lines(VTE_TERMINAL(widgets->terminal), 100);
vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE); vte_terminal_set_scroll_on_output(VTE_TERMINAL(widgets->terminal), TRUE);
vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE); vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(widgets->terminal), TRUE);
gtk_widget_show_all(widgets->TerminalRevealer); 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){ 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){ void on_module_install_activate(GtkCellRendererToggle* ,gchar* path,main_window *widgets){
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(widgets->DriversTree)); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(widgets->DriversTree));
GtkTreeIter iter; GtkTreeIter iter;
if (!GTK_IS_TREE_MODEL_FILTER(model)){ if (!GTK_IS_TREE_MODEL_FILTER(model)){
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(main_config.list),&iter,path); gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(main_config.list),&iter,path);
} else { } else {
GtkTreeIter itar; GtkTreeIter itar;
@ -1509,6 +1543,7 @@ void config_init(){
main_config.lock_save_global=0; main_config.lock_save_global=0;
main_config.lock_save_local=0; main_config.lock_save_local=0;
main_config.load_mode=1; main_config.load_mode=1;
main_config.progress_active=0;
} }
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){

@ -198,6 +198,8 @@ typedef struct
GtkWidget *TerminalMoreRevieler; GtkWidget *TerminalMoreRevieler;
GtkWidget *MenusTab; GtkWidget *MenusTab;
GtkWidget *terminal;
GtkWidget *LoadDriversButton; GtkWidget *LoadDriversButton;
} main_window; } main_window;
@ -232,6 +234,10 @@ typedef struct
int dblock; int dblock;
int save_config; int save_config;
main_window *widgets; main_window *widgets;
GMutex progress_mutex;
int progress_active;
} config; } config;
typedef struct 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_done(GtkWidget *terminal, int size, main_window *widgets);
void on_terminal_more(GtkWidget *self, main_window *widgets); void on_terminal_more(GtkWidget *self, main_window *widgets);
void on_terminal_destroy(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 yon_terminal_start(main_window *widgets, char *usr_command);
void on_driver_pack_selection_change(GtkWidget *self, main_window *widgets); void on_driver_pack_selection_change(GtkWidget *self, main_window *widgets);
void on_driver_pack_info(GtkWidget *self, main_window *widgets); void on_driver_pack_info(GtkWidget *self, main_window *widgets);

Loading…
Cancel
Save