You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ubl-settings-keyboard/source/ubl-settings-keyboard-layou...

236 lines
9.8 KiB

#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)){
char *layout, *variant;
gtk_tree_model_get(model,&iter,0,&layout,1,&variant,-1);
if (!yon_char_is_empty(variant)){
char *temp = yon_char_unite(layout,"_",variant,NULL);
free(layout);
layout = temp;
}
yon_config_remove_element(keyboard_layout_parameter,layout,",");
}
yon_interface_update(widgets);
}
void on_system_layouts_remove(GtkWidget *, main_window *widgets){
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);
}
void on_layout_move_up(GtkWidget *, main_window *widgets){
GtkTreeModel *model;
GtkTreeIter iter,*previter;
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutTree)),&model,&iter)){
previter = gtk_tree_iter_copy(&iter);
if (!gtk_tree_model_iter_previous(model,previter)) return;
char *a, *b;
gtk_tree_model_get(model,&iter,0,&a,-1);
gtk_tree_model_get(model,previter,0,&b,-1);
char *layouts = config(keyboard_layout_parameter);
char *temp = yon_char_swap_element(layouts,a,b,",");
yon_config_register(keyboard_layout_parameter,keyboard_layout_parameter_command,temp);
free(temp);
gtk_list_store_swap(widgets->LayoutsList,&iter,previter);
gtk_tree_iter_free(previter);
}
}
void on_layout_move_down(GtkWidget *, main_window *widgets){
GtkTreeModel *model;
GtkTreeIter iter,*nextiter;
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutTree)),&model,&iter)){
nextiter = gtk_tree_iter_copy(&iter);
if (!gtk_tree_model_iter_next(model,nextiter)) return;
char *a, *b;
gtk_tree_model_get(model,&iter,0,&a,-1);
gtk_tree_model_get(model,nextiter,0,&b,-1);
char *layouts = config(keyboard_layout_parameter);
char *temp = yon_char_swap_element(layouts,a,b,",");
yon_config_register(keyboard_layout_parameter,keyboard_layout_parameter_command,temp);
free(temp);
gtk_list_store_swap(widgets->LayoutsList,&iter,nextiter);
gtk_tree_iter_free(nextiter);
}
}
// void on_layout_dnd_inserted(GtkTreeModel *, GtkTreePath* , GtkTreeIter* iter, main_window *widgets){
// char *target;
// gtk_tree_model_get(GTK_TREE_MODEL(widgets->LayoutsList),iter,0,&target,-1);
// }
// void on_layout_dnd_deleted(GtkTreeModel *, GtkTreePath* , GtkTreeIter* iter, main_window *widgets){
// char *target;
// gtk_tree_model_get(GTK_TREE_MODEL(widgets->LayoutsList),iter,0,&target,-1);
// printf("%s\n",target);
// }