Bug fixed in "Open current image folder", make sure every image has
[gliv.git] / src / dirty_gtk.c
blob63beb4af0aa36ff508e4e7cc7281a30bece4f250
1 /* Even the GPL header does not want to be associated with "that". */
3 #include "gliv.h"
4 #include "dirty_gtk.h"
6 /*
7 * This is the only way I found to build a menu with N items in O(N)
8 * time instead of O(N²).
9 */
11 DirtyGtkMenu *dirty_gtk_menu_new(void)
13 DirtyGtkMenu *menu = g_new(DirtyGtkMenu, 1);
15 menu->gtk_menu_shell = GTK_MENU_SHELL(gtk_menu_new());
16 menu->last_child = NULL;
17 menu->tearoff = GTK_TEAROFF_MENU_ITEM(gtk_tearoff_menu_item_new());
19 dirty_gtk_menu_append(menu, GTK_WIDGET(menu->tearoff));
21 return menu;
24 void dirty_gtk_menu_append(DirtyGtkMenu * menu, GtkWidget * item)
26 GList *children = menu->gtk_menu_shell->children;
28 menu->last_child = g_list_last(menu->gtk_menu_shell->children);
29 menu->gtk_menu_shell->children = menu->last_child;
31 gtk_menu_shell_append(menu->gtk_menu_shell, item);
32 if (children != NULL)
33 menu->gtk_menu_shell->children = children;
36 GtkTearoffMenuItem *dirty_gtk_menu_get_tearoff(DirtyGtkMenu * menu)
38 return menu->tearoff;
41 void dirty_gtk_menu_release(DirtyGtkMenu * menu)
43 g_free(menu);
46 /*** ::grab-notify ***/
49 * This is borrowed from gtk+-2, without the gtk_grab_notify() calls.
50 * They slow down things a lot when the images menus are built with many files.
52 GtkWindowGroup *_gtk_window_get_group(GtkWindow * window)
54 if (window && window->group)
55 return window->group;
56 else {
57 static GtkWindowGroup *default_group = NULL;
59 if (!default_group)
60 default_group = gtk_window_group_new();
62 return default_group;
66 static GtkWindowGroup *gtk_main_get_window_group(GtkWidget * widget)
68 GtkWidget *toplevel = NULL;
70 if (widget)
71 toplevel = gtk_widget_get_toplevel(widget);
73 if (toplevel && GTK_IS_WINDOW(toplevel))
74 return _gtk_window_get_group(GTK_WINDOW(toplevel));
75 else
76 return _gtk_window_get_group(NULL);
79 void gtk_grab_add(GtkWidget * widget)
81 GtkWindowGroup *group;
83 g_return_if_fail(widget != NULL);
85 if (!GTK_WIDGET_HAS_GRAB(widget) && GTK_WIDGET_IS_SENSITIVE(widget)) {
86 GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_GRAB);
88 group = gtk_main_get_window_group(widget);
90 g_object_ref(widget);
91 group->grabs = g_slist_prepend(group->grabs, widget);
93 /* gtk_grab_notify (group, widget, FALSE); */
97 void gtk_grab_remove(GtkWidget * widget)
99 GtkWindowGroup *group;
101 g_return_if_fail(widget != NULL);
103 if (GTK_WIDGET_HAS_GRAB(widget)) {
104 GTK_WIDGET_UNSET_FLAGS(widget, GTK_HAS_GRAB);
106 group = gtk_main_get_window_group(widget);
107 group->grabs = g_slist_remove(group->grabs, widget);
109 g_object_unref(widget);
111 /* gtk_grab_notify (group, widget, TRUE); */