From 2d8aff421c7051309b3a6f9c409e2bf048d0b5c6 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 24 Jul 2025 18:10:09 +0600 Subject: [PATCH] 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