WIP keyboard rework

pull/17/head
parent 1f46007544
commit 2a7069d2e7
No known key found for this signature in database
GPG Key ID: FF1D842BF4DDE92B

@ -74,6 +74,9 @@ endif()
set(SOURCE_FILES set(SOURCE_FILES
ubl-settings-keyboard.c ubl-settings-keyboard.c
ubl-settings-keyboard-layouts.c
ubl-settings-keyboard-options.c
ubl-settings-keyboard-save.c
ubl-settings-keyboard.h ubl-settings-keyboard.h
ubl-strings.h ubl-strings.h
) )

@ -0,0 +1,185 @@
#include "ubl-settings-keyboard.h"
void on_layouts_accept(GtkWidget *self, layouts_window *window){
main_window *widgets = g_object_get_data(G_OBJECT(window->Window),"widgets");
gtk_list_store_clear(widgets->LayoutsList);
GtkTreeModel *model = GTK_TREE_MODEL(window->list);
GtkTreeIter window_iter;
char *save_string = NULL;
for_iter(window->list,&window_iter){
char *id, *variant, *name;
int status;
gtk_tree_model_get(model,&window_iter,0,&id,2,&name,3,&status,-1);
if (status){
char *temp = yon_char_append_element(save_string,id,",");
if (!yon_char_is_empty(save_string)) free(save_string);
save_string = temp;
}
GtkTreeIter child_iter;
if (gtk_tree_model_iter_children(model,&child_iter,&window_iter)){
for (int valid2=1;valid2;valid2=gtk_tree_model_iter_next(model,&child_iter)){
gtk_tree_model_get(model,&child_iter,0,&id,1,&variant,2,&name,3,&status,-1);
if (status){
char *full_id = yon_char_unite(id,"_",variant,NULL);
char *temp = yon_char_append_element(save_string,full_id,",");
if (!yon_char_is_empty(save_string)) free(save_string);
save_string = temp;
free(full_id);
}
}
}
}
if (!yon_char_is_empty(save_string)){
yon_config_register(keyboard_layout_parameter,keyboard_layout_parameter_command,save_string);
} else {
yon_config_remove_by_key(keyboard_layout_parameter);
}
on_subwindow_close(self);
yon_interface_update(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;
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,3,&chosen,-1);
gtk_tree_store_set(GTK_TREE_STORE(window->list),&iter,3,!chosen,-1);
}
void on_system_layouts_add(GtkWidget *, main_window *widgets){
yon_layouts_add(GTK_TREE_VIEW(widgets->LayoutTree),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");
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->Window),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(keyboard_layout_parameter);
int size;
config_str parsed = yon_char_parse(languages,&size,",");
GtkTreeIter iter;
for_iter(window->list,&iter){
int found = 0;
char *id;
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&id,-1);
for (int i=0;i<size;i++){
if (!strcmp(id,parsed[i])){
gtk_tree_store_set(GTK_TREE_STORE(window->list),&iter,3,1,-1);
found=1;
break;
}
}
if (!found) {
gtk_tree_store_set(GTK_TREE_STORE(window->list),&iter,3,0,-1);
}
}
}
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)){
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,",");
}
}
void on_system_layouts_remove(GtkWidget *, main_window *widgets){
yon_layouts_remove(GTK_TREE_VIEW(widgets->LayoutTree),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;i<main_config.variants_size;i++){
int parsed_size;
config_str parsed = yon_char_parse(main_config.variants_list[i],&parsed_size,"|");
if (!strcmp(parsed[0],layout_id)){
yon_char_parsed_add_or_create_if_exists(final,size,main_config.variants_list[i]);
}
}
return final;
}
void yon_layout_load(char *layout,main_window *widgets){
GtkTreeIter iter;
if (strstr(layout,"_")){
char *cur_variant = yon_char_new(layout);
char *cur_layout = yon_char_divide_search(cur_variant,"_",-1);
for (int i=0;i<main_config.variants_size;i++){
int parsed_size;
config_str parsed = yon_char_parse(main_config.variants_list[i],&parsed_size,"|");
if (!strcmp(parsed[0],cur_layout)&&!strcmp(parsed[1],cur_variant)){
gtk_list_store_append(widgets->LayoutsList,&iter);
gtk_list_store_set(widgets->LayoutsList,&iter,0,parsed[0],1,parsed[1],2,_(parsed[2]),-1);
}
}
} else {
for (int i=0;i<main_config.layouts_size;i++){
int parsed_size;
config_str parsed = yon_char_parse(main_config.layouts_list[i],&parsed_size,"|");
if (!strcmp(parsed[0],layout)){
gtk_list_store_append(widgets->LayoutsList,&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;i<size;i++){
yon_char_remove_last_symbol(layouts[i],'\n');
int parsed_size;
config_str parsed = yon_char_parse(layouts[i],&parsed_size,"|");
gtk_tree_store_append(window->list,&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;k<variants_size;k++){
parsed = yon_char_parse(variants[k],&parsed_size,"|");
gtk_tree_store_append(window->list,&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);
}

@ -0,0 +1,84 @@
#include "ubl-settings-keyboard.h"
// 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);
// GtkTreeIter iter;
// 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->OptionsEntry),name);
// yon_config_register(options_parameter,options_parameter_command,id);
// }
// on_subwindow_close(self);
// }
// void on_options_open(GtkWidget *, main_window *widgets){
// GtkBuilder *builder = gtk_builder_new_from_resource(glade_layouts_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);
// 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);
// }
// GList *yon_get_all_selected(GtkTreeView *tree, int column){
// GtkTreeIter iter;
// GList *list = NULL;
// GtkTreeModel *model = gtk_tree_view_get_model(tree);
// for_iter(model,&iter){
// int status;
// gtk_tree_model_get(model,&iter,column,&status,-1);
// if (status){
// GtkTreePath *path = gtk_tree_model_get_path(model,&iter);
// list = g_list_append(list,path);
// }
// }
// return list;
// }
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);
GtkTreeIter iter;
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);
}
on_subwindow_close(self);
}
void on_options_open(GtkWidget *, main_window *widgets){
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);
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);
}

