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-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 + #ifdef __GTK_H__ // GtkEntry section @@ -40,112 +42,228 @@ // } - struct packages { - GHashTable *all_list; - GHashTable *installed_list; - GHashTable *updates_list; -} packages_struct; + alpm_handle_t *packages_handle; + int init_status; +} packages_struct = {}; + +int _yon_packages_get_db(){ + const char *root = "/"; + const char *dbpath = "/var/lib/pacman"; + const char *config_path = "/etc/pacman.conf"; + packages_struct.packages_handle = alpm_initialize(root,dbpath,NULL); + if (!packages_struct.packages_handle){ + packages_struct.init_status=0; + return 0; + } + int size = 0; + config_str pacman_config = yon_file_open((char*)config_path,&size); + char *pacman_config_full = yon_char_parsed_to_string(pacman_config,size,""); + + 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]=='['){ + free(yon_char_divide(iter,0)); + yon_char_remove_last_symbol(iter,']'); + } + if (strcmp(iter,"options")){ + alpm_register_syncdb(packages_struct.packages_handle,iter,ALPM_SIG_USE_DEFAULT); + } + g_match_info_next(match,NULL); + } -int yon_packages_init(){ - if (getuid()) return 0; - 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); + return 1; +} - 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; + 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; - 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){ - 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){ - 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; + + 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; + } + { + 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; + } + + 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; + } + return 0; } -void yon_packages_update_package(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); +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); + } } } - free(command); + return final; +} - 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)); +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)); } - } else { - if (g_hash_table_contains(packages_struct.updates_list,package)){ - g_hash_table_remove(packages_struct.updates_list,package); + } +} + +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)); } } - 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){ - char *command = install_package_command(package); - yon_terminal_window_launch(NULL,command,"",""); + if (!packages_struct.init_status) return 0; + // 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){ - char *command = remove_package_command(package); - yon_terminal_window_launch(NULL,command,"",""); + if (!packages_struct.init_status) return 0; + // 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(){ - g_hash_table_unref(packages_struct.all_list); - g_hash_table_unref(packages_struct.installed_list); + if (!packages_struct.init_status) return; + alpm_release(packages_struct.packages_handle); +} + +GList *yon_packages_get_all(){ + if (!packages_struct.init_status) return NULL; + + 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; } config_str yon_resource_open_file(const char *path, int *size){ @@ -159,6 +277,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 799c438..00e391a 100644 --- a/source/libublsettings-gtk3.h +++ b/source/libublsettings-gtk3.h @@ -283,8 +283,8 @@ void yon_gtk_widget_set_sensitive_from_toggle_button(GtkToggleButton *toggle, Gt */ void yon_gtk_widget_set_sensitive_from_toggle_button_inversed(GtkToggleButton *toggle, GtkWidget *target); -void yon_gtk_widget_set_sensitive_from_switch(GtkSwitch *toggle, GtkWidget *target); -void yon_gtk_widget_set_sensitive_from_switch_inversed(GtkSwitch *toggle, GtkWidget *target); +void yon_gtk_widget_set_sensitive_from_switch(GtkSwitch *toggle, int status, GtkWidget *target); +void yon_gtk_widget_set_sensitive_from_switch_inversed(GtkSwitch *toggle, int status, GtkWidget *target); /**yon_gtk_widget_set_sensitive_from_combo_box(GtkComboBox *toggle, GtkWidget *target); * [EN] @@ -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; @@ -533,6 +533,8 @@ void yon_gtk_entry_block_symbols(GtkEntry *target, char *symbols); void yon_gtk_entry_block_lowercase(GtkEntry *target); +void yon_entry_set_pattern(GtkEntry *target, char *pattern); + void yon_on_entry_set_allowed_symbols(GtkEntry *target, char *symbols); // GtkTreeStore section @@ -564,11 +566,39 @@ 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(); -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(); -void yon_packages_update_package(char *package); +GList *yon_packages_get_all(); +void yon_packages_update(); int yon_packages_install(char *package); -int yon_packages_remove(char *package); \ No newline at end of file +int yon_packages_remove(char *package); + +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*)); + +int yon_ip_mask_get_bits(char *mask); +int yon_ip_check(char *ip); + +#endif \ No newline at end of file