diff options
author | jbeich <jbeich@FreeBSD.org> | 2017-11-06 14:41:55 +0800 |
---|---|---|
committer | jbeich <jbeich@FreeBSD.org> | 2017-11-06 14:41:55 +0800 |
commit | 8f089220d5f9cb135adb883de05626c850a11c07 (patch) | |
tree | 05d9086b5511c7ee70b2c1230682e107e1bb96a8 /www/firefox | |
parent | bf8d274aec7302e62e1020afa39e87a888c79c38 (diff) | |
download | freebsd-ports-gnome-8f089220d5f9cb135adb883de05626c850a11c07.tar.gz freebsd-ports-gnome-8f089220d5f9cb135adb883de05626c850a11c07.tar.zst freebsd-ports-gnome-8f089220d5f9cb135adb883de05626c850a11c07.zip |
www/firefox: gracefully handle errors from Gtk font settings
PR: 1400817
Obtained from: upstream (Firefox 57)
MFH: 2017Q4
Diffstat (limited to 'www/firefox')
-rw-r--r-- | www/firefox/Makefile | 2 | ||||
-rw-r--r-- | www/firefox/files/patch-bug1384701 | 796 |
2 files changed, 797 insertions, 1 deletions
diff --git a/www/firefox/Makefile b/www/firefox/Makefile index c5227eb47606..23bdc2bbb0be 100644 --- a/www/firefox/Makefile +++ b/www/firefox/Makefile @@ -4,7 +4,7 @@ PORTNAME= firefox DISTVERSION= 56.0.2 DISTVERSIONSUFFIX=.source -PORTREVISION= 6 +PORTREVISION= 7 PORTEPOCH= 1 CATEGORIES= www ipv6 MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \ diff --git a/www/firefox/files/patch-bug1384701 b/www/firefox/files/patch-bug1384701 new file mode 100644 index 000000000000..142d5430d266 --- /dev/null +++ b/www/firefox/files/patch-bug1384701 @@ -0,0 +1,796 @@ +diff --git widget/gtk/nsLookAndFeel.cpp widget/gtk/nsLookAndFeel.cpp +index 6bb3e27c6653..f4c35d82200a 100644 +--- widget/gtk/nsLookAndFeel.cpp ++++ widget/gtk/nsLookAndFeel.cpp +@@ -29,11 +29,9 @@ + + #include "mozilla/gfx/2D.h" + +-#if MOZ_WIDGET_GTK != 2 + #include <cairo-gobject.h> + #include "WidgetStyleCache.h" + #include "prenv.h" +-#endif + + using mozilla::LookAndFeel; + +@@ -49,9 +47,6 @@ using mozilla::LookAndFeel; + + nsLookAndFeel::nsLookAndFeel() + : nsXPLookAndFeel(), +-#if (MOZ_WIDGET_GTK == 2) +- mStyle(nullptr), +-#endif + mDefaultFontCached(false), mButtonFontCached(false), + mFieldFontCached(false), mMenuFontCached(false), + mInitialized(false) +@@ -66,12 +61,8 @@ nsLookAndFeel::NativeInit() + + nsLookAndFeel::~nsLookAndFeel() + { +-#if (MOZ_WIDGET_GTK == 2) +- g_object_unref(mStyle); +-#endif + } + +-#if MOZ_WIDGET_GTK != 2 + // Modifies color |*aDest| as if a pattern of color |aSource| was painted with + // CAIRO_OPERATOR_OVER to a surface with color |*aDest|. + static void +@@ -228,42 +219,19 @@ GetBorderColors(GtkStyleContext* aContext, + *aDarkColor = GDK_RGBA_TO_NS_RGBA(darkColor); + return ret; + } +-#endif + + nsresult + nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + { + EnsureInit(); + +-#if (MOZ_WIDGET_GTK == 3) + GdkRGBA gdk_color; +-#endif + nsresult res = NS_OK; + + switch (aID) { + // These colors don't seem to be used for anything anymore in Mozilla + // (except here at least TextSelectBackground and TextSelectForeground) + // The CSS2 colors below are used. +-#if (MOZ_WIDGET_GTK == 2) +- case eColorID_WindowBackground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]); +- break; +- case eColorID_WindowForeground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]); +- break; +- case eColorID_WidgetBackground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_WidgetForeground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]); +- break; +- case eColorID_WidgetSelectBackground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_SELECTED]); +- break; +- case eColorID_WidgetSelectForeground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_SELECTED]); +- break; +-#else + case eColorID_WindowBackground: + case eColorID_WidgetBackground: + case eColorID_TextBackground: +@@ -303,35 +271,12 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + case eColorID__moz_html_cellhighlighttext: + aColor = sTextSelectedText; + break; +-#endif + case eColorID_Widget3DHighlight: + aColor = NS_RGB(0xa0,0xa0,0xa0); + break; + case eColorID_Widget3DShadow: + aColor = NS_RGB(0x40,0x40,0x40); + break; +-#if (MOZ_WIDGET_GTK == 2) +- case eColorID_TextBackground: +- // not used? +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]); +- break; +- case eColorID_TextForeground: +- // not used? +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]); +- break; +- case eColorID_TextSelectBackground: +- case eColorID_IMESelectedRawTextBackground: +- case eColorID_IMESelectedConvertedTextBackground: +- // still used +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_SELECTED]); +- break; +- case eColorID_TextSelectForeground: +- case eColorID_IMESelectedRawTextForeground: +- case eColorID_IMESelectedConvertedTextForeground: +- // still used +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_SELECTED]); +- break; +-#endif + case eColorID_IMERawInputBackground: + case eColorID_IMEConvertedTextBackground: + aColor = NS_TRANSPARENT; +@@ -352,53 +297,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + aColor = NS_RGB(0xff, 0, 0); + break; + +-#if (MOZ_WIDGET_GTK == 2) +- // css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors +- case eColorID_activeborder: +- // active window border +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_activecaption: +- // active window caption background +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_appworkspace: +- // MDI background color +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_background: +- // desktop background +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_captiontext: +- // text in active window caption, size box, and scrollbar arrow box (!) +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]); +- break; +- case eColorID_graytext: +- // disabled text in windows, menus, etc. +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_INSENSITIVE]); +- break; +- case eColorID_highlight: +- // background of selected item +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_SELECTED]); +- break; +- case eColorID_highlighttext: +- // text of selected item +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_SELECTED]); +- break; +- case eColorID_inactiveborder: +- // inactive window border +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_inactivecaption: +- // inactive window caption +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_INSENSITIVE]); +- break; +- case eColorID_inactivecaptiontext: +- // text in inactive window caption +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_INSENSITIVE]); +- break; +-#else + // css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors + case eColorID_activeborder: { + // active window border +@@ -433,7 +331,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + ReleaseStyleContext(style); + break; + } +-#endif + case eColorID_infobackground: + // tooltip background color + aColor = sInfoBackground; +@@ -452,11 +349,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + break; + case eColorID_scrollbar: + // scrollbar gray area +-#if (MOZ_WIDGET_GTK == 2) +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_ACTIVE]); +-#else + aColor = sMozScrollbar; +-#endif + break; + + case eColorID_threedlightshadow: +@@ -465,11 +358,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + case eColorID_threedface: + case eColorID_buttonface: + // 3-D face color +-#if (MOZ_WIDGET_GTK == 3) + aColor = sMozWindowBackground; +-#else +- aColor = sButtonBackground; +-#endif + break; + + case eColorID_buttontext: +@@ -491,56 +380,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + aColor = sFrameInnerDarkBorder; + break; + +-#if (MOZ_WIDGET_GTK == 2) +- case eColorID_threeddarkshadow: +- // 3-D shadow outer edge color +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->black); +- break; +- +- case eColorID_window: +- case eColorID_windowframe: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- +- case eColorID_windowtext: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]); +- break; +- +- case eColorID__moz_eventreerow: +- case eColorID__moz_field: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]); +- break; +- case eColorID__moz_fieldtext: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]); +- break; +- case eColorID__moz_dialog: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID__moz_dialogtext: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]); +- break; +- case eColorID__moz_dragtargetzone: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_SELECTED]); +- break; +- case eColorID__moz_buttondefault: +- // default button border color +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->black); +- break; +- case eColorID__moz_buttonhoverface: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_PRELIGHT]); +- break; +- case eColorID__moz_buttonhovertext: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_PRELIGHT]); +- break; +- case eColorID__moz_cellhighlight: +- case eColorID__moz_html_cellhighlight: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_ACTIVE]); +- break; +- case eColorID__moz_cellhighlighttext: +- case eColorID__moz_html_cellhighlighttext: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_ACTIVE]); +- break; +-#else + case eColorID_threeddarkshadow: + // Hardcode to black + aColor = NS_RGB(0x00,0x00,0x00); +@@ -574,7 +413,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + case eColorID__moz_buttonhovertext: + aColor = sButtonHoverText; + break; +-#endif + case eColorID__moz_menuhover: + aColor = sMenuHover; + break; +@@ -590,11 +428,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + case eColorID__moz_comboboxtext: + aColor = sComboBoxText; + break; +-#if (MOZ_WIDGET_GTK == 2) +- case eColorID__moz_combobox: +- aColor = sComboBoxBackground; +- break; +-#endif + case eColorID__moz_menubartext: + aColor = sMenuBarText; + break; +@@ -602,11 +435,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + aColor = sMenuBarHoverText; + break; + case eColorID__moz_gtk_info_bar_text: +-#if (MOZ_WIDGET_GTK == 3) + aColor = sInfoBarText; +-#else +- aColor = sInfoText; +-#endif + break; + default: + /* default color is BLACK */ +@@ -618,27 +447,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + return res; + } + +-#if (MOZ_WIDGET_GTK == 2) +-static void darken_gdk_color(GdkColor *src, GdkColor *dest) +-{ +- gdouble red; +- gdouble green; +- gdouble blue; +- +- red = (gdouble) src->red / 65535.0; +- green = (gdouble) src->green / 65535.0; +- blue = (gdouble) src->blue / 65535.0; +- +- red *= 0.93; +- green *= 0.93; +- blue *= 0.93; +- +- dest->red = red * 65535.0; +- dest->green = green * 65535.0; +- dest->blue = blue * 65535.0; +-} +-#endif +- + static int32_t CheckWidgetStyle(GtkWidget* aWidget, const char* aStyle, int32_t aResult) { + gboolean value = FALSE; + gtk_widget_style_get(aWidget, aStyle, &value, nullptr); +@@ -826,14 +634,8 @@ nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult) + res = NS_ERROR_NOT_IMPLEMENTED; + break; + case eIntID_TouchEnabled: +-#if MOZ_WIDGET_GTK == 3 + aResult = mozilla::widget::WidgetUtils::IsTouchDeviceSupportPresent(); + break; +-#else +- aResult = 0; +- res = NS_ERROR_NOT_IMPLEMENTED; +-#endif +- break; + case eIntID_MacGraphiteTheme: + aResult = 0; + res = NS_ERROR_NOT_IMPLEMENTED; +@@ -905,24 +707,20 @@ nsLookAndFeel::GetFloatImpl(FloatID aID, float &aResult) + } + + static void +-GetSystemFontInfo(GtkWidget *aWidget, ++GetSystemFontInfo(GtkStyleContext *aStyle, + nsString *aFontName, + gfxFontStyle *aFontStyle) + { +- GtkSettings *settings = gtk_widget_get_settings(aWidget); +- + aFontStyle->style = NS_FONT_STYLE_NORMAL; + +- gchar *fontname; +- g_object_get(settings, "gtk-font-name", &fontname, nullptr); +- ++ // As in ++ // https://git.gnome.org/browse/gtk+/tree/gtk/gtkwidget.c?h=3.22.19#n10333 + PangoFontDescription *desc; +- desc = pango_font_description_from_string(fontname); ++ gtk_style_context_get(aStyle, gtk_style_context_get_state(aStyle), ++ "font", &desc, nullptr); + + aFontStyle->systemFont = true; + +- g_free(fontname); +- + NS_NAMED_LITERAL_STRING(quote, "\""); + NS_ConvertUTF8toUTF16 family(pango_font_description_get_family(desc)); + *aFontName = quote + family + quote; +@@ -953,96 +751,28 @@ GetSystemFontInfo(GtkWidget *aWidget, + pango_font_description_free(desc); + } + +-static void +-GetSystemFontInfo(LookAndFeel::FontID aID, +- nsString *aFontName, +- gfxFontStyle *aFontStyle) +-{ +- if (aID == LookAndFeel::eFont_Widget) { +- GtkWidget *label = gtk_label_new("M"); +- GtkWidget *parent = gtk_fixed_new(); +- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP); +- +- gtk_container_add(GTK_CONTAINER(parent), label); +- gtk_container_add(GTK_CONTAINER(window), parent); +- +- gtk_widget_ensure_style(label); +- GetSystemFontInfo(label, aFontName, aFontStyle); +- gtk_widget_destroy(window); // no unref, windows are different +- +- } else if (aID == LookAndFeel::eFont_Button) { +- GtkWidget *label = gtk_label_new("M"); +- GtkWidget *parent = gtk_fixed_new(); +- GtkWidget *button = gtk_button_new(); +- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP); +- +- gtk_container_add(GTK_CONTAINER(button), label); +- gtk_container_add(GTK_CONTAINER(parent), button); +- gtk_container_add(GTK_CONTAINER(window), parent); +- +- gtk_widget_ensure_style(label); +- GetSystemFontInfo(label, aFontName, aFontStyle); +- gtk_widget_destroy(window); // no unref, windows are different +- +- } else if (aID == LookAndFeel::eFont_Field) { +- GtkWidget *entry = gtk_entry_new(); +- GtkWidget *parent = gtk_fixed_new(); +- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP); +- +- gtk_container_add(GTK_CONTAINER(parent), entry); +- gtk_container_add(GTK_CONTAINER(window), parent); +- +- gtk_widget_ensure_style(entry); +- GetSystemFontInfo(entry, aFontName, aFontStyle); +- gtk_widget_destroy(window); // no unref, windows are different +- +- } else { +- MOZ_ASSERT(aID == LookAndFeel::eFont_Menu, "unexpected font ID"); +- GtkWidget *accel_label = gtk_accel_label_new("M"); +- GtkWidget *menuitem = gtk_menu_item_new(); +- GtkWidget *menu = gtk_menu_new(); +- g_object_ref_sink(menu); +- +- gtk_container_add(GTK_CONTAINER(menuitem), accel_label); +- gtk_menu_shell_append((GtkMenuShell *)GTK_MENU(menu), menuitem); +- +- gtk_widget_ensure_style(accel_label); +- GetSystemFontInfo(accel_label, aFontName, aFontStyle); +- g_object_unref(menu); +- } +-} +- + bool + nsLookAndFeel::GetFontImpl(FontID aID, nsString& aFontName, + gfxFontStyle& aFontStyle, + float aDevPixPerCSSPixel) + { +- nsString *cachedFontName = nullptr; +- gfxFontStyle *cachedFontStyle = nullptr; +- bool *isCached = nullptr; +- + switch (aID) { + case eFont_Menu: // css2 + case eFont_PullDownMenu: // css3 +- cachedFontName = &mMenuFontName; +- cachedFontStyle = &mMenuFontStyle; +- isCached = &mMenuFontCached; +- aID = eFont_Menu; +- break; ++ aFontName = mMenuFontName; ++ aFontStyle = mMenuFontStyle; ++ return true; + + case eFont_Field: // css3 + case eFont_List: // css3 +- cachedFontName = &mFieldFontName; +- cachedFontStyle = &mFieldFontStyle; +- isCached = &mFieldFontCached; +- aID = eFont_Field; +- break; ++ aFontName = mFieldFontName; ++ aFontStyle = mFieldFontStyle; ++ return true; + + case eFont_Button: // css3 +- cachedFontName = &mButtonFontName; +- cachedFontStyle = &mButtonFontStyle; +- isCached = &mButtonFontCached; +- break; ++ aFontName = mButtonFontName; ++ aFontStyle = mButtonFontStyle; ++ return true; + + case eFont_Caption: // css2 + case eFont_Icon: // css2 +@@ -1057,21 +787,11 @@ nsLookAndFeel::GetFontImpl(FontID aID, nsString& aFontName, + case eFont_Dialog: // css3 + case eFont_Tooltips: // moz + case eFont_Widget: // moz +- cachedFontName = &mDefaultFontName; +- cachedFontStyle = &mDefaultFontStyle; +- isCached = &mDefaultFontCached; +- aID = eFont_Widget; +- break; +- } +- +- if (!*isCached) { +- GetSystemFontInfo(aID, cachedFontName, cachedFontStyle); +- *isCached = true; ++ default: ++ aFontName = mDefaultFontName; ++ aFontStyle = mDefaultFontStyle; ++ return true; + } +- +- aFontName = *cachedFontName; +- aFontStyle = *cachedFontStyle; +- return true; + } + + void +@@ -1087,70 +807,6 @@ nsLookAndFeel::EnsureInit() + // gtk does non threadsafe refcounting + MOZ_ASSERT(NS_IsMainThread()); + +-#if (MOZ_WIDGET_GTK == 2) +- NS_ASSERTION(!mStyle, "already initialized"); +- // GtkInvisibles come with a refcount that is not floating +- // (since their initialization code calls g_object_ref_sink) and +- // their destroy code releases that reference (which means they +- // have to be explicitly destroyed, since calling unref enough +- // to cause destruction would lead to *another* unref). +- // However, this combination means that it's actually still ok +- // to use the normal pattern, which is to g_object_ref_sink +- // after construction, and then destroy *and* unref when we're +- // done. (Though we could skip the g_object_ref_sink and the +- // corresponding g_object_unref, but that's particular to +- // GtkInvisibles and GtkWindows.) +- GtkWidget *widget = gtk_invisible_new(); +- g_object_ref_sink(widget); // effectively g_object_ref (see above) +- +- gtk_widget_ensure_style(widget); +- mStyle = gtk_style_copy(gtk_widget_get_style(widget)); +- +- gtk_widget_destroy(widget); +- g_object_unref(widget); +- +- // tooltip foreground and background +- GtkStyle *style = gtk_rc_get_style_by_paths(gtk_settings_get_default(), +- "gtk-tooltips", "GtkWindow", +- GTK_TYPE_WINDOW); +- if (style) { +- sInfoBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); +- sInfoText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); +- } +- +- // menu foreground & menu background +- GtkWidget *accel_label = gtk_accel_label_new("M"); +- GtkWidget *menuitem = gtk_menu_item_new(); +- GtkWidget *menu = gtk_menu_new(); +- +- g_object_ref_sink(menu); +- +- gtk_container_add(GTK_CONTAINER(menuitem), accel_label); +- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); +- +- gtk_widget_set_style(accel_label, nullptr); +- gtk_widget_set_style(menu, nullptr); +- gtk_widget_realize(menu); +- gtk_widget_realize(accel_label); +- +- style = gtk_widget_get_style(accel_label); +- if (style) { +- sMenuText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); +- } +- +- style = gtk_widget_get_style(menu); +- if (style) { +- sMenuBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); +- } +- +- style = gtk_widget_get_style(menuitem); +- if (style) { +- sMenuHover = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_PRELIGHT]); +- sMenuHoverText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_PRELIGHT]); +- } +- +- g_object_unref(menu); +-#else + GdkRGBA color; + GtkStyleContext *style; + +@@ -1195,6 +851,12 @@ nsLookAndFeel::EnsureInit() + } + } + ++ // The label is not added to a parent widget, but shared for constructing ++ // different style contexts. The node hierarchy is constructed only on ++ // the label style context. ++ GtkWidget *labelWidget = gtk_label_new("M"); ++ g_object_ref_sink(labelWidget); ++ + // Scrollbar colors + style = ClaimStyleContext(MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL); + gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); +@@ -1208,6 +870,13 @@ nsLookAndFeel::EnsureInit() + gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); + sMozWindowText = GDK_RGBA_TO_NS_RGBA(color); + ReleaseStyleContext(style); ++ style = ClaimStyleContext(MOZ_GTK_WINDOW_CONTAINER); ++ { ++ GtkStyleContext* labelStyle = CreateStyleForWidget(labelWidget, style); ++ GetSystemFontInfo(labelStyle, &mDefaultFontName, &mDefaultFontStyle); ++ g_object_unref(labelStyle); ++ } ++ ReleaseStyleContext(style); + + // tooltip foreground and background + style = ClaimStyleContext(MOZ_GTK_TOOLTIP); +@@ -1224,6 +893,9 @@ nsLookAndFeel::EnsureInit() + { + GtkStyleContext* accelStyle = + CreateStyleForWidget(gtk_accel_label_new("M"), style); ++ ++ GetSystemFontInfo(accelStyle, &mMenuFontName, &mMenuFontStyle); ++ + gtk_style_context_get_color(accelStyle, GTK_STATE_FLAG_NORMAL, &color); + sMenuText = GDK_RGBA_TO_NS_RGBA(color); + gtk_style_context_get_color(accelStyle, GTK_STATE_FLAG_INSENSITIVE, &color); +@@ -1243,17 +915,8 @@ nsLookAndFeel::EnsureInit() + gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); + sMenuHoverText = GDK_RGBA_TO_NS_RGBA(color); + ReleaseStyleContext(style); +-#endif + +- // button styles + GtkWidget *parent = gtk_fixed_new(); +- GtkWidget *button = gtk_button_new(); +- GtkWidget *label = gtk_label_new("M"); +-#if (MOZ_WIDGET_GTK == 2) +- GtkWidget *combobox = gtk_combo_box_new(); +- GtkWidget *comboboxLabel = gtk_label_new("M"); +- gtk_container_add(GTK_CONTAINER(combobox), comboboxLabel); +-#endif + GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP); + GtkWidget *treeView = gtk_tree_view_new(); + GtkWidget *linkButton = gtk_link_button_new("http://example.com/"); +@@ -1262,94 +925,14 @@ nsLookAndFeel::EnsureInit() + GtkWidget *entry = gtk_entry_new(); + GtkWidget *textView = gtk_text_view_new(); + +- gtk_container_add(GTK_CONTAINER(button), label); +- gtk_container_add(GTK_CONTAINER(parent), button); + gtk_container_add(GTK_CONTAINER(parent), treeView); + gtk_container_add(GTK_CONTAINER(parent), linkButton); +-#if (MOZ_WIDGET_GTK == 2) +- gtk_container_add(GTK_CONTAINER(parent), combobox); +-#endif + gtk_container_add(GTK_CONTAINER(parent), menuBar); + gtk_menu_shell_append(GTK_MENU_SHELL(menuBar), menuBarItem); + gtk_container_add(GTK_CONTAINER(window), parent); + gtk_container_add(GTK_CONTAINER(parent), entry); + gtk_container_add(GTK_CONTAINER(parent), textView); + +-#if (MOZ_WIDGET_GTK == 2) +- gtk_widget_set_style(button, nullptr); +- gtk_widget_set_style(label, nullptr); +- gtk_widget_set_style(treeView, nullptr); +- gtk_widget_set_style(linkButton, nullptr); +- gtk_widget_set_style(combobox, nullptr); +- gtk_widget_set_style(comboboxLabel, nullptr); +- gtk_widget_set_style(menuBar, nullptr); +- gtk_widget_set_style(entry, nullptr); +- +- gtk_widget_realize(button); +- gtk_widget_realize(label); +- gtk_widget_realize(treeView); +- gtk_widget_realize(linkButton); +- gtk_widget_realize(combobox); +- gtk_widget_realize(comboboxLabel); +- gtk_widget_realize(menuBar); +- gtk_widget_realize(entry); +- +- style = gtk_widget_get_style(label); +- if (style) { +- sButtonText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); +- } +- +- style = gtk_widget_get_style(comboboxLabel); +- if (style) { +- sComboBoxText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); +- } +- style = gtk_widget_get_style(combobox); +- if (style) { +- sComboBoxBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); +- } +- +- style = gtk_widget_get_style(menuBar); +- if (style) { +- sMenuBarText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); +- sMenuBarHoverText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_SELECTED]); +- } +- +- // GTK's guide to fancy odd row background colors: +- // 1) Check if a theme explicitly defines an odd row color +- // 2) If not, check if it defines an even row color, and darken it +- // slightly by a hardcoded value (gtkstyle.c) +- // 3) If neither are defined, take the base background color and +- // darken that by a hardcoded value +- colorValuePtr = nullptr; +- gtk_widget_style_get(treeView, +- "odd-row-color", &colorValuePtr, +- nullptr); +- +- if (colorValuePtr) { +- colorValue = *colorValuePtr; +- } else { +- gtk_widget_style_get(treeView, +- "even-row-color", &colorValuePtr, +- nullptr); +- if (colorValuePtr) +- darken_gdk_color(colorValuePtr, &colorValue); +- else +- darken_gdk_color(&treeView->style->base[GTK_STATE_NORMAL], &colorValue); +- } +- +- sOddCellBackground = GDK_COLOR_TO_NS_RGB(colorValue); +- if (colorValuePtr) +- gdk_color_free(colorValuePtr); +- +- style = gtk_widget_get_style(button); +- if (style) { +- sButtonBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); +- sFrameOuterLightBorder = +- GDK_COLOR_TO_NS_RGB(style->light[GTK_STATE_NORMAL]); +- sFrameInnerDarkBorder = +- GDK_COLOR_TO_NS_RGB(style->dark[GTK_STATE_NORMAL]); +- } +-#else + // Text colors + GdkRGBA bgColor; + // If the text window background is translucent, then the background of +@@ -1381,8 +964,10 @@ nsLookAndFeel::EnsureInit() + // Button text color + style = ClaimStyleContext(MOZ_GTK_BUTTON); + { +- GtkStyleContext* labelStyle = +- CreateStyleForWidget(gtk_label_new("M"), style); ++ GtkStyleContext* labelStyle = CreateStyleForWidget(labelWidget, style); ++ ++ GetSystemFontInfo(labelStyle, &mButtonFontName, &mButtonFontStyle); ++ + gtk_style_context_get_color(labelStyle, GTK_STATE_FLAG_NORMAL, &color); + sButtonText = GDK_RGBA_TO_NS_RGBA(color); + gtk_style_context_get_color(labelStyle, GTK_STATE_FLAG_PRELIGHT, &color); +@@ -1446,7 +1031,6 @@ nsLookAndFeel::EnsureInit() + gtk_style_context_add_class(style, GTK_STYLE_CLASS_INFO); + gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); + sInfoBarText = GDK_RGBA_TO_NS_RGBA(color); +-#endif + // Some themes have a unified menu bar, and support window dragging on it + gboolean supports_menubar_drag = FALSE; + GParamSpec *param_spec = +@@ -1493,7 +1074,11 @@ nsLookAndFeel::EnsureInit() + "cursor-aspect-ratio", &sCaretRatio, + nullptr); + ++ GetSystemFontInfo(gtk_widget_get_style_context(entry), ++ &mFieldFontName, &mFieldFontStyle); ++ + gtk_widget_destroy(window); ++ g_object_unref(labelWidget); + } + + // virtual +@@ -1515,11 +1100,6 @@ nsLookAndFeel::RefreshImpl() + mFieldFontCached = false; + mMenuFontCached = false; + +-#if (MOZ_WIDGET_GTK == 2) +- g_object_unref(mStyle); +- mStyle = nullptr; +-#endif +- + mInitialized = false; + } + +diff --git widget/gtk/nsLookAndFeel.h widget/gtk/nsLookAndFeel.h +index 9a4015e95415..38cd51c056d6 100644 +--- widget/gtk/nsLookAndFeel.h ++++ widget/gtk/nsLookAndFeel.h +@@ -33,9 +33,6 @@ public: + virtual bool GetEchoPasswordImpl(); + + protected: +-#if (MOZ_WIDGET_GTK == 2) +- struct _GtkStyle *mStyle; +-#endif + + // Cached fonts + bool mDefaultFontCached; +@@ -63,7 +60,6 @@ protected: + nscolor sMenuHoverText; + nscolor sButtonText; + nscolor sButtonHoverText; +- nscolor sButtonBackground; + nscolor sFrameOuterLightBorder; + nscolor sFrameInnerDarkBorder; + nscolor sOddCellBackground; +@@ -77,9 +73,7 @@ protected: + nscolor sTextSelectedText; + nscolor sTextSelectedBackground; + nscolor sMozScrollbar; +-#if (MOZ_WIDGET_GTK == 3) + nscolor sInfoBarText; +-#endif + char16_t sInvisibleCharacter; + float sCaretRatio; + bool sMenuSupportsDrag; |