#include "ubinstall-gtk.h" int yon_keyboard_save(main_window *widgets){ if (gtk_switch_get_active(GTK_SWITCH(widgets->KeyboardDefaultLayoutsSwitch))){ yon_config_remove_by_key(xkblayout_parameter); } else { GtkTreeIter iter; if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->LayoutsList),&iter)){ yon_ubl_status_box_spawn(GTK_CONTAINER(widgets->StatusBox),yon_char_get_localised_from_lib(EMPTY_IMPORTANT_LABEL),5,BACKGROUND_IMAGE_FAIL_TYPE); yon_ubl_status_highlight_incorrect(widgets->KeyboardLayoutTree); return 0; } } return 1; } void yon_keyboard_init(main_window *widgets){ g_signal_handlers_block_by_func(G_OBJECT(widgets->KeyboardModelCombo),G_CALLBACK(on_model_changed),widgets); g_signal_handlers_block_by_func(G_OBJECT(widgets->KeyboardLayoutChangingCombo),G_CALLBACK(on_options_save),widgets); g_signal_handlers_block_by_func(G_OBJECT(widgets->KeyboardNumLockCombo),G_CALLBACK(on_num_lock_changed),widgets); g_signal_handlers_block_by_func(G_OBJECT(widgets->KeyboardScrollLockSwitch),G_CALLBACK(on_scroll_lock_switch),widgets); g_signal_handlers_block_by_func(G_OBJECT(widgets->KeyboardComposeSwitch),G_CALLBACK(on_compose_switch),widgets); g_signal_handlers_block_by_func(G_OBJECT(widgets->KeyboardDefaultLayoutsSwitch),G_CALLBACK(on_layout_default_toggled),widgets); gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(widgets->KeyboardModelCombo)); int size; gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->KeyboardModelCombo),DEFAULT_LABEL); config_str models = yon_config_load(get_keyboard_models_command,&size); for (int i=0;iKeyboardModelCombo),parsed[0],_(parsed[1])); yon_char_parsed_free(parsed,parsed_size); } yon_char_parsed_free(models,size); // g_signal_handlers_block_by_func(G_OBJECT(widgets->TTYLayoutCombo),G_CALLBACK(on_tty_changed),widgets); gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardModelCombo),0); gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardNumLockCombo),0); { char *kbmodel = yon_config_get_by_key(xkbmodel_parameter); if (kbmodel) { gtk_combo_box_set_active_id(GTK_COMBO_BOX(widgets->KeyboardModelCombo),kbmodel); } } { gtk_list_store_clear(widgets->LayoutsList); char *layouts = config(xkblayout_parameter); int layouts_parsed_size; config_str layouts_parsed = yon_char_parse(layouts,&layouts_parsed_size,","); for(int i=0;iKeyboardDefaultLayoutsSwitch),1); } else { gtk_switch_set_active(GTK_SWITCH(widgets->KeyboardDefaultLayoutsSwitch),0); } if (yon_char_is_empty(layouts)){ char *element = yon_char_parsed_check_exist_begins_with(main_config.layouts_list,main_config.layouts_size,"us|"); if (element){ int parsed_size; config_str parsed = yon_char_parse(element,&parsed_size,"|"); GtkTreeIter iter; gtk_list_store_append(widgets->LayoutsList,&iter); gtk_list_store_set(widgets->LayoutsList,&iter,0,parsed[0],2,_(parsed[1]),-1); yon_char_parsed_free(parsed,parsed_size); } } } { gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(widgets->KeyboardLayoutChangingCombo)); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->KeyboardLayoutChangingCombo),DEFAULT_LABEL); int size; gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardLayoutChangingCombo),0); config_str options = yon_config_load(grp_options_command,&size); for (int i=0;iKeyboardLayoutChangingCombo),parsed[0],_(parsed[1])); yon_char_parsed_free(parsed,parsed_size); } yon_char_parsed_free(options,size); } { char *name = yon_config_get_by_key(num_lock_boot_parameter); if (name) { if (!strcmp(name,"yes")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardNumLockCombo),1); else if (!strcmp(name,"no")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardNumLockCombo),2); } } { char *options = config(xkboptions_parameter); if (!yon_char_is_empty(options)){ int size; config_str parsed = yon_char_parse(options,&size,","); if (!yon_char_is_empty(parsed[0])){ gtk_combo_box_set_active_id(GTK_COMBO_BOX(widgets->KeyboardLayoutChangingCombo),parsed[0]); } else { gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardLayoutChangingCombo),0); } if (yon_char_parsed_check_exist(parsed,size,"compose:rwin")>-1){ gtk_switch_set_active(GTK_SWITCH(widgets->KeyboardComposeSwitch),1); } else { gtk_switch_set_active(GTK_SWITCH(widgets->KeyboardComposeSwitch),0); } if (yon_char_parsed_check_exist(parsed,size,"grp_led:scroll")>-1){ gtk_switch_set_active(GTK_SWITCH(widgets->KeyboardScrollLockSwitch),1); } else { gtk_switch_set_active(GTK_SWITCH(widgets->KeyboardScrollLockSwitch),0); } } } g_signal_handlers_unblock_by_func(G_OBJECT(widgets->KeyboardModelCombo),G_CALLBACK(on_model_changed),widgets); g_signal_handlers_unblock_by_func(G_OBJECT(widgets->KeyboardNumLockCombo),G_CALLBACK(on_num_lock_changed),widgets); g_signal_handlers_unblock_by_func(G_OBJECT(widgets->KeyboardLayoutChangingCombo),G_CALLBACK(on_options_save),widgets); g_signal_handlers_unblock_by_func(G_OBJECT(widgets->KeyboardScrollLockSwitch),G_CALLBACK(on_scroll_lock_switch),widgets); g_signal_handlers_unblock_by_func(G_OBJECT(widgets->KeyboardComposeSwitch),G_CALLBACK(on_compose_switch),widgets); g_signal_handlers_unblock_by_func(G_OBJECT(widgets->KeyboardDefaultLayoutsSwitch),G_CALLBACK(on_layout_default_toggled),widgets); } void on_layouts_accept(GtkWidget *self, layouts_window *window){ main_window *widgets = g_object_get_data(G_OBJECT(window->Window),"widgets"); if (!yon_char_is_empty(window->parameters)){ yon_config_register(xkblayout_parameter,xkblayout_parameter_command,window->parameters); } else { yon_config_remove_by_key(xkblayout_parameter); } on_subwindow_close(self); yon_keyboard_init(widgets); } void on_layouts_chosen(GtkCellRenderer *, gchar *path, layouts_window *window){ GtkTreeIter iter; gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->list),&iter,path); int chosen; char *layout, *variant; gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&layout,1,&variant,3,&chosen,-1); gtk_tree_store_set(GTK_TREE_STORE(window->list),&iter,3,!chosen,-1); char *full_layout = NULL; if (!yon_char_is_empty(variant)){ full_layout = yon_char_unite(layout,"_",variant,NULL); } else { full_layout = layout; } if (!chosen){ char *temp = yon_char_append_element(window->parameters,full_layout,","); free(window->parameters); window->parameters = temp; } else { char *temp = yon_char_remove_element(window->parameters,full_layout,","); free(window->parameters); window->parameters = temp; } free(full_layout); } void on_system_layouts_add(GtkWidget *, main_window *widgets){ yon_layouts_add(GTK_TREE_VIEW(widgets->KeyboardLayoutTree),widgets->LayoutsList,widgets); } layouts_window *yon_layouts_window_new(){ GtkBuilder *builder = gtk_builder_new_from_resource(glade_layouts_path); layouts_window *window = malloc(sizeof(layouts_window)); memset(window,0,sizeof(layouts_window)); window->Window = yon_gtk_builder_get_widget(builder,"Window"); window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->ChosenCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ChosenCell")); window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree"); window->parameters = yon_char_new(config(xkblayout_parameter)); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->ChosenCell),"toggled",G_CALLBACK(on_layouts_chosen),window); return window; } void yon_layouts_add(GtkTreeView *, GtkListStore *, main_window *widgets){ layouts_window *window = yon_layouts_window_new(); yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->MainWindow),TITLE_LABEL,icon_path,"layout_window"); window->list = main_config.layouts_store; gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree), GTK_TREE_MODEL(main_config.layouts_store)); gtk_tree_view_column_clicked(GTK_TREE_VIEW_COLUMN(gtk_tree_view_get_column(GTK_TREE_VIEW(window->MainTree),0))); yon_layout_build(window); g_object_set_data(G_OBJECT(window->Window),"widgets",widgets); g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_layouts_accept),window); char *languages = config(xkblayout_parameter); int size; config_str parsed = yon_char_parse(languages,&size,","); GtkTreeIter iter,itar; for_iter(window->list,&iter){ int found = 0; char *id, *id_var; gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&id,-1); for (int i=0;ilist),&iter,3,1,-1); found=1; break; } } if (!found) { gtk_tree_store_set(GTK_TREE_STORE(window->list),&iter,3,0,-1); } if (gtk_tree_model_iter_children(GTK_TREE_MODEL(window->list),&itar,&iter)){ for (int valid2=1;valid2;valid2 = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&itar)){ gtk_tree_model_get(GTK_TREE_MODEL(window->list),&itar,0,&id,1,&id_var,-1); for (int i=0;ilist),&itar,3,1,-1); found=1; break; } } } } } } void yon_layouts_remove(GtkTreeView *tree, GtkListStore *cur_list, main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(cur_list); GtkTreeIter iter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(tree),&model,&iter)){ dialog_confirmation_data *data = yon_confirmation_dialog_data_new(); data->action_text = LAYOUT_REMOVE_LABEL; data->title = LAYOUT_REMOVE_TITLE_LABEL; if (yon_confirmation_dialog_call(widgets->MainWindow,data)!=GTK_RESPONSE_ACCEPT) return; gtk_list_store_remove(widgets->LayoutsList,&iter); } yon_keyboard_init(widgets); } void on_system_layouts_remove(GtkWidget *, main_window *widgets){ yon_layouts_remove(GTK_TREE_VIEW(widgets->KeyboardLayoutTree),widgets->LayoutsList,widgets); } // standard functions config_str yon_layout_get_children(char *layout_id, int *size){ (*size)=0; config_str final = NULL; for (int i=0;iLayoutsList,&iter); gtk_list_store_set(widgets->LayoutsList,&iter,0,parsed[0],1,parsed[1],2,_(parsed[2]),-1); } } } else { for (int i=0;iLayoutsList,&iter); gtk_list_store_set(widgets->LayoutsList,&iter,0,parsed[0],2,_(parsed[1]),-1); } } } } void yon_layout_build(layouts_window *window){ gtk_tree_store_clear(window->list); GtkTreeIter parent; GtkTreeIter iter; int size; config_str layouts = yon_config_load(layouts_command,&size); for (int i=0;ilist,&parent,NULL); gtk_tree_store_set(window->list,&parent,0,parsed[0],2,_(parsed[1]),-1); int variants_size; config_str variants = yon_layout_get_children(parsed[0],&variants_size); yon_char_parsed_free(parsed,parsed_size); for (int k=0;klist,&iter,&parent); gtk_tree_store_set(window->list,&iter,0,parsed[0],1,parsed[1],2,_(parsed[2]),-1); yon_char_parsed_free(parsed,parsed_size); } yon_char_parsed_free(variants,variants_size); } yon_char_parsed_free(layouts,size); } void on_layout_move_up(GtkWidget *, main_window *widgets){ GtkTreeModel *model; GtkTreeIter iter,*previter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->KeyboardLayoutTree)),&model,&iter)){ previter = gtk_tree_iter_copy(&iter); if (!gtk_tree_model_iter_previous(model,previter)) return; char *a, *b; gtk_tree_model_get(model,&iter,0,&a,-1); gtk_tree_model_get(model,previter,0,&b,-1); char *layouts = config(xkblayout_parameter); char *temp = yon_char_swap_element(layouts,a,b,","); yon_config_register(xkblayout_parameter,xkblayout_parameter_command,temp); free(temp); gtk_list_store_swap(widgets->LayoutsList,&iter,previter); gtk_tree_iter_free(previter); } } void on_layout_move_down(GtkWidget *, main_window *widgets){ GtkTreeModel *model; GtkTreeIter iter,*nextiter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->KeyboardLayoutTree)),&model,&iter)){ nextiter = gtk_tree_iter_copy(&iter); if (!gtk_tree_model_iter_next(model,nextiter)) return; char *a, *b; gtk_tree_model_get(model,&iter,0,&a,-1); gtk_tree_model_get(model,nextiter,0,&b,-1); char *layouts = config(xkblayout_parameter); char *temp = yon_char_swap_element(layouts,a,b,","); yon_config_register(xkblayout_parameter,xkblayout_parameter_command,temp); free(temp); gtk_list_store_swap(widgets->LayoutsList,&iter,nextiter); gtk_tree_iter_free(nextiter); } } void on_compose_switch(GtkWidget *,int status,main_window *widgets){ switch(status){ case 0:{ yon_config_remove_element(xkboptions_parameter,"compose:rwin",","); } break; case 1:{ yon_config_append_element(xkboptions_parameter,"compose:rwin",","); } break; } yon_keyboard_init(widgets); } void on_scroll_lock_switch(GtkWidget *,int status,main_window *widgets){ switch(status){ case 0:{ yon_config_remove_element(xkboptions_parameter,"grp_led:scroll",","); } break; case 1:{ yon_config_append_element(xkboptions_parameter,"grp_led:scroll",","); } break; } yon_keyboard_init(widgets); } void on_layout_default_sensitive_toggled(GtkWidget *, int status, main_window *widgets){ gtk_widget_set_sensitive(widgets->KeyboardLayoutTree,!status); gtk_widget_set_sensitive(widgets->KeyboardLayoutAddButton,!status); if (status){ gtk_widget_set_sensitive(widgets->KeyboardLayoutRemoveButton,!status); gtk_widget_set_sensitive(widgets->KeyboardLayoutMoveUpButton,!status); gtk_widget_set_sensitive(widgets->KeyboardLayoutMoveDownButton,!status); }else { on_layout_selection_changed(GTK_TREE_VIEW(widgets->KeyboardLayoutTree),widgets); } } void on_layout_default_toggled(GtkWidget *, int status, main_window *widgets){ if (!status){ GtkTreeModel *model = GTK_TREE_MODEL(widgets->LayoutsList); GtkTreeIter iter; char *locales = NULL; for_iter(model,&iter){ char *target, *variant; gtk_tree_model_get(model,&iter,0,&target,1,&variant,-1); char *key = NULL; if (!yon_char_is_empty(variant)){ key = yon_char_unite(target,"_",variant,NULL); } else { key = yon_char_new(target); } char *temp = yon_char_append_element(locales?locales:"",key,","); if (!yon_char_is_empty(locales)) free(locales); locales = temp; } if (!yon_char_is_empty(locales)){ yon_config_register(xkblayout_parameter,xkblayout_parameter_command,locales); } } } void on_layout_selection_changed(GtkTreeView *self,main_window *widgets){ int status = gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(self)),NULL,NULL); gtk_widget_set_sensitive(widgets->KeyboardLayoutMoveDownButton,status); gtk_widget_set_sensitive(widgets->KeyboardLayoutMoveUpButton,status); gtk_widget_set_sensitive(widgets->KeyboardLayoutRemoveButton,status); } void on_num_lock_changed(GtkComboBox *self, main_window *){ switch (gtk_combo_box_get_active(self)){ case 0: yon_config_remove_by_key(num_lock_boot_parameter); break; case 1: yon_config_register(num_lock_boot_parameter,num_lock_boot_parameter_command,"yes"); break; case 2:yon_config_register(num_lock_boot_parameter,num_lock_boot_parameter_command,"no"); break; } } void on_model_changed(GtkComboBoxText *self, main_window *widgets){ switch (gtk_combo_box_get_active(GTK_COMBO_BOX(self))){ case 0: yon_config_remove_by_key(xkbmodel_parameter); break; default: char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(widgets->KeyboardModelCombo)); yon_config_register(xkbmodel_parameter,xkbmodel_parameter_command,id); break; } } void on_options_save(GtkWidget *,main_window *widgets){ char *main_id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(widgets->KeyboardLayoutChangingCombo)); int parameter_parsed_size; config_str parameter_parsed = NULL; yon_char_parsed_add_or_create_if_exists(parameter_parsed,¶meter_parsed_size,!yon_char_is_empty(main_id)?main_id:""); char *final_parameter = yon_char_parsed_to_string_full(parameter_parsed,parameter_parsed_size,","); yon_char_parsed_free(parameter_parsed,parameter_parsed_size); if (!yon_char_is_empty(final_parameter)){ yon_config_register(xkboptions_parameter,xkboptions_parameter_command,final_parameter); free(final_parameter); } else { yon_config_remove_by_key(xkboptions_parameter); } }