diff --git a/source/ubl-settings-bootloader-menu.c b/source/ubl-settings-bootloader-menu.c index 9f1a621..3c6d285 100644 --- a/source/ubl-settings-bootloader-menu.c +++ b/source/ubl-settings-bootloader-menu.c @@ -2,110 +2,124 @@ -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->OSDefaultEntry),item->target); - } else { - gtk_entry_set_text(GTK_ENTRY(item->widgets->OSDefaultEntry),DEFAULT_MENU_ITEM_LABEL); +void yon_menu_open_submenu(yon_menu_window *window, yon_menu_item *item){ + int size; + config_str options = yon_config_load(get_menus_entry_command,&size); + for (int i=1;i"); + int name_size; + config_str name_parsed = yon_char_parse(parsed[1],&name_size,">"); + if (yon_char_parsed_check_exist(id_parsed,id_size,item->id)==0){ + yon_menu_item *subitem = yon_menu_add_item(window,parsed[0],name_parsed[1],0); + gtk_list_box_insert(GTK_LIST_BOX(window->ChildrenListBox),subitem->MenuItemRow,-1); + gtk_widget_hide(subitem->ArrowImage); + + } + yon_char_parsed_free(id_parsed,id_size); + yon_char_parsed_free(name_parsed,name_size); + yon_char_parsed_free(parsed,parsed_size); } +} + +void yon_menu_ungrab(yon_menu_window *window){ GdkDisplay *display = gdk_display_get_default(); GdkSeat *seat = gdk_display_get_default_seat(display); - if (item->window->seat_grab) + if (window->seat_grab) gdk_seat_ungrab(seat); else - gtk_grab_remove(item->window->MenuWindow); - gtk_widget_destroy(item->window->MenuWindow); + gtk_grab_remove(window->MenuWindow); + gtk_widget_destroy(window->MenuWindow); +} + +void on_menu_chosen(GtkWidget *, GtkListBoxRow* row, yon_menu_window *window){ + yon_menu_item *item = g_object_get_data(G_OBJECT(row),"yon_menu_item"); + if (item->children){ + yon_menu_open_submenu(window,item); + gtk_widget_show(window->ChildrenRevealer); + gtk_widget_hide(window->ItemsRevealer); + gtk_revealer_set_reveal_child(GTK_REVEALER(window->ItemsRevealer),0); + gtk_revealer_set_reveal_child(GTK_REVEALER(window->ChildrenRevealer),1); + } else { + gtk_entry_set_text(GTK_ENTRY(window->target),item->name); + yon_config_register(GRUB_DEFAULT_parameter,DEFAULT_MENU_ITEM_LABEL,item->id); + yon_menu_ungrab(window); + } } -void on_submenu_open(GtkWidget *,yon_menu_item *item){ - yon_menu_window *window = item->window; +yon_menu_item *yon_menu_add_item(yon_menu_window *target_menu,const char *id, const char *name, int children){ + yon_menu_item *item = yon_menu_item_new(); + item->window=target_menu; + item->children = children; + item->id = yon_char_new(id); + item->name = yon_char_new(name); + gtk_label_set_text(GTK_LABEL(item->MenuTextLabel),item->name); - 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); + // g_signal_connect(G_OBJECT(item->MenuItemRow),"clicked",G_CALLBACK(on_menu_chosen),item); + + g_object_set_data(G_OBJECT(item->MenuItemRow),"yon_menu_item",item); + gtk_widget_show(item->MenuItemRow); + return item; } yon_menu_window *yon_menu_window_open(GtkWidget *, main_window *widgets){ yon_menu_window *window = yon_menu_window_new(); + window->target = widgets->OSDefaultEntry; + g_signal_connect(G_OBJECT(window->ItemsListBox),"row-activated",G_CALLBACK(on_menu_chosen),window); + g_signal_connect(G_OBJECT(window->ChildrenListBox),"row-activated",G_CALLBACK(on_menu_chosen),window); gtk_window_set_transient_for(GTK_WINDOW(window->MenuWindow),GTK_WINDOW(widgets->Window)); { - 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); + yon_menu_item *item = yon_menu_add_item(window,"",DEFAULT_MENU_ITEM_LABEL,0); + gtk_list_box_insert(GTK_LIST_BOX(window->ItemsListBox),item->MenuItemRow,-1); + gtk_widget_hide(item->ArrowImage); } + 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); - } + config_str options = yon_config_load(get_menus_entry_command,&size); + GHashTable *created = g_hash_table_new(g_str_hash,g_str_equal); + for (int i=1;i"))){ + children_id[0]='\0'; + have_children=1; + } + char *children_name; + if ((children_name=strstr(parsed[1],">"))){ + children_name[0]='\0'; + have_children=1; } + if (!g_hash_table_contains(created,parsed[0])){ + g_hash_table_add(created,parsed[0]); + yon_menu_item *item = yon_menu_add_item(window,parsed[0],parsed[1],have_children); + gtk_list_box_insert(GTK_LIST_BOX(window->ItemsListBox),item->MenuItemRow,-1); + if (!have_children){ + gtk_widget_hide(item->ArrowImage); + } + } } + g_hash_table_unref(created); + yon_char_parsed_free(options,size); + gtk_window_set_transient_for(GTK_WINDOW(window->MenuWindow), GTK_WINDOW(widgets->Window)); + int x,y,width; + gtk_widget_realize(window->MenuWindow); 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); + GtkAllocation alloc; + gtk_widget_get_allocation(widgets->MenuButton, &alloc); 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_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) { @@ -122,14 +136,7 @@ gboolean on_menu_clicked(GtkWidget *, GdkEventButton *event, yon_menu_window *wi 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); + yon_menu_ungrab(window); } return 1; @@ -169,11 +176,10 @@ void on_children_clean(GtkWidget*, yon_menu_window *window){ } 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); + 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); } @@ -197,11 +203,9 @@ void on_menu_window_size_reallocated(GtkWidget *self,GtkAllocation *,yon_menu_wi 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->MenuItemRow = yon_gtk_builder_get_widget(builder,"MenuItemRow"); item->MenuTextLabel = yon_gtk_builder_get_widget(builder,"MenuTextLabel"); - item->NextIconButton = yon_gtk_builder_get_widget(builder,"NextIconButton"); - item->children=NULL; + item->ArrowImage = yon_gtk_builder_get_widget(builder,"ArrowImage"); return item; } \ No newline at end of file diff --git a/source/ubl-settings-bootloader.c b/source/ubl-settings-bootloader.c index 8d7a89a..0d62fbc 100644 --- a/source/ubl-settings-bootloader.c +++ b/source/ubl-settings-bootloader.c @@ -649,6 +649,8 @@ 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_save_window_set_postsave_function(on_save_done,widgets); yon_load_proceed(YON_CONFIG_LOCAL); + char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL); + yon_window_config_load(path); yon_interface_update(widgets); } @@ -667,8 +669,6 @@ int main(int argc, char *argv[]){ main_config.launch_arguments=yon_char_parsed_copy(argv,argc); main_config.launch_size=argc; yon_main_window_complete((main_window*)widgets); - char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL); - yon_window_config_load(path); if (getuid()!=0){ textdomain(template_ui_LocaleName); yon_ubl_status_box_render(ROOT_WARNING_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); diff --git a/source/ubl-settings-bootloader.h b/source/ubl-settings-bootloader.h index a4a0837..8fc8d8c 100644 --- a/source/ubl-settings-bootloader.h +++ b/source/ubl-settings-bootloader.h @@ -34,7 +34,7 @@ #define LocaleName "ubl-settings-bootloader" -#define get_menus_entry_command "/usr/lib/ublinux/scripts/grub-functions exec_get_all_menuentry" +#define get_menus_entry_command "/usr/lib/ublinux/scripts/grub-functions exec_get_all_menuentry2" #define check_is_password_hash(password) system(yon_char_unite("/lib/ublinux/functions is_hash_password '", password,"'",NULL)) @@ -183,6 +183,36 @@ typedef struct { char *prev_name; } yon_ringtone_window; +typedef struct +{ + GtkWidget *MenuWindow; + GtkWidget *BackButton; + GtkWidget *ItemsRevealer; + GtkWidget *ItemsListBox; + GtkWidget *ChildrenRevealer; + GtkWidget *ChildrenListBox; + GtkWidget *target; + + int seat_grab; + dictionary *menu_items; + char *cur_selection; + int button_pos_x; + int button_pos_y; +} yon_menu_window; + +typedef struct +{ + GtkWidget *MenuItemRow; + GtkWidget *MenuTextLabel; + GtkWidget *ArrowImage; + + yon_menu_window *window; + + char *name; + char *id; + int children; + +} yon_menu_item; //main void on_save_done(main_window *, config_str output, int size); @@ -232,43 +262,17 @@ yon_ringtone_window *yon_ringtone_window_new(); //menu -typedef struct { - GtkWidget *MenuWindow; - GtkWidget *BackButton; - GtkWidget *ItemsRevealer; - GtkWidget *ItemsListBox; - GtkWidget *ChildrenRevealer; - GtkWidget *ChildrenListBox; - - int seat_grab; - dictionary *menu_items; - char *cur_selection; - int button_pos_x; - int button_pos_y; -} yon_menu_window; - -typedef struct { - GtkWidget *MenuItemBox; - GtkWidget *MenuButton; - GtkWidget *MenuTextLabel; - GtkWidget *NextIconButton; - - char *target; - - main_window *widgets; - yon_menu_window *window; - - dictionary *children; - -} yon_menu_item; - -yon_menu_window *yon_menu_window_open(GtkWidget *target, main_window *widgets); -gboolean on_menu_clicked(GtkWidget *, GdkEventButton *, yon_menu_window *); - yon_menu_window *yon_menu_window_new(); yon_menu_item *yon_menu_item_new(); -void on_menu_window_size_reallocated(GtkWidget *,GtkAllocation *,yon_menu_window *window); -void on_menu_chosen(GtkWidget *, yon_menu_item *item); -void on_submenu_open(GtkWidget *,yon_menu_item *item); +yon_menu_window *yon_menu_window_new(); +void on_menu_window_size_reallocated(GtkWidget *self, GtkAllocation *, yon_menu_window *window); +void on_children_clean(GtkWidget *, yon_menu_window *window); +gboolean yon_on_revealer_switched(yon_menu_window *window); +gboolean on_menu_clicked(GtkWidget *, GdkEventButton *event, yon_menu_window *window); +yon_menu_window *yon_menu_window_open(GtkWidget *, main_window *widgets); +void yon_menu_open_submenu(yon_menu_window *window, yon_menu_item *item); +yon_menu_item *yon_menu_add_item(yon_menu_window *target_menu,const char *id, const char *name, int children); +void yon_menu_ungrab(yon_menu_window *window); +void on_menu_chosen(GtkWidget *, GtkListBoxRow* row, yon_menu_window *window); void on_children_clean(GtkWidget*, yon_menu_window *window); gboolean yon_on_revealer_switched (yon_menu_window *window); void yon_save_window_hide_passwords(template_saving_window *window); diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 1c77658..6be74b9 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -6,7 +6,7 @@ #define BOOT_MENU_LABEL _("Boot menu") #define BOOT_SELECTION_LABEL _("Boot selection menu timer:") #define SECONDS_LABEL _("seconds") -#define DEFAULT_LABEL _("Default") +// #define DEFAULT_LABEL _("Default") #define DEFAULT_OS_LABEL _("Default OS:") #define LOAD_DISPLAY_MODE_LABEL _("Load screen display mode:") #define BOOT_USERS_LABEL _("Boot Menu Users") @@ -28,8 +28,8 @@ #define EDIT_LABEL _("Edit") #define REMOVE_LABEL _("Remove") -#define ACCEPT_LABEL _("Accept") -#define CANCE_LABEL _("Cancel") +// #define ACCEPT_LABEL _("Accept") +// #define CANCE_LABEL _("Cancel") #define BOOT_LOG_LABEL _("Boot animation with log") #define BOOT_NO_LOG_LABEL _("Boot animation without log") diff --git a/ubl-settings-bootloader-menu-item.glade b/ubl-settings-bootloader-menu-item.glade index c9d988a..3f31954 100644 --- a/ubl-settings-bootloader-menu-item.glade +++ b/ubl-settings-bootloader-menu-item.glade @@ -1,69 +1,42 @@ - + - + True - False + True - + True - True - True + False + 5 + + + True + False + label + + + False + True + 0 + + - + True False - 5 - - - True - False - label - - - False - True - 0 - - - - - True - True - False - True - menu1 - right - - - - - - - False - True - end - 1 - - + com.ublinux.libublsettingsui-gtk3.pan-right-symbolic + + False + True + end + 1 + - - - True - True - 0 - diff --git a/ubl-settings-bootloader-menu.glade b/ubl-settings-bootloader-menu.glade index a4205a7..2ba17a5 100644 --- a/ubl-settings-bootloader-menu.glade +++ b/ubl-settings-bootloader-menu.glade @@ -1,5 +1,5 @@ - + @@ -60,6 +60,9 @@ + @@ -166,6 +169,9 @@ Children options were not found +