parent
2525224a0f
commit
3de416883a
@ -1,91 +1,190 @@
|
||||
#include "ubl-settings-bootloader.h"
|
||||
|
||||
void on_menu_chosen(GtkWidget *widget, dictionary *dict) {
|
||||
yon_menu_item *item = yon_dictionary_get_data(dict->first, yon_menu_item *);
|
||||
main_window *widgets = yon_dictionary_get_data(dict->first->next, main_window *);
|
||||
gtk_entry_set_text(GTK_ENTRY(widgets->OSEntry), item->target);
|
||||
|
||||
yon_menu_window *window = yon_dictionary_get_data(dict->first->next->next, yon_menu_window *);
|
||||
GdkDisplay *display = gdk_display_get_default();
|
||||
GdkSeat *seat = gdk_display_get_default_seat(display);
|
||||
gdk_seat_ungrab(seat);
|
||||
gtk_widget_destroy(window->MenuWindow);
|
||||
}
|
||||
|
||||
void on_submenu_open(GtkWidget *widget, dictionary *dict) {
|
||||
yon_menu_window *window = yon_dictionary_get_data(dict->first, yon_menu_window *);
|
||||
yon_menu_item *item = yon_dictionary_get_data(dict->first->next, yon_menu_item *);
|
||||
main_window *widgets = yon_dictionary_get_data(dict->first->next->next, main_window *);
|
||||
|
||||
on_children_clean(NULL, window);
|
||||
void on_menu_chosen(GtkWidget *, yon_menu_item *item){
|
||||
gtk_entry_set_text(GTK_ENTRY(item->widgets->OSDefaultEntry),item->target);
|
||||
GdkDisplay *display = gdk_display_get_default();
|
||||
GdkSeat *seat = gdk_display_get_default_seat(display);
|
||||
if (item->window->seat_grab)
|
||||
gdk_seat_ungrab(seat);
|
||||
else
|
||||
gtk_grab_remove(item->window->MenuWindow);
|
||||
gtk_widget_destroy(item->window->MenuWindow);
|
||||
|
||||
}
|
||||
|
||||
void on_submenu_open(GtkWidget *,yon_menu_item *item){
|
||||
yon_menu_window *window = item->window;
|
||||
|
||||
dictionary *dact = NULL;
|
||||
for_dictionaries(dact, item->children) {
|
||||
yon_menu_item *child = yon_dictionary_get_data(dact, yon_menu_item *);
|
||||
gtk_list_box_insert(GTK_LIST_BOX(window->ChildrenListBox), child->MenuItemBox, -1);
|
||||
|
||||
dictionary *child_dict = NULL;
|
||||
yon_dictionary_add_or_create_if_exists_with_data(child_dict, "item", child);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(child_dict, "widgets", widgets);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(child_dict, "window", window);
|
||||
g_signal_connect(G_OBJECT(child->MenuButton), "clicked", G_CALLBACK(on_menu_chosen), child_dict);
|
||||
for_dictionaries(dact,item->children){
|
||||
yon_menu_item *child = yon_dictionary_get_data(dact,yon_menu_item*);
|
||||
gtk_widget_hide(child->NextIconButton);
|
||||
gtk_list_box_insert(GTK_LIST_BOX(window->ChildrenListBox),child->MenuItemBox,-1);
|
||||
g_signal_connect(G_OBJECT(child->MenuButton),"clicked",G_CALLBACK(on_menu_chosen),dact->data);
|
||||
|
||||
}
|
||||
gtk_revealer_set_reveal_child(GTK_REVEALER(item->window->ItemsRevealer),0);
|
||||
gtk_revealer_set_reveal_child(GTK_REVEALER(item->window->ChildrenRevealer),1);
|
||||
gtk_box_set_child_packing(GTK_BOX(gtk_widget_get_parent(window->ChildrenRevealer)),window->ChildrenRevealer,1,1,0,GTK_PACK_START);
|
||||
gtk_box_set_child_packing(GTK_BOX(gtk_widget_get_parent(window->ItemsRevealer)),window->ItemsRevealer,0,0,0,GTK_PACK_START);
|
||||
yon_on_revealer_switched(window);
|
||||
g_signal_connect(G_OBJECT(window->MenuWindow),"size-allocate",G_CALLBACK(on_menu_window_size_reallocated),window);
|
||||
|
||||
gtk_revealer_set_reveal_child(GTK_REVEALER(window->ItemsRevealer), FALSE);
|
||||
gtk_revealer_set_reveal_child(GTK_REVEALER(window->ChildrenRevealer), TRUE);
|
||||
}
|
||||
|
||||
yon_menu_window *yon_menu_window_open(GtkWidget *widget, main_window *widgets) {
|
||||
yon_menu_window *yon_menu_window_open(GtkWidget *, main_window *widgets){
|
||||
yon_menu_window *window = yon_menu_window_new();
|
||||
gtk_window_set_transient_for(GTK_WINDOW(window->MenuWindow),GTK_WINDOW(widgets->Window));
|
||||
int size;
|
||||
config_str parsed = yon_config_load(get_menus_entry_command, &size);
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
yon_char_remove_last_symbol(parsed[i], '\n');
|
||||
config_str parsed = yon_config_load(get_menus_entry_command,&size);
|
||||
for (int i=0;i<size;i++){
|
||||
yon_char_remove_last_symbol(parsed[i],'\n');
|
||||
int param_size;
|
||||
config_str parameter = yon_char_parse(parsed[i], ¶m_size, ">");
|
||||
|
||||
yon_menu_item *item = yon_dictionary_get(window->menu_items, parameter[0]);
|
||||
if (!item) {
|
||||
item = yon_menu_item_new();
|
||||
gtk_widget_hide(item->NextIconButton);
|
||||
gtk_label_set_text(GTK_LABEL(item->MenuTextLabel), parameter[0]);
|
||||
item->target = yon_char_new(parameter[0]);
|
||||
gtk_list_box_insert(GTK_LIST_BOX(window->ItemsListBox), item->MenuItemBox, -1);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(window->menu_items, parameter[0], item);
|
||||
gtk_widget_show(item->MenuItemBox);
|
||||
}
|
||||
|
||||
if (param_size == 2) {
|
||||
if (!item->children) item->children = NULL;
|
||||
config_str parameter = yon_char_parse(parsed[i],¶m_size,">");
|
||||
dictionary * cur_item = NULL;
|
||||
if (param_size==2&&(cur_item=yon_dictionary_get(&window->menu_items,parameter[0]))){
|
||||
yon_menu_item *item = (yon_menu_item*)cur_item->data;
|
||||
yon_menu_item *item_child = yon_menu_item_new();
|
||||
gtk_widget_hide(item_child->NextIconButton);
|
||||
gtk_label_set_text(GTK_LABEL(item_child->MenuTextLabel), parameter[1]);
|
||||
item_child->target = yon_char_new(parameter[1]);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(item->children, parameter[1], item_child);
|
||||
|
||||
dictionary *sub_dict = NULL;
|
||||
yon_dictionary_add_or_create_if_exists_with_data(sub_dict, "window", window);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(sub_dict, "item", item);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(sub_dict, "widgets", widgets);
|
||||
g_signal_connect(G_OBJECT(item->MenuButton), "clicked", G_CALLBACK(on_submenu_open), sub_dict);
|
||||
gtk_label_set_text(GTK_LABEL(item_child->MenuTextLabel),parameter[1]);
|
||||
item_child->target=yon_char_new(parameter[1]);
|
||||
gtk_widget_show(item_child->MenuItemBox);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(item->children,parameter[1],item_child);
|
||||
item_child->widgets=widgets;
|
||||
item_child->window=window;
|
||||
|
||||
} else {
|
||||
dictionary *item_dict = NULL;
|
||||
yon_dictionary_add_or_create_if_exists_with_data(item_dict, "item", item);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(item_dict, "widgets", widgets);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(item_dict, "window", window);
|
||||
g_signal_connect(G_OBJECT(item->MenuButton), "clicked", G_CALLBACK(on_menu_chosen), item_dict);
|
||||
yon_menu_item *item = yon_menu_item_new();
|
||||
item->widgets=widgets;
|
||||
item->window=window;
|
||||
gtk_label_set_text(GTK_LABEL(item->MenuTextLabel),parameter[0]);
|
||||
item->target=yon_char_new(parameter[0]);
|
||||
gtk_list_box_insert(GTK_LIST_BOX(window->ItemsListBox),item->MenuItemBox,-1);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(window->menu_items,parameter[0],item);
|
||||
gtk_widget_show(item->MenuItemBox);
|
||||
if (param_size==2){
|
||||
yon_menu_item *item_child = yon_menu_item_new();
|
||||
gtk_widget_show(item->NextIconButton);
|
||||
gtk_widget_hide(item_child->NextIconButton);
|
||||
gtk_label_set_text(GTK_LABEL(item_child->MenuTextLabel),parameter[1]);
|
||||
item_child->target=yon_char_new(parameter[1]);
|
||||
gtk_widget_show(item_child->MenuItemBox);
|
||||
item_child->widgets=widgets;
|
||||
item_child->window=window;
|
||||
g_signal_connect(G_OBJECT(item->MenuButton),"clicked",G_CALLBACK(on_submenu_open),item);
|
||||
yon_dictionary_add_or_create_if_exists_with_data(item->children,parameter[1],item_child);
|
||||
} else {
|
||||
gtk_widget_hide(item->NextIconButton);
|
||||
g_signal_connect(G_OBJECT(item->MenuButton),"clicked",G_CALLBACK(on_menu_chosen),item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int x, y, x2, y2, width;
|
||||
gdk_window_get_position(gtk_widget_get_window(widgets->MenuButton), &x, &y);
|
||||
gtk_widget_translate_coordinates(widgets->MenuButton, widgets->Window, x, y, &x2, &y2);
|
||||
gtk_window_get_size(GTK_WINDOW(window->MenuWindow), &width, NULL);
|
||||
gtk_window_get_position(GTK_WINDOW(widgets->Window), &x, &y);
|
||||
gtk_window_move(GTK_WINDOW(window->MenuWindow), x + x2 - width, y + y2);
|
||||
}
|
||||
int x,y,width;
|
||||
gdk_window_get_position(gtk_widget_get_window(widgets->MenuButton),&x,&y);
|
||||
gtk_widget_translate_coordinates(widgets->MenuButton,widgets->Window,x,y,&window->button_pos_x,&window->button_pos_y);
|
||||
gtk_window_get_size(GTK_WINDOW(window->MenuWindow),&width,NULL);
|
||||
gtk_window_get_position(GTK_WINDOW(widgets->Window),&x,&y);
|
||||
gtk_window_move(GTK_WINDOW(window->MenuWindow),x+window->button_pos_x-width,y+window->button_pos_y);
|
||||
gtk_widget_realize(window->MenuWindow);
|
||||
gtk_widget_show(window->MenuWindow);
|
||||
gdk_seat_grab(gdk_display_get_default_seat(gdk_display_get_default()), gtk_widget_get_window(window->MenuWindow), GDK_SEAT_CAPABILITY_POINTER, TRUE, NULL, NULL, NULL, NULL);
|
||||
GdkGrabStatus status = gdk_seat_grab(gdk_display_get_default_seat(gdk_display_get_default()),gtk_widget_get_window(window->MenuWindow),GDK_SEAT_CAPABILITY_POINTER,TRUE,NULL,NULL,NULL,NULL);
|
||||
if (status != GDK_GRAB_SUCCESS) {
|
||||
window->seat_grab=0;
|
||||
gtk_grab_add(window->MenuWindow);
|
||||
} else {
|
||||
window->seat_grab=1;
|
||||
}
|
||||
return window;
|
||||
}
|
||||
|
||||
gboolean on_menu_clicked(GtkWidget *, GdkEventButton *event, yon_menu_window *window){
|
||||
int x,y,width,height;
|
||||
gtk_window_get_size(GTK_WINDOW(window->MenuWindow),&width,&height);
|
||||
gtk_window_get_position(GTK_WINDOW(window->MenuWindow),&x,&y);
|
||||
if (event->x_root<x||event->y_root<y||event->x_root>x+width||event->y_root>y+height){
|
||||
|
||||
GdkDisplay *display = gdk_display_get_default();
|
||||
GdkSeat *seat = gdk_display_get_default_seat(display);
|
||||
if (window->seat_grab)
|
||||
gdk_seat_ungrab(seat);
|
||||
else
|
||||
gtk_grab_remove(window->MenuWindow);
|
||||
gtk_widget_destroy(window->MenuWindow);
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
gboolean yon_on_revealer_switched (yon_menu_window *window){
|
||||
if (gtk_revealer_get_reveal_child(GTK_REVEALER(window->ItemsRevealer))){
|
||||
gtk_widget_hide(window->ChildrenRevealer);
|
||||
gtk_widget_show(window->ItemsRevealer);
|
||||
} else {
|
||||
gtk_widget_hide(window->ItemsRevealer);
|
||||
gtk_widget_show(window->ChildrenRevealer);
|
||||
|
||||
}
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
void on_children_clean(GtkWidget*, yon_menu_window *window){
|
||||
GList *list = gtk_container_get_children(GTK_CONTAINER(window->ChildrenListBox));
|
||||
list = g_list_last(list);
|
||||
for (guint i=0;i<g_list_length(list);i++){
|
||||
GList *item = gtk_container_get_children(GTK_CONTAINER(list->data));
|
||||
g_object_ref(G_OBJECT(item->data));
|
||||
gtk_container_remove(GTK_CONTAINER(list->data),GTK_WIDGET(item->data));
|
||||
gtk_widget_destroy(GTK_WIDGET(list->data));
|
||||
g_list_free(item);
|
||||
list=list->prev;
|
||||
}
|
||||
|
||||
gtk_revealer_set_reveal_child(GTK_REVEALER(window->ItemsRevealer),1);
|
||||
gtk_revealer_set_reveal_child(GTK_REVEALER(window->ChildrenRevealer),0);
|
||||
gtk_box_set_child_packing(GTK_BOX(gtk_widget_get_parent(window->ItemsRevealer)),window->ItemsRevealer,1,1,0,GTK_PACK_START);
|
||||
yon_on_revealer_switched(window);
|
||||
g_signal_connect(G_OBJECT(window->MenuWindow),"size-allocate",G_CALLBACK(on_menu_window_size_reallocated),window);
|
||||
gtk_box_set_child_packing(GTK_BOX(gtk_widget_get_parent(window->ChildrenRevealer)),window->ChildrenRevealer,0,0,0,GTK_PACK_START);
|
||||
|
||||
}
|
||||
|
||||
void on_menu_window_size_reallocated(GtkWidget *self,GtkAllocation *,yon_menu_window *window){
|
||||
|
||||
int x,y,width;
|
||||
gtk_window_get_size(GTK_WINDOW(window->MenuWindow),&width,NULL);
|
||||
gtk_window_get_position(GTK_WINDOW(gtk_window_get_transient_for(GTK_WINDOW(window->MenuWindow))),&x,&y);
|
||||
gtk_window_move(GTK_WINDOW(window->MenuWindow),x+window->button_pos_x-width,y+window->button_pos_y);
|
||||
g_signal_handlers_disconnect_by_func(self,on_menu_window_size_reallocated,window);
|
||||
}
|
||||
|
||||
yon_menu_window *yon_menu_window_new(){
|
||||
yon_menu_window *window = new(yon_menu_window);
|
||||
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_menu_window);
|
||||
window->MenuWindow = yon_gtk_builder_get_widget(builder,"MainWindow");
|
||||
window->ItemsRevealer = yon_gtk_builder_get_widget(builder,"ItemsRevealer");
|
||||
window->BackButton = yon_gtk_builder_get_widget(builder,"BackButton");
|
||||
window->ItemsListBox = yon_gtk_builder_get_widget(builder,"ItemsListBox");
|
||||
window->ChildrenRevealer = yon_gtk_builder_get_widget(builder,"ChildrenRevealer");
|
||||
window->ChildrenListBox = yon_gtk_builder_get_widget(builder,"ChildrenListBox");
|
||||
|
||||
window->menu_items=NULL;
|
||||
|
||||
g_signal_connect(G_OBJECT(window->BackButton),"clicked",G_CALLBACK(on_children_clean),window);
|
||||
g_signal_connect(G_OBJECT(window->MenuWindow),"button-press-event",G_CALLBACK(on_menu_clicked),window);
|
||||
return window;
|
||||
}
|
||||
|
||||
yon_menu_item *yon_menu_item_new(){
|
||||
yon_menu_item *item = new(yon_menu_item);
|
||||
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_menu_item);
|
||||
item->MenuItemBox = yon_gtk_builder_get_widget(builder,"MenuItemBox");
|
||||
item->MenuButton = yon_gtk_builder_get_widget(builder,"MenuButton");
|
||||
item->MenuTextLabel = yon_gtk_builder_get_widget(builder,"MenuTextLabel");
|
||||
item->NextIconButton = yon_gtk_builder_get_widget(builder,"NextIconButton");
|
||||
item->children=NULL;
|
||||
|
||||
return item;
|
||||
}
|
||||
Loading…
Reference in new issue