From e1bee5ad780d49b09d49e7d1da66ce6d17a81112 Mon Sep 17 00:00:00 2001 From: "reed@reedloden.com" Date: Wed, 20 Feb 2008 02:12:33 -0800 Subject: [PATCH] Bug 415810 - "Respect the user's settings of icons in menus" [p=ventnor.bugzilla@yahoo.com.au (Michael Ventnor) r+sr=roc r=Enn a1.9=schrep] --- layout/style/nsCSSRuleProcessor.cpp | 5 +++++ toolkit/content/xul.css | 11 +++++++++++ widget/public/nsILookAndFeel.h | 7 ++++++- widget/src/gtk2/gtk2drawing.c | 28 ++++++++++++++++++++++++++++ widget/src/gtk2/gtkdrawing.h | 6 ++++++ widget/src/gtk2/nsLookAndFeel.cpp | 4 +++- 6 files changed, 59 insertions(+), 2 deletions(-) diff --git a/layout/style/nsCSSRuleProcessor.cpp b/layout/style/nsCSSRuleProcessor.cpp index 44a7d952de0a..48a567ba149a 100644 --- a/layout/style/nsCSSRuleProcessor.cpp +++ b/layout/style/nsCSSRuleProcessor.cpp @@ -777,6 +777,11 @@ InitSystemMetrics() sSystemMetrics->AppendElement(do_GetAtom("scrollbar-thumb-proportional")); } + lookAndFeel->GetMetric(nsILookAndFeel::eMetric_ImagesInMenus, metricResult); + if (metricResult) { + sSystemMetrics->AppendElement(do_GetAtom("images-in-menus")); + } + return PR_TRUE; } diff --git a/toolkit/content/xul.css b/toolkit/content/xul.css index a813a7d69543..610c301a8e4e 100644 --- a/toolkit/content/xul.css +++ b/toolkit/content/xul.css @@ -304,6 +304,17 @@ menuitem.menuitem-non-iconic { -moz-binding: url("chrome://global/content/bindings/menu.xml#menubutton-item"); } +%ifdef MOZ_WIDGET_GTK2 +/********* detection of system setting to use icons in menus ***********/ +menuitem:not([type]):not(:-moz-system-metric(images-in-menus)) > .menu-iconic-left { + visibility: hidden; +} + +menu:not(:-moz-system-metric(images-in-menus)) > .menu-iconic-left { + visibility: hidden; +} +%endif + /********* menuseparator ***********/ menuseparator { diff --git a/widget/public/nsILookAndFeel.h b/widget/public/nsILookAndFeel.h index d115cb77591e..f3e6b5ee2d10 100644 --- a/widget/public/nsILookAndFeel.h +++ b/widget/public/nsILookAndFeel.h @@ -244,7 +244,12 @@ public: eMetric_IMERawInputUnderlineStyle, eMetric_IMESelectedRawTextUnderlineStyle, eMetric_IMEConvertedTextUnderlineStyle, - eMetric_IMESelectedConvertedTextUnderline + eMetric_IMESelectedConvertedTextUnderline, + + /** + * If this metric != 0, show icons in menus. + */ + eMetric_ImagesInMenus } nsMetricID; enum { diff --git a/widget/src/gtk2/gtk2drawing.c b/widget/src/gtk2/gtk2drawing.c index 07f0cb5e5e50..e9f5366ce153 100644 --- a/widget/src/gtk2/gtk2drawing.c +++ b/widget/src/gtk2/gtk2drawing.c @@ -81,6 +81,7 @@ static GtkWidget* gMenuBarWidget; static GtkWidget* gMenuBarItemWidget; static GtkWidget* gMenuPopupWidget; static GtkWidget* gMenuItemWidget; +static GtkWidget* gImageMenuItemWidget; static GtkWidget* gCheckMenuItemWidget; static GtkWidget* gTreeViewWidget; static GtkWidget* gTreeHeaderCellWidget; @@ -437,6 +438,19 @@ ensure_menu_item_widget() return MOZ_GTK_SUCCESS; } +static gint +ensure_image_menu_item_widget() +{ + if (!gImageMenuItemWidget) { + ensure_menu_popup_widget(); + gImageMenuItemWidget = gtk_image_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), + gImageMenuItemWidget); + gtk_widget_realize(gImageMenuItemWidget); + } + return MOZ_GTK_SUCCESS; +} + static gint ensure_menu_separator_widget() { @@ -2662,6 +2676,19 @@ moz_gtk_get_scrollbar_metrics(MozGtkScrollbarMetrics *metrics) return MOZ_GTK_SUCCESS; } +gboolean +moz_gtk_images_in_menus() +{ + gboolean result; + GtkSettings* settings; + + ensure_image_menu_item_widget(); + settings = gtk_widget_get_settings(gImageMenuItemWidget); + + g_object_get(settings, "gtk-menu-images", &result, NULL); + return result; +} + gint moz_gtk_widget_paint(GtkThemeWidgetType widget, GdkDrawable* drawable, GdkRectangle* rect, GdkRectangle* cliprect, @@ -2906,6 +2933,7 @@ moz_gtk_shutdown() gMenuBarItemWidget = NULL; gMenuPopupWidget = NULL; gMenuItemWidget = NULL; + gImageMenuItemWidget = NULL; gCheckMenuItemWidget = NULL; gTreeViewWidget = NULL; gTreeHeaderCellWidget = NULL; diff --git a/widget/src/gtk2/gtkdrawing.h b/widget/src/gtk2/gtkdrawing.h index 060213a0c1d9..88ab8914d8e9 100644 --- a/widget/src/gtk2/gtkdrawing.h +++ b/widget/src/gtk2/gtkdrawing.h @@ -404,6 +404,12 @@ GtkWidget* moz_gtk_get_scrollbar_widget(void); */ gint moz_gtk_get_tab_thickness(void); +/** + * Get a boolean which indicates whether or not to use images in menus. + * If TRUE, use images in menus. + */ +gboolean moz_gtk_images_in_menus(void); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/widget/src/gtk2/nsLookAndFeel.cpp b/widget/src/gtk2/nsLookAndFeel.cpp index 252dcd00a4e8..13cc7027fbe3 100644 --- a/widget/src/gtk2/nsLookAndFeel.cpp +++ b/widget/src/gtk2/nsLookAndFeel.cpp @@ -536,7 +536,9 @@ NS_IMETHODIMP nsLookAndFeel::GetMetric(const nsMetricID aID, PRInt32 & aMetric) case eMetric_IMESelectedConvertedTextUnderline: aMetric = NS_UNDERLINE_STYLE_NONE; break; - + case eMetric_ImagesInMenus: + aMetric = moz_gtk_images_in_menus(); + break; default: aMetric = 0; res = NS_ERROR_FAILURE;