|
|
|
|
@ -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<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,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<size;i++){
|
|
|
|
|
yon_char_remove_last_symbol(parsed[i],'\n');
|
|
|
|
|
int param_size;
|
|
|
|
|
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(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<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->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_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;
|
|
|
|
|
|
|
|
|
|
@ -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;
|
|
|
|
|
}
|