1 /* Even the GPL header does not want to be associated with "that". */
7 * This is the only way I found to build a menu with N items in O(N)
8 * time instead of O(N²).
11 #define CHILDREN(dirty_menu) GTK_MENU_SHELL((dirty_menu)->gtk_menu)->children
13 DirtyGtkMenu
*dirty_gtk_menu_new(void)
15 DirtyGtkMenu
*menu
= g_new(DirtyGtkMenu
, 1);
17 menu
->gtk_menu
= GTK_MENU(gtk_menu_new());
18 menu
->tearoff
= GTK_TEAROFF_MENU_ITEM(gtk_tearoff_menu_item_new());
20 gtk_menu_append(menu
->gtk_menu
, GTK_WIDGET(menu
->tearoff
));
21 menu
->last_child
= g_list_last(CHILDREN(menu
));
26 void dirty_gtk_menu_append(DirtyGtkMenu
* menu
, GtkWidget
* item
)
28 GList
*children
= CHILDREN(menu
);
30 menu
->last_child
= g_list_last(menu
->last_child
);
31 CHILDREN(menu
) = menu
->last_child
;
33 gtk_menu_shell_append(GTK_MENU_SHELL(menu
->gtk_menu
), item
);
34 CHILDREN(menu
) = children
;
37 GtkTearoffMenuItem
*dirty_gtk_menu_get_tearoff(DirtyGtkMenu
* menu
)
42 void dirty_gtk_menu_release(DirtyGtkMenu
* menu
)
47 /*** ::grab-notify ***/
50 * This is borrowed from gtk+-2, without the gtk_grab_notify() calls.
51 * They slow down things a lot when the images menus are built with many files.
53 GtkWindowGroup
*_gtk_window_get_group(GtkWindow
* window
)
55 if (window
&& window
->group
)
58 static GtkWindowGroup
*default_group
= NULL
;
61 default_group
= gtk_window_group_new();
67 static GtkWindowGroup
*gtk_main_get_window_group(GtkWidget
* widget
)
69 GtkWidget
*toplevel
= NULL
;
72 toplevel
= gtk_widget_get_toplevel(widget
);
74 if (toplevel
&& GTK_IS_WINDOW(toplevel
))
75 return _gtk_window_get_group(GTK_WINDOW(toplevel
));
77 return _gtk_window_get_group(NULL
);
80 void gtk_grab_add(GtkWidget
* widget
)
82 GtkWindowGroup
*group
;
84 g_return_if_fail(widget
!= NULL
);
86 if (!GTK_WIDGET_HAS_GRAB(widget
) && GTK_WIDGET_IS_SENSITIVE(widget
)) {
87 GTK_WIDGET_SET_FLAGS(widget
, GTK_HAS_GRAB
);
89 group
= gtk_main_get_window_group(widget
);
92 group
->grabs
= g_slist_prepend(group
->grabs
, widget
);
94 /* gtk_grab_notify (group, widget, FALSE); */
98 void gtk_grab_remove(GtkWidget
* widget
)
100 GtkWindowGroup
*group
;
102 g_return_if_fail(widget
!= NULL
);
104 if (GTK_WIDGET_HAS_GRAB(widget
)) {
105 GTK_WIDGET_UNSET_FLAGS(widget
, GTK_HAS_GRAB
);
107 group
= gtk_main_get_window_group(widget
);
108 group
->grabs
= g_slist_remove(group
->grabs
, widget
);
110 g_object_unref(widget
);
112 /* gtk_grab_notify (group, widget, TRUE); */