From bc16ad4ce09f48d33d3ad98cfbe030d2541fabbd Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 14 Jul 2025 09:43:40 +0600 Subject: [PATCH 1/8] Fixed pacman commands --- source/libublsettings-gtk3.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libublsettings-gtk3.c b/source/libublsettings-gtk3.c index 18e1f91..8bf57c1 100644 --- a/source/libublsettings-gtk3.c +++ b/source/libublsettings-gtk3.c @@ -86,8 +86,8 @@ int yon_packages_init(){ #define install_package_command(target) yon_char_unite("pacman -S ",target,NULL) #define remove_package_command(target) yon_char_unite("pacman -R ",target,NULL) -#define update_package_installed_command(target) yon_char_append("pacman -Qq",target) -#define update_package_updated_command(target) yon_char_append("pacman -Qqu",target) +#define update_package_installed_command(target) yon_char_append("pacman -Qq ",target) +#define update_package_updated_command(target) yon_char_append("pacman -Qqu ",target) int yon_packages_check_exist(char *package){ return g_hash_table_contains(packages_struct.all_list,package); From bc8d4507bb53f0c7ed593f6dfb6e321c315ef88e Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 14 Jul 2025 09:53:11 +0600 Subject: [PATCH 2/8] Added separate packages update functions for more speed --- source/libublsettings-gtk3.c | 28 ++++++++++++++++++++++++++++ source/libublsettings-gtk3.h | 4 +++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/source/libublsettings-gtk3.c b/source/libublsettings-gtk3.c index 8bf57c1..dfbd007 100644 --- a/source/libublsettings-gtk3.c +++ b/source/libublsettings-gtk3.c @@ -101,6 +101,34 @@ int yon_packages_check_updates(char *package){ return g_hash_table_contains(packages_struct.updates_list,package); } +void yon_packages_update_package_is_installed(char *package){ + char *command = update_package_installed_command(package); + if (!system(command)){ + if (!g_hash_table_contains(packages_struct.installed_list,package)){ + g_hash_table_add(packages_struct.installed_list,yon_char_new(package)); + } + } else { + if (g_hash_table_contains(packages_struct.installed_list,package)){ + g_hash_table_remove(packages_struct.installed_list,package); + } + } + free(command); +} + +void yon_packages_update_package_is_updated(char *package){ + char *command = update_package_updated_command(package); + if (!system(command)){ + if (!g_hash_table_contains(packages_struct.updates_list,package)){ + g_hash_table_add(packages_struct.updates_list,yon_char_new(package)); + } + } else { + if (g_hash_table_contains(packages_struct.updates_list,package)){ + g_hash_table_remove(packages_struct.updates_list,package); + } + } + free(command); +} + void yon_packages_update_package(char *package){ char *command = update_package_installed_command(package); if (!system(command)){ diff --git a/source/libublsettings-gtk3.h b/source/libublsettings-gtk3.h index 799c438..0dd9268 100644 --- a/source/libublsettings-gtk3.h +++ b/source/libublsettings-gtk3.h @@ -571,4 +571,6 @@ int yon_packages_check_updates(char *package); void yon_packages_finish(); void yon_packages_update_package(char *package); int yon_packages_install(char *package); -int yon_packages_remove(char *package); \ No newline at end of file +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 From a77405d1f2b3a78766bc2e06f5f17b9043d84094 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 14 Jul 2025 18:00:49 +0600 Subject: [PATCH 3/8] Minor optimization for packages loading --- source/libublsettings-gtk3.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/libublsettings-gtk3.c b/source/libublsettings-gtk3.c index dfbd007..6473396 100644 --- a/source/libublsettings-gtk3.c +++ b/source/libublsettings-gtk3.c @@ -40,7 +40,6 @@ // } - struct packages { GHashTable *all_list; GHashTable *installed_list; @@ -61,16 +60,19 @@ int yon_packages_init(){ config_str updates = yon_config_load("pacman -Qqu",&updates_size); for (int i=0;i Date: Tue, 15 Jul 2025 16:11:49 +0600 Subject: [PATCH 4/8] 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 From b4b6245a46bb54e03dce21cb4cb281285a2706a8 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 23 Jul 2025 18:02:15 +0600 Subject: [PATCH 5/8] Function add --- source/libublsettings-gtk3-window-config.c | 2 +- source/libublsettings-gtk3.c | 6 ++++++ source/libublsettings-gtk3.h | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/source/libublsettings-gtk3-window-config.c b/source/libublsettings-gtk3-window-config.c index 477084a..4f30a01 100644 --- a/source/libublsettings-gtk3-window-config.c +++ b/source/libublsettings-gtk3-window-config.c @@ -286,7 +286,7 @@ break; } } else { - g_error("Window configuration were not set"); + g_warning("Window configuration were not set"); } return 0; } diff --git a/source/libublsettings-gtk3.c b/source/libublsettings-gtk3.c index a69d7e6..c615b6a 100644 --- a/source/libublsettings-gtk3.c +++ b/source/libublsettings-gtk3.c @@ -203,6 +203,12 @@ void yon_packages_finish(){ g_hash_table_unref(packages_struct.installed_list); } +GList *yon_packages_get_all(){ + if (!packages_struct.init_status) return NULL; + GList *list = g_hash_table_get_keys(packages_struct.all_list); + return list; +} + config_str yon_resource_open_file(const char *path, int *size){ config_str parsed = NULL; char *modules = NULL; diff --git a/source/libublsettings-gtk3.h b/source/libublsettings-gtk3.h index 2e61ad1..a24d01e 100644 --- a/source/libublsettings-gtk3.h +++ b/source/libublsettings-gtk3.h @@ -576,10 +576,14 @@ void 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); void yon_packages_finish(); +GList *yon_packages_get_all(); void yon_packages_update_package(char *package); int yon_packages_install(char *package); int yon_packages_remove(char *package); From 00f358b38ecb6bb6fac3a7f3b264532cf0915a68 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 24 Jul 2025 11:32:30 +0600 Subject: [PATCH 6/8] Packages functions remade with alpm library --- source/CMakeLists.txt | 7 ++ source/libublsettings-gtk3.c | 220 +++++++++++++++-------------------- source/libublsettings-gtk3.h | 9 +- 3 files changed, 105 insertions(+), 131 deletions(-) diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index bc56209..1a88396 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -14,6 +14,11 @@ include_directories(${VTE291_INCLUDE_DIRS}) link_directories(${VTE291_LIBRARY_DIRS}) add_definitions(${VTE291_CFLAGS_OTHER}) +pkg_check_modules(ALPM REQUIRED libalpm) +include_directories(${ALPM_INCLUDE_DIRS}) +link_directories(${ALPM_LIBRARY_DIRS}) +add_definitions(${ALPM_CFLAGS_OTHER}) + find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) option(WEBKIT_FOUND "No" OFF) @@ -52,6 +57,8 @@ pthread) add_definitions(-DVTE_INCLUDE) list(APPEND LIBRARIES ${VTE291_LIBRARIES}) +list(APPEND LIBRARIES ${ALPM_LIBRARIES}) + if (WEBKIT_LIBRARIES_FOUND) list(APPEND LIBRARIES ${WEBKIT_LIBRARIES}) add_definitions(-DWEBKIT_INCLUDE) diff --git a/source/libublsettings-gtk3.c b/source/libublsettings-gtk3.c index c615b6a..2823ee7 100644 --- a/source/libublsettings-gtk3.c +++ b/source/libublsettings-gtk3.c @@ -1,5 +1,7 @@ #include "libublsettings-gtk3.h" +#include + #ifdef __GTK_H__ // GtkEntry section @@ -41,171 +43,137 @@ // } struct packages { - GHashTable *all_list; - GHashTable *installed_list; - GHashTable *updates_list; + alpm_handle_t *packages_handle; int init_status; -} packages_struct; -GThread *packages_thread = NULL; - -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); - - int size; - int installed_size; - int updates_size; - config_str package_list = yon_config_load("pacman -Slq",&size); - config_str installed = yon_config_load("pacman -Qq",&installed_size); - config_str updates = yon_config_load("pacman -Qqu",&updates_size); - - for (int i=0;idata; + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) return 1; + } + return 0; } -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_installed(char *package_name){ + alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) return 1; + return 0; } -int yon_packages_check_updates(char *package){ - if (!packages_struct.init_status) return 0; - return g_hash_table_contains(packages_struct.updates_list,package); -} +int yon_packages_check_updates(char *package_name){ + alpm_pkg_t *sync_db_package = NULL; + alpm_pkg_t *local_db_package = NULL; -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)){ - g_hash_table_add(packages_struct.installed_list,yon_char_new(package)); - } - } else { - if (g_hash_table_contains(packages_struct.installed_list,package)){ - g_hash_table_remove(packages_struct.installed_list,package); - } + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) sync_db_package = package; } - free(command); -} - -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)){ - g_hash_table_add(packages_struct.updates_list,yon_char_new(package)); - } - } else { - if (g_hash_table_contains(packages_struct.updates_list,package)){ - g_hash_table_remove(packages_struct.updates_list,package); - } + { + alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) local_db_package = package; } - free(command); -} -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)){ - g_hash_table_add(packages_struct.installed_list,yon_char_new(package)); - } - } else { - if (g_hash_table_contains(packages_struct.installed_list,package)){ - g_hash_table_remove(packages_struct.installed_list,package); - } + if (sync_db_package && local_db_package){ + const char *sync_db_package_version = alpm_pkg_get_version(sync_db_package); + const char *local_db_package_version = alpm_pkg_get_version(sync_db_package); + if (strcmp(sync_db_package_version,local_db_package_version)) return 1; } - free(command); + return 0; +} - command = update_package_updated_command(package); - if (!system(command)){ - if (!g_hash_table_contains(packages_struct.updates_list,package)){ - g_hash_table_add(packages_struct.updates_list,yon_char_new(package)); - } - } else { - if (g_hash_table_contains(packages_struct.updates_list,package)){ - g_hash_table_remove(packages_struct.updates_list,package); - } - } - free(command); +void yon_packages_update(){ + if (packages_struct.packages_handle) alpm_release(packages_struct.packages_handle); + _yon_packages_get_db(); } 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,"",""); + // char *command = install_package_command(package); + // yon_terminal_window_launch(NULL,command,"",""); - yon_packages_update_package(package); - free(command); + yon_packages_update(); + // free(command); } 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,"",""); + // char *command = remove_package_command(package); + // yon_terminal_window_launch(NULL,command,"",""); - yon_packages_update_package(package); - free(command); + yon_packages_update(); + // free(command); } 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); + alpm_release(packages_struct.packages_handle); } GList *yon_packages_get_all(){ if (!packages_struct.init_status) return NULL; - GList *list = g_hash_table_get_keys(packages_struct.all_list); + + GList *list = NULL; + + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + alpm_list_t *package_list = alpm_db_get_pkgcache(database); + for (alpm_list_t *iter = package_list;iter;iter=iter->next){ + const char *cur_name = alpm_pkg_get_name(iter->data); + if (!list) list = g_list_append(list,yon_char_new(cur_name)); + else if (g_list_append(list,yon_char_new(cur_name))){}; + } + } + return list; } diff --git a/source/libublsettings-gtk3.h b/source/libublsettings-gtk3.h index a24d01e..890b66b 100644 --- a/source/libublsettings-gtk3.h +++ b/source/libublsettings-gtk3.h @@ -568,7 +568,7 @@ void yon_gtk_window_set_shrinking_from_revealer_resizing(GtkWindow *window, GtkR * Инициализация системы пакетов. Инициализация происходит долго, * рекомендуется вызывать как можно ближе к началу работы кода. */ -void yon_packages_init(); +int yon_packages_init(); /**yon_packages_finalize() * Завершает инициирование системы пакетов из yon_packages_init(). @@ -577,16 +577,15 @@ void yon_packages_init(); int yon_packages_finalize(); /*Проверить существовует ли пакет в репозиториях*/ -int yon_packages_check_exist(char *package); +int yon_packages_check_exist(const char *package); /*Проверить установлен ли пакет*/ int yon_packages_check_installed(char *package); int yon_packages_check_updates(char *package); void yon_packages_finish(); GList *yon_packages_get_all(); -void yon_packages_update_package(char *package); +void yon_packages_update(); 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); + void yon_combo_box_set_default(GtkComboBoxText *target, char *command, char*(result_callback)(char*)); \ No newline at end of file From 2d8aff421c7051309b3a6f9c409e2bf048d0b5c6 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 24 Jul 2025 18:10:09 +0600 Subject: [PATCH 7/8] Fixes; New functions added --- source/libublsettings-gtk3.c | 91 +++++++++++++++++++++++++++++++++++- source/libublsettings-gtk3.h | 23 +++++---- 2 files changed, 105 insertions(+), 9 deletions(-) diff --git a/source/libublsettings-gtk3.c b/source/libublsettings-gtk3.c index 2823ee7..0e7fe92 100644 --- a/source/libublsettings-gtk3.c +++ b/source/libublsettings-gtk3.c @@ -63,7 +63,7 @@ int _yon_packages_get_db(){ GRegex *regex = g_regex_new("^\\[.*\\]$",G_REGEX_MULTILINE,0,NULL); GMatchInfo *match = NULL; g_regex_match(regex,pacman_config_full,G_REGEX_MATCH_DEFAULT,&match); - + while (g_match_info_matches(match)){ char *iter = g_match_info_fetch(match,0); if (iter[0]=='['){ @@ -79,6 +79,43 @@ int _yon_packages_get_db(){ return 1; } +alpm_list_t *_yon_packages_get_db_list(enum YON_PACKAGES_DB_TYPE type){ + alpm_list_t *db_list = NULL; + switch(type){ + case YON_PACKAGES_LOCAL: + alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); + if (!db_list) db_list = alpm_list_append(&db_list,database); + else alpm_list_append(&db_list,database); + break; + + case YON_PACKAGES_SYNC: + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + if (!db_list) db_list = alpm_list_append(&db_list,database); + else alpm_list_append(&db_list,database); + } + break; + + case YON_PACKAGES_ALL:{ + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + if (!db_list) db_list = alpm_list_append(&db_list,database); + else alpm_list_append(&db_list,database); + } + } + { + alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); + if (!db_list) db_list = alpm_list_append(&db_list,database); + else alpm_list_append(&db_list,database); + } + break; + + } + return db_list; +} + int yon_packages_init(){ if (packages_struct.packages_handle) return 0; @@ -130,6 +167,58 @@ int yon_packages_check_updates(char *package_name){ return 0; } +config_str yon_packages_find(enum YON_PACKAGES_DB_TYPE type, const char *search_string, gsize *size){ + (*size)=0; + if (yon_char_is_empty(search_string)) return NULL; + + config_str final = NULL; + + alpm_list_t *databases = _yon_packages_get_db_list(type); + alpm_list_t *iter = NULL; + for (iter = databases; iter; iter=iter->next){ + alpm_db_t *database = iter->data; + alpm_list_t *packages = alpm_db_get_pkgcache(database); + alpm_list_t *iter2 = NULL; + for (iter2 = packages; iter2; iter2=iter2->next){ + const char *name = alpm_pkg_get_name(iter2->data); + if (strstr(name,search_string)){ + yon_char_parsed_add_or_create_if_exists(final,(int*)size,(char*)name); + } + } + } + return final; +} + +char *yon_packages_get_version(enum YON_PACKAGES_DB_TYPE type, const char *package){ + if (yon_char_is_empty(package)) return NULL; + + alpm_list_t *databases = _yon_packages_get_db_list(type); + alpm_list_t *iter = NULL; + for (iter = databases; iter; iter=iter->next){ + alpm_pkg_t *pkg = alpm_db_get_pkg(iter->data,package); + if (!pkg) continue; + const char *name = alpm_pkg_get_name(pkg); + if (!strcmp(name,package)){ + return yon_char_new(alpm_pkg_get_version(pkg)); + } + } +} + +char *yon_packages_get_description(enum YON_PACKAGES_DB_TYPE type, const char *package){ + if (yon_char_is_empty(package)) return NULL; + + alpm_list_t *databases = _yon_packages_get_db_list(type); + alpm_list_t *iter = NULL; + for (iter = databases; iter; iter=iter->next){ + alpm_pkg_t *pkg = alpm_db_get_pkg(iter->data,package); + if (!pkg) continue; + const char *name = alpm_pkg_get_name(pkg); + if (!strcmp(name,package)){ + return yon_char_new(alpm_pkg_get_desc(pkg)); + } + } +} + void yon_packages_update(){ if (packages_struct.packages_handle) alpm_release(packages_struct.packages_handle); _yon_packages_get_db(); diff --git a/source/libublsettings-gtk3.h b/source/libublsettings-gtk3.h index 890b66b..a29b9f3 100644 --- a/source/libublsettings-gtk3.h +++ b/source/libublsettings-gtk3.h @@ -509,7 +509,7 @@ GtkWidget *yon_ubl_browser_window_open(char *link, char *browser_window_name); */ GtkWidget *yon_ubl_browser_window_open(char *link, char *browser_window_name); #endif -#endif + // rmb menu section typedef struct { GtkWidget *menu; @@ -564,18 +564,19 @@ void yon_gtk_revealer_set_from_expander(GtkRevealer *revealer, GtkExpander *targ void yon_gtk_window_set_shrinking_from_revealer_resizing(GtkWindow *window, GtkRevealer *revealer); + +enum YON_PACKAGES_DB_TYPE { + YON_PACKAGES_LOCAL, + YON_PACKAGES_SYNC, + YON_PACKAGES_ALL, +}; + /**yon_packages_init() * Инициализация системы пакетов. Инициализация происходит долго, * рекомендуется вызывать как можно ближе к началу работы кода. */ int yon_packages_init(); -/**yon_packages_finalize() - * Завершает инициирование системы пакетов из yon_packages_init(). - * Рекомендуется вызывать как можно ближе к месту первого использования системы пакетов. - */ -int yon_packages_finalize(); - /*Проверить существовует ли пакет в репозиториях*/ int yon_packages_check_exist(const char *package); @@ -588,4 +589,10 @@ void yon_packages_update(); int yon_packages_install(char *package); int yon_packages_remove(char *package); -void yon_combo_box_set_default(GtkComboBoxText *target, char *command, char*(result_callback)(char*)); \ No newline at end of file +config_str yon_packages_find(enum YON_PACKAGES_DB_TYPE type, const char *search_string, gsize *size); + +char *yon_packages_get_version(enum YON_PACKAGES_DB_TYPE type, const char *package); +char *yon_packages_get_description(enum YON_PACKAGES_DB_TYPE type, const char *package); + +void yon_combo_box_set_default(GtkComboBoxText *target, char *command, char*(result_callback)(char*)); +#endif \ No newline at end of file From cef0ef0cc4dc5dbfcf809475c790b78ee2efdae8 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 25 Jul 2025 18:00:40 +0600 Subject: [PATCH 8/8] Added ip checking functions --- source/libublsettings-gtk3-misc.c | 88 +++++++++++++++++++------------ source/libublsettings-gtk3.h | 10 +++- 2 files changed, 63 insertions(+), 35 deletions(-) diff --git a/source/libublsettings-gtk3-misc.c b/source/libublsettings-gtk3-misc.c index d2711ff..3b9c095 100644 --- a/source/libublsettings-gtk3-misc.c +++ b/source/libublsettings-gtk3-misc.c @@ -241,11 +241,11 @@ void yon_gtk_widget_set_sensitive_from_toggle_button_inversed(GtkToggleButton *t } -void yon_gtk_widget_set_sensitive_from_switch(GtkSwitch *toggle, GtkWidget *target){ +void yon_gtk_widget_set_sensitive_from_switch(GtkSwitch *toggle, int status, GtkWidget *target){ gtk_widget_set_sensitive(target,gtk_switch_get_active(toggle)); } -void yon_gtk_widget_set_sensitive_from_switch_inversed(GtkSwitch *toggle, GtkWidget *target){ +void yon_gtk_widget_set_sensitive_from_switch_inversed(GtkSwitch *toggle, int status, GtkWidget *target){ gtk_widget_set_sensitive(target,!gtk_switch_get_active(toggle)); } @@ -447,38 +447,19 @@ void yon_gtk_window_set_shrinking_from_revealer_resizing(GtkWindow *window, GtkR g_signal_connect(G_OBJECT(wrapped->revealer),"notify::reveal-child",G_CALLBACK(_yon_on_revealer_switched),wrapped); } -// void on_entry_pattern_inserted(GtkEditable *self, const gchar *text, gint length, gint *position, char *pattern){ -// if (length!=1) { -// return; -// } -// const char *old = gtk_entry_get_text(GTK_ENTRY(self)); -// int old_size = strlen(old); - -// char *final = yon_char_append((char*)old,text); +void on_entry_pattern_inserted(GtkEditable *self, const gchar *text, gint length, gint *position, char *pattern){ + const char *old_text = gtk_entry_get_text(GTK_ENTRY(self)); + char *test_text = yon_char_append(old_text,text); + if (!g_regex_match_simple(pattern,test_text,0,0)){ + g_signal_stop_emission_by_name(G_OBJECT(self),"insert-text"); + } -// switch(pattern[old_size]){ -// case '\1':{ -// if (text[0]>='0'&&text[0]<='9') -// } -// break; -// case '\2': -// break; -// default: -// break; -// } - -// if (strlen(new_text) < strlen(text)) { -// g_signal_handlers_block_by_func(editable, G_CALLBACK(yon_on_space_first_changed), NULL); -// gtk_entry_set_text(editable, new_text); -// g_signal_handlers_unblock_by_func(editable, G_CALLBACK(yon_on_space_first_changed), NULL); -// g_signal_stop_emission_by_name(editable, "changed"); -// } -// } - -// void yon_entry_set_pattern(GtkEntry *target, char *pattern){ -// char *pattern_copy = yon_char_new(pattern); -// g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(on_entry_pattern_inserted),pattern_copy) -// } +} + +void yon_entry_set_pattern(GtkEntry *target, char *pattern){ + char *pattern_copy = yon_char_new(pattern); + g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(on_entry_pattern_inserted),pattern_copy); +} void yon_on_insert_allowed_check(GtkEditable *editable, char *text, int length, int *position,char *symbols){ @@ -506,4 +487,45 @@ void yon_on_insert_allowed_check(GtkEditable *editable, char *text, int length, void yon_on_entry_set_allowed_symbols(GtkEntry *target, char *symbols){ g_return_if_fail(GTK_IS_ENTRY(target)); g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_insert_allowed_check),symbols); +} + +int yon_ip_check(char *ip){ + if (!strstr(ip,".")){ + int pixmask = atoi(ip); + if (pixmask > 32) return 0; + } else { + if (!g_regex_match_simple("^(\\d){0,3}\\.(\\d){0,3}\\.(\\d){0,3}\\.(\\d){0,3}$",ip,0,0)) return 0; + int size; + config_str parsed = yon_char_parse(ip,&size,"."); + for (int i=0;i255){ + yon_char_parsed_free(parsed,size); + return 0; + } + } + yon_char_parsed_free(parsed,size); + } + return 1; +} + +int yon_ip_mask_get_bits(char *mask){ + if (!strstr(mask,".")){ + int bits = atoi(mask); + return bits; + } + int size; + config_str parsed = yon_char_parse(mask,&size,"."); + int bits = 32; + for (int i=0;i