diff --git a/gresource.xml b/gresource.xml
index 7c8474c..73c5f37 100644
--- a/gresource.xml
+++ b/gresource.xml
@@ -8,6 +8,9 @@
ubinstall-gtk-documentation.glade
ubinstall-gtk-log-view.glade
ubinstall-gtk-warning.glade
+ ubinstall-gtk-user.glade
+ ubinstall-gtk-menu.glade
+ ubinstall-gtk-menu-item.glade
ubinstall-gtk.css
diff --git a/source/ubinstall-gtk-bootloader.c b/source/ubinstall-gtk-bootloader.c
index 367d126..c412aad 100644
--- a/source/ubinstall-gtk-bootloader.c
+++ b/source/ubinstall-gtk-bootloader.c
@@ -24,4 +24,212 @@ int yon_bootloader_save(main_window *widgets){
// yon_config_remove_by_key();
}
return 1;
+}
+void on_menu_chosen(GtkWidget *, yon_menu_item *item){
+ if (strcmp(item->target,DEFAULT_MENU_ITEM_LABEL)){
+ gtk_entry_set_text(GTK_ENTRY(item->widgets->BootloadDefaultOSEntry),item->target);
+ } else {
+ gtk_entry_set_text(GTK_ENTRY(item->widgets->BootloadDefaultOSEntry),DEFAULT_MENU_ITEM_LABEL);
+ }
+ 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->MainWindow));
+ {
+ yon_menu_item *item = yon_menu_item_new();
+ item->widgets=widgets;
+ item->window=window;
+ item->children=NULL;
+ gtk_label_set_text(GTK_LABEL(item->MenuTextLabel),DEFAULT_MENU_ITEM_LABEL);
+ item->target=yon_char_new(DEFAULT_MENU_ITEM_LABEL);
+ gtk_list_box_insert(GTK_LIST_BOX(window->ItemsListBox),item->MenuItemBox,-1);
+ yon_dictionary_add_or_create_if_exists_with_data(window->menu_items,DEFAULT_MENU_ITEM_LABEL,item);
+ gtk_widget_show(item->MenuItemBox);
+ gtk_widget_hide(item->NextIconButton);
+ g_signal_connect(G_OBJECT(item->MenuButton),"clicked",G_CALLBACK(on_menu_chosen),item);
+ }
+ 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(parsed[i]);
+ 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(parsed[i]);
+ 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(parsed[i]);
+ 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);
+ }
+ }
+
+ }
+ gtk_window_set_transient_for(GTK_WINDOW(window->MenuWindow), GTK_WINDOW(widgets->MainWindow));
+
+ int x,y,width;
+ gtk_widget_realize(window->MenuWindow);
+ gdk_window_get_position(gtk_widget_get_window(widgets->BootloadDefaulOSButton),&x,&y);
+ gtk_widget_translate_coordinates(widgets->BootloadDefaulOSButton,widgets->MainWindow,x,y,&window->button_pos_x,&window->button_pos_y);
+ gtk_window_get_size(GTK_WINDOW(window->MenuWindow),&width,NULL);
+ GtkAllocation alloc;
+ gtk_widget_get_allocation(widgets->BootloadDefaulOSButton, &alloc);
+ gtk_window_get_position(GTK_WINDOW(widgets->MainWindow),&x,&y);
+ gtk_window_move(GTK_WINDOW(window->MenuWindow),window->button_pos_x-width,window->button_pos_y);
+ 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),window->button_pos_x-width,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;
}
\ No newline at end of file
diff --git a/ubinstall-gtk-menu-item.glade b/ubinstall-gtk-menu-item.glade
new file mode 100644
index 0000000..c9d988a
--- /dev/null
+++ b/ubinstall-gtk-menu-item.glade
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
diff --git a/ubinstall-gtk-menu.glade b/ubinstall-gtk-menu.glade
new file mode 100644
index 0000000..a4205a7
--- /dev/null
+++ b/ubinstall-gtk-menu.glade
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+