diff --git a/gdk/x11/gdksettings.c b/gdk/x11/gdksettings.c index fd7aacd676..e98b33ebd5 100644 --- a/gdk/x11/gdksettings.c +++ b/gdk/x11/gdksettings.c @@ -36,6 +36,7 @@ static const struct { {"Gtk/FontName", "gtk-font-name"}, {"Gtk/KeyThemeName", "gtk-key-theme-name"}, {"Gtk/Modules", "gtk-modules"}, + {"Gtk/MenuImages", "gtk-menu-images"}, {"Gtk/CursorThemeName", "gtk-cursor-theme-name"}, {"Gtk/CursorThemeSize", "gtk-cursor-theme-size"}, {"Gtk/ColorScheme", "gtk-color-scheme"}, diff --git a/gtk/deprecated/gtkaction.c b/gtk/deprecated/gtkaction.c index 3e5a6300c3..8d8db85da7 100644 --- a/gtk/deprecated/gtkaction.c +++ b/gtk/deprecated/gtkaction.c @@ -497,7 +497,8 @@ gtk_action_class_init (GtkActionClass *klass) /** * GtkAction:always-show-image: * - * If %TRUE, the action's menu item proxies will always show their image, if available. + * If %TRUE, the action's menu item proxies will ignore the #GtkSettings:gtk-menu-images + * setting and always show their image, if available. * * Use this property if the menu item would be useless or hard to use * without their image. @@ -1352,8 +1353,8 @@ gtk_action_get_is_important (GtkAction *action) * @action: a #GtkAction * @always_show: %TRUE if menuitem proxies should always show their image * - * Sets whether @action's menu item proxies will always show - * their image, if available. + * Sets whether @action's menu item proxies will ignore the + * #GtkSettings:gtk-menu-images setting and always show their image, if available. * * Use this if the menu item would be useless or hard to use * without their image. diff --git a/gtk/deprecated/gtkimagemenuitem.c b/gtk/deprecated/gtkimagemenuitem.c index c12bae9d73..02545072ba 100644 --- a/gtk/deprecated/gtkimagemenuitem.c +++ b/gtk/deprecated/gtkimagemenuitem.c @@ -109,6 +109,8 @@ static void gtk_image_menu_item_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static void gtk_image_menu_item_screen_changed (GtkWidget *widget, + GdkScreen *previous_screen); static void gtk_image_menu_item_recalculate (GtkImageMenuItem *image_menu_item); @@ -135,6 +137,7 @@ gtk_image_menu_item_class_init (GtkImageMenuItemClass *klass) GtkContainerClass *container_class = (GtkContainerClass*) klass; widget_class->destroy = gtk_image_menu_item_destroy; + widget_class->screen_changed = gtk_image_menu_item_screen_changed; widget_class->get_preferred_width = gtk_image_menu_item_get_preferred_width; widget_class->get_preferred_height = gtk_image_menu_item_get_preferred_height; widget_class->get_preferred_height_for_width = gtk_image_menu_item_get_preferred_height_for_width; @@ -306,6 +309,21 @@ gtk_image_menu_item_get_property (GObject *object, } } +static gboolean +show_image (GtkImageMenuItem *image_menu_item) +{ + GtkImageMenuItemPrivate *priv = image_menu_item->priv; + GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (image_menu_item)); + gboolean show; + + if (priv->always_show_image) + show = TRUE; + else + g_object_get (settings, "gtk-menu-images", &show, NULL); + + return show; +} + static void gtk_image_menu_item_map (GtkWidget *widget) { @@ -316,7 +334,7 @@ gtk_image_menu_item_map (GtkWidget *widget) if (priv->image) g_object_set (priv->image, - "visible", priv->always_show_image, + "visible", show_image (image_menu_item), NULL); } @@ -932,7 +950,8 @@ gtk_image_menu_item_get_use_stock (GtkImageMenuItem *image_menu_item) * @image_menu_item: a #GtkImageMenuItem * @always_show: %TRUE if the menuitem should always show the image * - * If %TRUE, the menu item will always show the image, if available. + * If %TRUE, the menu item will ignore the #GtkSettings:gtk-menu-images + * setting and always show the image, if available. * * Use this property if the menuitem would be useless or hard to use * without the image. @@ -957,7 +976,7 @@ gtk_image_menu_item_set_always_show_image (GtkImageMenuItem *image_menu_item, if (priv->image) { - if (priv->always_show_image) + if (show_image (image_menu_item)) gtk_widget_show (priv->image); else gtk_widget_hide (priv->image); @@ -971,7 +990,8 @@ gtk_image_menu_item_set_always_show_image (GtkImageMenuItem *image_menu_item, * gtk_image_menu_item_get_always_show_image: * @image_menu_item: a #GtkImageMenuItem * - * Returns whether the menu item will always show the image, if available. + * Returns whether the menu item will ignore the #GtkSettings:gtk-menu-images + * setting and always show the image, if available. * * Returns: %TRUE if the menu item will always show the image * @@ -1075,7 +1095,7 @@ gtk_image_menu_item_set_image (GtkImageMenuItem *image_menu_item, gtk_widget_set_parent (image, GTK_WIDGET (image_menu_item)); g_object_set (image, - "visible", priv->always_show_image, + "visible", show_image (image_menu_item), "no-show-all", TRUE, NULL); @@ -1128,3 +1148,66 @@ gtk_image_menu_item_remove (GtkContainer *container, GTK_CONTAINER_CLASS (gtk_image_menu_item_parent_class)->remove (container, child); } } + +static void +show_image_change_notify (GtkImageMenuItem *image_menu_item) +{ + GtkImageMenuItemPrivate *priv = image_menu_item->priv; + + if (priv->image) + { + if (show_image (image_menu_item)) + gtk_widget_show (priv->image); + else + gtk_widget_hide (priv->image); + } +} + +static void +traverse_container (GtkWidget *widget, + gpointer data) +{ + if (GTK_IS_IMAGE_MENU_ITEM (widget)) + show_image_change_notify (GTK_IMAGE_MENU_ITEM (widget)); + else if (GTK_IS_CONTAINER (widget)) + gtk_container_forall (GTK_CONTAINER (widget), traverse_container, NULL); +} + +static void +gtk_image_menu_item_setting_changed (GtkSettings *settings) +{ + GList *list, *l; + + list = gtk_window_list_toplevels (); + + for (l = list; l; l = l->next) + gtk_container_forall (GTK_CONTAINER (l->data), + traverse_container, NULL); + + g_list_free (list); +} + +static void +gtk_image_menu_item_screen_changed (GtkWidget *widget, + GdkScreen *previous_screen) +{ + GtkSettings *settings; + gulong show_image_connection; + + if (!gtk_widget_has_screen (widget)) + return; + + settings = gtk_widget_get_settings (widget); + + show_image_connection = + g_signal_handler_find (settings, G_SIGNAL_MATCH_FUNC, 0, 0, + NULL, gtk_image_menu_item_setting_changed, NULL); + + if (show_image_connection) + return; + + g_signal_connect (settings, "notify::gtk-menu-images", + G_CALLBACK (gtk_image_menu_item_setting_changed), NULL); + + show_image_change_notify (GTK_IMAGE_MENU_ITEM (widget)); +} diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index 484a5c1354..0c79c4a2ee 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -1350,7 +1350,7 @@ gtk_settings_class_init (GtkSettingsClass *class) * * Whether images should be shown in menu items * - * Deprecated: 3.10: This setting is ignored + * Deprecated: 3.10: This setting is deprecated */ result = settings_install_property_parser (class, g_param_spec_boolean ("gtk-menu-images",