From 4b18a3ef3be6a8e76f4334bd52326ef812e5b3e0 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Nov 2025 17:30:15 +0600 Subject: [PATCH] WIP Keyboard remake --- source/ubl-settings-keyboard-layouts.c | 15 ++- source/ubl-settings-keyboard-options.c | 166 ++++++++++++++++++++--- source/ubl-settings-keyboard.c | 138 +++++++++++++++---- source/ubl-settings-keyboard.h | 79 ++++++++++- ubl-settings-keyboard-options.glade | 179 ++++++++++++++++--------- ubl-settings-keyboard.glade | 35 ++--- 6 files changed, 477 insertions(+), 135 deletions(-) diff --git a/source/ubl-settings-keyboard-layouts.c b/source/ubl-settings-keyboard-layouts.c index 335824f..e165df1 100644 --- a/source/ubl-settings-keyboard-layouts.c +++ b/source/ubl-settings-keyboard-layouts.c @@ -102,13 +102,16 @@ void yon_layouts_remove(GtkTreeView *tree, GtkListStore *cur_list, main_window * GtkTreeModel *model = GTK_TREE_MODEL(cur_list); GtkTreeIter iter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(tree),&model,&iter)){ - GtkTreeIter iter_converted; - char *target; - gtk_tree_model_get(model,&iter,1,&target,-1); - gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&iter_converted,&iter); - gtk_list_store_remove(cur_list,&iter_converted); - yon_config_remove_element(keyboard_layout_parameter,target,","); + char *layout, *variant; + gtk_tree_model_get(model,&iter,0,&layout,1,&variant,-1); + if (!yon_char_is_empty(variant)){ + char *temp = yon_char_unite(layout,"_",variant,NULL); + free(layout); + layout = temp; + } + yon_config_remove_element(keyboard_layout_parameter,layout,","); } + yon_interface_update(widgets); } void on_system_layouts_remove(GtkWidget *, main_window *widgets){ diff --git a/source/ubl-settings-keyboard-options.c b/source/ubl-settings-keyboard-options.c index 0e19242..d436677 100644 --- a/source/ubl-settings-keyboard-options.c +++ b/source/ubl-settings-keyboard-options.c @@ -50,35 +50,165 @@ // } +void on_option_chosen(GtkCellRenderer *, gchar *path, layouts_window *window){ + GtkTreeIter iter; + GtkTreeIter itar; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->OptionsFilter),&iter,path); + gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(window->OptionsFilter),&itar,&iter); + int chosen; + gtk_tree_model_get(GTK_TREE_MODEL(window->OptionsList),&itar,2,&chosen,-1); + gtk_list_store_set(GTK_LIST_STORE(window->OptionsList),&itar,2,!chosen,-1); +} + +gboolean yon_filter_refilter(GtkTreeModel *model, GtkTreeIter *iter, layouts_window *window){ + char *target_id; + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->OptionsFilterCombo)); + if (yon_char_is_empty(id)) return 0; + gtk_tree_model_get(model,iter,0,&target_id,-1); + char *filter_section = yon_char_divide_search(target_id,":",-1); + int result = !strcmp(filter_section,id); + if (target_id) + free(target_id); + if (filter_section) + free(filter_section); + return result; +} -void on_options_accept(GtkWidget *self, dictionary *dict){ - main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); - layouts_window *window = yon_dictionary_get_data(dict->first->next,layouts_window*); - GtkTreeModel *model = GTK_TREE_MODEL(window->list); +void yon_options_setup(layouts_window *window){ + int size; + config_str option_commands = yon_char_parsed_new(&size, + lv2_options_command, + lv3_options_command, + ctrl_options_command, + grp_led_options_command, + mod_led_options_command, + keypad_options_command, + kpdl_options_command, + caps_options_command, + altwin_options_command, + Compose_options_command, + compat_options_command, + currencysign_options_command, + lv5_options_command, + nbsp_options_command, + japan_options_command, + korean_options_command, + esperanto_options_command, + solaris_options_command, + terminate_options_command, + NULL); + + char *command_full = yon_char_parsed_to_string(option_commands,size,"; "); + + int options_size; + config_str options = yon_config_load(command_full,&options_size); GtkTreeIter iter; + + int filter_size; + config_str filter = NULL; + + for (int i=0;iOptionsList,&iter); + gtk_list_store_set(window->OptionsList,&iter,0,parsed[0],1,parsed[1],-1); + char *str = yon_char_new(parsed[0]); + char *type = yon_char_divide_search(str,":",-1); + if (yon_char_parsed_check_exist(filter,filter_size,type)==-1){ + yon_char_parsed_add_or_create_if_exists(filter,&filter_size,type); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->OptionsFilterCombo),type,type); + } + if (!yon_char_is_empty(str))free(str); + if (!yon_char_is_empty(type))free(type); + yon_char_parsed_free(parsed,parsed_size); + } + gtk_combo_box_set_active(GTK_COMBO_BOX(window->OptionsFilterCombo),0); + yon_char_parsed_free(filter,filter_size); + yon_char_parsed_free(option_commands,size); +} + +void on_options_filter_changed(GtkWidget *, layouts_window *window){ + gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(window->OptionsFilter)); +} + +void on_options_accept(GtkWidget *self, layouts_window *window){ + main_window *widgets = g_object_get_data(G_OBJECT(window->Window),"widgets"); + GtkTreeModel *model = GTK_TREE_MODEL(window->OptionsList); + GtkTreeIter iter, itar; 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,&id,1,&name,-1); - gtk_entry_set_text(GTK_ENTRY(widgets->OptionsTree),name); - yon_config_register(options_parameter,options_parameter_command,id); - + int status; + for_iter(model,&iter){ + gtk_tree_model_get(model,&iter,0,&id,1,&name,2,&status,-1); + if (status){ + gtk_list_store_append(widgets->OptionsList,&itar); + gtk_list_store_set(widgets->OptionsList,&itar,0,id,1,_(name),-1); + } } on_subwindow_close(self); + on_options_save(NULL, widgets); } -void on_options_open(GtkWidget *, main_window *widgets){ +void on_options_save(GtkWidget *,main_window *widgets){ + char *main_id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(widgets->LayoutChangingCombo)); + 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:""); + GtkTreeIter iter; + for_iter(GTK_TREE_MODEL(widgets->OptionsList),&iter){ + char *cur_id; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->OptionsList),&iter,0,&cur_id,-1); + yon_char_parsed_add_or_create_if_exists(parameter_parsed,¶meter_parsed_size,cur_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(options_parameter,options_parameter_command,final_parameter); + gtk_entry_set_text(GTK_ENTRY(widgets->ManualEntry),final_parameter); + free(final_parameter); + } else { + yon_config_remove_by_key(options_parameter); + gtk_entry_set_text(GTK_ENTRY(widgets->ManualEntry),""); + } +} + +layouts_window *yon_options_window_new(){ + GtkBuilder *builder = gtk_builder_new_from_resource(glade_options_path); layouts_window *window = malloc(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->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree"); - // window->list = main_config.options_list; - gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree),GTK_TREE_MODEL(window->list)); - dictionary *dict = NULL; - gtk_tree_view_remove_column(GTK_TREE_VIEW(window->MainTree),gtk_tree_view_get_column(GTK_TREE_VIEW(window->MainTree),0)); - yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); - yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + window->MainTree = yon_gtk_builder_get_widget(builder,"OptionsTree"); + window->OptionsFilterCombo = yon_gtk_builder_get_widget(builder,"OptionsFilterCombo"); + window->OptionsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"OptionsList")); + window->OptionsFilter = GTK_TREE_MODEL(gtk_builder_get_object(builder,"OptionsFilter")); + window->ChosenCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ChosenCell")); + + g_signal_connect(G_OBJECT(window->OptionsFilterCombo),"changed",G_CALLBACK(on_options_filter_changed),window); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_options_accept),dict); + g_signal_connect(G_OBJECT(window->ChosenCell),"toggled",G_CALLBACK(on_option_chosen),window); + gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree),GTK_TREE_MODEL(window->OptionsFilter)); + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(window->OptionsFilter),(GtkTreeModelFilterVisibleFunc)yon_filter_refilter,window,NULL); + yon_options_setup(window); + return window; } + +void on_options_open(GtkWidget *, main_window *widgets){ + layouts_window *window = yon_options_window_new(); + // window->list = main_config.options_list; + g_object_set_data(G_OBJECT(window->Window),"widgets",widgets); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_options_accept),window); +} + + +void on_option_remove(GtkWidget*, main_window *widgets){ + GtkTreeIter iter; + GtkTreeModel *model; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->OptionsTree)),&model, &iter)){ + char *target; + gtk_tree_model_get(model,&iter,0,&target,-1); + yon_config_remove_element(options_parameter,target,","); + } + yon_interface_update(widgets); +} \ No newline at end of file diff --git a/source/ubl-settings-keyboard.c b/source/ubl-settings-keyboard.c index 081cd69..78382b5 100644 --- a/source/ubl-settings-keyboard.c +++ b/source/ubl-settings-keyboard.c @@ -7,6 +7,7 @@ gboolean yon_interface_update(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->OptionsEditButton),G_CALLBACK(on_options_open),widgets); g_signal_handlers_block_by_func(G_OBJECT(widgets->NumLockCombo),G_CALLBACK(on_num_lock_changed),widgets); + g_signal_handlers_block_by_func(G_OBJECT(widgets->LayoutChangingCombo),G_CALLBACK(on_options_save),widgets); gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardModelCombo),0); gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0); @@ -27,35 +28,42 @@ gboolean yon_interface_update(main_window *widgets){ yon_layout_load(layouts_parsed[i],widgets); } } + { + gtk_list_store_clear(widgets->OptionsList); + char *options = config(options_parameter); + if (!yon_char_is_empty(options)){ + gtk_entry_set_text(GTK_ENTRY(widgets->ManualEntry),options); + GtkTreeIter iter; + int size; + config_str parsed = yon_char_parse(options,&size,","); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(widgets->LayoutChangingCombo),parsed[0]); + for (int i=1;iOptionsList,&iter); + gtk_list_store_set(widgets->OptionsList,&iter,0,option_parsed[0],1,_(option_parsed[1]),-1); + yon_char_parsed_free(option_parsed,option_parsed_size); + } + yon_char_parsed_free(parsed,size); + } else { + gtk_entry_set_text(GTK_ENTRY(widgets->ManualEntry),""); + } + } { 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->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); - if (main_config.layouts_list){ - int size=0; - name = yon_config_get_by_key(keyboard_layout_parameter); - config_str layouts = yon_char_parse(name,&size,","); - GtkTreeIter iter, itar; - char *rid,*rname; - gtk_list_store_clear(widgets->LayoutsList); - for (int i=0;iLayoutsList,&itar); - gtk_list_store_set(widgets->LayoutsList,&itar,0,rname,1,rid,2,1,-1); - } - } - } - } } 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->OptionsEditButton),G_CALLBACK(on_options_open),widgets); g_signal_handlers_unblock_by_func(G_OBJECT(widgets->NumLockCombo),G_CALLBACK(on_num_lock_changed),widgets); + g_signal_handlers_unblock_by_func(G_OBJECT(widgets->LayoutChangingCombo),G_CALLBACK(on_options_save),widgets); return G_SOURCE_REMOVE; } @@ -77,18 +85,18 @@ void on_model_changed(GtkComboBoxText *self, main_window *widgets){ yon_config_remove_by_key(model_parameter); break; default: - char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(widgets->KeyboardModelCombo)); - yon_config_register(model_parameter,model_parameter_command,id); + char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(widgets->KeyboardModelCombo)); + yon_config_register(model_parameter,model_parameter_command,id); break; } } void yon_config_init(){ int size; - main_config.layouts_store = gtk_tree_store_new(4,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN); main_config.models_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN); GtkTreeIter iter; + main_config.layouts_store = gtk_tree_store_new(4,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN); main_config.variants_list = yon_config_load(layouts_variant_command,&main_config.variants_size); main_config.layouts_list = yon_config_load(layouts_command,&main_config.layouts_size); for (int i=0;iComposeSwitch = yon_gtk_builder_get_widget(builder,"ComposeSwitch"); widgets->ScrollLockSwitch = yon_gtk_builder_get_widget(builder,"ScrollLockSwitch"); widgets->ManualEntry = yon_gtk_builder_get_widget(builder,"ManualEntry"); - widgets->NumLockCombo = yon_gtk_builder_get_widget(builder,"NumlockCombo"); + widgets->NumLockCombo = yon_gtk_builder_get_widget(builder,"NumLockCombo"); widgets->TTYLayoutCombo = yon_gtk_builder_get_widget(builder,"TTYLayoutCombo"); widgets->LayoutsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"LayoutsList")); + widgets->OptionsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"OptionsList")); /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ // yon_window_config_add_custom_parameter(widgets->HeadInfoLabel,"head-text","label",YON_TYPE_STRING); @@ -142,8 +213,13 @@ void yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->LayoutAddButton),"clicked",G_CALLBACK(on_system_layouts_add),widgets); g_signal_connect(G_OBJECT(widgets->LayoutRemoveButton),"clicked",G_CALLBACK(on_system_layouts_remove),widgets); g_signal_connect(G_OBJECT(widgets->KeyboardModelCombo),"changed",G_CALLBACK(on_model_changed),widgets); - // g_signal_connect(G_OBJECT(widgets->SystemKeyboardOptionsCombo),"clicked",G_CALLBACK(on_options_open),widgets); + g_signal_connect(G_OBJECT(widgets->OptionsEditButton),"clicked",G_CALLBACK(on_options_open),widgets); + g_signal_connect(G_OBJECT(widgets->OptionsRemoveButton),"clicked",G_CALLBACK(on_option_remove),widgets); g_signal_connect(G_OBJECT(widgets->NumLockCombo),"changed",G_CALLBACK(on_num_lock_changed),widgets); + g_signal_connect(G_OBJECT(widgets->LayoutChangingCombo),"changed",G_CALLBACK(on_options_save),widgets); + g_signal_connect(G_OBJECT(widgets->ComposeSwitch),"state-set",G_CALLBACK(on_compose_switch),widgets); + g_signal_connect(G_OBJECT(widgets->ScrollLockSwitch),"state-set",G_CALLBACK(on_scroll_lock_switch),widgets); + g_signal_connect(G_OBJECT(widgets->DefaultLayoutsSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch_inversed),widgets->LayoutTree); g_signal_connect(G_OBJECT(widgets->DefaultLayoutsSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch_inversed),widgets->LayoutAddButton); g_signal_connect(G_OBJECT(widgets->DefaultLayoutsSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch_inversed),widgets->LayoutRemoveButton); @@ -167,6 +243,20 @@ void yon_main_window_complete(main_window *widgets){ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(widgets->KeyboardModelCombo),parsed[0],_(parsed[1])); yon_char_parsed_free(parsed,parsed_size); } + + { + int size; + config_str options = yon_config_load(grp_options_command,&size); + + for (int i=0;iLayoutChangingCombo),parsed[0],_(parsed[1])); + yon_char_parsed_free(parsed,parsed_size); + } + yon_char_parsed_free(options,size); + } yon_char_parsed_free(models,size); yon_root_button_setup((template_main_window*)widgets,main_config.launch_arguments,main_config.launch_size); @@ -179,7 +269,7 @@ void yon_main_window_complete(main_window *widgets){ int main(int argc, char *argv[]){ setlocale(LC_ALL, ""); textdomain (LocaleName); - + yon_config_init(); yon_ubl_connect_config((_template_config*)&main_config); yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK); config_str unfound = NULL; diff --git a/source/ubl-settings-keyboard.h b/source/ubl-settings-keyboard.h index 6cd46db..a4663e6 100644 --- a/source/ubl-settings-keyboard.h +++ b/source/ubl-settings-keyboard.h @@ -53,6 +53,66 @@ #define layouts_command "sed -En '/^! layout$/,/^ *$/!d;s/[[:blank:]]+([^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" #define layouts_variant_command "sed -En '/^! variant$/,/^ *$/!d;s/[[:blank:]]+([^ ]+)[[:blank:]]+([^ :]+):[[:blank:]]+(.*)/\\2|\\1|\\3/p' /usr/share/X11/xkb/rules/evdev.lst" +// grp : Switching to another layout +#define grp_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(grp:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// lv2 : Key to choose the 2nd level +#define lv2_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(lv2:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// lv3 : Key to choose the 3nd level +#define lv3_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(lv3:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// ctrl : Ctrl position +#define ctrl_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(ctrl:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// grp_led : Use keyboard LED to show alternative layout +#define grp_led_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(grp_led:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// mod_led : Use keyboard LED to indicate modifiers +#define mod_led_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(mod_led:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// keypad : Layout of numeric keypad +#define keypad_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(keypad:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// kpdl : Numeric keypad Delete behavior +#define kpdl_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(kpdl:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// caps : Caps Lock behavior +#define caps_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(caps:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// altwin : Alt and Win behavior +#define altwin_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(altwin:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// Compose key : Position of Compose key +#define Compose_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(compose:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// compat : Compatibility options +#define compat_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+((numpad|srvrkeys|apple|shift|misc|keypad|grab):[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// currencysign : Currency signs +#define currencysign_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+((eurosign|rupeesign):[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// lv5 : Key to choose the 5th level +#define lv5_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(lv5:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// nbsp : Non-breaking space input +#define nbsp_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(nbsp:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// japan : Japanese keyboard options +#define japan_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(japan:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// korean : Korean Hangul/Hanja keys +#define korean_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(korean:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// esperanto : Esperanto letters with superscripts +#define esperanto_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(esperanto:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// solaris : Old Solaris keycodes compatibility +#define solaris_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(solaris:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + +// terminate : Key sequence to kill the X server +#define terminate_options_command "sed -En '/^! option$/,/^ *$/!d;s/[[:blank:]]+(terminate:[^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst" + typedef char* string; __attribute__((unused)) static \ @@ -63,7 +123,7 @@ typedef struct { int save_config; config_str launch_arguments; int launch_size; - char *options; + GHashTable *options; GtkTreeStore *layouts_store; GtkListStore *options_list; GtkListStore *models_list; @@ -92,8 +152,8 @@ typedef struct { GtkWidget *ManualEntry; GtkWidget *NumLockCombo; GtkWidget *TTYLayoutCombo; - GtkTreeModelFilter *layoutsFilter; GtkListStore *LayoutsList; + GtkListStore *OptionsList; } main_window; @@ -114,8 +174,11 @@ typedef struct { GtkWidget *MainTree; GtkWidget *CancelButton; GtkWidget *AcceptButton; + GtkWidget *OptionsFilterCombo; GtkCellRenderer *ChosenCell; GtkTreeStore *list; + GtkListStore *OptionsList; + GtkTreeModel *OptionsFilter; } layouts_window; typedef struct { @@ -146,7 +209,7 @@ void on_move_down(GtkWidget *self, main_window *widgets); void on_move_up(GtkWidget *self, main_window *widgets); void on_layouts_accept(GtkWidget *self, layouts_window *window); void on_options_open(GtkWidget *self, main_window *widgets); -void on_options_accept(GtkWidget *self, dictionary *dict); +void on_options_accept(GtkWidget *self, layouts_window *window); void on_model_changed(GtkComboBoxText *self, main_window *widgets); void on_num_lock_changed(GtkComboBox *self, main_window *widgets); void on_layouts_chosen(GtkCellRenderer *self, gchar *path, layouts_window *window); @@ -160,3 +223,13 @@ void yon_layout_build(layouts_window *window); config_str yon_layout_get_children(char *layout_id, int *size); layouts_window *yon_layouts_window_new(); void yon_layout_load(char *layout,main_window *widgets); +void yon_options_setup(layouts_window *window); +layouts_window *yon_options_window_new(); +void on_options_filter_changed(GtkWidget *, layouts_window *window); +gboolean yon_filter_refilter(GtkTreeModel *model, GtkTreeIter *iter, layouts_window *window); +void yon_options_setup(layouts_window *window); +void on_option_chosen(GtkCellRenderer *, gchar *path, layouts_window *window); +void on_options_save(GtkWidget *,main_window *widgets); +void on_compose_switch(GtkWidget *,int status,main_window *widgets); +void on_scroll_lock_switch(GtkWidget *,int status,main_window *widgets); +void on_option_remove(GtkWidget*, main_window *widgets); \ No newline at end of file diff --git a/ubl-settings-keyboard-options.glade b/ubl-settings-keyboard-options.glade index 0f2d3a5..0b04912 100644 --- a/ubl-settings-keyboard-options.glade +++ b/ubl-settings-keyboard-options.glade @@ -3,56 +3,124 @@ + + + + + + + + + + + + OptionsList + True False - emblem-ok-symbolic + com.ublinux.libublsettingsui-gtk3.accept-symbolic True False - process-stop-symbolic + com.ublinux.libublsettingsui-gtk3.cancel-uncolored-symbolic - + 450 550 True False - dialog - + com.ublinux.ubl-settings-keyboard + + True False - 3 - 3 - 3 - 3 vertical - 5 - - + + + True + False + vertical + + + + + + False + True + 0 + + + + + True False - end + 5 + 5 + 5 + 5 + vertical + 5 - - Cancel + True - True - True - image2 + False - True + False True 0 - - Accept + True True - True - image1 + never + in + + + True + True + OptionsList + + + + + + 2 + + + + + + + Name + + + + 0 + + + + + + + Description + + + word + 250 + + + 1 + + + + + + True @@ -62,51 +130,17 @@ - False - False - 0 + True + True + 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True False - True True @@ -136,6 +170,31 @@ com.ublinux.ubl-settings-keyboard + + + Cancel + True + True + True + image2 + + + 1 + + + + + Accept + True + True + True + image1 + + + end + 2 + + diff --git a/ubl-settings-keyboard.glade b/ubl-settings-keyboard.glade index 93f054f..c3f410d 100644 --- a/ubl-settings-keyboard.glade +++ b/ubl-settings-keyboard.glade @@ -25,16 +25,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - - - - - - - - - @@ -45,20 +35,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + - - - - + + True False - com.ublinux.libublsettingsui-gtk3.edit-symbolic + com.ublinux.libublsettingsui-gtk3.increase-symbolic True @@ -238,6 +226,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False True LayoutsList + False True both @@ -257,7 +246,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Designation - 0 @@ -432,30 +420,29 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True True - AdditionalOptionsList - False + OptionsList both - column + Name - 1 + 0 - column + Description - 0 + 1 @@ -685,7 +672,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + True False 0