aboutsummaryrefslogtreecommitdiff
path: root/libdbusmenu-gtk
diff options
context:
space:
mode:
Diffstat (limited to 'libdbusmenu-gtk')
-rw-r--r--libdbusmenu-gtk/Makefile.in6
-rw-r--r--libdbusmenu-gtk/genericmenuitem.c24
-rw-r--r--libdbusmenu-gtk/parser.c66
3 files changed, 78 insertions, 18 deletions
diff --git a/libdbusmenu-gtk/Makefile.in b/libdbusmenu-gtk/Makefile.in
index 21d663e..5041590 100644
--- a/libdbusmenu-gtk/Makefile.in
+++ b/libdbusmenu-gtk/Makefile.in
@@ -239,6 +239,10 @@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
INTLTOOL_MERGE = @INTLTOOL_MERGE@
INTLTOOL_PERL = @INTLTOOL_PERL@
INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@
+INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@
+INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@
+INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@
INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
@@ -331,6 +335,8 @@ htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
+intltool__v_merge_options_ = @intltool__v_merge_options_@
+intltool__v_merge_options_0 = @intltool__v_merge_options_0@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c
index 435c808..e9c8367 100644
--- a/libdbusmenu-gtk/genericmenuitem.c
+++ b/libdbusmenu-gtk/genericmenuitem.c
@@ -83,6 +83,12 @@ genericmenuitem_class_init (GenericmenuitemClass *klass)
object_class->dispose = genericmenuitem_dispose;
object_class->finalize = genericmenuitem_finalize;
+#ifdef HAVE_GTK3
+ GtkWidgetClass * widget_class = GTK_WIDGET_CLASS(klass);
+
+ gtk_widget_class_set_accessible_role(widget_class, ATK_ROLE_MENU_ITEM);
+#endif
+
GtkCheckMenuItemClass * check_class = GTK_CHECK_MENU_ITEM_CLASS (klass);
parent_draw_indicator = check_class->draw_indicator;
@@ -109,6 +115,13 @@ genericmenuitem_init (Genericmenuitem *self)
self->priv->disposition = GENERICMENUITEM_DISPOSITION_NORMAL;
self->priv->label_text = NULL;
+#ifndef HAVE_GTK3
+ AtkObject * aobj = gtk_widget_get_accessible(GTK_WIDGET(self));
+ if (aobj != NULL) {
+ atk_object_set_role(aobj, ATK_ROLE_MENU_ITEM);
+ }
+#endif
+
return;
}
@@ -347,18 +360,29 @@ genericmenuitem_set_check_type (Genericmenuitem * item, GenericmenuitemCheckType
}
item->priv->check_type = check_type;
+ AtkObject * aobj = gtk_widget_get_accessible(GTK_WIDGET(item));
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. */
+
+ if (aobj != NULL) {
+ atk_object_set_role(aobj, ATK_ROLE_MENU_ITEM);
+ }
break;
case GENERICMENUITEM_CHECK_TYPE_CHECKBOX:
gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item), FALSE);
+ if (aobj != NULL) {
+ atk_object_set_role(aobj, ATK_ROLE_CHECK_MENU_ITEM);
+ }
break;
case GENERICMENUITEM_CHECK_TYPE_RADIO:
gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item), TRUE);
+ if (aobj != NULL) {
+ atk_object_set_role(aobj, ATK_ROLE_RADIO_MENU_ITEM);
+ }
break;
default:
g_warning("Generic Menuitem invalid check type: %d", check_type);
diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c
index 019a304..70ffcea 100644
--- a/libdbusmenu-gtk/parser.c
+++ b/libdbusmenu-gtk/parser.c
@@ -44,6 +44,8 @@ typedef struct _ParserData
GtkWidget *shell;
GtkWidget *image;
AtkObject *accessible;
+
+ guint theme_changed_sig;
} ParserData;
typedef struct _RecurseContext
@@ -59,6 +61,8 @@ static void accel_changed (GtkWidget * widget,
static void checkbox_toggled (GtkWidget * widget,
DbusmenuMenuitem * mi);
static void update_icon (DbusmenuMenuitem * menuitem,
+ ParserData * pdata,
+ GtkImageMenuItem * gmenuitem,
GtkImage * image);
static GtkWidget * find_menu_label (GtkWidget * widget);
static void label_notify_cb (GtkWidget * widget,
@@ -212,6 +216,11 @@ parse_data_free (gpointer data)
g_object_remove_weak_pointer(G_OBJECT(pdata->accessible), (gpointer*)&pdata->accessible);
}
+ if (pdata != NULL && pdata->theme_changed_sig != 0) {
+ g_signal_handler_disconnect(gtk_icon_theme_get_default(), pdata->theme_changed_sig);
+ pdata->theme_changed_sig = 0;
+ }
+
g_free(pdata);
return;
@@ -568,19 +577,7 @@ construct_dbusmenu_for_widget (GtkWidget * widget)
if (GTK_IS_IMAGE (image))
{
- update_icon (mi, GTK_IMAGE (image));
-
- /* Watch for theme changes because if gicon changes, we want to send a
- different pixbuf. */
- g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()),
- "changed", G_CALLBACK(theme_changed_cb), widget);
-
- pdata->image = image;
- g_signal_connect (G_OBJECT (image),
- "notify",
- G_CALLBACK (image_notify_cb),
- mi);
- g_object_add_weak_pointer(G_OBJECT (image), (gpointer*)&pdata->image);
+ update_icon (mi, pdata, GTK_IMAGE_MENU_ITEM(widget), GTK_IMAGE (image));
}
}
@@ -737,7 +734,7 @@ checkbox_toggled (GtkWidget *widget, DbusmenuMenuitem *mi)
}
static void
-update_icon (DbusmenuMenuitem *menuitem, GtkImage *image)
+update_icon (DbusmenuMenuitem *menuitem, ParserData * pdata, GtkImageMenuItem * gmenuitem, GtkImage *image)
{
GdkPixbuf * pixbuf = NULL;
const gchar * icon_name = NULL;
@@ -746,6 +743,35 @@ update_icon (DbusmenuMenuitem *menuitem, GtkImage *image)
GtkIconInfo * info;
gint width;
+ /* Check to see if we're changing the image. If so, we need to track
+ that little bugger */
+ /* Why check for gmenuitem being NULL? Because there are some cases where
+ we can't get it easily, and those mean it's not changed just the icon
+ underneith, so we can ignore these larger impacts */
+ if (image != GTK_IMAGE(pdata->image) && gmenuitem != NULL) {
+ if (pdata->theme_changed_sig != 0) {
+ g_signal_handler_disconnect(gtk_icon_theme_get_default(), pdata->theme_changed_sig);
+ pdata->theme_changed_sig = 0;
+ }
+
+ if (pdata->image != NULL) {
+ g_signal_handlers_disconnect_by_func(pdata->image, G_CALLBACK(image_notify_cb), menuitem);
+ g_object_remove_weak_pointer(G_OBJECT(pdata->image), (gpointer*)&pdata->image);
+ }
+
+ pdata->image = GTK_WIDGET(image);
+
+ if (pdata->image != NULL) {
+ pdata->theme_changed_sig = g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()),
+ "changed", G_CALLBACK(theme_changed_cb), gmenuitem);
+ g_signal_connect (G_OBJECT (pdata->image),
+ "notify",
+ G_CALLBACK (image_notify_cb),
+ menuitem);
+ g_object_add_weak_pointer(G_OBJECT (pdata->image), (gpointer*)&pdata->image);
+ }
+ }
+
if (image != NULL && should_show_image (image)) {
switch (gtk_image_get_storage_type (image)) {
case GTK_IMAGE_EMPTY:
@@ -946,7 +972,8 @@ image_notify_cb (GtkWidget *widget,
pspec->name == g_intern_static_string ("stock") ||
pspec->name == g_intern_static_string ("storage-type"))
{
- update_icon (mi, GTK_IMAGE (widget));
+ ParserData *pdata = (ParserData *)g_object_get_data(G_OBJECT(mi), PARSER_DATA);
+ update_icon (mi, pdata, NULL, GTK_IMAGE (widget));
}
}
@@ -1134,13 +1161,15 @@ widget_notify_cb (GtkWidget *widget,
{
GtkWidget *image = NULL;
g_object_get(widget, "image", &image, NULL);
- update_icon (child, GTK_IMAGE(image));
+ ParserData *pdata = (ParserData *)g_object_get_data(G_OBJECT(child), PARSER_DATA);
+ update_icon (child, pdata, GTK_IMAGE_MENU_ITEM(widget), GTK_IMAGE(image));
}
else if (pspec->name == g_intern_static_string ("image"))
{
GtkWidget *image;
image = GTK_WIDGET (g_value_get_object (&prop_value));
- update_icon (child, GTK_IMAGE (image));
+ ParserData *pdata = (ParserData *)g_object_get_data(G_OBJECT(child), PARSER_DATA);
+ update_icon (child, pdata, GTK_IMAGE_MENU_ITEM(widget), GTK_IMAGE (image));
}
else if (pspec->name == g_intern_static_string ("parent"))
{
@@ -1259,7 +1288,8 @@ theme_changed_cb (GtkIconTheme *theme, gpointer data)
gpointer pmi = g_object_get_data(G_OBJECT(data), CACHED_MENUITEM);
if (pmi != NULL) {
- update_icon(DBUSMENU_MENUITEM(pmi), GTK_IMAGE(image));
+ ParserData *pdata = (ParserData *)g_object_get_data(G_OBJECT(pmi), PARSER_DATA);
+ update_icon(DBUSMENU_MENUITEM(pmi), pdata, NULL, GTK_IMAGE(image));
}
/* Switch signal to new theme */