From 309891ed2caf92e93934276fa91d0b16c7f9f557 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 2 Sep 2009 09:48:52 -0500 Subject: Basic support for the sensitive property. --- libdbusmenu-gtk/client.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'libdbusmenu-gtk/client.c') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 7271c37..b3d55d9 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -48,6 +48,9 @@ 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); + /* GObject Stuff */ G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT); @@ -116,6 +119,18 @@ process_visible (GtkMenuItem * gmi, const gchar * value) return; } +/* Process the sensitive property */ +static void +process_sensitive (GtkMenuItem * gmi, const gchar * value) +{ + if (value == NULL || !g_strcmp0(value, "true")) { + gtk_widget_set_sensitive(GTK_WIDGET(gmi), TRUE); + } else { + gtk_widget_set_sensitive(GTK_WIDGET(gmi), FALSE); + } + return; +} + /* Whenever we have a property change on a DbusmenuMenuitem we need to be responsive to that. */ static void @@ -125,6 +140,8 @@ menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenu gtk_menu_item_set_label(gmi, value); } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_VISIBLE)) { process_visible(gmi, value); + } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_SENSITIVE)) { + process_sensitive(gmi, value); } return; @@ -171,6 +188,7 @@ dbusmenu_gtkclient_newitem_base (DbusmenuGtkClient * client, DbusmenuMenuitem * 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)); if (parent != NULL) { new_child(parent, item, dbusmenu_menuitem_get_position(item, parent), DBUSMENU_GTKCLIENT(client)); -- cgit v1.2.3 From 71082927e6c21b163ad5771d9dfe9a1c885fe5ed Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 2 Sep 2009 11:08:02 -0500 Subject: Inital structure for the image menu item. --- libdbusmenu-gtk/client.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'libdbusmenu-gtk/client.c') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 7271c37..0936fc8 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -322,9 +322,42 @@ new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm return TRUE; } +static void +image_property_handle (DbusmenuMenuitem * item, const gchar * property, const gchar * value, gpointer user_data) +{ + + + return; +} + 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()); + + 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(newitem, DBUSMENU_MENUITEM_PROP_ICON), + NULL); + image_property_handle(newitem, + DBUSMENU_MENUITEM_PROP_ICON_DATA, + dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_ICON_DATA), + NULL); + g_signal_connect(G_OBJECT(newitem), + DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, + G_CALLBACK(image_property_handle), + NULL); return TRUE; } -- cgit v1.2.3 From 13c8c7e819bc3489ac8c494198b08393cef6b6da Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 2 Sep 2009 15:01:11 -0500 Subject: Fleshing out the image property handler. --- libdbusmenu-gtk/client.c | 92 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 88 insertions(+), 4 deletions(-) (limited to 'libdbusmenu-gtk/client.c') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 0936fc8..b615019 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -33,6 +33,7 @@ License version 3 and version 2.1 along with this program. If not, see #include #include "client.h" +#include "menuitem.h" /* Prototypes */ static void dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass); @@ -322,14 +323,97 @@ new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm return TRUE; } +/* 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 user_data) +image_property_handle (DbusmenuMenuitem * item, const gchar * property, const gchar * value, gpointer userdata) { + if (g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON) || + g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON_DATA)) { + /* We're only looking at these two properties here */ + return; + } + + if (value == NULL || value[0] == '\0') { + /* This means that we're unsetting a value. */ + /* Try to use the other one */ + if (g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON)) { + property = DBUSMENU_MENUITEM_PROP_ICON_DATA; + } else { + property = DBUSMENU_MENUITEM_PROP_ICON; + } + } + + /* Grab the data of the items that we've got, so that + we can know how things need to change. */ + GtkMenuItem * gimi = dbusmenu_gtkclient_menuitem_get (DBUSMENU_GTKCLIENT(userdata), item); + if (gimi == NULL) { + 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)); + + /* Now figure out what to change */ + if (g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON)) { + const gchar * iconname = dbusmenu_menuitem_property_get(item, property); + if (iconname == NULL) { + /* If there is no name, by golly we want no + icon either. */ + gtkimage = NULL; + } else { + /* If we don't have an image, we need to build + one so that we can set the name. Otherwise we + can just convert it to this name. */ + if (gtkimage == NULL) { + gtkimage = gtk_image_new_from_icon_name(iconname, GTK_ICON_SIZE_MENU); + } else { + gtk_image_set_from_icon_name(GTK_IMAGE(gtkimage), iconname, GTK_ICON_SIZE_MENU); + } + } + } else { + GdkPixbuf * image = dbusmenu_menuitem_property_get_image(item, property); + if (image == NULL) { + /* If there is no pixbuf, by golly we want no + icon either. */ + gtkimage = NULL; + } else { + /* Resize the pixbuf */ + gint width, height; + gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height); + if (gdk_pixbuf_get_width(image) > width || + gdk_pixbuf_get_height(image) > height) { + GdkPixbuf * newimage = gdk_pixbuf_scale_simple(image, + width, + height, + GDK_INTERP_BILINEAR); + g_object_unref(image); + image = newimage; + } + + /* If we don't have an image, we need to build + one so that we can set the pixbuf. */ + if (gtkimage == NULL) { + gtkimage = gtk_image_new_from_pixbuf(image); + } else { + /* 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) { + gtk_image_set_from_pixbuf(GTK_IMAGE(gtkimage), image); + } else { + g_debug("Blocking icon image data as already set by name."); + } + } + } + + } + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gimi), gtkimage); 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) { @@ -349,15 +433,15 @@ 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), - NULL); + client); image_property_handle(newitem, DBUSMENU_MENUITEM_PROP_ICON_DATA, dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_ICON_DATA), - NULL); + client); g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(image_property_handle), - NULL); + client); return TRUE; } -- cgit v1.2.3 From 90e014164dc9e5b0b6f9cb756da914f001b255a4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 2 Sep 2009 15:02:55 -0500 Subject: A couple more comments. --- libdbusmenu-gtk/client.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'libdbusmenu-gtk/client.c') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index b615019..cbf8bc8 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -285,6 +285,8 @@ dbusmenu_gtkclient_menuitem_get (DbusmenuGtkClient * client, DbusmenuMenuitem * return mi; } +/* The base type handler that builds a plain ol' + GtkMenuItem to represent, well, the GtkMenuItem */ static gboolean new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) { @@ -304,6 +306,8 @@ new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusmenu return TRUE; } +/* Type handler for the seperators where it builds + a GtkSeparator to act as the GtkMenuItem */ static gboolean new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) { -- cgit v1.2.3 From def1cec9b003a821d1c91ae0acf1cd0a6a6a30a4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 3 Sep 2009 11:26:05 -0500 Subject: Switching to setting the label initially seems to make everything better. Go figure. --- libdbusmenu-gtk/client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libdbusmenu-gtk/client.c') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index cbf8bc8..3733432 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -426,7 +426,7 @@ new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuC /* Note: not checking parent, it's reasonable for it to be NULL */ GtkMenuItem * gmi; - gmi = GTK_MENU_ITEM(gtk_image_menu_item_new()); + gmi = GTK_MENU_ITEM(gtk_image_menu_item_new_with_label(dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_LABEL))); if (gmi != NULL) { dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent); -- cgit v1.2.3 From 299c398f84aa427600aa5a6ade9fb84ee6cf49be Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 3 Sep 2009 11:54:39 -0500 Subject: Fixing some string checking. Truth is a bitch. --- libdbusmenu-gtk/client.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'libdbusmenu-gtk/client.c') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 3733432..1106e3a 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -332,11 +332,8 @@ new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm static void image_property_handle (DbusmenuMenuitem * item, const gchar * property, const gchar * value, gpointer userdata) { - if (g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON) || - g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON_DATA)) { - /* We're only looking at these two properties here */ - return; - } + /* 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)); if (value == NULL || value[0] == '\0') { /* This means that we're unsetting a value. */ @@ -358,7 +355,7 @@ image_property_handle (DbusmenuMenuitem * item, const gchar * property, const gc GtkWidget * gtkimage = gtk_image_menu_item_get_image(GTK_IMAGE_MENU_ITEM(gimi)); /* Now figure out what to change */ - if (g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON)) { + if (!g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON)) { const gchar * iconname = dbusmenu_menuitem_property_get(item, property); if (iconname == NULL) { /* If there is no name, by golly we want no -- cgit v1.2.3 From 8db4ab3be8d1c89be219575350441ca8a63b9323 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 3 Sep 2009 12:12:18 -0500 Subject: Moving the checking on the data set on whether we have a name earlier. We don't want to change anything if we've got a name already. Return early. --- libdbusmenu-gtk/client.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'libdbusmenu-gtk/client.c') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 1106e3a..16eae34 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -354,6 +354,14 @@ image_property_handle (DbusmenuMenuitem * item, const gchar * property, const gc } GtkWidget * gtkimage = gtk_image_menu_item_get_image(GTK_IMAGE_MENU_ITEM(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) { + return; + } + } + /* Now figure out what to change */ if (!g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON)) { const gchar * iconname = dbusmenu_menuitem_property_get(item, property); @@ -396,13 +404,7 @@ image_property_handle (DbusmenuMenuitem * item, const gchar * property, const gc if (gtkimage == NULL) { gtkimage = gtk_image_new_from_pixbuf(image); } else { - /* 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) { - gtk_image_set_from_pixbuf(GTK_IMAGE(gtkimage), image); - } else { - g_debug("Blocking icon image data as already set by name."); - } + gtk_image_set_from_pixbuf(GTK_IMAGE(gtkimage), image); } } -- cgit v1.2.3