Bug 1401063: Cache remaining gtk window and button colors to eliminate on-demand gtk calls in ::NativeGetColor. draft
authorBrad Werth <bwerth@mozilla.com>
Tue, 19 Sep 2017 13:00:28 -0700
changeset 667193 2434aaf70a24c9b51c247670e0f95c057df754cb
parent 666884 e4261f5b96ebfd63e7cb8af3035ff9fea90c74a5
child 732323 f5235c4a394af284a5adeafd7a09ae307919f04c
push id80644
push userbwerth@mozilla.com
push dateTue, 19 Sep 2017 20:28:57 +0000
bugs1401063
milestone57.0a1
Bug 1401063: Cache remaining gtk window and button colors to eliminate on-demand gtk calls in ::NativeGetColor. MozReview-Commit-ID: HbZqBUG0w7y
widget/gtk/nsLookAndFeel.cpp
widget/gtk/nsLookAndFeel.h
--- a/widget/gtk/nsLookAndFeel.cpp
+++ b/widget/gtk/nsLookAndFeel.cpp
@@ -220,17 +220,16 @@ GetBorderColors(GtkStyleContext* aContex
     return ret;
 }
 
 nsresult
 nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
 {
     EnsureInit();
 
-    GdkRGBA gdk_color;
     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.
     case eColorID_WindowBackground:
     case eColorID_WidgetBackground:
@@ -289,50 +288,36 @@ nsLookAndFeel::NativeGetColor(ColorID aI
     case eColorID_IMEConvertedTextUnderline:
         aColor = NS_SAME_AS_FOREGROUND_COLOR;
         break;
     case eColorID_IMESelectedRawTextUnderline:
     case eColorID_IMESelectedConvertedTextUnderline:
         aColor = NS_TRANSPARENT;
         break;
     case eColorID_SpellCheckerUnderline:
-      aColor = NS_RGB(0xff, 0, 0);
-      break;
+        aColor = NS_RGB(0xff, 0, 0);
+        break;
 
         // css2  http://www.w3.org/TR/REC-CSS2/ui.html#system-colors
-    case eColorID_activeborder: {
+    case eColorID_activeborder:
         // active window border
-        GtkStyleContext *style = GetStyleContext(MOZ_GTK_WINDOW);
-        gtk_style_context_get_border_color(style,
-                                           GTK_STATE_FLAG_NORMAL, &gdk_color);
-        aColor = GDK_RGBA_TO_NS_RGBA(gdk_color);
+        aColor = sMozWindowActiveBorder;
         break;
-    }
-    case eColorID_inactiveborder: {
+    case eColorID_inactiveborder:
         // inactive window border
-        GtkStyleContext *style = GetStyleContext(MOZ_GTK_WINDOW);
-        gtk_style_context_get_border_color(style,
-                                           GTK_STATE_FLAG_INSENSITIVE,
-                                           &gdk_color);
-        aColor = GDK_RGBA_TO_NS_RGBA(gdk_color);
+        aColor = sMozWindowInactiveBorder;
         break;
-    }
     case eColorID_graytext: // disabled text in windows, menus, etc.
     case eColorID_inactivecaptiontext: // text in inactive window caption
         aColor = sMenuTextInactive;
         break;
-    case eColorID_inactivecaption: {
+    case eColorID_inactivecaption:
         // inactive window caption
-        GtkStyleContext *style = GetStyleContext(MOZ_GTK_WINDOW);
-        gtk_style_context_get_background_color(style,
-                                               GTK_STATE_FLAG_INSENSITIVE, 
-                                               &gdk_color);
-        aColor = GDK_RGBA_TO_NS_RGBA(gdk_color);
+        aColor = sMozWindowInactiveCaption;
         break;
-    }
     case eColorID_infobackground:
         // tooltip background color
         aColor = sInfoBackground;
         break;
     case eColorID_infotext:
         // tooltip text color
         aColor = sInfoText;
         break;
@@ -384,32 +369,23 @@ nsLookAndFeel::NativeGetColor(ColorID aI
 
     case eColorID__moz_eventreerow:
     case eColorID__moz_field:
         aColor = sMozFieldBackground;
         break;
     case eColorID__moz_fieldtext:
         aColor = sMozFieldText;
         break;
-    case eColorID__moz_buttondefault: {
+    case eColorID__moz_buttondefault:
         // default button border color
-        GtkStyleContext *style = GetStyleContext(MOZ_GTK_BUTTON);
-        gtk_style_context_get_border_color(style,
-                                           GTK_STATE_FLAG_NORMAL, &gdk_color);
-        aColor = GDK_RGBA_TO_NS_RGBA(gdk_color);
+        aColor = sButtonDefault;
         break;
-    }
-    case eColorID__moz_buttonhoverface: {
-        GtkStyleContext *style = GetStyleContext(MOZ_GTK_BUTTON);
-        gtk_style_context_get_background_color(style,
-                                               GTK_STATE_FLAG_PRELIGHT, 
-                                               &gdk_color);
-        aColor = GDK_RGBA_TO_NS_RGBA(gdk_color);
+    case eColorID__moz_buttonhoverface:
+        aColor = sButtonHoverFace;
         break;
-    }
     case eColorID__moz_buttonhovertext:
         aColor = sButtonHoverText;
         break;
     case eColorID__moz_menuhover:
         aColor = sMenuHover;
         break;
     case eColorID__moz_menuhovertext:
         aColor = sMenuHoverText;
@@ -858,16 +834,25 @@ nsLookAndFeel::EnsureInit()
     sMozScrollbar = GDK_RGBA_TO_NS_RGBA(color);
 
     // Window colors
     style = GetStyleContext(MOZ_GTK_WINDOW);
     gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color);
     sMozWindowBackground = GDK_RGBA_TO_NS_RGBA(color);
     gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
     sMozWindowText = GDK_RGBA_TO_NS_RGBA(color);
+    gtk_style_context_get_border_color(style, GTK_STATE_FLAG_NORMAL, &color);
+    sMozWindowActiveBorder = GDK_RGBA_TO_NS_RGBA(color);
+    gtk_style_context_get_border_color(style, GTK_STATE_FLAG_INSENSITIVE,
+                                       &color);
+    sMozWindowInactiveBorder = GDK_RGBA_TO_NS_RGBA(color);
+    gtk_style_context_get_background_color(style, GTK_STATE_FLAG_INSENSITIVE,
+                                           &color);
+    sMozWindowInactiveCaption = GDK_RGBA_TO_NS_RGBA(color);
+
     style = GetStyleContext(MOZ_GTK_WINDOW_CONTAINER);
     {
         GtkStyleContext* labelStyle = CreateStyleForWidget(labelWidget, style);
         GetSystemFontInfo(labelStyle, &mDefaultFontName, &mDefaultFontStyle);
         g_object_unref(labelStyle);
     }
 
     // tooltip foreground and background
@@ -948,20 +933,25 @@ nsLookAndFeel::EnsureInit()
 
     // Button text color
     style = GetStyleContext(MOZ_GTK_BUTTON);
     {
         GtkStyleContext* labelStyle = CreateStyleForWidget(labelWidget, style);
 
         GetSystemFontInfo(labelStyle, &mButtonFontName, &mButtonFontStyle);
 
+        gtk_style_context_get_border_color(style, GTK_STATE_FLAG_NORMAL, &color);
+        sButtonDefault = GDK_RGBA_TO_NS_RGBA(color);
         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);
         sButtonHoverText = GDK_RGBA_TO_NS_RGBA(color);
+        gtk_style_context_get_background_color(style, GTK_STATE_FLAG_PRELIGHT,
+                                               &color);
+        sButtonHoverFace = GDK_RGBA_TO_NS_RGBA(color);
         g_object_unref(labelStyle);
     }
 
     // Combobox text color
     style = GetStyleContext(MOZ_GTK_COMBOBOX_ENTRY_TEXTAREA);
     gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
     sComboBoxText = GDK_RGBA_TO_NS_RGBA(color);
 
--- a/widget/gtk/nsLookAndFeel.h
+++ b/widget/gtk/nsLookAndFeel.h
@@ -53,28 +53,33 @@ protected:
     nscolor sInfoText;
     nscolor sMenuBackground;
     nscolor sMenuBarText;
     nscolor sMenuBarHoverText;
     nscolor sMenuText;
     nscolor sMenuTextInactive;
     nscolor sMenuHover;
     nscolor sMenuHoverText;
+    nscolor sButtonDefault;
     nscolor sButtonText;
     nscolor sButtonHoverText;
+    nscolor sButtonHoverFace;
     nscolor sFrameOuterLightBorder;
     nscolor sFrameInnerDarkBorder;
     nscolor sOddCellBackground;
     nscolor sNativeHyperLinkText;
     nscolor sComboBoxText;
     nscolor sComboBoxBackground;
     nscolor sMozFieldText;
     nscolor sMozFieldBackground;
     nscolor sMozWindowText;
     nscolor sMozWindowBackground;
+    nscolor sMozWindowActiveBorder;
+    nscolor sMozWindowInactiveBorder;
+    nscolor sMozWindowInactiveCaption;
     nscolor sTextSelectedText;
     nscolor sTextSelectedBackground;
     nscolor sMozScrollbar;
     nscolor sInfoBarText;
     char16_t sInvisibleCharacter;
     float   sCaretRatio;
     bool    sMenuSupportsDrag;
     bool    mInitialized;