diff --git a/source/libublsettings-gtk3.c b/source/libublsettings-gtk3.c index 4da29c8..0c92053 100644 --- a/source/libublsettings-gtk3.c +++ b/source/libublsettings-gtk3.c @@ -4,6 +4,7 @@ static render_data render; +// vte section #ifdef VTE_INCLUDE static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data) @@ -101,7 +102,7 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end gtk_widget_show_all(terminal); } #endif - // Window config functions + // Window config section #define check_window_config_setup if(__yon_window_config_target_window) @@ -433,6 +434,7 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end yon_window_config_add_instant_parameter(yon_char_append(window_name,"PosY"),"window",&Y,YON_TYPE_INT); } +// gtk misc section GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){ GtkWidget *menu_item = gtk_menu_item_new(); gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom"); @@ -461,9 +463,6 @@ GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname){ return menu_item; } - -// other Gtk functions - int yon_gtk_combo_box_fill(GtkWidget *combo, config_str parameters,int size){ if (combo&¶meters){ for (int i=0;i-1){ gtk_widget_hide(gtk_widget_get_toplevel(main_window)); @@ -858,7 +859,7 @@ void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWi } gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"inherited"); gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window); - gtk_box_pack_end(GTK_BOX(box),left_window,0,0,5); + gtk_box_pack_start(GTK_BOX(box),left_window,0,0,5); } if (socket_right_id>-1&&right_window){ plug_right=gtk_plug_new(socket_right_id); @@ -881,7 +882,7 @@ void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWi } gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"inherited"); gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window); - gtk_box_pack_start(GTK_BOX(box),right_window,0,0,5); + gtk_box_pack_end(GTK_BOX(box),right_window,0,0,5); } g_object_ref(main_window); gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(main_window)),main_window); @@ -890,6 +891,7 @@ void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWi } } +// webkit section #ifdef WEBKIT_INCLUDE void yon_ubl_browser_window_open(char *link, char *browser_window_name){ @@ -918,4 +920,82 @@ void yon_ubl_browser_window_open(char *link, char *browser_window_name){ yon_launch(command); } #endif + +// rmb menu section +gboolean on_rmb_menu_open(GtkWidget *self,GdkEventButton *event, rmb_menu_window *window){ + if (self){}; + if (event->button==3){ + + gtk_widget_show_all(window->menu); + gtk_menu_popup_at_pointer(GTK_MENU(window->menu),NULL); + return 0; + } + return 0; +} + +rmb_menu_window *yon_rmb_menu_new(){ + rmb_menu_window *window = malloc(sizeof(rmb_menu_window)); + window->menu=gtk_menu_new(); + gtk_menu_set_reserve_toggle_size(GTK_MENU(window->menu),0); + window->buttons=NULL; + + return window; +} + +rmb_menu_window *yon_rmb_menu_setup(GtkWidget *target_widget, const char *button_label, const char *icon_name, GCallback function, gpointer data,...){ + if (target_widget){ + rmb_menu_window *window = yon_rmb_menu_new(); + { + GtkWidget *menu_item = gtk_menu_item_new(); + GtkWidget *content_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + gtk_container_add(GTK_CONTAINER(menu_item),content_box); + + GtkWidget *image=NULL; + if (!yon_char_is_empty(icon_name)){ + image=gtk_image_new_from_icon_name(icon_name,GTK_ICON_SIZE_BUTTON); + gtk_box_pack_start(GTK_BOX(content_box),image,0,0,0); + gtk_widget_show(image); + } + + GtkWidget *label = gtk_label_new(button_label); + gtk_box_pack_start(GTK_BOX(content_box),label,0,0,0); + + if (function){ + g_signal_connect(G_OBJECT(menu_item),"activate",function,data); + } + yon_dictionary_add_or_create_if_exists_with_data(window->buttons,(char*)button_label,menu_item); + gtk_menu_shell_append(GTK_MENU_SHELL(window->menu),menu_item); + } + va_list list; + va_start(list,data); + const char *current_label, *current_icon; + GCallback current_function; + gpointer *current_data; + while ((current_label=va_arg(list,const char*))){ + current_icon=va_arg(list,const char*); + current_function=va_arg(list,GCallback); + current_data=va_arg(list,gpointer); + GtkWidget *menu_item = gtk_menu_item_new(); + GtkWidget *content_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + gtk_container_add(GTK_CONTAINER(menu_item),content_box); + + GtkWidget *image=NULL; + if (!yon_char_is_empty(current_icon)){ + image=gtk_image_new_from_icon_name(current_icon,GTK_ICON_SIZE_BUTTON); + gtk_box_pack_start(GTK_BOX(content_box),image,0,0,0); + gtk_widget_show(image); + } + + GtkWidget *label = gtk_label_new(current_label); + gtk_box_pack_start(GTK_BOX(content_box),label,0,0,0); + + if (current_function){ + g_signal_connect(G_OBJECT(menu_item),"activate",current_function,current_data); + } + yon_dictionary_add_or_create_if_exists_with_data(window->buttons,(char*)current_label,menu_item); + gtk_menu_shell_append(GTK_MENU_SHELL(window->menu),menu_item); + } + g_signal_connect(G_OBJECT(target_widget),"button-press-event",G_CALLBACK(on_rmb_menu_open),window); + } +} #endif \ No newline at end of file diff --git a/source/libublsettings-gtk3.h b/source/libublsettings-gtk3.h index 2a1f2d5..9881ded 100644 --- a/source/libublsettings-gtk3.h +++ b/source/libublsettings-gtk3.h @@ -425,4 +425,11 @@ void yon_ubl_browser_window_open(char *link, char *browser_window_name); void yon_ubl_browser_window_open(char *link, char *browser_window_name); #endif #endif +// rmb menu section +typedef struct { + GtkWidget *menu; + dictionary *buttons; +} rmb_menu_window; + +rmb_menu_window *yon_rmb_menu_setup(GtkWidget *target_widget, const char *button_label, const char *icon_name, GCallback function, gpointer data,...); #endif \ No newline at end of file