@ -0,0 +1,104 @@
#include "ubl-settings-keyboard.h"
void on_save_done(main_window *, config_str output, int size){
char *final_output = yon_char_parsed_to_string(output,size,"");
if (final_output){
printf("%s\n",final_output);
free(final_output);
}
yon_char_parsed_free(output,size);
switch (main_config.save_config){
case YON_CONFIG_GLOBAL:
yon_ubl_status_box_render(yon_char_get_localised_from_lib(GLOBAL_SAVE_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
break;
case YON_CONFIG_LOCAL:
yon_ubl_status_box_render(yon_char_get_localised_from_lib(LOCAL_SAVE_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
break;
case YON_CONFIG_BOTH:
yon_ubl_status_box_render(yon_char_get_localised_from_lib(GLOBAL_LOCAL_SAVE_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
break;
}
}
void on_config_global_local_save(GtkWidget *, main_window *){
main_config.save_config=YON_CONFIG_BOTH;
yon_save_proceed(NULL,YON_CONFIG_BOTH,config_get_global_command,NULL);
}
void on_config_local_save(GtkWidget *, main_window *){
main_config.save_config=YON_CONFIG_LOCAL;
yon_save_proceed("system",YON_CONFIG_LOCAL,config_get_local_command,NULL);
}
void on_config_global_save(GtkWidget *, main_window *){
main_config.save_config=YON_CONFIG_GLOBAL;
yon_save_proceed("global",YON_CONFIG_GLOBAL,config_get_global_command,NULL);
}
void on_config_custom_save(GtkWidget *, main_window *){
main_config.save_config=YON_CONFIG_LOCAL;
template_saving_window *window = yon_save_proceed(NULL,YON_CONFIG_CUSTOM,yon_config_get_custom_command("system"),NULL);
if (window){};
}
void on_config_local_load(GtkWidget *,main_window *widgets){
yon_load_proceed(YON_CONFIG_LOCAL);
yon_ubl_status_box_render(yon_char_get_localised_from_lib(LOCAL_LOAD_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
yon_interface_update(widgets);
main_config.load_mode=1;
}
void on_config_global_load(GtkWidget *,main_window *widgets){
yon_load_proceed(YON_CONFIG_GLOBAL);
yon_ubl_status_box_render(yon_char_get_localised_from_lib(GLOBAL_LOAD_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
yon_interface_update(widgets);
main_config.load_mode=0;
}
void on_config_custom_load(GtkWidget *,main_window *widgets){
yon_load_proceed(YON_CONFIG_CUSTOM);
textdomain(template_ui_LocaleName);
yon_ubl_status_box_render(yon_char_get_localised_from_lib(LOCAL_LOAD_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
textdomain(LocaleName);
main_config.load_mode=3;
yon_interface_update(widgets);
}
void yon_load_proceed(YON_CONFIG_TYPE type){
yon_config_clean();
if (!yon_char_is_empty(config_get_default_command))
yon_config_load_config(YON_CONFIG_DEFAULT,config_get_default_command,NULL);
if (type==YON_CONFIG_GLOBAL){
yon_config_load_config(type,yon_debug_output("%s\n",config_get_global_command),NULL);
} else if (type==YON_CONFIG_LOCAL){
yon_config_load_config(type,config_get_local_command,NULL);
} else if (type==YON_CONFIG_CUSTOM){
char *path="";
textdomain(template_ui_LocaleName);
GtkWidget *dialog = gtk_file_chooser_dialog_new(template_app_information.app_title,NULL,GTK_FILE_CHOOSER_ACTION_SAVE,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL);
textdomain(LocaleName);
gtk_window_set_icon_name(GTK_WINDOW(dialog),"com.ublinux.ubl-settings-services");
gtk_window_set_title(GTK_WINDOW(dialog),TITLE_LABEL);
GtkFileFilter *filter = gtk_file_filter_new();
gtk_file_filter_add_pattern(filter,"*.ini");
gtk_file_filter_set_name(filter, "*.ini");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter);
gtk_widget_show(dialog);
int response = gtk_dialog_run(GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_ACCEPT){
char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
if (!yon_char_is_empty(file)){
path=file;
}
gtk_widget_destroy(dialog);
} else {
gtk_widget_destroy(dialog);
}
char *command = yon_config_get_custom_command(path);
yon_config_load_config(type,command,NULL);
}
}

@ -2,165 +2,41 @@
config main_config; config main_config;
void on_save_done(main_window *, config_str output, int size){
char *final_output = yon_char_parsed_to_string(output,size,"");
if (final_output){
printf("%s\n",final_output);
free(final_output);
}
yon_char_parsed_free(output,size);
switch (main_config.save_config){
case YON_CONFIG_GLOBAL:
yon_ubl_status_box_render(yon_char_get_localised_from_lib(GLOBAL_SAVE_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
break;
case YON_CONFIG_LOCAL:
yon_ubl_status_box_render(yon_char_get_localised_from_lib(LOCAL_SAVE_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
break;
case YON_CONFIG_BOTH:
yon_ubl_status_box_render(yon_char_get_localised_from_lib(GLOBAL_LOCAL_SAVE_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
break;
}
}
void on_config_global_local_save(GtkWidget *, main_window *){
main_config.save_config=YON_CONFIG_BOTH;
yon_save_proceed(NULL,YON_CONFIG_BOTH,config_get_global_command,NULL);
}
void on_config_local_save(GtkWidget *, main_window *){
main_config.save_config=YON_CONFIG_LOCAL;
yon_save_proceed("system",YON_CONFIG_LOCAL,config_get_local_command,NULL);
}
void on_config_global_save(GtkWidget *, main_window *){
main_config.save_config=YON_CONFIG_GLOBAL;
yon_save_proceed("global",YON_CONFIG_GLOBAL,config_get_global_command,NULL);
}
void on_config_custom_save(GtkWidget *, main_window *){
main_config.save_config=YON_CONFIG_LOCAL;
template_saving_window *window = yon_save_proceed(NULL,YON_CONFIG_CUSTOM,yon_config_get_custom_command("system"),NULL);
if (window){};
}
void on_config_local_load(GtkWidget *,main_window *widgets){
yon_load_proceed(YON_CONFIG_LOCAL);
yon_ubl_status_box_render(yon_char_get_localised_from_lib(LOCAL_LOAD_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
yon_interface_update(widgets);
main_config.load_mode=1;
}
void on_config_global_load(GtkWidget *,main_window *widgets){
yon_load_proceed(YON_CONFIG_GLOBAL);
yon_ubl_status_box_render(yon_char_get_localised_from_lib(GLOBAL_LOAD_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
yon_interface_update(widgets);
main_config.load_mode=0;
}
void on_config_custom_load(GtkWidget *,main_window *widgets){
yon_load_proceed(YON_CONFIG_CUSTOM);
textdomain(template_ui_LocaleName);
yon_ubl_status_box_render(yon_char_get_localised_from_lib(LOCAL_LOAD_SUCCESS_LABEL),BACKGROUND_IMAGE_SUCCESS_TYPE);
textdomain(LocaleName);
main_config.load_mode=3;
yon_interface_update(widgets);
}
void yon_load_proceed(YON_CONFIG_TYPE type){
yon_config_clean();
if (!yon_char_is_empty(config_get_default_command))
yon_config_load_config(YON_CONFIG_DEFAULT,config_get_default_command,NULL);
if (type==YON_CONFIG_GLOBAL){
yon_config_load_config(type,yon_debug_output("%s\n",config_get_global_command),NULL);
} else if (type==YON_CONFIG_LOCAL){
yon_config_load_config(type,config_get_local_command,NULL);
} else if (type==YON_CONFIG_CUSTOM){
char *path="";
textdomain(template_ui_LocaleName);
GtkWidget *dialog = gtk_file_chooser_dialog_new(template_app_information.app_title,NULL,GTK_FILE_CHOOSER_ACTION_SAVE,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL);
textdomain(LocaleName);
gtk_window_set_icon_name(GTK_WINDOW(dialog),"com.ublinux.ubl-settings-services");
gtk_window_set_title(GTK_WINDOW(dialog),TITLE_LABEL);
GtkFileFilter *filter = gtk_file_filter_new();
gtk_file_filter_add_pattern(filter,"*.ini");
gtk_file_filter_set_name(filter, "*.ini");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter);
gtk_widget_show(dialog);
int response = gtk_dialog_run(GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_ACCEPT){
char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
if (!yon_char_is_empty(file)){
path=file;
}
gtk_widget_destroy(dialog);
} else {
gtk_widget_destroy(dialog);
}
char *command = yon_config_get_custom_command(path);
yon_config_load_config(type,command,NULL);
}
}
gboolean yon_interface_update(main_window *widgets){ 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->KeyboardModelCombo),G_CALLBACK(on_model_changed),widgets);
// g_signal_handlers_block_by_func(G_OBJECT(widgets->SystemKeyboardOptionsCombo),G_CALLBACK(on_options_open),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->NumlockCombo),G_CALLBACK(on_num_lock_changed),widgets);
gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardModelCombo),0); gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardModelCombo),0);
gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumlockCombo),0); gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumlockCombo),0);
// gtk_entry_set_text(GTK_ENTRY(widgets->SystemKeyboardOptionsCombo),DEFAULT_LABEL); // gtk_entry_set_text(GTK_ENTRY(widgets->SystemKeyboardOptionsCombo),DEFAULT_LABEL);
GtkTreeIter iter;
{ {
char *name = yon_config_get_by_key(model_parameter); char *kbmodel = yon_config_get_by_key(model_parameter);
char *id; if (kbmodel) {
if (name) { gtk_combo_box_set_active_id(GTK_COMBO_BOX(widgets->KeyboardModelCombo),kbmodel);
int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.models_list),&iter); }
for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.models_list),&iter)){ }
gtk_tree_model_get(GTK_TREE_MODEL(main_config.models_list),&iter,1,&id,-1); {
if (!strcmp(name,id)){ gtk_list_store_clear(widgets->LayoutsList);
gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->KeyboardModelCombo),&iter); char *layouts = config(keyboard_layout_parameter);
break;
} int layouts_parsed_size;
} config_str layouts_parsed = yon_char_parse(layouts,&layouts_parsed_size,",");
} else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardModelCombo),0); for(int i=0;i<layouts_parsed_size;i++){
yon_layout_load(layouts_parsed[i],widgets);
}
} }
{ {
// if (main_config.layouts_store){
// for_iter(main_config.layouts_store,&iter){
// gtk_tree_store_set(main_config.layouts_store,&iter,2,0,-1);
// }
// }
char *name = yon_config_get_by_key(num_lock_boot_parameter); char *name = yon_config_get_by_key(num_lock_boot_parameter);
if (name) { if (name) {
if (!strcmp(name,"yes")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumlockCombo),1); 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 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_store){
// 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_tree_store_clear(main_config.layouts_store);
// for (int i=0;i<size;i++){
// for_iter(main_config.layouts_store,&iter){
// gtk_tree_model_get(GTK_TREE_MODEL(main_config.layouts_store),&iter,0,&rid,1,&rname,-1);
// if (!strcmp(layouts[i],rid)){
// gtk_tree_store_append(main_config.layouts_store,&itar,NULL);
// gtk_tree_store_set(main_config.layouts_store,&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->KeyboardModelCombo),G_CALLBACK(on_model_changed),widgets);
// g_signal_handlers_unblock_by_func(G_OBJECT(widgets->OptionsButton),G_CALLBACK(on_options_open),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->NumlockCombo),G_CALLBACK(on_num_lock_changed),widgets);
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
@ -193,219 +69,19 @@ void on_model_changed(GtkComboBoxText *self, main_window *widgets){
} }
} }
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);
GtkTreeIter iter;
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);
}
on_subwindow_close(self);
}
void yon_layouts_save(main_window *widgets){
GtkTreeIter iter;
GtkTreeIter child_iter;
int size;
config_str parsed = NULL;
for_iter(widgets->layoutsFilter,&iter){
char *name, *id;
gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(widgets->layoutsFilter),&child_iter,&iter);
gtk_tree_model_get(GTK_TREE_MODEL(main_config.layouts_store),&child_iter,0,&name,1,&id,-1);
yon_char_parsed_add_or_create_if_exists(parsed,&size,id);
}
if (parsed&&size>0){
yon_config_register(keyboard_layout_parameter,keyboard_layout_parameter_command,yon_char_parsed_to_string(parsed,size,","));
yon_char_parsed_free(parsed,size);
} else {
yon_config_remove_by_key(keyboard_layout_parameter);
}
}
void on_options_open(GtkWidget *, main_window *widgets){
GtkBuilder *builder = gtk_builder_new_from_resource(glade_layouts_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);
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);
}
GList *yon_get_all_selected(GtkTreeView *tree, int column){
GtkTreeIter iter;
GList *list = NULL;
GtkTreeModel *model = gtk_tree_view_get_model(tree);
for_iter(model,&iter){
int status;
gtk_tree_model_get(model,&iter,column,&status,-1);
if (status){
GtkTreePath *path = gtk_tree_model_get_path(model,&iter);
list = g_list_append(list,path);
}
}
return list;
}
void on_layouts_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*);
gtk_list_store_clear(widgets->LayoutsList);
GtkTreeModel *model = GTK_TREE_MODEL(window->list);
GtkTreeIter main_iter, window_iter;
for_iter(window->list,&window_iter){
char *id, *name;
int status;
gtk_tree_model_get(model,&window_iter,0,&id,1,&name,2,&status,-1);
if (status){
gtk_list_store_append(widgets->LayoutsList,&main_iter);
gtk_list_store_set(widgets->LayoutsList,&main_iter,0,id,1,name,-1);
}
GtkTreeIter child_iter;
if (gtk_tree_model_iter_children(model,&child_iter,&window_iter)){
for (int valid2=1;valid2;valid2=gtk_tree_model_iter_next(model,&child_iter)){
gtk_tree_model_get(model,&child_iter,0,&id,1,&name,2,&status,-1);
if (status){
gtk_list_store_append(widgets->LayoutsList,&main_iter);
gtk_list_store_set(widgets->LayoutsList,&main_iter,0,id,1,name,-1);
}
}
}
}
on_subwindow_close(self);
}
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;
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,2,&chosen,-1);
gtk_tree_store_set(GTK_TREE_STORE(window->list),&iter,2,!chosen,-1);
}
void on_system_layouts_add(GtkWidget *, main_window *widgets){
yon_layouts_add(GTK_TREE_VIEW(widgets->LayoutTree),widgets->LayoutsList,widgets);
}
void yon_layouts_add(GtkTreeView *, GtkListStore *, main_window *widgets){
GtkBuilder *builder = gtk_builder_new_from_resource(glade_layouts_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->ChosenCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ChosenCell"));
window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree");
window->list = (GtkListStore*)main_config.layouts_store;
gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree), GTK_TREE_MODEL(main_config.layouts_store));
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),GTK_SELECTION_MULTIPLE);
yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),TITLE_LABEL,icon_path,"layout_window");
gtk_tree_view_column_clicked(GTK_TREE_VIEW_COLUMN(gtk_tree_view_get_column(GTK_TREE_VIEW(window->MainTree),0)));
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->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_layouts_accept),dict);
g_signal_connect(G_OBJECT(window->ChosenCell),"toggled",G_CALLBACK(on_layouts_chosen),window);
char *languages = config(keyboard_layout_parameter);
int size;
config_str parsed = yon_char_parse(languages,&size,",");
GtkTreeIter iter;
for_iter(window->list,&iter){
int found = 0;
char *id;
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&id,-1);
for (int i=0;i<size;i++){
if (!strcmp(id,parsed[i])){
gtk_tree_store_set(GTK_TREE_STORE(window->list),&iter,2,1,-1);
found=1;
break;
}
}
if (!found) {
gtk_tree_store_set(GTK_TREE_STORE(window->list),&iter,2,0,-1);
}
}
}
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)){
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,",");
}
}
void on_system_layouts_remove(GtkWidget *, main_window *widgets){
yon_layouts_remove(GTK_TREE_VIEW(widgets->LayoutTree),widgets->LayoutsList,widgets);
}
// standard functions
void yon_layout_build(char *key, dictionary *value, main_window *){
GtkTreeIter parent;
GtkTreeIter iter;
gtk_tree_store_append(main_config.layouts_store,&parent,NULL);
gtk_tree_store_set(main_config.layouts_store,&parent,0,key,1,"",2,(char*)value->first->data,-1);
dictionary *dict;
for_dictionaries(dict,value){
if (yon_char_is_empty(dict->key)) continue;
gtk_tree_store_append(main_config.layouts_store,&iter,&parent);
char *key_full = yon_char_unite(key,"_",dict->key,NULL);
gtk_tree_store_set(main_config.layouts_store,&iter,0,key_full,1,dict->key,2,(char*)dict->data,-1);
}
}
void yon_config_init(){ void yon_config_init(){
int size; int size;
main_config.models_list = gtk_list_store_new(3,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; GtkTreeIter iter;
config_str models = yon_config_load(get_models_command,&size);
for (int i=0;i<size;i+=2){
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(main_config.models_list,&iter);
gtk_list_store_set(main_config.models_list,&iter,1,models[i],0,_(models[i+1]),-1);
}
yon_char_parsed_free(models,size);
main_config.layouts_store = gtk_tree_store_new(4,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN); 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); main_config.layouts_list = yon_config_load(layouts_command,&main_config.layouts_size);
main_config.layouts = g_hash_table_new(g_str_hash,g_str_equal); for (int i=0;i<main_config.variants_size;i++){
for (int i=0; i<main_config.layouts_size; i++){ yon_char_remove_last_symbol(main_config.variants_list[i],'\n');
}
for (int i=0;i<main_config.layouts_size;i++){
yon_char_remove_last_symbol(main_config.layouts_list[i],'\n'); yon_char_remove_last_symbol(main_config.layouts_list[i],'\n');
int parsed_size;
config_str parsed = yon_char_parse(main_config.layouts_list[i],&parsed_size,"|");
if (!g_hash_table_contains(main_config.layouts,parsed[0])){
dictionary *dict = NULL;
yon_dictionary_add_or_create_if_exists_with_data(dict,parsed[1],yon_char_new(parsed[2]));
g_hash_table_insert(main_config.layouts,yon_char_new(parsed[0]),dict);
} else {
dictionary *dict = (dictionary*)g_hash_table_lookup(main_config.layouts,parsed[0]);
yon_dictionary_add_or_create_if_exists_with_data(dict,parsed[1],yon_char_new(parsed[2]));
}
yon_char_parsed_free(parsed,parsed_size);
} }
@ -429,16 +105,16 @@ void yon_main_window_complete(main_window *widgets){
{ {
widgets->KeyboardModelCombo = yon_gtk_builder_get_widget(builder,"KeyboardModelCombo"); widgets->KeyboardModelCombo = yon_gtk_builder_get_widget(builder,"KeyboardModelCombo");
widgets->DefaultLayoutRadio = yon_gtk_builder_get_widget(builder,"DefaultLayoutRadio"); widgets->DefaultLayoutsSwitch = yon_gtk_builder_get_widget(builder,"DefaultLayoutsSwitch");
widgets->ManualLayoutRadio = yon_gtk_builder_get_widget(builder,"ManualLayoutRadio");
widgets->LayoutTree = yon_gtk_builder_get_widget(builder,"LayoutTree"); widgets->LayoutTree = yon_gtk_builder_get_widget(builder,"LayoutTree");
widgets->LayoutAddButton = yon_gtk_builder_get_widget(builder,"LayoutAddButton"); widgets->LayoutAddButton = yon_gtk_builder_get_widget(builder,"LayoutAddButton");
widgets->LayoutRemoveButton = yon_gtk_builder_get_widget(builder,"LayoutRemoveButton"); widgets->LayoutRemoveButton = yon_gtk_builder_get_widget(builder,"LayoutRemoveButton");
widgets->LayoutChangingCombo = yon_gtk_builder_get_widget(builder,"LayoutChangingCombo"); widgets->LayoutChangingCombo = yon_gtk_builder_get_widget(builder,"LayoutChangingCombo");
widgets->OptionsTree = yon_gtk_builder_get_widget(builder,"OptionsTree"); widgets->OptionsTree = yon_gtk_builder_get_widget(builder,"OptionsTree");
widgets->OptionsEditButton = yon_gtk_builder_get_widget(builder,"OptionsEditButton"); widgets->OptionsEditButton = yon_gtk_builder_get_widget(builder,"OptionsEditButton");
widgets->ScrollLockCheck = yon_gtk_builder_get_widget(builder,"ScrollLockCheck"); widgets->OptionsRemoveButton = yon_gtk_builder_get_widget(builder,"OptionsRemoveButton");
widgets->ComposeCheck = yon_gtk_builder_get_widget(builder,"ComposeCheck"); widgets->ComposeSwitch = 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->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->TTYLayoutCombo = yon_gtk_builder_get_widget(builder,"TTYLayoutCombo");
@ -455,7 +131,9 @@ void yon_main_window_complete(main_window *widgets){
g_signal_connect(G_OBJECT(widgets->KeyboardModelCombo),"changed",G_CALLBACK(on_model_changed),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->SystemKeyboardOptionsCombo),"clicked",G_CALLBACK(on_options_open),widgets);
g_signal_connect(G_OBJECT(widgets->NumlockCombo),"changed",G_CALLBACK(on_num_lock_changed),widgets); g_signal_connect(G_OBJECT(widgets->NumlockCombo),"changed",G_CALLBACK(on_num_lock_changed),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);
g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(on_config_local_load),widgets); g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(on_config_local_load),widgets);
g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_config_global_load),widgets); g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_config_global_load),widgets);
@ -465,11 +143,22 @@ void yon_main_window_complete(main_window *widgets){
g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(on_config_local_save),NULL); g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(on_config_local_save),NULL);
g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(on_config_global_save),NULL); g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(on_config_global_save),NULL);
g_signal_connect(G_OBJECT(widgets->SaveCustomMenuItem),"activate",G_CALLBACK(on_config_custom_save),NULL); g_signal_connect(G_OBJECT(widgets->SaveCustomMenuItem),"activate",G_CALLBACK(on_config_custom_save),NULL);
}
int size;
config_str models = yon_config_load(get_models_command,&size);
for (int i=0;i<size;i++){
yon_char_remove_last_symbol(models[i],'\n');
int parsed_size;
config_str parsed = yon_char_parse(models[i],&parsed_size,"|");
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(widgets->KeyboardModelCombo),parsed[0],_(parsed[1]));
yon_char_parsed_free(parsed,parsed_size);
}
yon_char_parsed_free(models,size);
yon_root_button_setup((template_main_window*)widgets,main_config.launch_arguments,main_config.launch_size); yon_root_button_setup((template_main_window*)widgets,main_config.launch_arguments,main_config.launch_size);
yon_save_window_set_postsave_function(on_save_done,widgets); yon_save_window_set_postsave_function(on_save_done,widgets);
gtk_tree_view_column_clicked(GTK_TREE_VIEW_COLUMN(gtk_tree_view_get_column(GTK_TREE_VIEW(widgets->LayoutTree),0))); gtk_tree_view_column_clicked(GTK_TREE_VIEW_COLUMN(gtk_tree_view_get_column(GTK_TREE_VIEW(widgets->LayoutTree),0)));
g_hash_table_foreach(main_config.layouts,(GHFunc)yon_layout_build,widgets);
on_config_local_load(NULL,widgets); on_config_local_load(NULL,widgets);
} }

