updated Brazilian translation
[gliv.git] / src / dirty_gtk.c
blob27be07c97a554d21b1d7ec618f8507c0b1f35123
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 #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));
23 return 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)
39 return menu->tearoff;
42 void dirty_gtk_menu_release(DirtyGtkMenu * menu)
44 g_free(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)
56 return window->group;
57 else {
58 static GtkWindowGroup *default_group = NULL;
60 if (!default_group)
61 default_group = gtk_window_group_new();
63 return default_group;
67 static GtkWindowGroup *gtk_main_get_window_group(GtkWidget * widget)
69 GtkWidget *toplevel = NULL;
71 if (widget)
72 toplevel = gtk_widget_get_toplevel(widget);
74 if (toplevel && GTK_IS_WINDOW(toplevel))
75 return _gtk_window_get_group(GTK_WINDOW(toplevel));
76 else
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);
91 g_object_ref(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); */