#include "ubl-settings-bootloader.h" 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_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); } 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"); 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]); 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 { 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,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); 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_rooty_rootx_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;idata)); 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; }