From d817004b1faeff8a494d5925a0f161d2f5036a84 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 22 Sep 2023 12:32:53 +0600 Subject: [PATCH] Added new entry and menu for LOCALE parameter --- gresource.xml | 1 + source/CMakeLists.txt | 1 + source/ubl-settings-system.c | 126 ++++++++++++++++++++++---- source/ubl-settings-system.h | 16 ++++ source/ubl-strings.h | 4 +- source/ubl-utils.c | 43 ++++++++- source/ubl-utils.h | 8 +- ubl-settings-system-layouts.glade | 141 +++++++++++++++++------------- ubl-settings-system.glade | 104 ++++++++++++++++++---- 9 files changed, 341 insertions(+), 103 deletions(-) diff --git a/gresource.xml b/gresource.xml index 02e88c1..a172326 100644 --- a/gresource.xml +++ b/gresource.xml @@ -2,6 +2,7 @@ ubl-settings-system.glade + ubl-settings-system-layouts.glade ubl-settings-system.css diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 865fcbb..f2d6ea4 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -36,6 +36,7 @@ add_custom_target(GLADE ubl-settings-system.glade) set(DEPENDFILES ../ubl-settings-system.glade + ../ubl-settings-system-layouts.glade ../gresource.xml ../ubl-settings-system-banner.png ../ubl-settings-system.css diff --git a/source/ubl-settings-system.c b/source/ubl-settings-system.c index c9a7813..924a147 100644 --- a/source/ubl-settings-system.c +++ b/source/ubl-settings-system.c @@ -103,7 +103,7 @@ void on_about(){ //functions void yon_load_proceed(YON_CONFIG_TYPE type){ - if (yon_config_load_register(type,"config",hostname_parameter,"config",id_parameter,"locale",console_font_parameter,"locale",language_parameter,NULL)){} + if (yon_config_load_register(type,"config",hostname_parameter,"config",id_parameter,"locale",console_font_parameter,"locale",locale_parameter,"locale",language_parameter,NULL)){} else yon_ubl_status_box_render(LOAD_FAILED_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); @@ -112,7 +112,9 @@ void yon_load_proceed(YON_CONFIG_TYPE type){ void yon_config_local_load(GtkWidget *self, main_window *widgets){ gtk_entry_set_text(GTK_ENTRY(widgets->HostnameEntry),""); gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),""); + gtk_entry_set_text(GTK_ENTRY(widgets->LocaleEntry),""); int size; + GtkTreeIter iter; config_str rtn = yon_config_load(get_id_command,&size); rtn[0]=yon_char_divide_search(rtn[0],"\n",-1); gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),*rtn); @@ -120,6 +122,9 @@ void yon_config_local_load(GtkWidget *self, main_window *widgets){ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->LanguageCombo),0); yon_load_proceed(YON_CONFIG_LOCAL); gtk_entry_set_text(GTK_ENTRY(widgets->HostnameEntry),yon_config_get_by_key(hostname_parameter)); + for_iter(GTK_TREE_MODEL(widgets->languagelist),&iter){ + gtk_list_store_set(widgets->languagelist,&iter,2,0,-1); + } char *id = yon_config_get_by_key(id_parameter); if (!strcmp(id,"Random")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->IDCombo),1); @@ -128,7 +133,6 @@ void yon_config_local_load(GtkWidget *self, main_window *widgets){ else gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),id); - GtkTreeIter iter; char *code; char *cons_font = yon_config_get_by_key(console_font_parameter); if (cons_font){ @@ -139,12 +143,26 @@ void yon_config_local_load(GtkWidget *self, main_window *widgets){ } } char *lang = yon_config_get_by_key(language_parameter); + char *avlocale = yon_config_get_by_key(locale_parameter); + int locsize; + if (avlocale); + config_str locale_parsed = yon_char_parse(avlocale,&locsize,","); + gboolean is_active; + char *locale_string=""; + char *loc_name; if (lang){ int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->languagelist),&iter); for(;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->languagelist),&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(widgets->languagelist),&iter,1,&code,-1); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->languagelist),&iter,0,&loc_name,1,&code,2,&is_active,-1); if (code&&!strcmp(code,lang)) gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->LanguageCombo),&iter); + if (avlocale) + for (int i=0;ilanguagelist,&iter,2,1,-1); + locale_string = yon_char_unite(strcmp(locale_string,"") ? yon_char_append(locale_string,"; ") : locale_string, loc_name,NULL); + } } + gtk_entry_set_text(GTK_ENTRY(widgets->LocaleEntry),locale_string); } yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } @@ -152,7 +170,9 @@ void yon_config_local_load(GtkWidget *self, main_window *widgets){ void yon_config_global_load(GtkWidget *self, main_window *widgets){ gtk_entry_set_text(GTK_ENTRY(widgets->HostnameEntry),""); gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),""); + gtk_entry_set_text(GTK_ENTRY(widgets->LocaleEntry),""); int size; + GtkTreeIter iter; config_str rtn = yon_config_load(get_id_command,&size); rtn[0]=yon_char_divide_search(rtn[0],"\n",-1); gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),*rtn); @@ -160,51 +180,120 @@ void yon_config_global_load(GtkWidget *self, main_window *widgets){ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->LanguageCombo),0); yon_load_proceed(YON_CONFIG_GLOBAL); gtk_entry_set_text(GTK_ENTRY(widgets->HostnameEntry),yon_config_get_by_key(hostname_parameter)); + for_iter(GTK_TREE_MODEL(widgets->languagelist),&iter){ + gtk_list_store_set(widgets->languagelist,&iter,2,0,-1); + } char *id = yon_config_get_by_key(id_parameter); if (!strcmp(id,"Random")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->IDCombo),1); else if (!strcmp(id,"hardware")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->IDCombo),2); - GtkTreeIter iter; + else + gtk_entry_set_text(GTK_ENTRY(widgets->IDEntry),id); + char *code; char *cons_font = yon_config_get_by_key(console_font_parameter); if (cons_font){ int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->fontlist),&iter); - for(;valid;gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->fontlist),&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(widgets->fontlist),&iter,1,&code,-1); - if (code&&!strcmp(code,cons_font)){ gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->ConsoleFontCombo),&iter); break; } - else { gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ConsoleFontCombo),0); } + for(;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->fontlist),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->fontlist),&iter,0,&code,-1); + if (code&&!strcmp(code,cons_font)) gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->ConsoleFontCombo),&iter); } } char *lang = yon_config_get_by_key(language_parameter); + char *avlocale = yon_config_get_by_key(locale_parameter); + int locsize; + if (avlocale); + config_str locale_parsed = yon_char_parse(avlocale,&locsize,","); + gboolean is_active; + char *locale_string=""; + char *loc_name; if (lang){ int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->languagelist),&iter); for(;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->languagelist),&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(widgets->languagelist),&iter,1,&code,-1); - if (!strcmp(code,lang)){ gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->LanguageCombo),&iter); break; } - else { gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->LanguageCombo),0); } + gtk_tree_model_get(GTK_TREE_MODEL(widgets->languagelist),&iter,0,&loc_name,1,&code,2,&is_active,-1); + if (code&&!strcmp(code,lang)) gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->LanguageCombo),&iter); + if (avlocale) + for (int i=0;ilanguagelist,&iter,2,1,-1); + locale_string = yon_char_unite(strcmp(locale_string,"") ? yon_char_append(locale_string,"; ") : locale_string, loc_name,NULL); + } } + gtk_entry_set_text(GTK_ENTRY(widgets->LocaleEntry),locale_string); } yon_ubl_status_box_render(GLOBAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } void yon_config_global_local_save(){ - yon_config_save_registered(NULL,""); + yon_config_save_registered(NULL); yon_ubl_status_box_render(yon_char_unite(GLOBAL_LOCAL_SAVE_SUCCESS_LABEL,"\n", SAVE_WARNING_LABEL,NULL),BACKGROUND_IMAGE_SUCCESS_TYPE); } void yon_config_local_save(){ - yon_config_save_registered("system","config"); + yon_config_save_registered("system"); yon_ubl_status_box_render(yon_char_unite(LOCAL_SAVE_SUCCESS_LABEL,"\n", SAVE_WARNING_LABEL,NULL),BACKGROUND_IMAGE_SUCCESS_TYPE); } void yon_config_global_save(){ - yon_config_save_registered("global",""); + yon_config_save_registered("global"); yon_ubl_status_box_render(yon_char_unite(GLOBAL_SAVE_SUCCESS_LABEL,"\n", SAVE_WARNING_LABEL,NULL),BACKGROUND_IMAGE_SUCCESS_TYPE); } +void on_locale_toggle(GtkCellRendererToggle *self,GtkTreePath* path,GtkTreeViewColumn* column,locals_window *window){ + GtkTreeIter iter; + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(window->MainTree)); + gtk_tree_model_get_iter(model,&iter,path); + gboolean is_active; + gtk_tree_model_get(model,&iter,2,&is_active,-1); + gtk_list_store_set(GTK_LIST_STORE(model),&iter,2,!is_active,-1); +} + +void on_locale_accept(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + locals_window *window = yon_dictionary_get_data(dict->first->next,locals_window*); + GtkTreeIter iter; + gboolean is_active; + char *final_string = ""; + char *final_ids = ""; + char *name, *id; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->languagelist),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->languagelist),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->languagelist),&iter,0,&name,1,&id,2,&is_active,-1); + if (is_active){ + final_string = yon_char_unite(strcmp(final_string,"") ? yon_char_append(final_string,"; ") : final_string,name,NULL); + final_ids = yon_char_unite(strcmp(final_ids,"") ? yon_char_append(final_ids,",") : final_ids,id,NULL); + } + } + gtk_entry_set_text(GTK_ENTRY(widgets->LocaleEntry),final_string); + if (yon_config_get_by_key("LOCALE")) yon_config_set("LOCALE",final_ids); + else yon_config_register("LOCALE","locale",final_ids); + on_close_subwindow(self); +} + +void on_locale_open(GtkWidget *self, main_window *widgets){ + locals_window *window = malloc(sizeof(locals_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_locales_path); + window->Window = yon_gtk_builder_get_widget(builder,"localesLayoutsWindow"); + window->MainTree = yon_gtk_builder_get_widget(builder,"localesTree"); + window->CloseButton = yon_gtk_builder_get_widget(builder,"localesCancelButton"); + window->AcceptButton = yon_gtk_builder_get_widget(builder,"localesAcceptButton"); + window->ToggleCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"toggleCell")); + gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree), GTK_TREE_MODEL(widgets->languagelist)); + + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + + g_signal_connect(G_OBJECT(window->CloseButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_locale_accept),dict); + g_signal_connect(G_OBJECT(window->MainTree),"row-activated",G_CALLBACK(on_locale_toggle),window); + gtk_dialog_run(GTK_DIALOG(window->Window)); + +} + void on_hostname_changed(GtkEntry *self, main_window *widgets){ char *text = (char*)gtk_entry_get_text(self); if (yon_config_get_by_key(hostname_parameter)){ @@ -349,6 +438,9 @@ main_window *setup_window(){ widgets->ConsoleFontCombo = yon_gtk_builder_get_widget(builder,"ConsoleFontCombo"); widgets->LanguageCombo = yon_gtk_builder_get_widget(builder,"LanguageCombo"); + widgets->LocaleButton = yon_gtk_builder_get_widget(builder,"getLocalesButton"); + widgets->LocaleEntry = yon_gtk_builder_get_widget(builder,"localeEntry"); + widgets->fontlist = GTK_LIST_STORE(gtk_builder_get_object(builder,"fontlist")); widgets->languagelist = GTK_LIST_STORE(gtk_builder_get_object(builder,"languagelist")); @@ -391,9 +483,11 @@ main_window *setup_window(){ g_signal_connect(G_OBJECT(widgets->IDCombo),"changed",G_CALLBACK(on_id_combo_toggled),widgets); g_signal_connect(G_OBJECT(widgets->IDEntry),"changed",G_CALLBACK(on_id_changed),widgets); g_signal_connect(G_OBJECT(widgets->IDCopyButton),"clicked",G_CALLBACK(on_id_copy),widgets); + g_signal_connect(G_OBJECT(widgets->LocaleButton),"clicked",G_CALLBACK(on_locale_open),widgets); g_signal_connect(G_OBJECT(widgets->ConsoleFontCombo),"changed",G_CALLBACK(on_console_font_changed),widgets); g_signal_connect(G_OBJECT(widgets->LanguageCombo),"changed",G_CALLBACK(on_language_changed),widgets); - + + main_config.localeslist = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN); int size; config_str locales = yon_config_load(get_locales_command,&size); GtkTreeIter iter; @@ -402,7 +496,7 @@ main_window *setup_window(){ locales[i]=yon_char_divide_search(locales[i],"\n",-1); config_str loc_parsed = yon_char_parse(locales[i],&locsize,";"); gtk_list_store_append(widgets->languagelist,&iter); - gtk_list_store_set(widgets->languagelist,&iter,0,_(loc_parsed[1]),1,loc_parsed[0],-1); + gtk_list_store_set(widgets->languagelist,&iter,0,_(loc_parsed[1]),1,loc_parsed[0],2,0,-1); } config_str fonts = yon_config_load(get_fonts_command,&size); for (int i=0;idata&&strcmp(yon_dictionary_get_data(dct,char*),"")!=0){ if (((yon_config_parameter*)dct)->flag1==1){ ((yon_config_parameter*)dct)->flag1=0; - if (sections_add&&yon_dictionary_get(§ions_add,((yon_config_parameter*)dct)->section)) sections_add->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_add,char*)," ",dct->key,"=",yon_dictionary_get_data(dct,char*),NULL); - else yon_dictionary_add_or_create_if_exists_with_data(sections_add,((yon_config_parameter*)dct)->section,yon_char_unite (ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " set ", ((yon_config_parameter*)dct)->section, " ",dct->key,"=",yon_dictionary_get_data(dct,char*),NULL)); + if (sections_add&&yon_dictionary_get(§ions_add,((yon_config_parameter*)dct)->section)) sections_add->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_add,char*)," ",dct->key,"=\"",yon_dictionary_get_data(dct,char*),"\"",NULL); + else yon_dictionary_add_or_create_if_exists_with_data(sections_add,((yon_config_parameter*)dct)->section,yon_char_unite (ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " set ", ((yon_config_parameter*)dct)->section," ", dct->key,"=\"",yon_dictionary_get_data(dct,char*),"\"",NULL)); } else if (((yon_config_parameter*)dct)->flag1==-1){ ((yon_config_parameter*)dct)->flag1=0; if (sections_remove&&yon_dictionary_get(§ions_remove,((yon_config_parameter*)dct)->section)) sections_remove->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_remove,char*)," ",dct->key,NULL); @@ -1740,6 +1750,31 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.deleted_parameters,param->parameter_name,param); } + int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type){ + GError *err=NULL; + switch (type){ + case YON_TYPE_BOOLEAN: + *((int*)return_value) = g_key_file_get_boolean(__yon_window_config_file,section,config_parameter,&err); + if (err) return 0; else return 1; + break; + case YON_TYPE_INT: + *((int*)return_value) = g_key_file_get_integer(__yon_window_config_file,section,config_parameter,&err); + if (err) return 0; else return 1; + break; + case YON_TYPE_STRING: + *((char**)return_value) = g_key_file_get_string(__yon_window_config_file,section,config_parameter,&err); + if (err) return 0; else return 1; + break; + case YON_TYPE_STRING_LIST: + gsize size=0; + *((char***)return_value) = g_key_file_get_string_list(__yon_window_config_file,section,config_parameter,&size,&err); + *((char***)return_value)=yon_remalloc(return_value,size+1); + *((char***)return_value)[size]=NULL; + if (err) return 0; else return 1; + break; + } + } + 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"); diff --git a/source/ubl-utils.h b/source/ubl-utils.h index ab19767..396ccd4 100644 --- a/source/ubl-utils.h +++ b/source/ubl-utils.h @@ -22,6 +22,7 @@ #define DesktopPath "/usr/share/applications/" #define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next) +#define for_iter(model,iter) for (int valid = gtk_tree_model_get_iter_first(model,iter);valid;valid=gtk_tree_model_iter_next(model,iter)) #define new(type) malloc(sizeof(type)) #define new_arr(type,size) malloc(sizeof(type)*size) @@ -171,6 +172,8 @@ void yon_apps_sort(apps *applist, int size); apps *yon_apps_get_by_name(apps *applist, char *name, int size); +config_str yon_file_open(char *file_path, int *size); + //config functions #define ubconfig_save_command "ubconfig" @@ -184,7 +187,7 @@ typedef enum { config_str yon_config_load(char *command, int *str_len); -int yon_config_save_registered(char *path, char *section); +int yon_config_save_registered(char *path); char *yon_config_get_parameter(config_str parameters, int size, char *param); @@ -226,6 +229,7 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end enum YON_TYPE{ YON_TYPE_STRING, + YON_TYPE_STRING_LIST, YON_TYPE_INT, YON_TYPE_BOOLEAN, YON_TYPE_OTHER @@ -262,6 +266,8 @@ void yon_window_config_add_custom_parameter(char *param_name, char *section, voi void yon_window_config_erase_custom_parameter(char *param_name, char *section); +int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type); + int yon_gtk_combo_box_fill(GtkWidget *combo, char **parameters,int size); int yon_gtk_combo_box_text_find(GtkWidget *combo_box, char *text_to_find); diff --git a/ubl-settings-system-layouts.glade b/ubl-settings-system-layouts.glade index 6853c3b..2dfb5fc 100644 --- a/ubl-settings-system-layouts.glade +++ b/ubl-settings-system-layouts.glade @@ -12,77 +12,27 @@ False emblem-ok-symbolic - - - - - - - + 450 550 False - False - 450 - dialog-question-symbolic - + dialog + - True False - 5 - 5 - 5 - 5 - 5 - 5 vertical - 10 - - - True - True - in - - - True - True - keyboardList - False - - - - - - column - - - - 0 - - - - - - - - - True - True - 0 - - - - - True + 2 + + False - 5 + end - - Ok + + Cancel True True True - image9 + image8 @@ -95,12 +45,12 @@ - - Cancel + + Accept True True True - image8 + image9 @@ -115,6 +65,70 @@ False + False + 0 + + + + + True + False + 2 + 2 + 2 + 2 + vertical + 10 + + + True + True + in + + + True + True + False + True + + + none + + + + + column + + + + 2 + + + + + + + column + + + + 0 + + + + + + + + + True + True + 0 + + + + + True True 1 @@ -125,6 +139,7 @@ True False + True True diff --git a/ubl-settings-system.glade b/ubl-settings-system.glade index 9b011b2..37b2560 100644 --- a/ubl-settings-system.glade +++ b/ubl-settings-system.glade @@ -211,6 +211,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False edit-copy-symbolic + + True + False + document-edit-symbolic + True False @@ -419,13 +424,9 @@ translated and supported by community. + + - - - Default - - - True @@ -866,14 +867,53 @@ translated and supported by community. True False + vertical 5 - + True False - Language: - True - 0 + 5 + + + True + False + Locale: + 0 + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + True + True + True + image2 + + + + False + True + 2 + + False @@ -882,20 +922,46 @@ translated and supported by community. - + True False - languagelist - 0 + 5 + + + True + False + Language: + True + 0 + + + False + True + 0 + + - - - 0 - + + True + False + languagelist + 0 + + + + 0 + + + + + True + True + 1 + - True + False True 1 @@ -1110,6 +1176,8 @@ translated and supported by community. + +