From b0969bfe4707c56eb17b7d7df56102b92359339a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 9 Dec 2009 23:33:30 -0600 Subject: Flow through GValue changes. --- libdbusmenu-gtk/client.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 68c0549..66b876f 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -49,8 +49,8 @@ static gboolean new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuite static gboolean new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); static gboolean new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); -static void process_visible (GtkMenuItem * gmi, const gchar * value); -static void process_sensitive (GtkMenuItem * gmi, const gchar * value); +static void process_visible (GtkMenuItem * gmi, const GValue * value); +static void process_sensitive (GtkMenuItem * gmi, const GValue * value); /* GObject Stuff */ G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT); @@ -115,9 +115,9 @@ menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) /* Process the visible property */ static void -process_visible (GtkMenuItem * gmi, const gchar * value) +process_visible (GtkMenuItem * gmi, const GValue * value) { - if (value == NULL || !g_strcmp0(value, "true")) { + if (value == NULL || !g_strcmp0(g_value_get_string(value), "true")) { gtk_widget_show(GTK_WIDGET(gmi)); } else { gtk_widget_hide(GTK_WIDGET(gmi)); @@ -127,9 +127,9 @@ process_visible (GtkMenuItem * gmi, const gchar * value) /* Process the sensitive property */ static void -process_sensitive (GtkMenuItem * gmi, const gchar * value) +process_sensitive (GtkMenuItem * gmi, const GValue * value) { - if (value == NULL || !g_strcmp0(value, "true")) { + if (value == NULL || !g_strcmp0(g_value_get_string(value), "true")) { gtk_widget_set_sensitive(GTK_WIDGET(gmi), TRUE); } else { gtk_widget_set_sensitive(GTK_WIDGET(gmi), FALSE); @@ -140,10 +140,10 @@ process_sensitive (GtkMenuItem * gmi, const gchar * value) /* Whenever we have a property change on a DbusmenuMenuitem we need to be responsive to that. */ static void -menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenuItem * gmi) +menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * value, GtkMenuItem * gmi) { if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_LABEL)) { - gtk_menu_item_set_label(gmi, value); + gtk_menu_item_set_label(gmi, g_value_get_string(value)); } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_VISIBLE)) { process_visible(gmi, value); } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_SENSITIVE)) { @@ -228,8 +228,8 @@ dbusmenu_gtkclient_newitem_base (DbusmenuGtkClient * client, DbusmenuMenuitem * /* Life insurance */ g_object_weak_ref(G_OBJECT(item), destoryed_dbusmenuitem_cb, gmi); - process_visible(gmi, dbusmenu_menuitem_property_get(item, DBUSMENU_MENUITEM_PROP_VISIBLE)); - process_sensitive(gmi, dbusmenu_menuitem_property_get(item, DBUSMENU_MENUITEM_PROP_SENSITIVE)); + process_visible(gmi, dbusmenu_menuitem_property_get_value(item, DBUSMENU_MENUITEM_PROP_VISIBLE)); + process_sensitive(gmi, dbusmenu_menuitem_property_get_value(item, DBUSMENU_MENUITEM_PROP_SENSITIVE)); if (parent != NULL) { new_child(parent, item, dbusmenu_menuitem_get_position(item, parent), DBUSMENU_GTKCLIENT(client)); @@ -395,10 +395,11 @@ new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm /* This handler looks at property changes for items that are image menu items. */ static void -image_property_handle (DbusmenuMenuitem * item, const gchar * property, const gchar * value, gpointer userdata) +image_property_handle (DbusmenuMenuitem * item, const gchar * property, const GValue * invalue, gpointer userdata) { /* We're only looking at these two properties here */ g_return_if_fail(!g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON) || !g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON_DATA)); + const gchar * value = g_value_get_string(invalue); if (value == NULL || value[0] == '\0') { /* This means that we're unsetting a value. */ @@ -501,11 +502,11 @@ new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuC image_property_handle(newitem, DBUSMENU_MENUITEM_PROP_ICON, - dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_ICON), + dbusmenu_menuitem_property_get_value(newitem, DBUSMENU_MENUITEM_PROP_ICON), client); image_property_handle(newitem, DBUSMENU_MENUITEM_PROP_ICON_DATA, - dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_ICON_DATA), + dbusmenu_menuitem_property_get_value(newitem, DBUSMENU_MENUITEM_PROP_ICON_DATA), client); g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, -- cgit v1.2.3 From 676987c27da3fb20881d9c56c25a005bdd088010 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 9 Dec 2009 23:38:20 -0600 Subject: Killing the image item as it's own beast. --- libdbusmenu-gtk/client.c | 50 ++++++++++++++---------------------------------- 1 file changed, 14 insertions(+), 36 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 66b876f..d201cc4 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -47,10 +47,10 @@ static void move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint n static gboolean new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); static gboolean new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); -static gboolean new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); static void process_visible (GtkMenuItem * gmi, const GValue * value); static void process_sensitive (GtkMenuItem * gmi, const GValue * value); +static void image_property_handle (DbusmenuMenuitem * item, const gchar * property, const GValue * invalue, gpointer userdata); /* GObject Stuff */ G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT); @@ -74,7 +74,6 @@ dbusmenu_gtkclient_init (DbusmenuGtkClient *self) { dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(self), DBUSMENU_CLIENT_TYPES_DEFAULT, new_item_normal); dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(self), DBUSMENU_CLIENT_TYPES_SEPARATOR, new_item_seperator); - dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(self), DBUSMENU_CLIENT_TYPES_IMAGE, new_item_image); g_signal_connect(G_OBJECT(self), DBUSMENU_CLIENT_SIGNAL_NEW_MENUITEM, G_CALLBACK(new_menuitem), NULL); @@ -367,6 +366,19 @@ new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusmenu return FALSE; } + image_property_handle(newitem, + DBUSMENU_MENUITEM_PROP_ICON, + dbusmenu_menuitem_property_get_value(newitem, DBUSMENU_MENUITEM_PROP_ICON), + client); + image_property_handle(newitem, + DBUSMENU_MENUITEM_PROP_ICON_DATA, + dbusmenu_menuitem_property_get_value(newitem, DBUSMENU_MENUITEM_PROP_ICON_DATA), + client); + g_signal_connect(G_OBJECT(newitem), + DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, + G_CALLBACK(image_property_handle), + client); + return TRUE; } @@ -481,37 +493,3 @@ image_property_handle (DbusmenuMenuitem * item, const gchar * property, const GV return; } -/* This is a type call back for the image type where - it uses the GtkImageMenuitem to create the menu item. */ -static gboolean -new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) -{ - g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); - g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); - /* Note: not checking parent, it's reasonable for it to be NULL */ - - GtkMenuItem * gmi; - gmi = GTK_MENU_ITEM(gtk_image_menu_item_new_with_label(dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_LABEL))); - gtk_menu_item_set_use_underline (gmi, TRUE); - - if (gmi != NULL) { - dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent); - } else { - return FALSE; - } - - image_property_handle(newitem, - DBUSMENU_MENUITEM_PROP_ICON, - dbusmenu_menuitem_property_get_value(newitem, DBUSMENU_MENUITEM_PROP_ICON), - client); - image_property_handle(newitem, - DBUSMENU_MENUITEM_PROP_ICON_DATA, - dbusmenu_menuitem_property_get_value(newitem, DBUSMENU_MENUITEM_PROP_ICON_DATA), - client); - g_signal_connect(G_OBJECT(newitem), - DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, - G_CALLBACK(image_property_handle), - client); - - return TRUE; -} -- cgit v1.2.3 From d3ce0f4a3b2f5b087586429a5f188a494dedc6fe Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 15 Dec 2009 14:27:15 -0600 Subject: Switching around the visible and sensitive handling to use our new fancy getters so that we have consistent handling there. --- libdbusmenu-gtk/client.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index d201cc4..66862d3 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -48,8 +48,8 @@ static void move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint n static gboolean new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); static gboolean new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); -static void process_visible (GtkMenuItem * gmi, const GValue * value); -static void process_sensitive (GtkMenuItem * gmi, const GValue * value); +static void process_visible (DbusmenuMenuitem * mi, GtkMenuItem * gmi, const GValue * value); +static void process_sensitive (DbusmenuMenuitem * mi, GtkMenuItem * gmi, const GValue * value); static void image_property_handle (DbusmenuMenuitem * item, const gchar * property, const GValue * invalue, gpointer userdata); /* GObject Stuff */ @@ -114,9 +114,14 @@ menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) /* Process the visible property */ static void -process_visible (GtkMenuItem * gmi, const GValue * value) +process_visible (DbusmenuMenuitem * mi, GtkMenuItem * gmi, const GValue * value) { - if (value == NULL || !g_strcmp0(g_value_get_string(value), "true")) { + gboolean val = TRUE; + if (value != NULL) { + val = dbusmenu_menuitem_property_get_bool(mi, DBUSMENU_MENUITEM_PROP_VISIBLE); + } + + if (val) { gtk_widget_show(GTK_WIDGET(gmi)); } else { gtk_widget_hide(GTK_WIDGET(gmi)); @@ -126,13 +131,13 @@ process_visible (GtkMenuItem * gmi, const GValue * value) /* Process the sensitive property */ static void -process_sensitive (GtkMenuItem * gmi, const GValue * value) +process_sensitive (DbusmenuMenuitem * mi, GtkMenuItem * gmi, const GValue * value) { - if (value == NULL || !g_strcmp0(g_value_get_string(value), "true")) { - gtk_widget_set_sensitive(GTK_WIDGET(gmi), TRUE); - } else { - gtk_widget_set_sensitive(GTK_WIDGET(gmi), FALSE); + gboolean val = TRUE; + if (value != NULL) { + val = dbusmenu_menuitem_property_get_bool(mi, DBUSMENU_MENUITEM_PROP_SENSITIVE); } + gtk_widget_set_sensitive(GTK_WIDGET(gmi), val); return; } @@ -144,9 +149,9 @@ menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * value, GtkMen if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_LABEL)) { gtk_menu_item_set_label(gmi, g_value_get_string(value)); } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_VISIBLE)) { - process_visible(gmi, value); + process_visible(mi, gmi, value); } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_SENSITIVE)) { - process_sensitive(gmi, value); + process_sensitive(mi, gmi, value); } return; @@ -227,8 +232,8 @@ dbusmenu_gtkclient_newitem_base (DbusmenuGtkClient * client, DbusmenuMenuitem * /* Life insurance */ g_object_weak_ref(G_OBJECT(item), destoryed_dbusmenuitem_cb, gmi); - process_visible(gmi, dbusmenu_menuitem_property_get_value(item, DBUSMENU_MENUITEM_PROP_VISIBLE)); - process_sensitive(gmi, dbusmenu_menuitem_property_get_value(item, DBUSMENU_MENUITEM_PROP_SENSITIVE)); + process_visible(item, gmi, dbusmenu_menuitem_property_get_value(item, DBUSMENU_MENUITEM_PROP_VISIBLE)); + process_sensitive(item, gmi, dbusmenu_menuitem_property_get_value(item, DBUSMENU_MENUITEM_PROP_SENSITIVE)); if (parent != NULL) { new_child(parent, item, dbusmenu_menuitem_get_position(item, parent), DBUSMENU_GTKCLIENT(client)); -- cgit v1.2.3 From f70759b6c1a61e34660a3bc2dddfb3f2cbf18fe7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 15 Dec 2009 16:04:29 -0600 Subject: Building the basic generic menu item. --- libdbusmenu-gtk/Makefile.am | 2 ++ libdbusmenu-gtk/genericmenuitem.c | 49 +++++++++++++++++++++++++++++++++++++++ libdbusmenu-gtk/genericmenuitem.h | 34 +++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 libdbusmenu-gtk/genericmenuitem.c create mode 100644 libdbusmenu-gtk/genericmenuitem.h (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/Makefile.am b/libdbusmenu-gtk/Makefile.am index 87a82a6..97d8563 100644 --- a/libdbusmenu-gtk/Makefile.am +++ b/libdbusmenu-gtk/Makefile.am @@ -15,6 +15,8 @@ libdbusmenu_gtkinclude_HEADERS = \ libdbusmenu_gtk_la_SOURCES = \ client.h \ client.c \ + genericmenuitem.h \ + genericmenuitem.c \ menu.h \ menu.c \ menuitem.h \ diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c new file mode 100644 index 0000000..3dd3969 --- /dev/null +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -0,0 +1,49 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "genericmenuitem.h" + +typedef struct _GenericmenuitemPrivate GenericmenuitemPrivate; + +struct _GenericmenuitemPrivate +{ +}; + +#define GENERICMENUITEM_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), GENERICMENUITEM_TYPE, GenericmenuitemPrivate)) + +static void genericmenuitem_class_init (GenericmenuitemClass *klass); +static void genericmenuitem_init (Genericmenuitem *self); +static void genericmenuitem_dispose (GObject *object); +static void genericmenuitem_finalize (GObject *object); + +G_DEFINE_TYPE (Genericmenuitem, genericmenuitem, GTK_TYPE_CHECK_MENU_ITEM); + +static void +genericmenuitem_class_init (GenericmenuitemClass *klass) +{ +GObjectClass *object_class = G_OBJECT_CLASS (klass); + +g_type_class_add_private (klass, sizeof (GenericmenuitemPrivate)); + +object_class->dispose = genericmenuitem_dispose; +object_class->finalize = genericmenuitem_finalize; +} + +static void +genericmenuitem_init (Genericmenuitem *self) +{ +} + +static void +genericmenuitem_dispose (GObject *object) +{ +G_OBJECT_CLASS (genericmenuitem_parent_class)->dispose (object); +} + +static void +genericmenuitem_finalize (GObject *object) +{ +G_OBJECT_CLASS (genericmenuitem_parent_class)->finalize (object); +} diff --git a/libdbusmenu-gtk/genericmenuitem.h b/libdbusmenu-gtk/genericmenuitem.h new file mode 100644 index 0000000..fdfbee1 --- /dev/null +++ b/libdbusmenu-gtk/genericmenuitem.h @@ -0,0 +1,34 @@ +#ifndef __GENERICMENUITEM_H__ +#define __GENERICMENUITEM_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GENERICMENUITEM_TYPE (genericmenuitem_get_type ()) +#define GENERICMENUITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GENERICMENUITEM_TYPE, Genericmenuitem)) +#define GENERICMENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GENERICMENUITEM_TYPE, GenericmenuitemClass)) +#define IS_GENERICMENUITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GENERICMENUITEM_TYPE)) +#define IS_GENERICMENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GENERICMENUITEM_TYPE)) +#define GENERICMENUITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GENERICMENUITEM_TYPE, GenericmenuitemClass)) + +typedef struct _Genericmenuitem Genericmenuitem; +typedef struct _GenericmenuitemClass GenericmenuitemClass; + +struct _GenericmenuitemClass +{ +GtkCheckMenuItemClass parent_class; +}; + +struct _Genericmenuitem +{ +GtkCheckMenuItem parent; +}; + +GType genericmenuitem_get_type (void); + +G_END_DECLS + +#endif -- cgit v1.2.3 From eda482ed8bee77ed0904f1b1f3e835b49e174c5b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 15 Dec 2009 16:26:08 -0600 Subject: Slight cleanups, getting this code going. --- libdbusmenu-gtk/genericmenuitem.c | 39 +++++++++++++++++++++++++++++---------- libdbusmenu-gtk/genericmenuitem.h | 26 +++++++++++++++++--------- 2 files changed, 46 insertions(+), 19 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 3dd3969..1d59d34 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -4,10 +4,9 @@ #include "genericmenuitem.h" -typedef struct _GenericmenuitemPrivate GenericmenuitemPrivate; - -struct _GenericmenuitemPrivate -{ +struct _GenericmenuitemPrivate { + int checkbox_type; + int state; }; #define GENERICMENUITEM_GET_PRIVATE(o) \ @@ -20,30 +19,50 @@ static void genericmenuitem_finalize (GObject *object); G_DEFINE_TYPE (Genericmenuitem, genericmenuitem, GTK_TYPE_CHECK_MENU_ITEM); +/* Initializing all of the classes. Most notably we're + disabling the drawing of the check early. */ static void genericmenuitem_class_init (GenericmenuitemClass *klass) { -GObjectClass *object_class = G_OBJECT_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GenericmenuitemPrivate)); + + object_class->dispose = genericmenuitem_dispose; + object_class->finalize = genericmenuitem_finalize; -g_type_class_add_private (klass, sizeof (GenericmenuitemPrivate)); + GtkCheckMenuItemClass * check_class = GTK_CHECK_MENU_ITEM_CLASS (klass); -object_class->dispose = genericmenuitem_dispose; -object_class->finalize = genericmenuitem_finalize; + /* We'll put this back if we get a type set */ + check_class->draw_indicator = NULL; + + return; } +/* Sets default values for all the class variables. Mostly, + this puts us in a default state. */ static void genericmenuitem_init (Genericmenuitem *self) { + self->priv = GENERICMENUITEM_GET_PRIVATE(self); + + return; } +/* Clean everything up. Whew, that can be work. */ static void genericmenuitem_dispose (GObject *object) { -G_OBJECT_CLASS (genericmenuitem_parent_class)->dispose (object); + + G_OBJECT_CLASS (genericmenuitem_parent_class)->dispose (object); + return; } +/* Now free memory, we no longer need it. */ static void genericmenuitem_finalize (GObject *object) { -G_OBJECT_CLASS (genericmenuitem_parent_class)->finalize (object); + + G_OBJECT_CLASS (genericmenuitem_parent_class)->finalize (object); + return; } diff --git a/libdbusmenu-gtk/genericmenuitem.h b/libdbusmenu-gtk/genericmenuitem.h index fdfbee1..8a19282 100644 --- a/libdbusmenu-gtk/genericmenuitem.h +++ b/libdbusmenu-gtk/genericmenuitem.h @@ -14,17 +14,25 @@ G_BEGIN_DECLS #define IS_GENERICMENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GENERICMENUITEM_TYPE)) #define GENERICMENUITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GENERICMENUITEM_TYPE, GenericmenuitemClass)) -typedef struct _Genericmenuitem Genericmenuitem; -typedef struct _GenericmenuitemClass GenericmenuitemClass; - -struct _GenericmenuitemClass -{ -GtkCheckMenuItemClass parent_class; +typedef struct _Genericmenuitem Genericmenuitem; +typedef struct _GenericmenuitemClass GenericmenuitemClass; +typedef struct _GenericmenuitemPrivate GenericmenuitemPrivate; + +/** + GenericmenuitemClass: + @parent_class: Our parent #GtkCheckMenuItemClass +*/ +struct _GenericmenuitemClass { + GtkCheckMenuItemClass parent_class; }; -struct _Genericmenuitem -{ -GtkCheckMenuItem parent; +/** + Genericmenuitem: + @parent: Our parent #GtkCheckMenuItem +*/ +struct _Genericmenuitem { + GtkCheckMenuItem parent; + GenericmenuitemPrivate * priv; }; GType genericmenuitem_get_type (void); -- cgit v1.2.3 From fcb8ac056eceee3ac25f28812cd9090177d91463 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 15 Dec 2009 16:37:12 -0600 Subject: Setting up enums for the type of check and the state of it. --- libdbusmenu-gtk/genericmenuitem.c | 7 +++++-- libdbusmenu-gtk/genericmenuitem.h | 20 +++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 1d59d34..ee02a1c 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -5,8 +5,8 @@ #include "genericmenuitem.h" struct _GenericmenuitemPrivate { - int checkbox_type; - int state; + GenericmenuitemCheckType check_type; + GenericmenuitemState state; }; #define GENERICMENUITEM_GET_PRIVATE(o) \ @@ -46,6 +46,9 @@ genericmenuitem_init (Genericmenuitem *self) { self->priv = GENERICMENUITEM_GET_PRIVATE(self); + self->priv->check_type = GENERICMENUITEM_CHECK_TYPE_NONE; + self->priv->state = GENERICMENUITEM_STATE_UNCHECKED; + return; } diff --git a/libdbusmenu-gtk/genericmenuitem.h b/libdbusmenu-gtk/genericmenuitem.h index 8a19282..b735fe4 100644 --- a/libdbusmenu-gtk/genericmenuitem.h +++ b/libdbusmenu-gtk/genericmenuitem.h @@ -14,9 +14,11 @@ G_BEGIN_DECLS #define IS_GENERICMENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GENERICMENUITEM_TYPE)) #define GENERICMENUITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GENERICMENUITEM_TYPE, GenericmenuitemClass)) -typedef struct _Genericmenuitem Genericmenuitem; -typedef struct _GenericmenuitemClass GenericmenuitemClass; -typedef struct _GenericmenuitemPrivate GenericmenuitemPrivate; +typedef struct _Genericmenuitem Genericmenuitem; +typedef struct _GenericmenuitemClass GenericmenuitemClass; +typedef struct _GenericmenuitemPrivate GenericmenuitemPrivate; +typedef enum _GenericmenuitemCheckType GenericmenuitemCheckType; +typedef enum _GenericmenuitemState GenericmenuitemState; /** GenericmenuitemClass: @@ -35,6 +37,18 @@ struct _Genericmenuitem { GenericmenuitemPrivate * priv; }; +enum _GenericmenuitemCheckType { + GENERICMENUITEM_CHECK_TYPE_NONE, + GENERICMENUITEM_CHECK_TYPE_CHECKBOX, + GENErICMENUITEM_CHECK_TYPE_RADIO +}; + +enum _GenericmenuitemState { + GENERICMENUITEM_STATE_UNCHECKED, + GENERICMENUITEM_STATE_CHECKED, + GENERICMENUITEM_STATE_INDETERMINATE +}; + GType genericmenuitem_get_type (void); G_END_DECLS -- cgit v1.2.3 From 5e7b2cec7f0ffd4147d81470ca162fd14ed92836 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 15 Dec 2009 16:49:07 -0600 Subject: Better handling of the draw_indicator function, as in, this one will actually work. --- libdbusmenu-gtk/genericmenuitem.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index ee02a1c..b40a3f5 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -4,21 +4,33 @@ #include "genericmenuitem.h" +/** + GenericmenuitemPrivate: + @check_type: What type of check we have, or none at all. + @state: What the state of our check is. +*/ struct _GenericmenuitemPrivate { GenericmenuitemCheckType check_type; GenericmenuitemState state; }; +/* Private macro */ #define GENERICMENUITEM_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), GENERICMENUITEM_TYPE, GenericmenuitemPrivate)) +/* Prototypes */ static void genericmenuitem_class_init (GenericmenuitemClass *klass); static void genericmenuitem_init (Genericmenuitem *self); static void genericmenuitem_dispose (GObject *object); static void genericmenuitem_finalize (GObject *object); +static void draw_indicator (GtkCheckMenuItem *check_menu_item, GdkRectangle *area); +/* GObject stuff */ G_DEFINE_TYPE (Genericmenuitem, genericmenuitem, GTK_TYPE_CHECK_MENU_ITEM); +/* Globals */ +static void (*parent_draw_indicator) (GtkCheckMenuItem *check_menu_item, GdkRectangle *area) = NULL; + /* Initializing all of the classes. Most notably we're disabling the drawing of the check early. */ static void @@ -33,8 +45,8 @@ genericmenuitem_class_init (GenericmenuitemClass *klass) GtkCheckMenuItemClass * check_class = GTK_CHECK_MENU_ITEM_CLASS (klass); - /* We'll put this back if we get a type set */ - check_class->draw_indicator = NULL; + parent_draw_indicator = check_class->draw_indicator; + check_class->draw_indicator = draw_indicator; return; } @@ -69,3 +81,16 @@ genericmenuitem_finalize (GObject *object) G_OBJECT_CLASS (genericmenuitem_parent_class)->finalize (object); return; } + +/* Checks to see if we should be drawing a little box at + all. If we should be, let's do that, otherwise we're + going suppress the box drawing. */ +static void +draw_indicator (GtkCheckMenuItem *check_menu_item, GdkRectangle *area) +{ + Genericmenuitem * self = GENERICMENUITEM(check_menu_item); + if (self->priv->check_type != GENERICMENUITEM_CHECK_TYPE_NONE) { + parent_draw_indicator(check_menu_item, area); + } + return; +} -- cgit v1.2.3 From f54a417fde8f6937ecafd269db51a135af2e7a3e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 15 Dec 2009 17:09:16 -0600 Subject: Functions for setting the check type and state of the check. --- libdbusmenu-gtk/genericmenuitem.c | 45 +++++++++++++++++++++++++++++++++++++++ libdbusmenu-gtk/genericmenuitem.h | 6 +++++- 2 files changed, 50 insertions(+), 1 deletion(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index b40a3f5..6eee2f7 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -94,3 +94,48 @@ draw_indicator (GtkCheckMenuItem *check_menu_item, GdkRectangle *area) } return; } + +/** + genericmenuitem_set_check_type: + @item: #Genericmenuitem to set the type on + @check_type: Which type of check should be displayed + + This function changes the type of the checkmark that + appears in the left hand gutter for the menuitem. +*/ +void +genericmenuitem_set_check_type (Genericmenuitem * item, GenericmenuitemCheckType check_type) +{ + if (item->priv->check_type == check_type) { + return; + } + + item->priv->check_type = check_type; + + gtk_widget_queue_draw(GTK_WIDGET(item)); + + return; +} + +/** + genericmenuitem_set_state: + @item: #Genericmenuitem to set the type on + @check_type: What is the state of the check + + Sets the state of the check in the menu item. It does + not require, but isn't really useful if the type of + check that the menuitem is set to #GENERICMENUITEM_CHECK_TYPE_NONE. +*/ +void +genericmenuitem_set_state (Genericmenuitem * item, GenericmenuitemState state) +{ + if (item->priv->state == state) { + return; + } + + item->priv->state = state; + + gtk_widget_queue_draw(GTK_WIDGET(item)); + + return; +} diff --git a/libdbusmenu-gtk/genericmenuitem.h b/libdbusmenu-gtk/genericmenuitem.h index b735fe4..8586590 100644 --- a/libdbusmenu-gtk/genericmenuitem.h +++ b/libdbusmenu-gtk/genericmenuitem.h @@ -49,7 +49,11 @@ enum _GenericmenuitemState { GENERICMENUITEM_STATE_INDETERMINATE }; -GType genericmenuitem_get_type (void); +GType genericmenuitem_get_type (void); +void genericmenuitem_set_check_type (Genericmenuitem * item, + GenericmenuitemCheckType check_type); +void genericmenuitem_set_state (Genericmenuitem * item, + GenericmenuitemState state); G_END_DECLS -- cgit v1.2.3 From 16812b7ca72e41dfaf76b14d5517739f44e815b7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 15 Dec 2009 17:12:32 -0600 Subject: Building up the case statements. --- libdbusmenu-gtk/genericmenuitem.c | 24 ++++++++++++++++++++++++ libdbusmenu-gtk/genericmenuitem.h | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 6eee2f7..3f36bbf 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -112,6 +112,18 @@ genericmenuitem_set_check_type (Genericmenuitem * item, GenericmenuitemCheckType item->priv->check_type = check_type; + switch (item->priv->check_type) { + case GENERICMENUITEM_CHECK_TYPE_NONE: + break; + case GENERICMENUITEM_CHECK_TYPE_CHECKBOX: + break; + case GENERICMENUITEM_CHECK_TYPE_RADIO: + break; + default: + g_warning("Generic Menuitem invalid check type: %d", check_type); + return; + } + gtk_widget_queue_draw(GTK_WIDGET(item)); return; @@ -135,6 +147,18 @@ genericmenuitem_set_state (Genericmenuitem * item, GenericmenuitemState state) item->priv->state = state; + switch (item->priv->state) { + case GENERICMENUITEM_STATE_UNCHECKED: + break; + case GENERICMENUITEM_STATE_CHECKED: + break; + case GENERICMENUITEM_STATE_INDETERMINATE: + break; + default: + g_warning("Generic Menuitem invalid check state: %d", state); + return; + } + gtk_widget_queue_draw(GTK_WIDGET(item)); return; diff --git a/libdbusmenu-gtk/genericmenuitem.h b/libdbusmenu-gtk/genericmenuitem.h index 8586590..4f54924 100644 --- a/libdbusmenu-gtk/genericmenuitem.h +++ b/libdbusmenu-gtk/genericmenuitem.h @@ -40,7 +40,7 @@ struct _Genericmenuitem { enum _GenericmenuitemCheckType { GENERICMENUITEM_CHECK_TYPE_NONE, GENERICMENUITEM_CHECK_TYPE_CHECKBOX, - GENErICMENUITEM_CHECK_TYPE_RADIO + GENERICMENUITEM_CHECK_TYPE_RADIO }; enum _GenericmenuitemState { -- cgit v1.2.3 From 0669b0c473075115337aede5eb1ae6b86a521668 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 08:31:02 -0600 Subject: Setting the properties based on the enum value changes. --- libdbusmenu-gtk/genericmenuitem.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 3f36bbf..d8e9b39 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -111,13 +111,23 @@ genericmenuitem_set_check_type (Genericmenuitem * item, GenericmenuitemCheckType } item->priv->check_type = check_type; + GValue value = {0}; switch (item->priv->check_type) { case GENERICMENUITEM_CHECK_TYPE_NONE: + /* We don't need to do anything here as we're queuing the + draw and then when it draws it'll avoid drawing the + check on the item. */ break; case GENERICMENUITEM_CHECK_TYPE_CHECKBOX: + g_value_init(&value, G_TYPE_BOOLEAN); + g_value_set_boolean(&value, FALSE); + g_object_set_property(G_OBJECT(item), "draw-as-radio", &value); break; case GENERICMENUITEM_CHECK_TYPE_RADIO: + g_value_init(&value, G_TYPE_BOOLEAN); + g_value_set_boolean(&value, TRUE); + g_object_set_property(G_OBJECT(item), "draw-as-radio", &value); break; default: g_warning("Generic Menuitem invalid check type: %d", check_type); @@ -146,13 +156,27 @@ genericmenuitem_set_state (Genericmenuitem * item, GenericmenuitemState state) } item->priv->state = state; + GValue value = {0}; + g_value_init(&value, G_TYPE_BOOLEAN); switch (item->priv->state) { case GENERICMENUITEM_STATE_UNCHECKED: + g_value_set_boolean(&value, FALSE); + g_object_set_property(G_OBJECT(item), "active", &value); + g_value_set_boolean(&value, FALSE); + g_object_set_property(G_OBJECT(item), "inconsistent", &value); break; case GENERICMENUITEM_STATE_CHECKED: + g_value_set_boolean(&value, TRUE); + g_object_set_property(G_OBJECT(item), "active", &value); + g_value_set_boolean(&value, FALSE); + g_object_set_property(G_OBJECT(item), "inconsistent", &value); break; case GENERICMENUITEM_STATE_INDETERMINATE: + g_value_set_boolean(&value, TRUE); + g_object_set_property(G_OBJECT(item), "active", &value); + g_value_set_boolean(&value, TRUE); + g_object_set_property(G_OBJECT(item), "inconsistent", &value); break; default: g_warning("Generic Menuitem invalid check state: %d", state); -- cgit v1.2.3 From 58c6ed7efa57ff15c27cee2fc07b4b31a48b734b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 13:09:32 -0600 Subject: Stubs for setting and getting the image and label. --- libdbusmenu-gtk/genericmenuitem.c | 39 +++++++++++++++++++++++++++++++++++++++ libdbusmenu-gtk/genericmenuitem.h | 3 +++ 2 files changed, 42 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index d8e9b39..20fb8e2 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -24,6 +24,8 @@ static void genericmenuitem_init (Genericmenuitem *self); static void genericmenuitem_dispose (GObject *object); static void genericmenuitem_finalize (GObject *object); static void draw_indicator (GtkCheckMenuItem *check_menu_item, GdkRectangle *area); +static void set_label (GtkMenuItem * menu_item, const gchar * label); +static const gchar * get_label (GtkMenuItem * menu_item); /* GObject stuff */ G_DEFINE_TYPE (Genericmenuitem, genericmenuitem, GTK_TYPE_CHECK_MENU_ITEM); @@ -48,6 +50,10 @@ genericmenuitem_class_init (GenericmenuitemClass *klass) parent_draw_indicator = check_class->draw_indicator; check_class->draw_indicator = draw_indicator; + GtkMenuItemClass * menuitem_class = GTK_MENU_ITEM_CLASS (klass); + menuitem_class->set_label = set_label; + menuitem_class->get_label = get_label; + return; } @@ -95,6 +101,23 @@ draw_indicator (GtkCheckMenuItem *check_menu_item, GdkRectangle *area) return; } +/* Set the label on the item */ +static void +set_label (GtkMenuItem * menu_item, const gchar * label) +{ + + return; +} + +/* Get the text of the label for the item */ +static const gchar * +get_label (GtkMenuItem * menu_item) +{ + + + return NULL; +} + /** genericmenuitem_set_check_type: @item: #Genericmenuitem to set the type on @@ -187,3 +210,19 @@ genericmenuitem_set_state (Genericmenuitem * item, GenericmenuitemState state) return; } + +void +genericmenuitem_set_image (Genericmenuitem * item, GtkWidget * image) +{ + + + return; +} + +GtkWidget * +genericmenuitem_get_image (Genericmenuitem * item) +{ + + + return NULL; +} diff --git a/libdbusmenu-gtk/genericmenuitem.h b/libdbusmenu-gtk/genericmenuitem.h index 4f54924..eaccee8 100644 --- a/libdbusmenu-gtk/genericmenuitem.h +++ b/libdbusmenu-gtk/genericmenuitem.h @@ -54,6 +54,9 @@ void genericmenuitem_set_check_type (Genericmenuitem * item, GenericmenuitemCheckType check_type); void genericmenuitem_set_state (Genericmenuitem * item, GenericmenuitemState state); +void genericmenuitem_set_image (Genericmenuitem * item, + GtkWidget * image); +GtkWidget * genericmenuitem_get_image (Genericmenuitem * item); G_END_DECLS -- cgit v1.2.3 From ab52deb8a0b8fe4dd2fb602cb32beafac4d5dae0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 13:11:08 -0600 Subject: Stupid formating changes. --- libdbusmenu-gtk/genericmenuitem.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.h b/libdbusmenu-gtk/genericmenuitem.h index eaccee8..6c494e8 100644 --- a/libdbusmenu-gtk/genericmenuitem.h +++ b/libdbusmenu-gtk/genericmenuitem.h @@ -49,14 +49,14 @@ enum _GenericmenuitemState { GENERICMENUITEM_STATE_INDETERMINATE }; -GType genericmenuitem_get_type (void); -void genericmenuitem_set_check_type (Genericmenuitem * item, - GenericmenuitemCheckType check_type); -void genericmenuitem_set_state (Genericmenuitem * item, - GenericmenuitemState state); -void genericmenuitem_set_image (Genericmenuitem * item, - GtkWidget * image); -GtkWidget * genericmenuitem_get_image (Genericmenuitem * item); +GType genericmenuitem_get_type (void); +void genericmenuitem_set_check_type (Genericmenuitem * item, + GenericmenuitemCheckType check_type); +void genericmenuitem_set_state (Genericmenuitem * item, + GenericmenuitemState state); +void genericmenuitem_set_image (Genericmenuitem * item, + GtkWidget * image); +GtkWidget * genericmenuitem_get_image (Genericmenuitem * item); G_END_DECLS -- cgit v1.2.3 From 7ee8c7fd98fa88c2821b955064240364d1c0c903 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 13:13:23 -0600 Subject: Comments --- libdbusmenu-gtk/genericmenuitem.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 20fb8e2..63cc936 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -211,6 +211,13 @@ genericmenuitem_set_state (Genericmenuitem * item, GenericmenuitemState state) return; } +/** + genericmenuitem_set_image: + @item: A #Genericmenuitem + @image: The image to set as the image of @item + + Sets the image of the menu item. +*/ void genericmenuitem_set_image (Genericmenuitem * item, GtkWidget * image) { @@ -219,6 +226,15 @@ genericmenuitem_set_image (Genericmenuitem * item, GtkWidget * image) return; } +/** + genericmenuitem_get_image: + @item: A #Genericmenuitem + + Returns the image if there is one. + + Return value: A pointer to the image of the item or #NULL + if there isn't one. +*/ GtkWidget * genericmenuitem_get_image (Genericmenuitem * item) { -- cgit v1.2.3 From 0f9080a861c521e41fe4fa4c8c8ab138671d6659 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 13:41:29 -0600 Subject: Woot, a set label function. --- libdbusmenu-gtk/genericmenuitem.c | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 63cc936..d2a20ef 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -101,10 +101,50 @@ draw_indicator (GtkCheckMenuItem *check_menu_item, GdkRectangle *area) return; } +/* A small helper to look through the widgets in the + box and find the one that is the label. */ +static void +set_label_helper (GtkWidget * widget, gpointer data) +{ + GtkWidget ** labelval = (GtkWidget **)data; + if (GTK_IS_LABEL(widget)) { + *labelval = widget; + } + return; +} + /* Set the label on the item */ static void set_label (GtkMenuItem * menu_item, const gchar * label) { + GtkWidget * child = gtk_bin_get_child(GTK_BIN(menu_item)); + + if (child == NULL) { + GtkWidget * labelw = gtk_label_new(label); + gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE); + gtk_container_add(GTK_CONTAINER(menu_item), labelw); + } else if (GTK_IS_LABEL(child)) { + gtk_label_set_label(GTK_LABEL(child), label); + } else if (GTK_IS_BOX(child)) { + GtkWidget * labelw = NULL; + /* Look for the label */ + gtk_container_foreach(GTK_CONTAINER(child), set_label_helper, &labelw); + + if (labelw == NULL) { + /* We don't have a label, so we need to build */ + labelw = gtk_label_new(label); + gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE); + gtk_box_pack_end(GTK_BOX(child), labelw, TRUE, TRUE, 0); + } else { + /* We can reset the label that we have. */ + gtk_label_set_label(GTK_LABEL(labelw), label); + } + } else { + g_error("Generic item in an indeterminate state."); + return; + } + + g_object_notify(G_OBJECT(menu_item), "label"); return; } -- cgit v1.2.3 From 4cc0915b394bb63dad3018d342d4baf57fd215f0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 16:26:49 -0600 Subject: Switching the client over to creating generic items. --- libdbusmenu-gtk/client.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 66862d3..325399d 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -34,6 +34,7 @@ License version 3 and version 2.1 along with this program. If not, see #include "client.h" #include "menuitem.h" +#include "genericmenuitem.h" /* Prototypes */ static void dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass); @@ -362,8 +363,8 @@ new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusmenu /* Note: not checking parent, it's reasonable for it to be NULL */ GtkMenuItem * gmi; - gmi = GTK_MENU_ITEM(gtk_menu_item_new_with_label(dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_LABEL))); - gtk_menu_item_set_use_underline (gmi, TRUE); + gmi = GTK_MENU_ITEM(g_object_new(GENERICMENUITEM_TYPE, NULL)); + gtk_menu_item_set_label(gmi, dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_LABEL)); if (gmi != NULL) { dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent); @@ -416,7 +417,12 @@ image_property_handle (DbusmenuMenuitem * item, const gchar * property, const GV { /* We're only looking at these two properties here */ g_return_if_fail(!g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON) || !g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON_DATA)); - const gchar * value = g_value_get_string(invalue); + + const gchar * value = NULL; + + if (invalue != NULL && G_VALUE_TYPE(invalue) == G_TYPE_STRING) { + value = g_value_get_string(invalue); + } if (value == NULL || value[0] == '\0') { /* This means that we're unsetting a value. */ @@ -435,12 +441,12 @@ image_property_handle (DbusmenuMenuitem * item, const gchar * property, const GV g_warning("Oddly we're handling image properties on a menuitem that doesn't have any GTK structures associated with it."); return; } - GtkWidget * gtkimage = gtk_image_menu_item_get_image(GTK_IMAGE_MENU_ITEM(gimi)); + GtkWidget * gtkimage = genericmenuitem_get_image(GENERICMENUITEM(gimi)); if (!g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON_DATA)) { /* If we have an image already built from a name that is way better than a pixbuf. Keep it. */ - if (gtk_image_get_storage_type(GTK_IMAGE(gtkimage)) == GTK_IMAGE_ICON_NAME) { + if (gtkimage != NULL && gtk_image_get_storage_type(GTK_IMAGE(gtkimage)) == GTK_IMAGE_ICON_NAME) { return; } } @@ -493,7 +499,7 @@ image_property_handle (DbusmenuMenuitem * item, const gchar * property, const GV } - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gimi), gtkimage); + genericmenuitem_set_image(GENERICMENUITEM(gimi), gtkimage); return; } -- cgit v1.2.3 From 9ab79b5a7cf9a6d0224acd7902324a76ad2f8cf5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 16:29:24 -0600 Subject: Yeah, gotta show those labels. --- libdbusmenu-gtk/genericmenuitem.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index d2a20ef..5eba55a 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -123,6 +123,7 @@ set_label (GtkMenuItem * menu_item, const gchar * label) GtkWidget * labelw = gtk_label_new(label); gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE); gtk_container_add(GTK_CONTAINER(menu_item), labelw); + gtk_widget_show(labelw); } else if (GTK_IS_LABEL(child)) { gtk_label_set_label(GTK_LABEL(child), label); } else if (GTK_IS_BOX(child)) { @@ -135,6 +136,7 @@ set_label (GtkMenuItem * menu_item, const gchar * label) labelw = gtk_label_new(label); gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE); gtk_box_pack_end(GTK_BOX(child), labelw, TRUE, TRUE, 0); + gtk_widget_show(labelw); } else { /* We can reset the label that we have. */ gtk_label_set_label(GTK_LABEL(labelw), label); -- cgit v1.2.3 From 6731f63179ec24929a8209aee8eed363f3350c47 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 16:32:50 -0600 Subject: Set alignment on the labels. --- libdbusmenu-gtk/genericmenuitem.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 5eba55a..3f7f22d 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -122,6 +122,7 @@ set_label (GtkMenuItem * menu_item, const gchar * label) if (child == NULL) { GtkWidget * labelw = gtk_label_new(label); gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE); + gtk_misc_set_alignment(GTK_MISC(labelw), 0.0, 0.5); gtk_container_add(GTK_CONTAINER(menu_item), labelw); gtk_widget_show(labelw); } else if (GTK_IS_LABEL(child)) { @@ -135,6 +136,7 @@ set_label (GtkMenuItem * menu_item, const gchar * label) /* We don't have a label, so we need to build */ labelw = gtk_label_new(label); gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE); + gtk_misc_set_alignment(GTK_MISC(labelw), 0.0, 0.5); gtk_box_pack_end(GTK_BOX(child), labelw, TRUE, TRUE, 0); gtk_widget_show(labelw); } else { -- cgit v1.2.3 From 763a7a3e7915858a80ceb0140a13631c7c042a13 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 21:31:32 -0600 Subject: Handline the toggle based properties --- libdbusmenu-gtk/client.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 325399d..80d067f 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -142,6 +142,47 @@ process_sensitive (DbusmenuMenuitem * mi, GtkMenuItem * gmi, const GValue * valu return; } +/* Process the sensitive property */ +static void +process_toggle_type (DbusmenuMenuitem * mi, GtkMenuItem * gmi, const GValue * value) +{ + if (!IS_GENERICMENUITEM(gmi)) return; + if (G_VALUE_TYPE(value) != G_TYPE_STRING) return; + + const gchar * strval = g_value_get_string(value); + GenericmenuitemCheckType type = GENERICMENUITEM_CHECK_TYPE_NONE; + + if (!g_strcmp0(strval, "checkbox")) { + type = GENERICMENUITEM_CHECK_TYPE_CHECKBOX; + } else if (!g_strcmp0(strval, "radio")) { + type = GENERICMENUITEM_CHECK_TYPE_RADIO; + } + + genericmenuitem_set_check_type(GENERICMENUITEM(gmi), type); + + return; +} + +/* Process the sensitive property */ +static void +process_toggle_checked (DbusmenuMenuitem * mi, GtkMenuItem * gmi, const GValue * value) +{ + if (!IS_GENERICMENUITEM(gmi)) return; + if (G_VALUE_TYPE(value) != G_TYPE_STRING) return; + + const gchar * strval = g_value_get_string(value); + GenericmenuitemState state = GENERICMENUITEM_STATE_UNCHECKED; + + if (!g_strcmp0(strval, "checked")) { + state = GENERICMENUITEM_STATE_CHECKED; + } else if (!g_strcmp0(strval, "indeterminate")) { + state = GENERICMENUITEM_STATE_INDETERMINATE; + } + + genericmenuitem_set_state(GENERICMENUITEM(gmi), state); + return; +} + /* Whenever we have a property change on a DbusmenuMenuitem we need to be responsive to that. */ static void @@ -153,6 +194,10 @@ menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * value, GtkMen process_visible(mi, gmi, value); } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_SENSITIVE)) { process_sensitive(mi, gmi, value); + } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE)) { + process_toggle_type(mi, gmi, value); + } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_TOGGLE_CHECKED)) { + process_toggle_checked(mi, gmi, value); } return; @@ -233,9 +278,13 @@ dbusmenu_gtkclient_newitem_base (DbusmenuGtkClient * client, DbusmenuMenuitem * /* Life insurance */ g_object_weak_ref(G_OBJECT(item), destoryed_dbusmenuitem_cb, gmi); + /* Check our set of props to see if any are set already */ process_visible(item, gmi, dbusmenu_menuitem_property_get_value(item, DBUSMENU_MENUITEM_PROP_VISIBLE)); process_sensitive(item, gmi, dbusmenu_menuitem_property_get_value(item, DBUSMENU_MENUITEM_PROP_SENSITIVE)); + process_toggle_type(item, gmi, dbusmenu_menuitem_property_get_value(item, DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE)); + process_toggle_checked(item, gmi, dbusmenu_menuitem_property_get_value(item, DBUSMENU_MENUITEM_PROP_TOGGLE_CHECKED)); + /* Oh, we're a child, let's deal with that */ if (parent != NULL) { new_child(parent, item, dbusmenu_menuitem_get_position(item, parent), DBUSMENU_GTKCLIENT(client)); } -- cgit v1.2.3 From 8ae44198e16818478035a666e2f998d8e584ab7c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 21:43:40 -0600 Subject: Protect against NULL values and treat them as default values. --- libdbusmenu-gtk/client.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 80d067f..80d2b4f 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -147,15 +147,17 @@ static void process_toggle_type (DbusmenuMenuitem * mi, GtkMenuItem * gmi, const GValue * value) { if (!IS_GENERICMENUITEM(gmi)) return; - if (G_VALUE_TYPE(value) != G_TYPE_STRING) return; - const gchar * strval = g_value_get_string(value); GenericmenuitemCheckType type = GENERICMENUITEM_CHECK_TYPE_NONE; - if (!g_strcmp0(strval, "checkbox")) { - type = GENERICMENUITEM_CHECK_TYPE_CHECKBOX; - } else if (!g_strcmp0(strval, "radio")) { - type = GENERICMENUITEM_CHECK_TYPE_RADIO; + if (value != NULL && G_VALUE_TYPE(value) == G_TYPE_STRING) { + const gchar * strval = g_value_get_string(value); + + if (!g_strcmp0(strval, "checkbox")) { + type = GENERICMENUITEM_CHECK_TYPE_CHECKBOX; + } else if (!g_strcmp0(strval, "radio")) { + type = GENERICMENUITEM_CHECK_TYPE_RADIO; + } } genericmenuitem_set_check_type(GENERICMENUITEM(gmi), type); @@ -168,15 +170,17 @@ static void process_toggle_checked (DbusmenuMenuitem * mi, GtkMenuItem * gmi, const GValue * value) { if (!IS_GENERICMENUITEM(gmi)) return; - if (G_VALUE_TYPE(value) != G_TYPE_STRING) return; - const gchar * strval = g_value_get_string(value); GenericmenuitemState state = GENERICMENUITEM_STATE_UNCHECKED; - if (!g_strcmp0(strval, "checked")) { - state = GENERICMENUITEM_STATE_CHECKED; - } else if (!g_strcmp0(strval, "indeterminate")) { - state = GENERICMENUITEM_STATE_INDETERMINATE; + if (value != NULL && G_VALUE_TYPE(value) == G_TYPE_STRING) { + const gchar * strval = g_value_get_string(value); + + if (!g_strcmp0(strval, "checked")) { + state = GENERICMENUITEM_STATE_CHECKED; + } else if (!g_strcmp0(strval, "indeterminate")) { + state = GENERICMENUITEM_STATE_INDETERMINATE; + } } genericmenuitem_set_state(GENERICMENUITEM(gmi), state); -- cgit v1.2.3 From 186e1058f5142308a02ecf20ed4653a7862cd973 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 16 Dec 2009 23:17:59 -0600 Subject: Adding in an activate function so that we don't toggle our value on click. We're letting the application handle that. But, in turn, it turns out that is the only way to set the active property. So without an activate function, we can't set it. So, we're taking a lot more responsibility for setting it properly when we want to. --- libdbusmenu-gtk/genericmenuitem.c | 43 ++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 3f7f22d..09d5004 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -26,6 +26,7 @@ static void genericmenuitem_finalize (GObject *object); static void draw_indicator (GtkCheckMenuItem *check_menu_item, GdkRectangle *area); static void set_label (GtkMenuItem * menu_item, const gchar * label); static const gchar * get_label (GtkMenuItem * menu_item); +static void activate (GtkMenuItem * menu_item); /* GObject stuff */ G_DEFINE_TYPE (Genericmenuitem, genericmenuitem, GTK_TYPE_CHECK_MENU_ITEM); @@ -53,6 +54,7 @@ genericmenuitem_class_init (GenericmenuitemClass *klass) GtkMenuItemClass * menuitem_class = GTK_MENU_ITEM_CLASS (klass); menuitem_class->set_label = set_label; menuitem_class->get_label = get_label; + menuitem_class->activate = activate; return; } @@ -162,6 +164,14 @@ get_label (GtkMenuItem * menu_item) return NULL; } +/* Make sure we don't toggle when there is an + activate like a normal check menu item. */ +static void +activate (GtkMenuItem * menu_item) +{ + return; +} + /** genericmenuitem_set_check_type: @item: #Genericmenuitem to set the type on @@ -223,33 +233,38 @@ genericmenuitem_set_state (Genericmenuitem * item, GenericmenuitemState state) } item->priv->state = state; - GValue value = {0}; - g_value_init(&value, G_TYPE_BOOLEAN); + + GtkCheckMenuItem * check = GTK_CHECK_MENU_ITEM(item); + + gboolean old_active = check->active; + gboolean old_inconsist = check->inconsistent; switch (item->priv->state) { case GENERICMENUITEM_STATE_UNCHECKED: - g_value_set_boolean(&value, FALSE); - g_object_set_property(G_OBJECT(item), "active", &value); - g_value_set_boolean(&value, FALSE); - g_object_set_property(G_OBJECT(item), "inconsistent", &value); + check->active = FALSE; + check->inconsistent = FALSE; break; case GENERICMENUITEM_STATE_CHECKED: - g_value_set_boolean(&value, TRUE); - g_object_set_property(G_OBJECT(item), "active", &value); - g_value_set_boolean(&value, FALSE); - g_object_set_property(G_OBJECT(item), "inconsistent", &value); + check->active = TRUE; + check->inconsistent = FALSE; break; case GENERICMENUITEM_STATE_INDETERMINATE: - g_value_set_boolean(&value, TRUE); - g_object_set_property(G_OBJECT(item), "active", &value); - g_value_set_boolean(&value, TRUE); - g_object_set_property(G_OBJECT(item), "inconsistent", &value); + check->active = TRUE; + check->inconsistent = TRUE; break; default: g_warning("Generic Menuitem invalid check state: %d", state); return; } + if (old_active != check->active) { + g_object_notify(G_OBJECT(item), "active"); + } + + if (old_inconsist != check->inconsistent) { + g_object_notify(G_OBJECT(item), "inconsistent"); + } + gtk_widget_queue_draw(GTK_WIDGET(item)); return; -- cgit v1.2.3 From 339b68e8b1a816a9ee5d44fea3a98e0492c65885 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 17 Dec 2009 14:25:32 -0600 Subject: License headers. I hate these. --- libdbusmenu-gtk/genericmenuitem.c | 28 ++++++++++++++++++++++++++++ libdbusmenu-gtk/genericmenuitem.h | 28 ++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 09d5004..aff14ef 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -1,3 +1,31 @@ +/* +A menuitem subclass that has the ability to do lots of different +things depending on it's settings. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of either or both of the following licenses: + +1) the GNU Lesser General Public License version 3, as published by the +Free Software Foundation; and/or +2) the GNU Lesser General Public License version 2.1, as published by +the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR +PURPOSE. See the applicable version of the GNU Lesser General Public +License for more details. + +You should have received a copy of both the GNU Lesser General Public +License version 3 and version 2.1 along with this program. If not, see + +*/ + #ifdef HAVE_CONFIG_H #include "config.h" #endif diff --git a/libdbusmenu-gtk/genericmenuitem.h b/libdbusmenu-gtk/genericmenuitem.h index 6c494e8..3c4af0c 100644 --- a/libdbusmenu-gtk/genericmenuitem.h +++ b/libdbusmenu-gtk/genericmenuitem.h @@ -1,3 +1,31 @@ +/* +A menuitem subclass that has the ability to do lots of different +things depending on it's settings. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of either or both of the following licenses: + +1) the GNU Lesser General Public License version 3, as published by the +Free Software Foundation; and/or +2) the GNU Lesser General Public License version 2.1, as published by +the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR +PURPOSE. See the applicable version of the GNU Lesser General Public +License for more details. + +You should have received a copy of both the GNU Lesser General Public +License version 3 and version 2.1 along with this program. If not, see + +*/ + #ifndef __GENERICMENUITEM_H__ #define __GENERICMENUITEM_H__ -- cgit v1.2.3 From 7f702b6234af4ec162997c16a3c4e8eb64afa8cb Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 17 Dec 2009 15:21:58 -0600 Subject: Trying to reduce the complexity of adding a label. Now we can detect the various cases and make sense of them. Which is kinda nice. More confident in this code. --- libdbusmenu-gtk/genericmenuitem.c | 91 +++++++++++++++++++++++++++++---------- 1 file changed, 68 insertions(+), 23 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index aff14ef..0eb78dc 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -148,37 +148,66 @@ static void set_label (GtkMenuItem * menu_item, const gchar * label) { GtkWidget * child = gtk_bin_get_child(GTK_BIN(menu_item)); + GtkLabel * labelw = NULL; + gboolean suppress_update = FALSE; + + /* Try to find if we have a label already */ + if (child != NULL) { + if (GTK_IS_LABEL(child)) { + /* We've got a label, let's update it. */ + labelw = GTK_LABEL(child); + } else if (GTK_IS_BOX(child)) { + /* Look for the label in the box */ + gtk_container_foreach(GTK_CONTAINER(child), set_label_helper, &labelw); + } else { + /* We need to put the child into a new box and + make the box the child of the menu item. Basically + we're inserting a box in the middle. */ + GtkWidget * hbox = gtk_hbox_new(FALSE, 0); + g_object_ref(child); + gtk_container_remove(GTK_CONTAINER(menu_item), child); + gtk_box_pack_start(GTK_BOX(hbox), child, FALSE, FALSE, 0); + gtk_container_add(GTK_CONTAINER(menu_item), hbox); + gtk_widget_show(hbox); + g_object_unref(child); + child = hbox; + /* It's important to notice that labelw is not set + by this condition. There was no label to find. */ + } + } - if (child == NULL) { - GtkWidget * labelw = gtk_label_new(label); + /* No we can see if we need to ethier build a label or just + update the one that we already have. */ + if (labelw == NULL) { + /* Build it */ + labelw = GTK_LABEL(gtk_label_new(label)); gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE); gtk_misc_set_alignment(GTK_MISC(labelw), 0.0, 0.5); - gtk_container_add(GTK_CONTAINER(menu_item), labelw); - gtk_widget_show(labelw); - } else if (GTK_IS_LABEL(child)) { - gtk_label_set_label(GTK_LABEL(child), label); - } else if (GTK_IS_BOX(child)) { - GtkWidget * labelw = NULL; - /* Look for the label */ - gtk_container_foreach(GTK_CONTAINER(child), set_label_helper, &labelw); - - if (labelw == NULL) { - /* We don't have a label, so we need to build */ - labelw = gtk_label_new(label); - gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE); - gtk_misc_set_alignment(GTK_MISC(labelw), 0.0, 0.5); - gtk_box_pack_end(GTK_BOX(child), labelw, TRUE, TRUE, 0); - gtk_widget_show(labelw); + gtk_widget_show(GTK_WIDGET(labelw)); + + /* Check to see if it needs to be in the bin for this + menu item or whether it gets packed in a box. */ + if (child == NULL) { + gtk_container_add(GTK_CONTAINER(menu_item), GTK_WIDGET(labelw)); } else { - /* We can reset the label that we have. */ - gtk_label_set_label(GTK_LABEL(labelw), label); + gtk_box_pack_end(GTK_BOX(child), GTK_WIDGET(labelw), TRUE, TRUE, 0); } } else { - g_error("Generic item in an indeterminate state."); - return; + /* Oh, just an update. No biggie. */ + if (!g_strcmp0(label, gtk_label_get_label(labelw))) { + /* The only reason to suppress the update is if we had + a label and the value was the same as the one we're + getting in. */ + suppress_update = TRUE; + } else { + gtk_label_set_label(labelw, label); + } } - g_object_notify(G_OBJECT(menu_item), "label"); + /* If we changed the value, tell folks. */ + if (!suppress_update) { + g_object_notify(G_OBJECT(menu_item), "label"); + } return; } @@ -187,7 +216,23 @@ set_label (GtkMenuItem * menu_item, const gchar * label) static const gchar * get_label (GtkMenuItem * menu_item) { + GtkWidget * child = gtk_bin_get_child(GTK_BIN(menu_item)); + GtkLabel * labelw = NULL; + + /* Try to find if we have a label already */ + if (child != NULL) { + if (GTK_IS_LABEL(child)) { + /* We've got a label, let's update it. */ + labelw = GTK_LABEL(child); + } else if (GTK_IS_BOX(child)) { + /* Look for the label in the box */ + gtk_container_foreach(GTK_CONTAINER(child), set_label_helper, &labelw); + } + } + if (labelw != NULL) { + return gtk_label_get_label(labelw); + } return NULL; } -- cgit v1.2.3 From ef5865fb14bb25ffbb05c6c22c7a74cb22a89f5e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 17 Dec 2009 15:35:23 -0600 Subject: Fleshing out the image functions for our generic item. --- libdbusmenu-gtk/genericmenuitem.c | 70 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 3 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index 0eb78dc..dded1de 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -343,6 +343,18 @@ genericmenuitem_set_state (Genericmenuitem * item, GenericmenuitemState state) return; } +/* A small helper to look through the widgets in the + box and find the one that is the image. */ +static void +set_image_helper (GtkWidget * widget, gpointer data) +{ + GtkWidget ** labelval = (GtkWidget **)data; + if (GTK_IS_IMAGE(widget)) { + *labelval = widget; + } + return; +} + /** genericmenuitem_set_image: @item: A #Genericmenuitem @@ -351,9 +363,49 @@ genericmenuitem_set_state (Genericmenuitem * item, GenericmenuitemState state) Sets the image of the menu item. */ void -genericmenuitem_set_image (Genericmenuitem * item, GtkWidget * image) +genericmenuitem_set_image (Genericmenuitem * menu_item, GtkWidget * image) { + GtkWidget * child = gtk_bin_get_child(GTK_BIN(menu_item)); + GtkImage * imagew = NULL; + /* Try to find if we have a label already */ + if (child != NULL) { + if (GTK_IS_IMAGE(child)) { + /* We've got a label, let's update it. */ + imagew = GTK_IMAGE(child); + } else if (GTK_IS_BOX(child)) { + /* Look for the label in the box */ + gtk_container_foreach(GTK_CONTAINER(child), set_image_helper, &imagew); + } else { + /* We need to put the child into a new box and + make the box the child of the menu item. Basically + we're inserting a box in the middle. */ + GtkWidget * hbox = gtk_hbox_new(FALSE, 0); + g_object_ref(child); + gtk_container_remove(GTK_CONTAINER(menu_item), child); + gtk_box_pack_end(GTK_BOX(hbox), child, TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(menu_item), hbox); + gtk_widget_show(hbox); + g_object_unref(child); + child = hbox; + /* It's important to notice that imagew is not set + by this condition. There was no label to find. */ + } + } + + /* No we can see if we need to ethier replace and image or + just put ourselves into the structures */ + if (imagew != NULL) { + gtk_widget_destroy(GTK_WIDGET(imagew)); + } + + /* Check to see if it needs to be in the bin for this + menu item or whether it gets packed in a box. */ + if (child == NULL) { + gtk_container_add(GTK_CONTAINER(menu_item), GTK_WIDGET(image)); + } else { + gtk_box_pack_start(GTK_BOX(child), GTK_WIDGET(image), FALSE, FALSE, 0); + } return; } @@ -368,9 +420,21 @@ genericmenuitem_set_image (Genericmenuitem * item, GtkWidget * image) if there isn't one. */ GtkWidget * -genericmenuitem_get_image (Genericmenuitem * item) +genericmenuitem_get_image (Genericmenuitem * menu_item) { + GtkWidget * child = gtk_bin_get_child(GTK_BIN(menu_item)); + GtkWidget * imagew = NULL; + /* Try to find if we have a label already */ + if (child != NULL) { + if (GTK_IS_IMAGE(child)) { + /* We've got a label, let's update it. */ + imagew = child; + } else if (GTK_IS_BOX(child)) { + /* Look for the label in the box */ + gtk_container_foreach(GTK_CONTAINER(child), set_image_helper, &imagew); + } + } - return NULL; + return imagew; } -- cgit v1.2.3 From 21b5c268ced2ded5ffe46be7f718e186eb2c834c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 17 Dec 2009 15:49:27 -0600 Subject: Handling the case of getting an image with the purpose of clearing the label. Also showing the image. --- libdbusmenu-gtk/genericmenuitem.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c index dded1de..f927556 100644 --- a/libdbusmenu-gtk/genericmenuitem.c +++ b/libdbusmenu-gtk/genericmenuitem.c @@ -376,7 +376,7 @@ genericmenuitem_set_image (Genericmenuitem * menu_item, GtkWidget * image) } else if (GTK_IS_BOX(child)) { /* Look for the label in the box */ gtk_container_foreach(GTK_CONTAINER(child), set_image_helper, &imagew); - } else { + } else if (image != NULL) { /* We need to put the child into a new box and make the box the child of the menu item. Basically we're inserting a box in the middle. */ @@ -401,10 +401,14 @@ genericmenuitem_set_image (Genericmenuitem * menu_item, GtkWidget * image) /* Check to see if it needs to be in the bin for this menu item or whether it gets packed in a box. */ - if (child == NULL) { - gtk_container_add(GTK_CONTAINER(menu_item), GTK_WIDGET(image)); - } else { - gtk_box_pack_start(GTK_BOX(child), GTK_WIDGET(image), FALSE, FALSE, 0); + if (image != NULL) { + if (child == NULL) { + gtk_container_add(GTK_CONTAINER(menu_item), GTK_WIDGET(image)); + } else { + gtk_box_pack_start(GTK_BOX(child), GTK_WIDGET(image), FALSE, FALSE, 0); + } + + gtk_widget_show(image); } return; -- cgit v1.2.3 From 53ce3275daf3cd64f160a5f77a03b9949f196e1d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 17 Dec 2009 16:43:32 -0600 Subject: Not setting the underline for seperators. --- libdbusmenu-gtk/client.c | 1 - 1 file changed, 1 deletion(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 80d2b4f..27ac4dc 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -452,7 +452,6 @@ new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm GtkMenuItem * gmi; gmi = GTK_MENU_ITEM(gtk_separator_menu_item_new()); - gtk_menu_item_set_use_underline (gmi, TRUE); if (gmi != NULL) { dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent); -- cgit v1.2.3