@ -47,27 +47,11 @@
#define get_options_command "grep -E \"grp:.*toggle|grp_led:.*toggle|compose:.*toggle\" /usr/share/X11/xkb/rules/base.lst|sed -e 's/^ *//g' -e 's/\t//g' -e 's/toggle */toggle;/g'" #define get_options_command "grep -E \"grp:.*toggle|grp_led:.*toggle|compose:.*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}<name>|^ {8,8}<description>'|sed -e 's/ *<name>//g' -e 's,</name>,,g' -e 's/ *<description>//g' -e 's,</description>,,g'" #define get_models_command "sed -En '/^! model$/,/^ *$/!d;s/[[:blank:]]+([^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst"
#define layouts_path "resource:///com/ublinux/csv/layouts.csv" #define layouts_path "resource:///com/ublinux/csv/layouts.csv"
#define layouts_command "xkbcli list --load-exotic | awk \"\ #define layouts_command "sed -En '/^! layout$/,/^ *$/!d;s/[[:blank:]]+([^ ]+)[[:blank:]]+(.*)/\\1|\\2/p' /usr/share/X11/xkb/rules/evdev.lst"
layout && /description:/ {\ #define layouts_variant_command "sed -En '/^! variant$/,/^ *$/!d;s/[[:blank:]]+([^ ]+)[[:blank:]]+([^ :]+):[[:blank:]]+(.*)/\\2|\\1|\\3/p' /usr/share/X11/xkb/rules/evdev.lst"
match(\\$0, /: *(.*)/, matches);\
description = matches[1];\
printf \\\"%s|%s|%s\\\\n\\\", layout, variant, description;\
layout = \\\"\\\"; variant = \\\"\\\";\
}\
/layout:/ {\
match(\\$0, /: *'([^']+)'/, matches);\
l = matches[1];\
layout = layouts[l] = l;\
}\
/variant:/ {\
match(\\$0, /: *'([^']+)'/, matches);\
variant = matches[1];\
}\
\" | sort -u\
"
typedef char* string; typedef char* string;
@ -83,25 +67,28 @@ typedef struct {
GtkTreeStore *layouts_store; GtkTreeStore *layouts_store;
GtkListStore *options_list; GtkListStore *options_list;
GtkListStore *models_list; GtkListStore *models_list;
GHashTable *layouts; config_str variants_list;
int layouts_size; int variants_size;
config_str layouts_list; config_str layouts_list;
int layouts_size;
} config; } config;
extern config main_config;
typedef struct { typedef struct {
template_window_fields template_window_fields
GtkWidget *KeyboardModelCombo; GtkWidget *KeyboardModelCombo;
GtkWidget *DefaultLayoutRadio; GtkWidget *DefaultLayoutsSwitch;
GtkWidget *ManualLayoutRadio;
GtkWidget *LayoutTree; GtkWidget *LayoutTree;
GtkWidget *LayoutAddButton; GtkWidget *LayoutAddButton;
GtkWidget *LayoutRemoveButton; GtkWidget *LayoutRemoveButton;
GtkWidget *LayoutChangingCombo; GtkWidget *LayoutChangingCombo;
GtkWidget *OptionsTree; GtkWidget *OptionsTree;
GtkWidget *OptionsEditButton; GtkWidget *OptionsEditButton;
GtkWidget *ScrollLockCheck; GtkWidget *OptionsRemoveButton;
GtkWidget *ComposeCheck; GtkWidget *ComposeSwitch;
GtkWidget *ScrollLockSwitch;
GtkWidget *ManualEntry; GtkWidget *ManualEntry;
GtkWidget *NumlockCombo; GtkWidget *NumlockCombo;
GtkWidget *TTYLayoutCombo; GtkWidget *TTYLayoutCombo;
@ -128,7 +115,7 @@ typedef struct {
GtkWidget *CancelButton; GtkWidget *CancelButton;
GtkWidget *AcceptButton; GtkWidget *AcceptButton;
GtkCellRenderer *ChosenCell; GtkCellRenderer *ChosenCell;
GtkListStore *list; GtkTreeStore *list;
} layouts_window; } layouts_window;
typedef struct { typedef struct {
@ -157,12 +144,11 @@ void config_init();
void yon_main_window_complete(main_window *widgets); void yon_main_window_complete(main_window *widgets);
void on_move_down(GtkWidget *self, main_window *widgets); void on_move_down(GtkWidget *self, main_window *widgets);
void on_move_up(GtkWidget *self, main_window *widgets); void on_move_up(GtkWidget *self, main_window *widgets);
void on_layouts_accept(GtkWidget *self, dictionary *dict); void on_layouts_accept(GtkWidget *self, layouts_window *window);
void on_options_open(GtkWidget *self, main_window *widgets); void on_options_open(GtkWidget *self, main_window *widgets);
void on_options_accept(GtkWidget *self, dictionary *dict); void on_options_accept(GtkWidget *self, dictionary *dict);
void on_model_changed(GtkComboBoxText *self, main_window *widgets); void on_model_changed(GtkComboBoxText *self, main_window *widgets);
void on_num_lock_changed(GtkComboBox *self, main_window *widgets); void on_num_lock_changed(GtkComboBox *self, main_window *widgets);
void yon_layouts_save(main_window *widgets);
void on_layouts_chosen(GtkCellRenderer *self, gchar *path, layouts_window *window); void on_layouts_chosen(GtkCellRenderer *self, gchar *path, layouts_window *window);
GList *yon_get_all_selected(GtkTreeView *tree, int column); GList *yon_get_all_selected(GtkTreeView *tree, int column);
void on_system_layouts_add(GtkWidget *, main_window *widgets); void on_system_layouts_add(GtkWidget *, main_window *widgets);
@ -170,4 +156,7 @@ void yon_layouts_add(GtkTreeView *tree, GtkListStore *cur_list, main_window *wid
void yon_layouts_remove(GtkTreeView *tree, GtkListStore *cur_list, main_window *widgets); void yon_layouts_remove(GtkTreeView *tree, GtkListStore *cur_list, main_window *widgets);
void on_system_layouts_remove(GtkWidget *, main_window *widgets); void on_system_layouts_remove(GtkWidget *, main_window *widgets);
void yon_config_init(); void yon_config_init();
void yon_layout_build(char *key, dictionary *value, main_window *widgets); 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);

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 --> <!-- Generated with glade 3.38.2 -->
<interface domain="ubl-settings-keyboard"> <interface domain="ubl-settings-keyboard">
<requires lib="gtk+" version="3.24"/> <requires lib="gtk+" version="3.24"/>
<object class="GtkImage" id="image1"> <object class="GtkImage" id="image1">
@ -78,16 +78,17 @@
<property name="headers-visible">False</property> <property name="headers-visible">False</property>
<property name="search-column">1</property> <property name="search-column">1</property>
<child internal-child="selection"> <child internal-child="selection">
<object class="GtkTreeSelection"/> <object class="GtkTreeSelection">
<property name="mode">none</property>
</object>
</child> </child>
<child> <child>
<object class="GtkTreeViewColumn"> <object class="GtkTreeViewColumn">
<property name="title" translatable="yes">column</property> <property name="title" translatable="yes">column</property>
<property name="sort-column-id">0</property>
<child> <child>
<object class="GtkCellRendererToggle" id="ChosenCell"/> <object class="GtkCellRendererToggle" id="ChosenCell"/>
<attributes> <attributes>
<attribute name="active">2</attribute> <attribute name="active">3</attribute>
</attributes> </attributes>
</child> </child>
</object> </object>
@ -99,7 +100,7 @@
<child> <child>
<object class="GtkCellRendererText"/> <object class="GtkCellRendererText"/>
<attributes> <attributes>
<attribute name="text">1</attribute> <attribute name="text">2</attribute>
</attributes> </attributes>
</child> </child>
</object> </object>

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 <!-- Generated with glade 3.38.2
ubl-settings-keyboard - ubl-settings-keyboard -
Copyright (C) UBGroup Copyright (C) UBGroup
@ -25,6 +25,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<!-- interface-license-type gplv2 --> <!-- interface-license-type gplv2 -->
<!-- interface-name ubl-settings-keyboard --> <!-- interface-name ubl-settings-keyboard -->
<!-- interface-copyright UBGroup --> <!-- interface-copyright UBGroup -->
<object class="GtkListStore" id="AdditionalOptionsList">
<columns>
<!-- column-name Name -->
<column type="gchararray"/>
<!-- column-name Id -->
<column type="gchararray"/>
<!-- column-name Chosen -->
<column type="gboolean"/>
</columns>
</object>
<object class="GtkListStore" id="LayoutsList"> <object class="GtkListStore" id="LayoutsList">
<columns> <columns>
<!-- column-name Id --> <!-- column-name Id -->
@ -35,6 +45,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<column type="gchararray"/> <column type="gchararray"/>
</columns> </columns>
</object> </object>
<object class="GtkListStore" id="MainOptionList">
<columns>
<!-- column-name Name -->
<column type="gchararray"/>
<!-- column-name Id -->
<column type="gchararray"/>
<!-- column-name Chosen -->
<column type="gboolean"/>
</columns>
</object>
<object class="GtkImage" id="image1"> <object class="GtkImage" id="image1">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
@ -45,6 +65,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.increase-symbolic</property> <property name="icon-name">com.ublinux.libublsettingsui-gtk3.increase-symbolic</property>
</object> </object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.trash-symbolic</property>
</object>
<object class="GtkImage" id="image6"> <object class="GtkImage" id="image6">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
@ -116,18 +141,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkComboBox" id="KeyboardModelCombo"> <object class="GtkComboBoxText" id="KeyboardModelCombo">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="model">LayoutsList</property>
<property name="active">0</property> <property name="active">0</property>
<property name="id-column">1</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
@ -152,7 +169,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="valign">start</property> <property name="valign">start</property>
<property name="label" translatable="yes">Keyboard model:</property> <property name="label" translatable="yes">Layouts:</property>
<property name="xalign">1</property> <property name="xalign">1</property>
</object> </object>
<packing> <packing>
@ -173,13 +190,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkRadioButton" id="DefaultLayoutRadio"> <object class="GtkSwitch" id="DefaultLayoutsSwitch">
<property name="label" translatable="yes">Default layout</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property> <property name="active">True</property>
<property name="draw-indicator">True</property>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -188,13 +202,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkRadioButton" id="ManualLayoutRadio"> <object class="GtkLabel">
<property name="label" translatable="yes">Manual</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">False</property>
<property name="receives-default">False</property> <property name="label" translatable="yes">Default layout</property>
<property name="draw-indicator">True</property>
<property name="group">DefaultLayoutRadio</property>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -224,35 +235,40 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<child> <child>
<object class="GtkTreeView" id="LayoutTree"> <object class="GtkTreeView" id="LayoutTree">
<property name="visible">True</property> <property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="model">LayoutsList</property> <property name="model">LayoutsList</property>
<property name="headers-visible">False</property> <property name="reorderable">True</property>
<property name="enable-grid-lines">both</property>
<child internal-child="selection"> <child internal-child="selection">
<object class="GtkTreeSelection"/> <object class="GtkTreeSelection"/>
</child> </child>
<child> <child>
<object class="GtkTreeViewColumn"> <object class="GtkTreeViewColumn">
<property name="title" translatable="yes">column</property> <property name="title" translatable="yes">Keyboard layout</property>
<property name="sort-column-id">0</property>
<child> <child>
<object class="GtkCellRendererText"/> <object class="GtkCellRendererText"/>
<attributes> <attributes>
<attribute name="text">0</attribute> <attribute name="text">2</attribute>
</attributes> </attributes>
</child> </child>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkTreeViewColumn"> <object class="GtkTreeViewColumn">
<property name="title" translatable="yes">column</property> <property name="title" translatable="yes">Designation</property>
<property name="sort-column-id">0</property>
<child> <child>
<object class="GtkCellRendererText"/> <object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child> </child>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkTreeViewColumn"> <object class="GtkTreeViewColumn">
<property name="title" translatable="yes">column</property> <property name="title" translatable="yes">Variant</property>
<child> <child>
<object class="GtkCellRendererText"/> <object class="GtkCellRendererText"/>
<attributes> <attributes>
@ -279,6 +295,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<child> <child>
<object class="GtkButton" id="LayoutAddButton"> <object class="GtkButton" id="LayoutAddButton">
<property name="visible">True</property> <property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="receives-default">True</property> <property name="receives-default">True</property>
<property name="image">image2</property> <property name="image">image2</property>
@ -295,6 +312,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<child> <child>
<object class="GtkButton" id="LayoutRemoveButton"> <object class="GtkButton" id="LayoutRemoveButton">
<property name="visible">True</property> <property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="receives-default">True</property> <property name="receives-default">True</property>
<property name="image">image6</property> <property name="image">image6</property>
@ -317,7 +335,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
@ -331,7 +349,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
@ -358,10 +376,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<object class="GtkComboBoxText" id="LayoutChangingCombo"> <object class="GtkComboBoxText" id="LayoutChangingCombo">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="active">0</property>
<items>
<item translatable="yes">Default</item>
</items>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
@ -412,13 +426,40 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="shadow-type">in</property> <property name="shadow-type">in</property>
<property name="min-content-height">100</property>
<property name="max-content-height">150</property>
<child> <child>
<object class="GtkTreeView" id="OptionsTree"> <object class="GtkTreeView" id="OptionsTree">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="model">AdditionalOptionsList</property>
<property name="headers-visible">False</property>
<property name="enable-grid-lines">both</property>
<child internal-child="selection"> <child internal-child="selection">
<object class="GtkTreeSelection"/> <object class="GtkTreeSelection"/>
</child> </child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">column</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">column</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>
@ -450,6 +491,22 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkButton" id="OptionsRemoveButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image3</property>
<style>
<class name="thin"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -459,7 +516,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">3</property> <property name="position">3</property>
</packing> </packing>
@ -489,12 +546,33 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">5</property> <property name="spacing">5</property>
<child> <child>
<object class="GtkCheckButton" id="ScrollLockCheck"> <object class="GtkBox">
<property name="label" translatable="yes">Scroll Lock indication when switching layouts</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">False</property>
<property name="receives-default">False</property> <property name="spacing">5</property>
<property name="draw-indicator">True</property> <child>
<object class="GtkSwitch" id="ComposeSwitch">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Set Compose (Multi_Key) to the right Win key</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -503,12 +581,33 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkCheckButton" id="ComposeCheck"> <object class="GtkBox">
<property name="label" translatable="yes">Set Compose (Multi_Key) to the right Win key</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">False</property>
<property name="receives-default">False</property> <property name="spacing">5</property>
<property name="draw-indicator">True</property> <child>
<object class="GtkSwitch" id="ScrollLockSwitch">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Scroll Lock indication when switching layouts</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -552,6 +651,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<object class="GtkEntry" id="ManualEntry"> <object class="GtkEntry" id="ManualEntry">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="placeholder-text" translatable="yes">grp:lalt_lshift_toggle,grp_led:scroll,compose:rwin</property>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
@ -591,6 +691,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<property name="active">0</property> <property name="active">0</property>
<items> <items>
<item translatable="yes">Default</item> <item translatable="yes">Default</item>
<item translatable="yes">On</item>
<item translatable="yes">Off</item>
</items> </items>
</object> </object>
<packing> <packing>
@ -718,9 +820,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<column type="gboolean"/> <column type="gboolean"/>
</columns> </columns>
</object> </object>
<object class="GtkTreeModelFilter" id="LayoutsFilter">
<property name="child-model">liststore1</property>
</object>
<object class="GtkMenu" id="menu1"> <object class="GtkMenu" id="menu1">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>

Loading…
Cancel
Save