You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libublsettings-gtk3/source/libublsettings-gtk3-misc.c

542 lines
20 KiB

#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&&parameters){
for (int i=0;i<size;i++){
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo),parameters[i]);
}
return 1;
} else
return 0;
}
int yon_gtk_combo_box_text_find(GtkWidget *combo_box, char *text_to_find){
if (combo_box&&text_to_find){
int active=gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box));
char *str="-1";
for (int i=0;strcmp(str,"")!=0;i++){
gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box),i);
str=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo_box));
if (!str) return -1;
if (strstr(str,text_to_find)) return i;
}
} return -1;
}
gboolean _yon_gtk_column_minimal_fixed_size_set(GtkTreeViewColumn *column){
g_return_val_if_fail(GTK_IS_TREE_VIEW_COLUMN(column),0);
const gchar *title = gtk_tree_view_column_get_title(column);
GtkWidget *label = gtk_label_new(title);
int header_width = 0;
PangoLayout *layout = gtk_widget_create_pango_layout(label, title);
if (layout != NULL) {
pango_layout_get_pixel_size(layout, &header_width, NULL);
}
if (GTK_IS_WIDGET(label)) {
g_object_ref_sink(label);
}
gtk_tree_view_column_set_min_width(column, header_width+10);
g_object_unref(label);
return G_SOURCE_REMOVE;
}
void yon_gtk_tree_view_column_minimal_fixed_size_set(GtkTreeViewColumn *column){
_yon_gtk_column_minimal_fixed_size_set(column);
}
void _yon_gtk_tree_view_minimal_fixed_size_set_full(GtkTreeView *tree){
GList *list = gtk_tree_view_get_columns(tree);
for (int i=0;i<g_list_length(list);i++){
gdk_threads_add_idle((GSourceFunc)_yon_gtk_column_minimal_fixed_size_set,(GtkTreeViewColumn*)g_list_nth_data(list,i));
}
g_list_free(list);
}
void yon_gtk_tree_view_minimal_fixed_size_set_full(GtkTreeView *tree){
GThread *thread = g_thread_new("column",(GThreadFunc)_yon_gtk_tree_view_minimal_fixed_size_set_full,tree);
}
void yon_gtk_tree_view_set_(GtkTreeView *top,GtkTreeView *resizing, ...){
va_list arglist;
va_start(arglist,resizing);
int column=-2, connect_to=-2;
int top_columns=gtk_tree_view_get_n_columns(top);
int resizing_columns=gtk_tree_view_get_n_columns(resizing);
dictionary *dict=NULL;
while((column=va_arg(arglist,int))!=-1){
connect_to = va_arg(arglist,int);
if (top_columns>column&&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)&&GTK_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)&&GTK_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)&&GTK_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);
}
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;i<size;i++){
int bits = atoi(parsed[i]);
if (bits>255){
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<size;i++){
int pixmask = atoi(parsed[i]);
int k;
for (k=0;k<8;k++){
if (!(pixmask & (1<<k))){
bits--;
}
}
}
yon_char_parsed_free(parsed,size);
return bits;
}