diff options
author | Havoc Pennington <hp@pobox.com> | 2001-10-25 04:18:08 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2001-10-25 04:18:08 +0000 |
commit | 02621329b44fa06133ef92232d92f32ccbeefc91 (patch) | |
tree | 9cb2d1222efca0155a4604e491212c651b03ef64 /libwnck/window-action-menu.c | |
parent | bcba045da2a3174f2a92c081be9fcdda797b5ecd (diff) | |
download | libwnck-02621329b44fa06133ef92232d92f32ccbeefc91.tar.gz |
right-click menu
2001-10-25 Havoc Pennington <hp@pobox.com>
* libwnck/pager.c: right-click menu
* libwnck/window-menu.c: fix weak ref stuff
* libwnck/window-action-menu.c (wnck_create_window_action_menu):
fix a weak ref
* libwnck/window.c (_wnck_window_create): initially update actions
Diffstat (limited to 'libwnck/window-action-menu.c')
-rw-r--r-- | libwnck/window-action-menu.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/libwnck/window-action-menu.c b/libwnck/window-action-menu.c index 3836ac2..854bfd1 100644 --- a/libwnck/window-action-menu.c +++ b/libwnck/window-action-menu.c @@ -40,6 +40,7 @@ typedef struct _ActionMenuData ActionMenuData; struct _ActionMenuData { WnckWindow *window; + GtkWidget *menu; GtkWidget *close_item; GtkWidget *minimize_item; GtkWidget *maximize_item; @@ -49,11 +50,29 @@ struct _ActionMenuData guint idle_handler; }; +static void object_weak_notify (gpointer data, + GObject *obj); +static void window_weak_notify (gpointer data, + GObject *window); + static void window_weak_notify (gpointer data, GObject *window) { g_object_set_data (G_OBJECT (data), "wnck-action-data", NULL); + g_object_weak_unref (G_OBJECT (data), + object_weak_notify, + window); +} + + +static void +object_weak_notify (gpointer data, + GObject *obj) +{ + g_object_weak_unref (G_OBJECT (data), + window_weak_notify, + obj); } static void @@ -62,7 +81,10 @@ set_data (GObject *obj, { g_object_set_data (obj, "wnck-action-data", amd); if (amd && amd->window) - g_object_weak_ref (G_OBJECT (amd->window), window_weak_notify, obj); + { + g_object_weak_ref (G_OBJECT (amd->window), window_weak_notify, obj); + g_object_weak_ref (obj, object_weak_notify, amd->window); + } } static ActionMenuData* @@ -244,6 +266,14 @@ amd_free (ActionMenuData *amd) g_free (amd); } +/** + * wnck_create_window_action_menu: + * @window: a #WnckWindow + * + * Creates a menu of window operations for @window. + * + * Return value: a new menu of window operations + **/ GtkWidget* wnck_create_window_action_menu (WnckWindow *window) { @@ -254,11 +284,13 @@ wnck_create_window_action_menu (WnckWindow *window) amd->window = window; menu = gtk_menu_new (); - + amd->menu = menu; + g_object_set_data_full (G_OBJECT (menu), "wnck-action-data", amd, (GDestroyNotify) amd_free); - g_object_weak_ref (G_OBJECT (menu), window_weak_notify, menu); + g_object_weak_ref (G_OBJECT (window), window_weak_notify, menu); + g_object_weak_ref (G_OBJECT (menu), object_weak_notify, window); amd->close_item = make_menu_item (amd, CLOSE); |