summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorMichael Natterer <mitch@imendio.com>2007-06-13 15:21:10 +0000
committerMichael Natterer <mitch@src.gnome.org>2007-06-13 15:21:10 +0000
commitece25ff10cd1b23e95b56498b523ed55c8441589 (patch)
tree5523d147638fee5b7d606be933f290ffd9a26d60 /gtk
parent5c48e783d463b07fb3dfe2d8a16d3ab3b6180763 (diff)
downloadgtk+-ece25ff10cd1b23e95b56498b523ed55c8441589.tar.gz
add "submenu" property. Fix gtk_menu_item_set_submenu() to accept NULL
2007-06-13 Michael Natterer <mitch@imendio.com> * gtk/gtkmenuitem.[ch]: add "submenu" property. Fix gtk_menu_item_set_submenu() to accept NULL submenus and deprecate gtk_menu_item_remove_submenu() because we have a properly working setter now (bug #447065). * gtk/gtk.symbols: deprecate gtk_menu_item_remove_submenu(). * gtk/gtkcombobox.c: use gtk_menu_item_set_submenu() instead of gtk_menu_item_remove_submenu(). svn path=/trunk/; revision=18125
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtk.symbols4
-rw-r--r--gtk/gtkcombobox.c2
-rw-r--r--gtk/gtkmenuitem.c139
-rw-r--r--gtk/gtkmenuitem.h2
4 files changed, 118 insertions, 29 deletions
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 8b69a9efcb..4722f0f3cb 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -2290,13 +2290,15 @@ gtk_menu_item_get_type G_GNUC_CONST
gtk_menu_item_new
gtk_menu_item_new_with_label
gtk_menu_item_new_with_mnemonic
-gtk_menu_item_remove_submenu
gtk_menu_item_select
gtk_menu_item_set_accel_path
gtk_menu_item_set_right_justified
gtk_menu_item_set_submenu
gtk_menu_item_toggle_size_allocate
gtk_menu_item_toggle_size_request
+#ifndef GTK_DISABLE_DEPRECATED
+gtk_menu_item_remove_submenu
+#endif
#endif
#endif
diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index 93e6b924cf..cb92de5c52 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -3382,7 +3382,7 @@ gtk_combo_box_menu_row_deleted (GtkTreeModel *model,
{
parent = find_menu_by_path (combo_box->priv->popup_widget,
parent_path, FALSE);
- gtk_menu_item_remove_submenu (GTK_MENU_ITEM (parent));
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (parent), NULL);
}
}
}
diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c
index 11c5b34d55..30698624f3 100644
--- a/gtk/gtkmenuitem.c
+++ b/gtk/gtkmenuitem.c
@@ -50,9 +50,22 @@ enum {
LAST_SIGNAL
};
+enum {
+ PROP_0,
+ PROP_SUBMENU
+};
-static void gtk_menu_item_destroy (GtkObject *object);
+
+static void gtk_menu_item_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void gtk_menu_item_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
static void gtk_menu_item_finalize (GObject *object);
+static void gtk_menu_item_destroy (GtkObject *object);
static void gtk_menu_item_size_request (GtkWidget *widget,
GtkRequisition *requisition);
static void gtk_menu_item_size_allocate (GtkWidget *widget,
@@ -108,6 +121,8 @@ gtk_menu_item_class_init (GtkMenuItemClass *klass)
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
GtkItemClass *item_class = GTK_ITEM_CLASS (klass);
+ gobject_class->set_property = gtk_menu_item_set_property;
+ gobject_class->get_property = gtk_menu_item_get_property;
gobject_class->finalize = gtk_menu_item_finalize;
object_class->destroy = gtk_menu_item_destroy;
@@ -176,6 +191,21 @@ gtk_menu_item_class_init (GtkMenuItemClass *klass)
G_TYPE_NONE, 1,
G_TYPE_INT);
+ /**
+ * GtkMenuItem:submenu:
+ *
+ * The submenu attached to the menu item, or NULL if it has none.
+ *
+ * Since: 2.12
+ **/
+ g_object_class_install_property (gobject_class,
+ PROP_SUBMENU,
+ g_param_spec_object ("submenu",
+ P_("Submenu"),
+ P_("The submenu attached to the menu item, or NULL if it has none"),
+ GTK_TYPE_MENU,
+ GTK_PARAM_READWRITE));
+
gtk_widget_class_install_style_property_parser (widget_class,
g_param_spec_enum ("selected-shadow-type",
"Selected Shadow Type",
@@ -284,19 +314,44 @@ gtk_menu_item_new_with_mnemonic (const gchar *label)
return menu_item;
}
-static void
-gtk_menu_item_destroy (GtkObject *object)
+static void
+gtk_menu_item_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
- GtkMenuItem *menu_item;
-
- g_return_if_fail (GTK_IS_MENU_ITEM (object));
+ GtkMenuItem *menu_item = GTK_MENU_ITEM (object);
+
+ switch (prop_id)
+ {
+ case PROP_SUBMENU:
+ gtk_menu_item_set_submenu (menu_item, g_value_get_object (value));
+ break;
- menu_item = GTK_MENU_ITEM (object);
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
- if (menu_item->submenu)
- gtk_widget_destroy (menu_item->submenu);
+static void
+gtk_menu_item_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GtkMenuItem *menu_item = GTK_MENU_ITEM (object);
+
+ switch (prop_id)
+ {
+ case PROP_SUBMENU:
+ g_value_set_object (value, gtk_menu_item_get_submenu (menu_item));
+ break;
- GTK_OBJECT_CLASS (gtk_menu_item_parent_class)->destroy (object);
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
}
static void
@@ -310,36 +365,59 @@ gtk_menu_item_finalize (GObject *object)
}
static void
-gtk_menu_item_detacher (GtkWidget *widget,
- GtkMenu *menu)
+gtk_menu_item_destroy (GtkObject *object)
{
- GtkMenuItem *menu_item;
+ GtkMenuItem *menu_item = GTK_MENU_ITEM (object);
- g_return_if_fail (GTK_IS_MENU_ITEM (widget));
+ if (menu_item->submenu)
+ gtk_widget_destroy (menu_item->submenu);
+
+ GTK_OBJECT_CLASS (gtk_menu_item_parent_class)->destroy (object);
+}
+
+static void
+gtk_menu_item_detacher (GtkWidget *widget,
+ GtkMenu *menu)
+{
+ GtkMenuItem *menu_item = GTK_MENU_ITEM (widget);
- menu_item = GTK_MENU_ITEM (widget);
g_return_if_fail (menu_item->submenu == (GtkWidget*) menu);
menu_item->submenu = NULL;
}
+/**
+ * gtk_menu_item_set_submenu:
+ * @menu_item: a #GtkMenuItem
+ * @submenu: the submenu, or %NULL
+ *
+ * Sets or replaces the menu item's submenu, or removes it when a %NULL
+ * submenu is passed.
+ **/
void
gtk_menu_item_set_submenu (GtkMenuItem *menu_item,
GtkWidget *submenu)
{
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
+ g_return_if_fail (submenu == NULL || GTK_IS_MENU (submenu));
if (menu_item->submenu != submenu)
{
- gtk_menu_item_remove_submenu (menu_item);
-
- menu_item->submenu = submenu;
- gtk_menu_attach_to_widget (GTK_MENU (submenu),
- GTK_WIDGET (menu_item),
- gtk_menu_item_detacher);
-
+ if (menu_item->submenu)
+ gtk_menu_detach (GTK_MENU (menu_item->submenu));
+
+ if (submenu)
+ {
+ menu_item->submenu = submenu;
+ gtk_menu_attach_to_widget (GTK_MENU (submenu),
+ GTK_WIDGET (menu_item),
+ gtk_menu_item_detacher);
+ }
+
if (GTK_WIDGET (menu_item)->parent)
gtk_widget_queue_resize (GTK_WIDGET (menu_item));
+
+ g_object_notify (G_OBJECT (menu_item), "submenu");
}
}
@@ -360,13 +438,22 @@ gtk_menu_item_get_submenu (GtkMenuItem *menu_item)
return menu_item->submenu;
}
+/**
+ * gtk_menu_item_remove_submenu:
+ * @menu_item: a #GtkMenuItem
+ *
+ * Removes the widget's submenu.
+ *
+ * Deprecated: 2.12: gtk_menu_item_remove_submenu() is deprecated and
+ * should not be used in newly written code. Use
+ * gtk_menu_item_set_submenu() instead.
+ **/
void
-gtk_menu_item_remove_submenu (GtkMenuItem *menu_item)
+gtk_menu_item_remove_submenu (GtkMenuItem *menu_item)
{
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
-
- if (menu_item->submenu)
- gtk_menu_detach (GTK_MENU (menu_item->submenu));
+
+ gtk_menu_item_set_submenu (menu_item, NULL);
}
void _gtk_menu_item_set_placement (GtkMenuItem *menu_item,
diff --git a/gtk/gtkmenuitem.h b/gtk/gtkmenuitem.h
index 84e9f43d2e..4da800edbb 100644
--- a/gtk/gtkmenuitem.h
+++ b/gtk/gtkmenuitem.h
@@ -99,7 +99,6 @@ GtkWidget* gtk_menu_item_new_with_mnemonic (const gchar *label);
void gtk_menu_item_set_submenu (GtkMenuItem *menu_item,
GtkWidget *submenu);
GtkWidget* gtk_menu_item_get_submenu (GtkMenuItem *menu_item);
-void gtk_menu_item_remove_submenu (GtkMenuItem *menu_item);
void gtk_menu_item_select (GtkMenuItem *menu_item);
void gtk_menu_item_deselect (GtkMenuItem *menu_item);
void gtk_menu_item_activate (GtkMenuItem *menu_item);
@@ -124,6 +123,7 @@ void _gtk_menu_item_popup_submenu (GtkWidget *menu_item,
void _gtk_menu_item_popdown_submenu (GtkWidget *menu_item);
#ifndef GTK_DISABLE_DEPRECATED
+void gtk_menu_item_remove_submenu (GtkMenuItem *menu_item);
#define gtk_menu_item_right_justify(menu_item) gtk_menu_item_set_right_justified ((menu_item), TRUE)
#endif /* GTK_DISABLE_DEPRECATED */