diff --git a/source/ubl-settings-keyboard.c b/source/ubl-settings-keyboard.c index f71ba59..6f28c63 100644 --- a/source/ubl-settings-keyboard.c +++ b/source/ubl-settings-keyboard.c @@ -102,11 +102,103 @@ void on_about(){ //functions -void yon_load_proceed(YON_CONFIG_TYPE type){ - if (yon_config_load_register(type,"keyboard","XkbModel","keyboard","XkbLayout","keyboard","KEYBOARD","keyboard","KEYTABLE","keyboard","GRP_TOGGLE","keyboard","XkbOptions",NULL)) - yon_ubl_status_box_render(LOCAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - else - yon_ubl_status_box_render(LOAD_FAILED_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); +void yon_load_proceed(YON_CONFIG_TYPE type, main_window *widgets){ + if (yon_config_load_register(type,"keyboard","XkbModel","keyboard","XkbLayout","keyboard","KEYBOARD","keyboard","XkbOptions","config","NUMLOCK",NULL)){ + GtkTreeIter iter; + char *name = yon_config_get_by_key("XkbModel"); + char *id; + if (name) { + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->modelsList),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->modelsList),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->modelsList),&iter,0,&id,-1); + if (!strcmp(name,id)){ + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->ModelCombo),&iter); + break; + } + } + } else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ModelCombo),0); + free(name); + name = yon_config_get_by_key("XkbOptions"); + if (name) { + char *id, *rname; + gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name); + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.options_list),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.options_list),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(main_config.options_list),&iter,0,&id,1,&rname,-1); + if (!strcmp(id,name)) gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),rname); + } + } + free(name); + name = yon_config_get_by_key("NUMLOCK"); + if (name) { + if (!strcmp(name,"yes")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),1); + else if (!strcmp(name,"no")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),2); + } + else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0); + free(name); + if (main_config.layouts_list){ + int size=0; + name = yon_config_get_by_key("XkbLayout"); + config_str layouts = yon_char_parse(name,&size,","); + GtkTreeIter iter; + char *rid,*rname; + gtk_list_store_clear(widgets->layoutsList); + for (int i=0;ilayoutsList,&iter); + gtk_list_store_set(widgets->layoutsList,&iter,0,rname,1,rid,2,0,-1); + } + } + } + } + } + yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + +} + +void on_config_global_load(GtkWidget *self, main_window *widgets){ + yon_load_proceed(YON_CONFIG_GLOBAL,widgets); +} + +void on_config_local_load(GtkWidget *self, main_window *widgets){ + yon_load_proceed(YON_CONFIG_LOCAL,widgets); +} + +void yon_save_proceed(char *path,main_window *widgets) { + GtkTreeIter iter; + char *final_string=""; + char *id,*name; + gboolean is_edited; + gboolean generic; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->layoutsList),&iter); + if (!valid) yon_config_remove_by_key(keyboard_layout_parameter); + else { + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->layoutsList),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->layoutsList),&iter,0,&name,1,&id,2,!is_edited ? &is_edited : &generic ,-1); + final_string = yon_char_unite(strcmp(final_string,"") ? yon_char_append(final_string,",") : "" ,id,NULL); + } + if (is_edited) + if (yon_config_get_by_key(keyboard_layout_parameter)) + yon_config_set(keyboard_layout_parameter,final_string); + else yon_config_register(keyboard_layout_parameter,"keyboard",final_string); + } + yon_config_save_registered(path); +} + +void on_config_global_local_save(GtkWidget *self,main_window *widgets){ + yon_save_proceed(NULL,widgets); +} + +void on_config_global_save(GtkWidget *self,main_window *widgets){ + yon_save_proceed("global",widgets); + +} + +void on_config_local_save(GtkWidget *self,main_window *widgets){ + yon_save_proceed("system",widgets); } @@ -151,10 +243,14 @@ void on_options_accept(GtkWidget *self, dictionary *dict){ layouts_window *window = yon_dictionary_get_data(dict->first->next,layouts_window*); GtkTreeModel *model = GTK_TREE_MODEL(window->list); GtkTreeIter iter; - char *name; + char *name, *id; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),&model,&iter)){ - gtk_tree_model_get(model,&iter,0,&name,-1); + gtk_tree_model_get(model,&iter,0,&id,1,&name,-1); gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name); + if (yon_config_get_by_key(options_parameter)) + yon_config_set(options_parameter,id); + else yon_config_register(options_parameter,"keyboard",id); + } on_close_subwindow(self); } @@ -177,7 +273,6 @@ void on_options_open(GtkWidget *self, main_window *widgets){ config_str option = yon_char_parse(rtn[i],&option_size,";"); gtk_list_store_append(window->list,&iter); gtk_list_store_set(window->list,&iter,0,option[0],1,option[1],-1); - } dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); @@ -200,7 +295,7 @@ void on_layouts_accept(GtkWidget *self, dictionary *dict){ gtk_tree_model_get_iter(model,&lwiter,pth); gtk_list_store_append(widgets->layoutsList,&iter); gtk_tree_model_get(model,&lwiter,0,&name,1,&id,-1); - gtk_list_store_set(widgets->layoutsList,&iter,1,name,0,id,-1); + gtk_list_store_set(widgets->layoutsList,&iter,1,name,0,id,2,1,-1); } on_close_subwindow(self); } @@ -212,7 +307,8 @@ void on_layouts_add(GtkWidget *self, main_window *widgets){ window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree"); - window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + window->list = main_config.layouts_list; + gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree), GTK_TREE_MODEL(window->list)); int size,laysize; GtkTreeIter iter; config_str rtn = yon_config_load(get_layouts_command,&size); @@ -353,7 +449,25 @@ main_window *setup_window(){ models[i] = yon_char_divide_search(models[i],"\n",-1); models[i+1] = yon_char_divide_search(models[i+1],"\n",-1); gtk_list_store_append(widgets->modelsList,&iter); - gtk_list_store_set(widgets->modelsList,&iter,0,models[i],1,models[i+1],-1); + gtk_list_store_set(widgets->modelsList,&iter,1,models[i],0,models[i+1],-1); + } + main_config.layouts_list = gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_STRING); + int laysize; + config_str rtn = yon_config_load(get_layouts_command,&size); + for (int i=0; iMoveDownButton),"clicked",G_CALLBACK(on_move_down),widgets); g_signal_connect(G_OBJECT(widgets->MoveUpButton),"clicked",G_CALLBACK(on_move_up),widgets); g_signal_connect(G_OBJECT(widgets->OptionsButton),"clicked",G_CALLBACK(on_options_open),widgets); - g_signal_connect(G_OBJECT(widgets->NumLockCombo),"changed",G_CALLBACK(on_num_lock_changed),NULL); + g_signal_connect(G_OBJECT(widgets->NumLockCombo),"changed",G_CALLBACK(on_num_lock_changed),widgets); + + g_signal_connect(G_OBJECT(widgets->SaveMenuItem),"activate",G_CALLBACK(on_config_global_local_save),widgets); + g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(on_config_global_save),widgets); + g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(on_config_local_save),widgets); + + g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_config_global_load),widgets); + g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(on_config_local_load),widgets); gtk_widget_show(widgets->Window); @@ -464,6 +585,7 @@ int main(int argc, char *argv[]){ yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id); yon_window_config_setup(GTK_WINDOW(widgets->Window)); yon_window_config_load(config_path); + on_config_local_load(NULL,widgets); GtkCssProvider *css=gtk_css_provider_new(); gtk_css_provider_load_from_resource(css,CssPath); gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), diff --git a/source/ubl-settings-keyboard.h b/source/ubl-settings-keyboard.h index 29c2975..b7e8b63 100644 --- a/source/ubl-settings-keyboard.h +++ b/source/ubl-settings-keyboard.h @@ -25,12 +25,10 @@ #define CssPath "/com/ublinux/css/ubl-settings-keyboard.css" #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) -#define hostname_parameter "HOSTNAME" #define model_parameter "XkbModel" #define keyboard_layout_parameter "XkbLayout" -#define console_font_parameter "CONSOLE_FONT" +#define options_parameter "XkbOptions" #define num_lock_boot_parameter "NUMLOCK" -#define language_parameter "LANG" #define get_options_command "grep \"grp:.*toggle\" /usr/share/X11/xkb/rules/base.lst|sed -e 's/^ *//g' -e 's/\t//g' -e 's/toggle */toggle;/g'" #define get_models_command "sed '/<\\/modelList>/q' /usr/share/X11/xkb/rules/base.xml | grep -E '^ {8,8}|^ {8,8}'|sed -e 's/ *//g' -e 's,,,g' -e 's/ *//g' -e 's,,,g'" @@ -58,6 +56,9 @@ typedef struct { int lock_save_local; int lock_save_global; int lock_load_global; + char *options; + GtkListStore *layouts_list; + GtkListStore *options_list; } config; typedef struct { diff --git a/source/ubl-utils.c b/source/ubl-utils.c index c5a6551..188d5fa 100644 --- a/source/ubl-utils.c +++ b/source/ubl-utils.c @@ -646,10 +646,10 @@ char **yon_char_parse(char *parameters, int *size, char *divider){ char *paramline=yon_char_new(parameters); char *param; while ((param=yon_char_divide_search(paramline,divider,1))){ + if (strcmp(param,paramline)==0) break; string=realloc(string,sizeof(char*)*i); string[i-1]=yon_char_new(param); i++; - if (strcmp(param,paramline)==0) break; } string=realloc(string,sizeof(char*)*i); string[i-1]=yon_char_new(paramline); @@ -1243,7 +1243,7 @@ config_str yon_config_load(char *command, int *str_len){ * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" */ -int yon_config_save_registered(char *path, char *section){ +int yon_config_save_registered(char *path){ check_config{ dictionary *dct; dictionary *sections_add=NULL; @@ -1252,8 +1252,8 @@ int yon_config_save_registered(char *path, char *section){ if (dct->data&&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); diff --git a/source/ubl-utils.h b/source/ubl-utils.h index fba6c98..928aea9 100644 --- a/source/ubl-utils.h +++ b/source/ubl-utils.h @@ -186,7 +186,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); diff --git a/ubl-settings-keyboard b/ubl-settings-keyboard index 84e08ff..a709c5c 100755 Binary files a/ubl-settings-keyboard and b/ubl-settings-keyboard differ diff --git a/ubl-settings-keyboard.glade b/ubl-settings-keyboard.glade index ca3c67e..90685ea 100644 --- a/ubl-settings-keyboard.glade +++ b/ubl-settings-keyboard.glade @@ -415,6 +415,8 @@ translated and supported by community. + + @@ -730,6 +732,7 @@ translated and supported by community. False liststore2 0 + 1