@ -161,103 +161,113 @@ void on_bootloader_user_add(GtkWidget *, main_window *widgets){
gtk_widget_show ( window - > Window ) ;
}
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 ) ;
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 < size ; i + + ) {
yon_char_remove_last_symbol ( options [ i ] , ' \n ' ) ;
int parsed_size ;
config_str parsed = yon_char_parse ( options [ i ] , & parsed_size , " ; " ) ;
int id_size ;
config_str id_parsed = yon_char_parse ( parsed [ 0 ] , & id_size , " > " ) ;
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 , GRUB_DEFAULT_parameter_command , 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 ) ;
// g_signal_connect(G_OBJECT(item->MenuItemRow),"clicked",G_CALLBACK(on_menu_chosen),item);
}
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_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 - > BootloadDefaultOSEntry ;
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 - > 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 < size ; i + + ) {
yon_char_remove_last_symbol ( parsed [ i ] , ' \n ' ) ;
int param_size ;
config_str parameter = yon_char_parse ( parsed [ i ] , & param_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 ( 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 ) ;
}
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 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 < size ; i + + ) {
yon_char_remove_last_symbol ( options [ i ] , ' \n ' ) ;
int parsed_size ;
config_str parsed = yon_char_parse ( options [ i ] , & parsed_size , " ; " ) ;
int have_children = 0 ;
char * children_id ;
if ( ( children_id = strstr ( parsed [ 0 ] , " > " ) ) ) {
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 - > MainWindow ) ) ;
int x , y , width ;
@ -270,10 +280,11 @@ yon_menu_window *yon_menu_window_open(GtkWidget *, main_window *widgets){
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 ) ;
GdkGrabStatus status = GDK_GRAB_SUCCESS ;
// 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 ) ;
// gtk_grab_add(window->MenuWindow);
} else {
window - > seat_grab = 1 ;
}
@ -285,14 +296,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_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 ) ;
yon_menu_ungrab ( window ) ;
}
return 1 ;
@ -359,11 +363,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 ;
}