From 9f6957d631f362043feaf6cfaddffb9eb6f312a4 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 15 Jul 2025 16:11:49 +0600 Subject: [PATCH] packages function optimization --- source/libublsettings-gtk3.c | 74 +++++++++++++++++++++++++++++++++--- source/libublsettings-gtk3.h | 16 +++++++- 2 files changed, 83 insertions(+), 7 deletions(-) diff --git a/source/libublsettings-gtk3.c b/source/libublsettings-gtk3.c index 6473396..a69d7e6 100644 --- a/source/libublsettings-gtk3.c +++ b/source/libublsettings-gtk3.c @@ -44,10 +44,15 @@ struct packages { GHashTable *all_list; GHashTable *installed_list; GHashTable *updates_list; + int init_status; } packages_struct; +GThread *packages_thread = NULL; -int yon_packages_init(){ - if (getuid()) return 0; +void *_yon_packages_init(void){ + if (getuid()){ + packages_struct.init_status = 0; + g_thread_exit(NULL); + } packages_struct.all_list = g_hash_table_new_full(g_str_hash,g_str_equal,free,NULL); packages_struct.installed_list = g_hash_table_new_full(g_str_hash,g_str_equal,free,NULL); packages_struct.updates_list = g_hash_table_new_full(g_str_hash,g_str_equal,free,NULL); @@ -80,10 +85,21 @@ int yon_packages_init(){ free(installed); free(updates); - if (g_hash_table_size(packages_struct.all_list)&&g_hash_table_size(packages_struct.installed_list)) - return 1; + if (g_hash_table_size(packages_struct.all_list)&&g_hash_table_size(packages_struct.installed_list)){ + packages_struct.init_status = 1; + } else { + packages_struct.init_status = 0; + } + g_thread_exit(NULL); +} - return 0; +void yon_packages_init(){ + packages_thread = g_thread_new("packages_thread",(GThreadFunc)_yon_packages_init,NULL); +} + +int yon_packages_finalize(){ + g_thread_join(packages_thread); + return packages_struct.init_status; } #define install_package_command(target) yon_char_unite("pacman -S ",target,NULL) @@ -92,18 +108,22 @@ int yon_packages_init(){ #define update_package_updated_command(target) yon_char_append("pacman -Qqu ",target) int yon_packages_check_exist(char *package){ + if (!packages_struct.init_status) return 0; return g_hash_table_contains(packages_struct.all_list,package); } int yon_packages_check_installed(char *package){ + if (!packages_struct.init_status) return 0; return g_hash_table_contains(packages_struct.installed_list,package); } int yon_packages_check_updates(char *package){ + if (!packages_struct.init_status) return 0; return g_hash_table_contains(packages_struct.updates_list,package); } void yon_packages_update_package_is_installed(char *package){ + if (!packages_struct.init_status) return; char *command = update_package_installed_command(package); if (!system(command)){ if (!g_hash_table_contains(packages_struct.installed_list,package)){ @@ -118,6 +138,7 @@ void yon_packages_update_package_is_installed(char *package){ } void yon_packages_update_package_is_updated(char *package){ + if (!packages_struct.init_status) return; char *command = update_package_updated_command(package); if (!system(command)){ if (!g_hash_table_contains(packages_struct.updates_list,package)){ @@ -132,6 +153,7 @@ void yon_packages_update_package_is_updated(char *package){ } void yon_packages_update_package(char *package){ + if (!packages_struct.init_status) return; char *command = update_package_installed_command(package); if (!system(command)){ if (!g_hash_table_contains(packages_struct.installed_list,package)){ @@ -158,6 +180,7 @@ void yon_packages_update_package(char *package){ } int yon_packages_install(char *package){ + if (!packages_struct.init_status) return 0; char *command = install_package_command(package); yon_terminal_window_launch(NULL,command,"",""); @@ -166,6 +189,7 @@ int yon_packages_install(char *package){ } int yon_packages_remove(char *package){ + if (!packages_struct.init_status) return 0; char *command = remove_package_command(package); yon_terminal_window_launch(NULL,command,"",""); @@ -174,6 +198,7 @@ int yon_packages_remove(char *package){ } void yon_packages_finish(){ + if (!packages_struct.init_status) return; g_hash_table_unref(packages_struct.all_list); g_hash_table_unref(packages_struct.installed_list); } @@ -189,6 +214,45 @@ config_str yon_resource_open_file(const char *path, int *size){ return parsed; } + +struct yon_combo_default_struct { + char *command; + GtkComboBoxText *target; + void *result_callback; // char*(*)(char*) + char *default_value; + char *command_value; +}; + +void _yon_combo_box_set_default_value(struct yon_combo_default_struct *target){ + gtk_combo_box_text_prepend(target->target,target->command_value,target->default_value); + if (!yon_char_is_empty(target->default_value)) free(target->command); + if (!yon_char_is_empty(target->default_value)) free(target->command_value); +} + +void *__yon_combo_set_default(struct yon_combo_default_struct *target){ + int size; + config_str parameter = yon_config_load(yon_config_parameter_prepare_command(target->command,"default",NULL,NULL),&size); + if (size&&!yon_char_is_empty(parameter[0])&&strcmp(parameter[0],"(null)\n")){ + yon_char_remove_last_symbol(parameter[0],'\n'); + target->command_value = yon_char_new(parameter[0]); + target->default_value = ((char*(*)(char*))(target->result_callback))(parameter[0]); + } else { + target->default_value = ((char*(*)(char*))(target->result_callback))(NULL); + } + g_idle_add_once((GSourceOnceFunc)_yon_combo_box_set_default_value,target); + +} + +void yon_combo_box_set_default(GtkComboBoxText *target, char *command, char*(result_callback)(char*)){ + struct yon_combo_default_struct *target_struct = malloc(sizeof(struct yon_combo_default_struct)); + target_struct->result_callback = result_callback; + target_struct->target = target; + target_struct->command = yon_char_new(command); + target_struct->command_value=NULL; + target_struct->default_value = NULL; + g_thread_new("combo_get_default",(GThreadFunc)__yon_combo_set_default,target_struct); +} + // dictionary *__yon_config_listeners = NULL; // typedef struct { // GtkWidget *target; diff --git a/source/libublsettings-gtk3.h b/source/libublsettings-gtk3.h index 0dd9268..2e61ad1 100644 --- a/source/libublsettings-gtk3.h +++ b/source/libublsettings-gtk3.h @@ -564,7 +564,18 @@ void yon_gtk_revealer_set_from_expander(GtkRevealer *revealer, GtkExpander *targ void yon_gtk_window_set_shrinking_from_revealer_resizing(GtkWindow *window, GtkRevealer *revealer); -int yon_packages_init(); +/**yon_packages_init() + * Инициализация системы пакетов. Инициализация происходит долго, + * рекомендуется вызывать как можно ближе к началу работы кода. + */ +void yon_packages_init(); + +/**yon_packages_finalize() + * Завершает инициирование системы пакетов из yon_packages_init(). + * Рекомендуется вызывать как можно ближе к месту первого использования системы пакетов. + */ +int yon_packages_finalize(); + int yon_packages_check_exist(char *package); int yon_packages_check_installed(char *package); int yon_packages_check_updates(char *package); @@ -573,4 +584,5 @@ void yon_packages_update_package(char *package); int yon_packages_install(char *package); int yon_packages_remove(char *package); void yon_packages_update_package_is_installed(char *package); -void yon_packages_update_package_is_updated(char *package); \ No newline at end of file +void yon_packages_update_package_is_updated(char *package); +void yon_combo_box_set_default(GtkComboBoxText *target, char *command, char*(result_callback)(char*)); \ No newline at end of file