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

@ -84,6 +84,7 @@ set(LIBRARIES
${UTILS_LIBRARIES} ${UTILS_LIBRARIES}
${VTE291_LIBRARIES} ${VTE291_LIBRARIES}
pthread pthread
xml2
ublsettings ublsettings
ublsettings-gtk3 ublsettings-gtk3
ublsettingsui-gtk3) ublsettingsui-gtk3)

@ -2,6 +2,58 @@
config main_config; config main_config;
const char *get_localized_layout_name(const char *layout_code) {
static char name[128];
name[0] = '\0';
setlocale(LC_ALL, "");
const char *lang = yongetenv("LANG");
if (!lang) lang = "en";
char lang_short[8];
sscanf(lang, "%2s", lang_short);
xmlDoc *doc = xmlReadFile("/usr/share/X11/xkb/rules/base.xml", NULL, 0);
if (!doc) return layout_code;
xmlNode *root = xmlDocGetRootElement(doc);
for (xmlNode *layout = root->children; layout; layout = layout->next) {
if (layout->type == XML_ELEMENT_NODE && strcmp((char *)layout->name, "layout") == 0) {
xmlNode *config = layout->children;
const char *found_name = NULL;
const char *found_desc = NULL;
for (xmlNode *n = config; n; n = n->next) {
if (n->type == XML_ELEMENT_NODE && strcmp((char *)n->name, "configItem") == 0) {
for (xmlNode *m = n->children; m; m = m->next) {
if (m->type != XML_ELEMENT_NODE) continue;
if (strcmp((char *)m->name, "name") == 0)
found_name = (char *)xmlNodeGetContent(m);
else if (strcmp((char *)m->name, "description") == 0) {
xmlChar *langAttr = xmlGetProp(m, (const xmlChar *)"xml:lang");
if (langAttr && strncmp((char *)langAttr, lang_short, 2) == 0)
found_desc = (char *)xmlNodeGetContent(m);
xmlFree(langAttr);
}
}
}
}
if (found_name && strcmp(found_name, layout_code) == 0) {
if (found_desc)
snprintf(name, sizeof(name), "%s", found_desc);
else
snprintf(name, sizeof(name), "%s", layout_code);
break;
}
}
}
xmlFreeDoc(doc);
xmlCleanupParser();
return name[0] ? name : layout_code;
}
void on_save_done(main_window *, config_str output, int size){ void on_save_done(main_window *, config_str output, int size){
char *final_output = yon_char_parsed_to_string(output,size,""); char *final_output = yon_char_parsed_to_string(output,size,"");
if (final_output){ if (final_output){
@ -106,62 +158,83 @@ void yon_load_proceed(YON_CONFIG_TYPE type){
} }
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->ModelCombo),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->MoveDownButton),G_CALLBACK(on_move_down),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->MoveUpButton),G_CALLBACK(on_move_up),widgets);
g_signal_handlers_block_by_func(G_OBJECT(widgets->OptionsButton),G_CALLBACK(on_options_open),widgets);
gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardModelCombo),0); 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->NumlockCombo),0); gtk_list_store_clear(widgets->layoutsList);
// gtk_entry_set_text(GTK_ENTRY(widgets->SystemKeyboardOptionsCombo),DEFAULT_LABEL);
gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ModelCombo),0);
gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0);
GtkTreeIter iter; GtkTreeIter iter;
gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),DEFAULT_LABEL);
{ {
char *name = yon_config_get_by_key(model_parameter); char *name = yon_config_get_by_key(model_parameter);
char *id; char *id;
if (name) { if (name) {
int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.models_list),&iter); int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->modelsList),&iter);
for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.models_list),&iter)){ for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->modelsList),&iter)){
gtk_tree_model_get(GTK_TREE_MODEL(main_config.models_list),&iter,1,&id,-1); gtk_tree_model_get(GTK_TREE_MODEL(widgets->modelsList),&iter,1,&id,-1);
if (!strcmp(name,id)){ if (!strcmp(name,id)){
gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->KeyboardModelCombo),&iter); gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->ModelCombo),&iter);
break; break;
} }
} }
} else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardModelCombo),0); } else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ModelCombo),0);
} }
{ {
// if (main_config.layouts_store){ char *name = yon_config_get_by_key(options_parameter);
// for_iter(main_config.layouts_store,&iter){ if (name) {
// gtk_tree_store_set(main_config.layouts_store,&iter,2,0,-1); char *id, *rname;
// } gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name);
// } int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.options_list),&iter);
for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.options_list),&iter)){
gtk_tree_model_get(GTK_TREE_MODEL(main_config.options_list),&iter,0,&id,1,&rname,-1);
if (!strcmp(id,name)){
gtk_list_store_set(main_config.options_list,&iter,2,1,-1);
gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),rname);
break;
}
}
}
}
{
if (main_config.layouts_list){
for_iter(main_config.layouts_list,&iter){
gtk_tree_store_set(main_config.layouts_list,&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_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;i<size;i++){
for_iter(main_config.layouts_list,&iter){
gtk_tree_model_get(GTK_TREE_MODEL(main_config.layouts_list),&iter,0,&rid,1,&rname,-1);
if (!strcmp(layouts[i],rid)){
gtk_list_store_append(widgets->layoutsList,&itar);
gtk_list_store_set(widgets->layoutsList,&itar,0,rname,1,rid,2,1,-1);
}
}
}
} }
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->ModelCombo),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->MoveDownButton),G_CALLBACK(on_move_down),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->MoveUpButton),G_CALLBACK(on_move_up),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->NumLockCombo),G_CALLBACK(on_num_lock_changed),widgets);
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
@ -185,10 +258,9 @@ void on_model_changed(GtkComboBoxText *self, main_window *widgets){
default: default:
char *id; char *id;
GtkTreeIter iter; GtkTreeIter iter;
if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widgets->KeyboardModelCombo),&iter)){ gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widgets->ModelCombo),&iter);
gtk_tree_model_get(GTK_TREE_MODEL(main_config.models_list),&iter,1,&id,-1); gtk_tree_model_get(GTK_TREE_MODEL(widgets->modelsList),&iter,1,&id,-1);
yon_config_register(model_parameter,model_parameter_command,id); yon_config_register(model_parameter,model_parameter_command,id);
}
break; break;
} }
@ -202,7 +274,7 @@ void on_options_accept(GtkWidget *self, dictionary *dict){
char *name, *id; char *name, *id;
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),&model,&iter)){ 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_tree_model_get(model,&iter,0,&id,1,&name,-1);
gtk_entry_set_text(GTK_ENTRY(widgets->OptionsTree),name); gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name);
yon_config_register(options_parameter,options_parameter_command,id); yon_config_register(options_parameter,options_parameter_command,id);
} }
@ -217,7 +289,7 @@ void yon_layouts_save(main_window *widgets){
for_iter(widgets->layoutsFilter,&iter){ for_iter(widgets->layoutsFilter,&iter){
char *name, *id; char *name, *id;
gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(widgets->layoutsFilter),&child_iter,&iter); 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); gtk_tree_model_get(GTK_TREE_MODEL(widgets->layoutsList),&child_iter,0,&name,1,&id,-1);
yon_char_parsed_add_or_create_if_exists(parsed,&size,id); yon_char_parsed_add_or_create_if_exists(parsed,&size,id);
} }
if (parsed&&size>0){ if (parsed&&size>0){
@ -263,28 +335,31 @@ GList *yon_get_all_selected(GtkTreeView *tree, int column){
void on_layouts_accept(GtkWidget *self, dictionary *dict){ void on_layouts_accept(GtkWidget *self, dictionary *dict){
main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
layouts_window *window = yon_dictionary_get_data(dict->first->next,layouts_window*); layouts_window *window = yon_dictionary_get_data(dict->first->next,layouts_window*);
gtk_list_store_clear(widgets->LayoutsList); gtk_list_store_clear(widgets->layoutsList);
GtkTreeModel *model = GTK_TREE_MODEL(window->list); GtkTreeModel *model = GTK_TREE_MODEL(window->list);
GtkTreeIter main_iter, window_iter; char *name;
for_iter(window->list,&window_iter){ char *id;
char *id, *name; GtkTreeIter iter, lwiter, chiter;
for_iter(model,&lwiter){
int status; int status;
gtk_tree_model_get(model,&window_iter,0,&id,1,&name,2,&status,-1); gtk_tree_model_get(model,&lwiter,0,&name,1,&id,2,&status,-1);
if (status){ if (status){
gtk_list_store_append(widgets->LayoutsList,&main_iter); gtk_list_store_append(widgets->layoutsList,&iter);
gtk_list_store_set(widgets->LayoutsList,&main_iter,0,id,1,name,-1); gtk_list_store_set(widgets->layoutsList,&iter,1,name,0,id,2,1,-1);
} }
GtkTreeIter child_iter; if (gtk_tree_model_iter_children(model,&chiter,&lwiter)){
if (gtk_tree_model_iter_children(model,&child_iter,&window_iter)){ for (int valid2 = 1; valid2; valid2 = gtk_tree_model_iter_next(model,&chiter)){
for (int valid2=1;valid2;valid2=gtk_tree_model_iter_next(model,&child_iter)){ char *chid, *chname;
gtk_tree_model_get(model,&child_iter,0,&id,1,&name,2,&status,-1); int chstatus;
if (status){ gtk_tree_model_get(model,&chiter,0,&chname,1,&chid,2,&chstatus,-1);
gtk_list_store_append(widgets->LayoutsList,&main_iter); if (chstatus){
gtk_list_store_set(widgets->LayoutsList,&main_iter,0,id,1,name,-1); gtk_list_store_append(widgets->layoutsList,&iter);
gtk_list_store_set(widgets->layoutsList,&iter,1,chname,0,chid,2,1,-1);
} }
} }
} }
} }
yon_layouts_save(widgets);
on_subwindow_close(self); on_subwindow_close(self);
} }
@ -296,11 +371,7 @@ void on_layouts_chosen(GtkCellRenderer *, gchar *path, layouts_window *window){
gtk_tree_store_set(GTK_TREE_STORE(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){ void on_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); GtkBuilder *builder = gtk_builder_new_from_resource(glade_layouts_path);
layouts_window *window = malloc(sizeof(layouts_window)); layouts_window *window = malloc(sizeof(layouts_window));
window->Window = yon_gtk_builder_get_widget(builder,"Window"); window->Window = yon_gtk_builder_get_widget(builder,"Window");
@ -308,14 +379,12 @@ void yon_layouts_add(GtkTreeView *, GtkListStore *, main_window *widgets){
window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
window->ChosenCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ChosenCell")); window->ChosenCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ChosenCell"));
window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree"); window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree");
window->list = (GtkListStore*)main_config.layouts_store; window->list = (GtkListStore*)main_config.layouts_list;
gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree), GTK_TREE_MODEL(main_config.layouts_store)); gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree), GTK_TREE_MODEL(window->list));
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),GTK_SELECTION_MULTIPLE); 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"); 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; 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,"widgets",widgets);
yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
@ -344,73 +413,110 @@ void yon_layouts_add(GtkTreeView *, GtkListStore *, main_window *widgets){
} }
} }
void yon_layouts_remove(GtkTreeView *tree, GtkListStore *cur_list, main_window *widgets){ void on_layouts_remove(GtkWidget *, main_window *widgets){
GtkTreeModel *model = GTK_TREE_MODEL(cur_list); GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsList);
GtkTreeIter iter; GtkTreeIter iter;
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(tree),&model,&iter)){ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutsTree)),&model,&iter)){
GtkTreeIter iter_converted; GtkTreeIter iter_converted;
char *target; char *target;
gtk_tree_model_get(model,&iter,1,&target,-1); gtk_tree_model_get(model,&iter,1,&target,-1);
gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&iter_converted,&iter); gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&iter_converted,&iter);
gtk_list_store_remove(cur_list,&iter_converted); gtk_list_store_remove(widgets->layoutsList,&iter_converted);
yon_config_remove_element(keyboard_layout_parameter,target,","); yon_config_remove_element(keyboard_layout_parameter,target,",");
} }
} }
void on_system_layouts_remove(GtkWidget *, main_window *widgets){ void on_move_up(GtkWidget *, main_window *widgets){
yon_layouts_remove(GTK_TREE_VIEW(widgets->LayoutTree),widgets->LayoutsList,widgets); GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsFilter);
GtkTreeIter iter,*previter;
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutsTree)),&model,&iter)){
previter = gtk_tree_iter_copy(&iter);
if (gtk_tree_model_iter_previous(model,previter))
{
GtkTreeIter iter_converted, previter_converted;
gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&iter_converted,&iter);
gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&previter_converted,previter);
gtk_list_store_move_before(widgets->layoutsList,&iter_converted,&previter_converted);
yon_layouts_save(widgets);
}
}
} }
// standard functions void on_move_down(GtkWidget *, main_window *widgets){
GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsFilter);
void yon_layout_build(char *key, dictionary *value, main_window *){ GtkTreeIter iter,*nextiter;
GtkTreeIter parent; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutsTree)),&model,&iter)){
GtkTreeIter iter; nextiter = gtk_tree_iter_copy(&iter);
gtk_tree_store_append(main_config.layouts_store,&parent,NULL); if (gtk_tree_model_iter_next(model,nextiter)){
gtk_tree_store_set(main_config.layouts_store,&parent,0,key,1,"",2,(char*)value->first->data,-1); GtkTreeIter iter_converted, nextiter_converted;
dictionary *dict; gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&iter_converted,&iter);
for_dictionaries(dict,value){ gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&nextiter_converted,nextiter);
if (yon_char_is_empty(dict->key)) continue; gtk_list_store_move_after(widgets->layoutsList,&iter_converted,&nextiter_converted);
gtk_tree_store_append(main_config.layouts_store,&iter,&parent); yon_layouts_save(widgets);
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(){
// standard functions
void yon_main_window_complete(main_window *widgets){
widgets = yon_remalloc(widgets,sizeof(main_window));
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
gtk_box_pack_start(GTK_BOX(widgets->InterfaceBox),yon_gtk_builder_get_widget(builder,"BoxMain"),1,1,0);
// Custom widgets configuration
{
widgets->NumLockCombo = yon_gtk_builder_get_widget(builder,"NumlockCombo");
widgets->ModelCombo = yon_gtk_builder_get_widget(builder,"ModelCombo");
widgets->keyboard = yon_gtk_builder_get_widget(builder,"keyboard");
widgets->keytable = yon_gtk_builder_get_widget(builder,"keytable");
widgets->grp_toggle = yon_gtk_builder_get_widget(builder,"grp_toggle");
widgets->OptionsEntry = yon_gtk_builder_get_widget(builder,"OptionsEntry");
widgets->OptionsButton = yon_gtk_builder_get_widget(builder,"OptionsButton");
widgets->LayoutsTree = yon_gtk_builder_get_widget(builder,"LayoutsTree");
widgets->MoveUpButton = yon_gtk_builder_get_widget(builder,"MoveUpButton");
widgets->MoveDownButton = yon_gtk_builder_get_widget(builder,"MoveDownButton");
widgets->AddButton = yon_gtk_builder_get_widget(builder,"AddButton");
widgets->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton");
widgets->layoutsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1"));
widgets->layoutsFilter = GTK_TREE_MODEL_FILTER(gtk_builder_get_object(builder,"LayoutsFilter"));
widgets->modelsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore2"));
int size; int size;
main_config.models_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN); GtkTreeIter iter,chiter;
GtkTreeIter iter;
config_str models = yon_config_load(get_models_command,&size); config_str models = yon_config_load(get_models_command,&size);
for (int i=0;i<size;i+=2){ for (int i=0;i<size;i+=2){
models[i] = yon_char_divide_search(models[i],"\n",-1); models[i] = yon_char_divide_search(models[i],"\n",-1);
models[i+1] = yon_char_divide_search(models[i+1],"\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_append(widgets->modelsList,&iter);
gtk_list_store_set(main_config.models_list,&iter,1,models[i],0,_(models[i+1]),-1); gtk_list_store_set(widgets->modelsList,&iter,1,models[i],0,_(models[i+1]),-1);
} }
yon_char_parsed_free(models,size); main_config.layouts_list = gtk_tree_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN);
int laysize;
main_config.layouts_store = gtk_tree_store_new(4,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN); config_str rtn = yon_config_load(get_layouts_command,&size);
main_config.layouts_list = yon_config_load(layouts_command,&main_config.layouts_size); for (int i=0; i<size; i++){
main_config.layouts = g_hash_table_new(g_str_hash,g_str_equal); yon_char_remove_last_symbol(rtn[i],'\n');
for (int i=0; i<main_config.layouts_size; i++){ config_str layout = yon_char_parse(rtn[i],&laysize,"|");
yon_char_remove_last_symbol(main_config.layouts_list[i],'\n'); if (yon_char_is_empty(layout[1])){
int parsed_size; gtk_tree_store_append(main_config.layouts_list,&iter,NULL);
config_str parsed = yon_char_parse(main_config.layouts_list[i],&parsed_size,"|"); gtk_tree_store_set(main_config.layouts_list,&iter,0,layout[0],1,get_localized_layout_name(layout[2]),-1);
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 { } else {
dictionary *dict = (dictionary*)g_hash_table_lookup(main_config.layouts,parsed[0]); char *full_layout = yon_char_unite(layout[0],"_",layout[1],NULL);
yon_dictionary_add_or_create_if_exists_with_data(dict,parsed[1],yon_char_new(parsed[2])); gtk_tree_store_append(main_config.layouts_list,&chiter,&iter);
textdomain("iso639");
gtk_tree_store_set(main_config.layouts_list,&chiter,0,full_layout,1,get_localized_layout_name(layout[2]),-1);
textdomain(LocaleName);
free(full_layout);
} }
yon_char_parsed_free(parsed,parsed_size);
} }
main_config.options_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN); main_config.options_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN);
config_str rtn = yon_config_load(get_options_command,&size); rtn = yon_config_load(get_options_command,&size);
for (int i=0; i<size;i++){ for (int i=0; i<size;i++){
int option_size; int option_size;
rtn[i] = yon_char_divide_search(rtn[i],"\n",-1); rtn[i] = yon_char_divide_search(rtn[i],"\n",-1);
@ -418,43 +524,19 @@ void yon_config_init(){
gtk_list_store_append(main_config.options_list,&iter); gtk_list_store_append(main_config.options_list,&iter);
gtk_list_store_set(main_config.options_list,&iter,0,option[0],1,_(option[1]),-1); gtk_list_store_set(main_config.options_list,&iter,0,option[0],1,_(option[1]),-1);
} }
yon_char_parsed_free(rtn,size);
}
void yon_main_window_complete(main_window *widgets){
widgets = yon_remalloc(widgets,sizeof(main_window));
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
gtk_box_pack_start(GTK_BOX(widgets->InterfaceBox),yon_gtk_builder_get_widget(builder,"BoxMain"),1,1,0);
// Custom widgets configuration
{
widgets->KeyboardModelCombo = yon_gtk_builder_get_widget(builder,"KeyboardModelCombo");
widgets->DefaultLayoutRadio = yon_gtk_builder_get_widget(builder,"DefaultLayoutRadio");
widgets->ManualLayoutRadio = yon_gtk_builder_get_widget(builder,"ManualLayoutRadio");
widgets->LayoutTree = yon_gtk_builder_get_widget(builder,"LayoutTree");
widgets->LayoutAddButton = yon_gtk_builder_get_widget(builder,"LayoutAddButton");
widgets->LayoutRemoveButton = yon_gtk_builder_get_widget(builder,"LayoutRemoveButton");
widgets->LayoutChangingCombo = yon_gtk_builder_get_widget(builder,"LayoutChangingCombo");
widgets->OptionsTree = yon_gtk_builder_get_widget(builder,"OptionsTree");
widgets->OptionsEditButton = yon_gtk_builder_get_widget(builder,"OptionsEditButton");
widgets->ScrollLockCheck = yon_gtk_builder_get_widget(builder,"ScrollLockCheck");
widgets->ComposeCheck = yon_gtk_builder_get_widget(builder,"ComposeCheck");
widgets->ManualEntry = yon_gtk_builder_get_widget(builder,"ManualEntry");
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"));
/* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */
// yon_window_config_add_custom_parameter(widgets->HeadInfoLabel,"head-text","label",YON_TYPE_STRING); // yon_window_config_add_custom_parameter(widgets->HeadInfoLabel,"head-text","label",YON_TYPE_STRING);
/* Signal connection | Присоединение сигналов */ /* Signal connection | Присоединение сигналов */
g_signal_connect(G_OBJECT(widgets->LayoutAddButton),"clicked",G_CALLBACK(on_system_layouts_add),widgets); g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_layouts_add),widgets);
g_signal_connect(G_OBJECT(widgets->LayoutRemoveButton),"clicked",G_CALLBACK(on_system_layouts_remove),widgets); g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_layouts_remove),widgets);
g_signal_connect(G_OBJECT(widgets->KeyboardModelCombo),"changed",G_CALLBACK(on_model_changed),widgets); g_signal_connect(G_OBJECT(widgets->ModelCombo),"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->MoveDownButton),"clicked",G_CALLBACK(on_move_down),widgets);
g_signal_connect(G_OBJECT(widgets->NumlockCombo),"changed",G_CALLBACK(on_num_lock_changed),widgets); g_signal_connect(G_OBJECT(widgets->MoveUpButton),"clicked",G_CALLBACK(on_move_up),widgets);
g_signal_connect(G_OBJECT(widgets->OptionsButton),"clicked",G_CALLBACK(on_options_open),widgets);
g_signal_connect(G_OBJECT(widgets->NumLockCombo),"changed",G_CALLBACK(on_num_lock_changed),widgets);
} }
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);
@ -468,8 +550,6 @@ void yon_main_window_complete(main_window *widgets){
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)));
g_hash_table_foreach(main_config.layouts,(GHFunc)yon_layout_build,widgets);
on_config_local_load(NULL,widgets); on_config_local_load(NULL,widgets);
} }
@ -477,7 +557,7 @@ void yon_main_window_complete(main_window *widgets){
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
textdomain (LocaleName); textdomain (LocaleName);
yon_config_init();
yon_ubl_connect_config((_template_config*)&main_config); yon_ubl_connect_config((_template_config*)&main_config);
yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK); yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK);
config_str unfound = NULL; config_str unfound = NULL;

