summaryrefslogtreecommitdiff
path: root/libwnck/window-action-menu.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@pobox.com>2001-10-25 04:18:08 +0000
committerHavoc Pennington <hp@src.gnome.org>2001-10-25 04:18:08 +0000
commit02621329b44fa06133ef92232d92f32ccbeefc91 (patch)
tree9cb2d1222efca0155a4604e491212c651b03ef64 /libwnck/window-action-menu.c
parentbcba045da2a3174f2a92c081be9fcdda797b5ecd (diff)
downloadlibwnck-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.c38
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);