From 60b6bbf030c227eeb87b04df5c9f483caf692c5e Mon Sep 17 00:00:00 2001 From: YanTheKaller Date: Mon, 13 Apr 2026 15:36:58 +0600 Subject: [PATCH] Pacman database updating changes --- source/ubinstall-gtk-components.c | 9 +++- source/ubinstall-gtk-kernel.c | 15 ++++++- source/ubinstall-gtk-packages.c | 4 ++ source/ubinstall-gtk-page-switch.c | 28 ++++++++++++ source/ubinstall-gtk.c | 70 ++++++++++++++++++++---------- source/ubinstall-gtk.h | 10 ++++- 6 files changed, 107 insertions(+), 29 deletions(-) diff --git a/source/ubinstall-gtk-components.c b/source/ubinstall-gtk-components.c index 21d7b16..6d044b0 100644 --- a/source/ubinstall-gtk-components.c +++ b/source/ubinstall-gtk-components.c @@ -484,6 +484,7 @@ gboolean yon_software_insert(struct row_data *row_input){ config_str parsed = yon_char_parse(main_config.modules[i],&parsed_size,";"); yon_char_parsed_add_or_create_if_exists(final,&final_size,parsed[1]); yon_char_parsed_free(parsed,parsed_size); + while(gtk_events_pending()) gtk_main_iteration(); } modules_param = yon_char_parsed_to_string(final,final_size,","); } else if (!yon_char_is_empty(modules_prm)){ @@ -496,6 +497,7 @@ gboolean yon_software_insert(struct row_data *row_input){ yon_char_parsed_add_or_create_if_exists(final,&final_size,parsed[1]); } yon_char_parsed_free(parsed,parsed_size); + while(gtk_events_pending()) gtk_main_iteration(); } modules_param = yon_char_parsed_to_string(final,final_size,","); } @@ -508,7 +510,6 @@ gboolean yon_software_insert(struct row_data *row_input){ } void yon_software_init(main_window *widgets){ - on_status_update(NULL,widgets); if (!main_config.configure_mode){ yon_config_update_by_args(main_config.config_load_path, packages_parameter,NULL); } @@ -518,6 +519,7 @@ void yon_software_init(main_window *widgets){ os_row *row = g_object_get_data(iter->data,"kernel_row"); free(row); gtk_widget_destroy(GTK_WIDGET(iter->data)); + while(gtk_events_pending()) gtk_main_iteration(); } int base_size; config_str base = yon_packages_find(YON_PACKAGES_ALL,"ubm-",(gsize*)&base_size); @@ -548,6 +550,7 @@ void yon_software_init(main_window *widgets){ row->size = size_str; row->widgets=widgets; g_idle_add((GSourceFunc)yon_software_insert,row); + while(gtk_events_pending()) gtk_main_iteration(); } g_idle_add((GSourceFunc)yon_spinner_switch_off,widgets->OSSpinner); yon_char_parsed_free(base,base_size); @@ -585,7 +588,6 @@ int yon_pacman_software_save(main_window *widgets){ } void yon_pacman_init(main_window *widgets){ - on_status_update(NULL,widgets); if (!main_config.configure_mode){ yon_config_update_by_args(main_config.config_load_path, packages_parameter,NULL); } @@ -606,6 +608,7 @@ void yon_pacman_init(main_window *widgets){ gtk_list_store_append(widgets->PacmanSoftwareChosenList,&iter); gtk_list_store_set(widgets->PacmanSoftwareChosenList,&iter,0,1,1,parsed[i],2,version,3,_(description),4,size_str,6,1,-1); free(size_str); + while(gtk_events_pending()) gtk_main_iteration(); } yon_char_parsed_free(parsed,size); @@ -633,6 +636,7 @@ void yon_pacman_init(main_window *widgets){ } modules_packages = yon_char_parsed_to_string(final,final_size,","); } + while(gtk_events_pending()) gtk_main_iteration(); parsed = yon_char_parse(modules_packages,&size,","); for (int i=1;iPacmanSoftwareChosenList,&iter); gtk_list_store_set(widgets->PacmanSoftwareChosenList,&iter,0,1,1,parsed[i],2,version,3,_(description),4,size_str,6,0,-1); free(size_str); + while(gtk_events_pending()) gtk_main_iteration(); } yon_pacman_software_update_overall_size(widgets); yon_char_parsed_free(parsed,size); diff --git a/source/ubinstall-gtk-kernel.c b/source/ubinstall-gtk-kernel.c index de1c5dd..87392f9 100644 --- a/source/ubinstall-gtk-kernel.c +++ b/source/ubinstall-gtk-kernel.c @@ -113,6 +113,7 @@ void yon_kernel_row_setup_tags(kernel_row *row, char *tags){ tag_type = "tag_green"; }; yon_tag_add(GTK_BOX(row->TagsBox),tag_name,tag_type,NULL); + while(gtk_events_pending()) gtk_main_iteration(); } } @@ -127,6 +128,7 @@ void yon_kernel_row_setup(kernel_row *row, char *name, char *modules,char *packa config_str description_wrapped = yon_char_wrap_to_lines(description_full,3,&size); description_full = yon_char_parsed_to_string(description_wrapped,size,"\n"); yon_char_parsed_free(description_wrapped,size); + while(gtk_events_pending()) gtk_main_iteration(); } int modules_size=0; config_str modules_parsed = yon_char_parse(modules,&modules_size," "); @@ -135,6 +137,7 @@ void yon_kernel_row_setup(kernel_row *row, char *name, char *modules,char *packa char *temp = yon_char_unite("",modules_parsed[i],"",NULL); free(modules_parsed[i]); modules_parsed[i] = temp; + while(gtk_events_pending()) gtk_main_iteration(); } char *modules_final = yon_char_parsed_to_string(modules_parsed,modules_size,"\n"); gtk_label_set_markup(GTK_LABEL(row->NameLabel),label_markup); @@ -168,6 +171,7 @@ void yon_kernel_resize(main_window *widgets){ gtk_widget_get_preferred_width(row->ModulesLabel,&cur_modules_size,NULL); if (name_sizeKernelNameLabel),name_size,-1); gtk_widget_set_size_request(GTK_WIDGET(widgets->KernelModulesLabel),modules_size,-1); @@ -177,6 +181,7 @@ void yon_kernel_resize(main_window *widgets){ gtk_widget_set_size_request(GTK_WIDGET(row->EnableRadio),enable_size,-1); gtk_widget_set_size_request(row->NameLabel,name_size,-1); gtk_widget_set_size_request(row->ModulesLabel,modules_size,-1); + while(gtk_events_pending()) gtk_main_iteration(); } g_list_free(list); } @@ -208,10 +213,10 @@ void yon_kernel_addon_resize(main_window *widgets){ } void yon_kernel_init(main_window *widgets){ - on_status_update(NULL,widgets); if (!main_config.configure_mode){ yon_config_update_by_args(main_config.config_load_path, packages_parameter,KERNEL_BOOT_parameter,NULL); } + while(gtk_events_pending()) gtk_main_iteration(); GList *list = gtk_container_get_children(GTK_CONTAINER(widgets->KernelListBox)); GList *iter; for (iter = list; iter; iter = iter->next){ @@ -222,6 +227,7 @@ void yon_kernel_init(main_window *widgets){ free(row); gtk_widget_destroy(GTK_WIDGET(iter->data)); } + while(gtk_events_pending()) gtk_main_iteration(); } g_list_free(list); @@ -234,6 +240,7 @@ void yon_kernel_init(main_window *widgets){ modules_parsed = yon_char_parse(modules,&modules_size,","); } + while(gtk_events_pending()) gtk_main_iteration(); int size; config_str kernels = yon_resource_open_file(kernel_list_path,&size); gtk_size_group_add_widget(widgets->KernelSizeGroup,widgets->KernelTagsLabel); @@ -256,6 +263,7 @@ void yon_kernel_init(main_window *widgets){ yon_kernel_row_setup(row,name,modules,package,tags,description); + while(gtk_events_pending()) gtk_main_iteration(); if (yon_char_parsed_check_exist(modules_parsed,modules_size,parsed[1])>-1){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(row->InstallCheck),1); } else { @@ -269,6 +277,7 @@ void yon_kernel_init(main_window *widgets){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(row->EnableRadio),1); } yon_char_parsed_free(parsed,parsed_size); + while(gtk_events_pending()) gtk_main_iteration(); } yon_kernel_resize(widgets); @@ -419,11 +428,11 @@ void yon_kernel_addon_row_setup(kernel_addon_row *row, char *name, char *modules } void yon_kernel_addon_init(main_window *widgets){ - on_status_update(NULL,widgets); yon_config_remove_by_args(packages_parameter,NULL); char *command = yon_config_parameter_prepare_command(packages_parameter_command,main_config.config_load_path,NULL,NULL); yon_config_load_config(YON_CONFIG_CUSTOM,command,NULL); free(command); + while(gtk_events_pending()) gtk_main_iteration(); GList *list = gtk_container_get_children(GTK_CONTAINER(widgets->KernelAddonListBox)); GList *iter; for (iter = list; iter; iter = iter->next){ @@ -434,6 +443,7 @@ void yon_kernel_addon_init(main_window *widgets){ free(row); gtk_widget_destroy(GTK_WIDGET(iter->data)); } + while(gtk_events_pending()) gtk_main_iteration(); } g_list_free(list); @@ -478,6 +488,7 @@ void yon_kernel_addon_init(main_window *widgets){ gtk_widget_set_sensitive(row->InstallCheck,0); } yon_char_parsed_free(parsed,parsed_size); + while(gtk_events_pending()) gtk_main_iteration(); } yon_kernel_addon_resize(widgets); diff --git a/source/ubinstall-gtk-packages.c b/source/ubinstall-gtk-packages.c index 850c855..e12b92d 100644 --- a/source/ubinstall-gtk-packages.c +++ b/source/ubinstall-gtk-packages.c @@ -117,6 +117,7 @@ void yon_packages_tab_init(main_window *widgets){ yon_config_load_config(YON_CONFIG_CUSTOM,command,NULL); free(command); } + while(gtk_events_pending()) gtk_main_iteration(); gtk_tree_store_clear(widgets->PackagesList); char *modules = config(modules_parameter); if (modules&&!strcmp(modules,"auto")){ @@ -142,6 +143,7 @@ void yon_packages_tab_init(main_window *widgets){ } modules = yon_char_parsed_to_string(final,final_size,","); } + while(gtk_events_pending()) gtk_main_iteration(); int size; char *config_packages = config(packages_parameter); @@ -163,6 +165,7 @@ void yon_packages_tab_init(main_window *widgets){ } yon_char_parsed_add_or_create_if_exists(final,&final_size,modules_parsed[j]); } + while(gtk_events_pending()) gtk_main_iteration(); yon_char_parsed_free(modules_parsed,modules_parsed_size); char *modules_string = yon_char_parsed_to_string(final,final_size,"\t"); if (empty && !yon_char_check_elements(modules,modules_string,",")) continue; @@ -218,6 +221,7 @@ void yon_packages_tab_init(main_window *widgets){ free(full_string); } } + while(gtk_events_pending()) gtk_main_iteration(); } yon_packages_remove_empty_groups(widgets); if (!yon_char_is_empty(modules)) free(modules); diff --git a/source/ubinstall-gtk-page-switch.c b/source/ubinstall-gtk-page-switch.c index 9f815eb..2f4a721 100644 --- a/source/ubinstall-gtk-page-switch.c +++ b/source/ubinstall-gtk-page-switch.c @@ -419,6 +419,28 @@ void yon_switch_page_render(main_window *widgets){ g_list_free(list); } +void yon_container_start_loading(GtkWidget *target){ + GtkWidget *parent = gtk_widget_get_parent(target); + g_object_ref(target); + gtk_container_remove(GTK_CONTAINER(parent),target); + GtkWidget *overlay = gtk_overlay_new(); + g_object_set_data(G_OBJECT(parent),"loader_overlay",overlay); + g_object_set_data(G_OBJECT(target),"parent",parent); + gtk_overlay_add_overlay(GTK_OVERLAY(overlay),target); + gtk_widget_show(overlay); +} + +void yon_container_stop_loading(GtkWidget *target){ + g_object_ref(target); + GtkWidget *parent = g_object_get_data(G_OBJECT(target),"loader_overlay"); + GtkWidget *overlay = g_object_get_data(G_OBJECT(parent),"loader_overlay"); + gtk_container_remove(GTK_CONTAINER(overlay),target); + gtk_container_add(GTK_CONTAINER(parent),target); + gtk_widget_destroy(overlay); + gtk_widget_show(overlay); + g_object_set_data(G_OBJECT(parent),"loader_overlay",NULL); + g_object_set_data(G_OBJECT(target),"parent",NULL); +} void yon_configuration_mode_check(main_window *widgets){ enum YON_PAGES page = gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->Notebook)); @@ -470,18 +492,23 @@ void yon_page_init(main_window *widgets, enum YON_PAGES page){ yon_configuration_hub_init(widgets); break; case YON_PAGE_OS_COMPONENTS: + on_status_update(NULL,widgets); yon_os_components_init(widgets); break; case YON_PAGE_KERNEL: + on_status_update(NULL,widgets); yon_kernel_init(widgets); break; case YON_PAGE_KERNEL_ADDON: + on_status_update(NULL,widgets); yon_kernel_addon_init(widgets); break; case YON_PAGE_SOFTWARE: + on_status_update(NULL,widgets); yon_software_init(widgets); break; case YON_PAGE_PACMAN_SOFTWARE: + on_status_update(NULL,widgets); yon_pacman_init(widgets); break; case YON_PAGE_REGION: @@ -509,6 +536,7 @@ void yon_page_init(main_window *widgets, enum YON_PAGES page){ yon_network_init(widgets); break; case YON_PAGE_PACKAGES: + on_status_update(NULL,widgets); yon_packages_tab_init(widgets); break; case YON_PAGE_INSTALL_ADVANCED: diff --git a/source/ubinstall-gtk.c b/source/ubinstall-gtk.c index 50d99ce..da767e7 100644 --- a/source/ubinstall-gtk.c +++ b/source/ubinstall-gtk.c @@ -315,28 +315,34 @@ void yon_licence_load(main_window *widgets){ } } -// void on_database_update(void *,main_window *widgets){ -// // vte_revealer_struct *revealer = yon_vte_revealer_new(); -// yon_terminal_window_launch(GTK_WINDOW(widgets->MainWindow),"pacman -Sy",SUCCESS_LABEL,FAIL_LABEL); -// yon_terminal_integrated_start_shell(widgets->InstallTerminal,yon_debug_output("%s\n",pacman_update_command),NULL,NULL); -// g_signal_connect(G_OBJECT(widgets->InstallTerminal),"child-exited",G_CALLBACK(on_db_update_done),widgets); -// gtk_button_clicked(GTK_BUTTON(widgets->MoreButton)); -// gtk_notebook_set_current_page(GTK_NOTEBOOK(widgets->MenusTab),1); -// } - -void on_status_update(GtkWidget *,main_window *widgets){ - // on_database_update(NULL,widgets); - yon_window *window = yon_window_new(); - GtkWidget *terminal = vte_terminal_new(); - yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->MainWindow),DB_UPDATE_LABEL,icon_path,NULL); - gtk_widget_show(terminal); - gtk_box_pack_start(GTK_BOX(window->MainBox),terminal,1,1,0); - yon_terminal_integrated_start_shell(terminal,"pacman -Sy",NULL,NULL); - gtk_widget_show(window->Window); - // yon_terminal_window_launch(GTK_WINDOW(widgets->MainWindow),"pacman -Sy",SUCCESS_LABEL,FAIL_LABEL); +void yon_update_page(main_window *widgets){ + enum YON_PAGES page = gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->Notebook)); yon_packages_update(); + while(gtk_events_pending()) gtk_main_iteration(); + yon_page_init(widgets,page); + gtk_widget_set_sensitive(widgets->KernelPacmanStatusButton,1); + gtk_widget_set_sensitive(widgets->PacmanSoftwareStatusButton,1); + gtk_widget_set_sensitive(widgets->KernelAddonPacmanStatusButton,1); + gtk_widget_set_sensitive(widgets->AdditionalComponentsStatusButton,1); +} - if (system(yon_check_database_command)){ +void *yon_db_update(main_window *widgets){ + yon_launch("pacsync --updated"); + g_idle_add_once((GSourceOnceFunc)yon_update_page,widgets); + pthread_exit(NULL); +} + +void on_status_button_update(GtkWidget *, main_window *widgets){ + gtk_widget_set_sensitive(widgets->KernelPacmanStatusButton,0); + gtk_widget_set_sensitive(widgets->PacmanSoftwareStatusButton,0); + gtk_widget_set_sensitive(widgets->KernelAddonPacmanStatusButton,0); + gtk_widget_set_sensitive(widgets->AdditionalComponentsStatusButton,0); + pthread_t tid=0; + pthread_create(&tid,NULL,(void*(*)(void*))yon_db_update,widgets); + +} + +void yon_status_thread_update_inactive(main_window *widgets){ gtk_image_set_from_icon_name(GTK_IMAGE(widgets->KernelPacmanStatusImage),inactive_icon_path,GTK_ICON_SIZE_BUTTON); gtk_image_set_from_icon_name(GTK_IMAGE(widgets->KernelAddonPacmanStatusImage),inactive_icon_path,GTK_ICON_SIZE_BUTTON); gtk_image_set_from_icon_name(GTK_IMAGE(widgets->PacmanSoftwareStatusImage),inactive_icon_path,GTK_ICON_SIZE_BUTTON); @@ -347,7 +353,9 @@ void on_status_update(GtkWidget *,main_window *widgets){ gtk_label_set_text(GTK_LABEL(widgets->KernelAddonPacmanStatusLabel),UNACCESSED_LABEL); gtk_label_set_text(GTK_LABEL(widgets->AdditionalComponentsStatusLabel),UNACCESSED_LABEL); gtk_label_set_text(GTK_LABEL(widgets->PackagesStatusLabel),UNACCESSED_LABEL); - } else { +} + +void yon_status_thread_update_active(main_window *widgets){ gtk_image_set_from_icon_name(GTK_IMAGE(widgets->KernelPacmanStatusImage),active_icon_path,GTK_ICON_SIZE_BUTTON); gtk_image_set_from_icon_name(GTK_IMAGE(widgets->KernelAddonPacmanStatusImage),active_icon_path,GTK_ICON_SIZE_BUTTON); gtk_image_set_from_icon_name(GTK_IMAGE(widgets->PacmanSoftwareStatusImage),active_icon_path,GTK_ICON_SIZE_BUTTON); @@ -358,10 +366,19 @@ void on_status_update(GtkWidget *,main_window *widgets){ gtk_label_set_text(GTK_LABEL(widgets->KernelAddonPacmanStatusLabel),ACCESSED_LABEL); gtk_label_set_text(GTK_LABEL(widgets->AdditionalComponentsStatusLabel),ACCESSED_LABEL); gtk_label_set_text(GTK_LABEL(widgets->PackagesStatusLabel),ACCESSED_LABEL); +} +void *yon_status_thread_update(main_window *widgets){ + if (system(yon_check_database_command)){ + g_idle_add_once((GSourceOnceFunc)yon_status_thread_update_inactive,widgets); + } else { + g_idle_add_once((GSourceOnceFunc)yon_status_thread_update_active,widgets); } - enum YON_PAGES page = gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->Notebook)); - page = yon_page_get_next(widgets,page); - yon_page_init(widgets,page); + pthread_exit(NULL); +} + +void on_status_update(GtkWidget *,main_window *widgets){ + pthread_t tid=0; + pthread_create(&tid,NULL,(void*(*)(void*))yon_status_thread_update,widgets); } @@ -723,6 +740,11 @@ void yon_main_window_create(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->LoadLocalConfigurationMenuItem),"activate",G_CALLBACK(on_config_local_load),widgets); g_signal_connect(G_OBJECT(widgets->LoadExternalConfigurationMenuItem),"activate",G_CALLBACK(on_config_custom_load),widgets); + g_signal_connect(G_OBJECT(widgets->PackagesStatusButton),"clicked",G_CALLBACK(on_status_button_update),widgets); + g_signal_connect(G_OBJECT(widgets->AdditionalComponentsStatusButton),"clicked",G_CALLBACK(on_status_button_update),widgets); + g_signal_connect(G_OBJECT(widgets->KernelPacmanStatusButton),"clicked",G_CALLBACK(on_status_button_update),widgets); + g_signal_connect(G_OBJECT(widgets->KernelAddonPacmanStatusButton),"clicked",G_CALLBACK(on_status_button_update),widgets); + g_signal_connect(G_OBJECT(widgets->PacmanSoftwareStatusButton),"clicked",G_CALLBACK(on_status_button_update),widgets); g_signal_connect(G_OBJECT(widgets->PackagesStatusButton),"clicked",G_CALLBACK(on_status_update),widgets); g_signal_connect(G_OBJECT(widgets->AdditionalComponentsStatusButton),"clicked",G_CALLBACK(on_status_update),widgets); g_signal_connect(G_OBJECT(widgets->KernelPacmanStatusButton),"clicked",G_CALLBACK(on_status_update),widgets); diff --git a/source/ubinstall-gtk.h b/source/ubinstall-gtk.h index 1cf8735..9ac5f09 100755 --- a/source/ubinstall-gtk.h +++ b/source/ubinstall-gtk.h @@ -1627,4 +1627,12 @@ gboolean on_os_components_info(GtkWidget *, GdkEventButton *, os_row *row); void on_software_info(GtkWidget*, main_window *widgets); void yon_packages_remove_empty_groups(main_window *widgets); void yon_config_mode_start(main_window *widgets); -void on_bootloader_selected(GtkTreeView *,main_window *widgets); \ No newline at end of file +void on_bootloader_selected(GtkTreeView *,main_window *widgets); +void yon_update_page(main_window *widgets); +void *yon_db_update(main_window *widgets); +void on_status_button_update(GtkWidget *, main_window *widgets); +void yon_container_start_loading(GtkWidget *target); +void yon_container_stop_loading(GtkWidget *target); +void yon_status_thread_update_inactive(main_window *widgets); +void yon_status_thread_update_active(main_window *widgets); +void *yon_status_thread_update(main_window *widgets); \ No newline at end of file