@ -9,6 +9,9 @@
#include <libublsettings.h> #include <libublsettings.h>
#include <libublsettings-gtk3.h> #include <libublsettings-gtk3.h>
#include <libublsettingsui-gtk3.h> #include <libublsettingsui-gtk3.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#ifdef WEBKIT_FOUND #ifdef WEBKIT_FOUND
#include <webkit2/webkit2.h> #include <webkit2/webkit2.h>
#endif #endif
@ -50,7 +53,7 @@
#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 '/<\\/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 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 get_layouts_command "xkbcli list --load-exotic | awk \"\
layout && /description:/ {\ layout && /description:/ {\
match(\\$0, /: *(.*)/, matches);\ match(\\$0, /: *(.*)/, matches);\
description = matches[1];\ description = matches[1];\
@ -80,33 +83,28 @@ typedef struct {
config_str launch_arguments; config_str launch_arguments;
int launch_size; int launch_size;
char *options; char *options;
GtkTreeStore *layouts_store; GtkTreeStore *layouts_list;
GtkListStore *options_list; GtkListStore *options_list;
GtkListStore *models_list;
GHashTable *layouts;
int layouts_size;
config_str layouts_list;
} config; } config;
typedef struct { typedef struct {
template_window_fields template_window_fields
GtkWidget *KeyboardModelCombo; GtkWidget *NumLockCombo;
GtkWidget *DefaultLayoutRadio; GtkWidget *ModelCombo;
GtkWidget *ManualLayoutRadio; GtkWidget *keyboard;
GtkWidget *LayoutTree; GtkWidget *keytable;
GtkWidget *LayoutAddButton; GtkWidget *grp_toggle;
GtkWidget *LayoutRemoveButton; GtkWidget *OptionsEntry;
GtkWidget *LayoutChangingCombo; GtkWidget *OptionsButton;
GtkWidget *OptionsTree; GtkWidget *LayoutsTree;
GtkWidget *OptionsEditButton; GtkWidget *MoveUpButton;
GtkWidget *ScrollLockCheck; GtkWidget *MoveDownButton;
GtkWidget *ComposeCheck; GtkWidget *AddButton;
GtkWidget *ManualEntry; GtkWidget *RemoveButton;
GtkWidget *NumlockCombo;
GtkWidget *TTYLayoutCombo;
GtkTreeModelFilter *layoutsFilter; GtkTreeModelFilter *layoutsFilter;
GtkListStore *LayoutsList; GtkListStore *layoutsList;
GtkListStore *modelsList;
} main_window; } main_window;
@ -157,17 +155,14 @@ 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_add(GtkWidget *self, main_window *widgets);
void on_layouts_accept(GtkWidget *self, dictionary *dict); void on_layouts_accept(GtkWidget *self, dictionary *dict);
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 on_layouts_remove(GtkWidget *, main_window *widgets);
void yon_layouts_save(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); const char *get_localized_layout_name(const char *layout_code);
void yon_layouts_add(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 yon_config_init();
void yon_layout_build(char *key, dictionary *value, main_window *widgets);

@ -12,6 +12,16 @@
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="icon-name">process-stop-symbolic</property> <property name="icon-name">process-stop-symbolic</property>
</object> </object>
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name Name -->
<column type="gchararray"/>
<!-- column-name Id -->
<column type="gchararray"/>
<!-- column-name Chosen -->
<column type="gboolean"/>
</columns>
</object>
<object class="GtkDialog" id="Window"> <object class="GtkDialog" id="Window">
<property name="width-request">450</property> <property name="width-request">450</property>
<property name="height-request">550</property> <property name="height-request">550</property>
@ -75,6 +85,7 @@
<object class="GtkTreeView" id="LayoutsTree"> <object class="GtkTreeView" id="LayoutsTree">
<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">liststore1</property>
<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">
@ -83,7 +94,6 @@
<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>

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save