#include "libublsettings-gtk3.h" void on_subwindow_close(GtkWidget *self){ gtk_widget_destroy(gtk_widget_get_toplevel(self)); } int yon_gtk_window_setup(GtkWindow *window, GtkWindow *transistent_window, char *title, char *icon_name, char *window_id){ if (GTK_IS_WINDOW(window)){ int success=0; if (transistent_window){ gtk_window_set_transient_for(window,transistent_window); success++; } if (!yon_char_is_empty(title)){ gtk_window_set_title(window,title); GtkWidget *titlebar = gtk_window_get_titlebar(window); if (titlebar){ GtkWidget *title_label = gtk_header_bar_get_custom_title(GTK_HEADER_BAR(titlebar)); if (title_label){ gtk_label_set_text(GTK_LABEL(title_label),title); } } success++; } if (!yon_char_is_empty(icon_name)){ gtk_window_set_icon_name(window,icon_name); success++; } if (!yon_char_is_empty(window_id)){ yon_window_config_custom_window_setup(window,window_id); success++; } return success; } else { return 0; } } GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){ GtkWidget *menu_item = gtk_menu_item_new(); gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom"); GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); GtkWidget *label = gtk_label_new(buttonname); GtkWidget *image = gtk_image_new_from_icon_name("dialog-information-symbolic",GTK_ICON_SIZE_BUTTON); gtk_label_set_xalign(GTK_LABEL(label),0.0); gtk_box_pack_start(GTK_BOX(box),image,0,0,5); gtk_box_pack_start(GTK_BOX(box),label,0,0,5); gtk_container_add(GTK_CONTAINER(menu_item),box); gtk_widget_show_all(menu_item); return menu_item; } GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname){ GtkWidget *menu_item = gtk_menu_item_new(); gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop"); GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); GtkWidget *label = gtk_label_new(buttonname); GtkWidget *image = gtk_image_new_from_icon_name("dialog-question-symbolic",GTK_ICON_SIZE_BUTTON); gtk_label_set_xalign(GTK_LABEL(label),0.0); gtk_box_pack_start(GTK_BOX(box),image,0,0,5); gtk_box_pack_start(GTK_BOX(box),label,0,0,5); gtk_container_add(GTK_CONTAINER(menu_item),box); gtk_widget_show_all(menu_item); return menu_item; } int yon_gtk_combo_box_fill(GtkWidget *combo, config_str parameters,int size){ if (combo&¶meters){ for (int i=0;icolumn&&resizing_columns>connect_to){ char *name="1"; name[0]=connect_to+1; dictionary *cur = NULL; if (!(cur =yon_dictionary_get(&dict,name))){ int *width = malloc(sizeof(int)); (*width)=gtk_tree_view_column_get_width(gtk_tree_view_get_column(top,column)); yon_dictionary_append_with_data(dict,name,width); } else { *(int*)cur->data+=gtk_tree_view_column_get_width(gtk_tree_view_get_column(top,column)); } } } dictionary *cur; for_dictionaries(cur,dict){ int cur_column = cur->key[0]-1; gtk_tree_view_column_set_fixed_width(gtk_tree_view_get_column(resizing,cur_column),*(int*)dict->data); free(dict->data); } va_end(arglist); } int yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...){ va_list args; va_start(args,padding); GtkWidget *widget = va_arg(args,GtkWidget*); while (widget){ gtk_box_pack_start(GTK_BOX(destination), widget, expand, fill, padding); } va_end(args); return 1; } int yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...){ va_list args; va_start(args,padding); GtkWidget *widget = va_arg(args,GtkWidget*); while (widget){ gtk_box_pack_end(GTK_BOX(destination), widget, expand, fill, padding); } va_end(args); return 1; } int yon_gtk_list_store_find_text(GtkListStore *list, GtkTreeIter *iter, int seek_column, char *value){ int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list),iter); for (;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(list),iter)){ char *seek_value; gtk_tree_model_get(GTK_TREE_MODEL(list),iter,seek_column,&seek_value,-1); if (!strcmp(value,seek_value)){ free(seek_value); return 1; } free(seek_value); } return 0; } void yon_on_cell_renderer_toggle_toggled_for_list_store(GtkWidget *self, gchar *path,GtkWidget *tree){ GtkTreePath *path_converted = gtk_tree_path_new_from_string(path); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree)); GtkTreeIter iter; gtk_tree_model_get_iter(model,&iter,path_converted); int last = yon_char_find_last(path,':'); char *col = path+last+1; int status; gtk_tree_model_get(model,&iter,atoi(col),&status,-1); gtk_list_store_set(GTK_LIST_STORE(model),&iter,atoi(col),!status,-1); } void yon_cell_renderer_toggle_set_toggle(GtkCellRendererToggle *target,GtkWidget *tree){ g_return_if_fail(GTK_IS_CELL_RENDERER_TOGGLE(target)); g_signal_connect(G_OBJECT(target),"toggled",G_CALLBACK(yon_on_cell_renderer_toggle_toggled_for_list_store),tree); } void yon_gtk_toggle_button_set_inactive_from_toggle(GtkToggleButton *self, GtkToggleButton *target){ if (gtk_toggle_button_get_active(self)){ gtk_toggle_button_set_active(target,1); } else { gtk_toggle_button_set_active(target,0); } } void yon_gtk_toggle_button_set_inactive_from_entry(GtkEntry *self, GtkToggleButton *target){ if (strlen(gtk_entry_get_text(self))>0){ gtk_toggle_button_set_active(target,1); } else { gtk_toggle_button_set_active(target,0); } } void yon_gtk_toggle_button_set_inactive_from_combo_box(GtkComboBox *self, GtkToggleButton *target){ if (gtk_combo_box_get_active(self)>0){ gtk_toggle_button_set_active(target,1); } else { gtk_toggle_button_set_active(target,0); } } void yon_gtk_widget_set_sensitive_from_toggle_button(GtkToggleButton *toggle, GtkWidget *target){ gtk_widget_set_sensitive(target,gtk_toggle_button_get_active(toggle)); } void yon_gtk_widget_set_sensitive_from_toggle_button_inversed(GtkToggleButton *toggle, GtkWidget *target){ gtk_widget_set_sensitive(target,!gtk_toggle_button_get_active(toggle)); } 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, int status, GtkWidget *target){ gtk_widget_set_sensitive(target,!gtk_switch_get_active(toggle)); } void yon_gtk_widget_set_sensitive_from_combo_box(GtkComboBox *toggle, GtkWidget *target){ gtk_widget_set_sensitive(target,gtk_combo_box_get_active(toggle)>0 ? 1 : 0); } void yon_gtk_widget_set_sensitive_from_combo_box_inversed(GtkComboBox *toggle, GtkWidget *target){ gtk_widget_set_sensitive(target,!gtk_combo_box_get_active(toggle)>0 ? 0 : 1); } void yon_gtk_toggle_button_set_inactive_from_toggle_button_inversed(GtkToggleButton *self, GtkToggleButton *target){ if (gtk_toggle_button_get_active(self)){ gtk_toggle_button_set_active(target,0); } } void yon_gtk_toggle_button_set_inactive_from_toggle_button(GtkToggleButton *self, GtkToggleButton *target){ if (!gtk_toggle_button_get_active(self)){ gtk_toggle_button_set_active(target,0); } } void yon_on_text_insert_only_digits(GtkEditable *editable, const gchar *text, gint length, gint *position, gpointer user_data){ gchar *new_text = g_new(gchar, length + 1); gint i, j = 0; for (i = 0; i < length; i++) { if (g_ascii_isdigit(text[i])) { new_text[j] = text[i]; j++; } } if (j < length) { g_signal_handlers_block_by_func(editable, G_CALLBACK(yon_on_text_insert_only_digits), user_data); gtk_editable_insert_text(editable, new_text, j, position); g_signal_handlers_unblock_by_func(editable, G_CALLBACK(yon_on_text_insert_only_digits), user_data); g_signal_stop_emission_by_name(editable, "insert-text"); } g_free(new_text); } void yon_on_insert_restricted_check(GtkEditable *editable, const gchar *text, gint length, gint *position, gpointer){ gchar *new_text = g_new(gchar, length + 1); memset(new_text,0,length+1); gint i, j = 0; for (i = 0; i < length; i++) { if ((text[i]>='0'&&text[i]<='9')||(text[i]>='a'&&text[i]<='z')||(text[i]>='A'&&text[i]<='Z')) { new_text[j] = text[i]; j++; } } if (j < length) { g_signal_handlers_block_by_func(editable, G_CALLBACK(yon_on_insert_restricted_check), NULL); gtk_editable_insert_text(editable, new_text, j, position); g_signal_handlers_unblock_by_func(editable, G_CALLBACK(yon_on_insert_restricted_check), NULL); g_signal_stop_emission_by_name(editable, "insert-text"); } g_free(new_text); } void yon_gtk_entry_block_restricted_symbols(GtkEntry *target){ g_return_if_fail(GTK_IS_ENTRY(target)); g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_insert_restricted_check),NULL); } void yon_on_insert_languages(GtkEditable *editable, const gchar *text, gint length, gint *position, gpointer){ gchar *new_text = g_new(gchar, length + 1); memset(new_text,0,length+1); gint i, j = 0; for (i = 0; i < length; i++) { if (text[i]>=0) { new_text[j] = text[i]; j++; } } if (j < length) { g_signal_handlers_block_by_func(editable, G_CALLBACK(yon_on_insert_restricted_check), NULL); gtk_editable_insert_text(editable, new_text, j, position); g_signal_handlers_unblock_by_func(editable, G_CALLBACK(yon_on_insert_restricted_check), NULL); g_signal_stop_emission_by_name(editable, "insert-text"); } g_free(new_text); } void yon_gtk_entry_block_languages(GtkEntry *target){ g_return_if_fail(GTK_IS_ENTRY(target)); g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_insert_languages),NULL); } void yon_on_insert_custom_restricted_check(GtkEditable *editable, const gchar *text, gint length, gint *position, char *symbols){ gchar *new_text = g_new(gchar, length + 1); memset(new_text,0,length+1); gint i, j = 0; for (i = 0; i < length; i++) { if (!strchr(symbols,text[i])) { new_text[j] = text[i]; j++; } } if (j < length) { g_signal_handlers_block_by_func(editable, G_CALLBACK(yon_on_insert_restricted_check), NULL); gtk_editable_insert_text(editable, new_text, j, position); g_signal_handlers_unblock_by_func(editable, G_CALLBACK(yon_on_insert_restricted_check), NULL); g_signal_stop_emission_by_name(editable, "insert-text"); } g_free(new_text); } void yon_gtk_entry_block_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_custom_restricted_check),yon_char_new(symbols)); } void yon_on_insert_lowercase_check(GtkEditable *editable, const gchar *text, gint length, gint *position, char *symbols){ gchar *new_text = g_new(gchar, length + 1); memset(new_text,0,length+1); gint i; for (i = 0; i < length; i++) { if (text[i]>=97&&text[i]<=122) { new_text[i]=text[i]-32; } else { new_text[i] = text[i]; } } g_signal_handlers_block_by_func(editable, G_CALLBACK(yon_on_insert_lowercase_check), NULL); gtk_editable_insert_text(editable, new_text, strlen(text), position); g_signal_handlers_unblock_by_func(editable, G_CALLBACK(yon_on_insert_lowercase_check), NULL); g_signal_stop_emission_by_name(editable, "insert-text"); } void yon_gtk_entry_block_lowercase(GtkEntry *target){ g_return_if_fail(GTK_IS_ENTRY(target)); g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_insert_lowercase_check),NULL); } gboolean _yon_on_gtk_revealer_set_from_switch(GtkSwitch *target, int status, GtkRevealer *revealer){ gtk_revealer_set_reveal_child(revealer,status); gtk_revealer_set_transition_type(revealer,status?GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN:GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP); return 0; } gboolean _yon_on_gtk_revealer_set_from_switch_inversed(GtkSwitch *target, int status, GtkRevealer *revealer){ gtk_revealer_set_reveal_child(revealer,!status); gtk_revealer_set_transition_type(revealer,!status?GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN:GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP); return 0; } gboolean _yon_on_gtk_revealer_set_from_expander(GtkExpander *target,GtkRevealer *revealer){ int status = gtk_expander_get_expanded(target); gtk_revealer_set_reveal_child(revealer,!status); gtk_revealer_set_transition_type(revealer,!status?GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN:GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP); return 0; } void yon_gtk_revealer_set_from_switch(GtkRevealer *revealer, GtkSwitch *target){ g_return_if_fail(GTK_IS_REVEALER(revealer)&>K_IS_SWITCH(target)); g_signal_connect(G_OBJECT(target),"state-set",G_CALLBACK(_yon_on_gtk_revealer_set_from_switch),revealer); } void yon_gtk_revealer_set_from_switch_inversed(GtkRevealer *revealer, GtkSwitch *target){ g_return_if_fail(GTK_IS_REVEALER(revealer)&>K_IS_SWITCH(target)); g_signal_connect(G_OBJECT(target),"state-set",G_CALLBACK(_yon_on_gtk_revealer_set_from_switch_inversed),revealer); } void yon_gtk_revealer_set_from_expander(GtkRevealer *revealer, GtkExpander *target){ g_return_if_fail(GTK_IS_REVEALER(revealer)&>K_IS_EXPANDER(target)); g_signal_connect(G_OBJECT(target),"activate",G_CALLBACK(_yon_on_gtk_revealer_set_from_expander),revealer); } struct revealer_wrapper { GtkWidget *revealer; GtkWidget *window; int height; }; gboolean _yon_on_revealer_hidden(struct revealer_wrapper *wrapped){ int width; gtk_window_get_size(GTK_WINDOW(wrapped->window),&width,NULL); gtk_window_resize(GTK_WINDOW(wrapped->window),width,wrapped->height); } gboolean _yon_on_revealer_switched(struct revealer_wrapper *wrapped){ if (!gtk_revealer_get_child_revealed(GTK_REVEALER(wrapped->revealer))){ g_timeout_add(gtk_revealer_get_transition_duration(GTK_REVEALER(wrapped->revealer))+1,(GSourceFunc)_yon_on_revealer_hidden,wrapped); } } void yon_gtk_window_set_shrinking_from_revealer_resizing(GtkWindow *window, GtkRevealer *revealer){ int height=0; gtk_window_get_size(window, NULL, &height); struct revealer_wrapper *wrapped = malloc(sizeof(struct revealer_wrapper)); wrapped->revealer=GTK_WIDGET(revealer); wrapped->height=height; wrapped->window=gtk_widget_get_toplevel(GTK_WIDGET(revealer)); 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){ 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"); } } 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){ gchar *new_text = g_new(gchar, length + 1); memset(new_text,0,length+1); gint i, j = 0; for (i = 0; i < length; i++) { if (strchr(symbols,text[i])) { new_text[j] = text[i]; j++; } } if (j < length) { g_signal_handlers_block_by_func(editable, G_CALLBACK(yon_on_insert_restricted_check), NULL); gtk_editable_insert_text(editable, new_text, j, position); g_signal_handlers_unblock_by_func(editable, G_CALLBACK(yon_on_insert_restricted_check), NULL); g_signal_stop_emission_by_name(editable, "insert-text"); } g_free(new_text); } 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); } void yon_gtk_entry_allow_password_symbols(GtkEntry *target){ g_return_if_fail(GTK_IS_ENTRY(target)); g_signal_connect(G_OBJECT(target),"insert-text",G_CALLBACK(yon_on_insert_allowed_check),yon_char_new("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&\'()*+,-./;<=>?@[\\]^_`{|}~")); } 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