blob: e1fdc550d68df4541d1d06cefa0594a4109cfc67 [file] [log] [blame] [view]
andybonsad92aa32015-08-31 02:27:441# Linux GTK Theme Integration
andybons3322f762015-08-24 21:37:092
andybonsad92aa32015-08-31 02:27:443The GTK+ port of Chromium has a mode where we try to match the user's GTK theme
4(which can be enabled under Wrench -> Options -> Personal Stuff -> Set to GTK+
5theme). The heuristics often don't pick good colors due to a lack of information
6in the GTK themes.
andybons3322f762015-08-24 21:37:097
andybonsad92aa32015-08-31 02:27:448Starting in Chrome 9, we're providing a new way for theme authors to control our
9GTK+ theming mode. I am not sure of the earliest build these showed up in, but I
10know 9.0.597 works.
andybons3322f762015-08-24 21:37:0911
andybonsad92aa32015-08-31 02:27:4412## Describing the previous heuristics
andybons3322f762015-08-24 21:37:0913
andybonsad92aa32015-08-31 02:27:4414The frame heuristics were simple. Query the `bg[SELECTED]` and `bg[INSENSITIVE]`
15colors on the `MetaFrames` class and darken them slightly. This usually worked
16OK until the rise of themes that try to make a unified titlebar/menubar look. At
17roughly that time, it seems that people stopped specifying color information for
18the `MetaFrames` class and this has lead to the very orange chrome frame on
19Maverick.
andybons3322f762015-08-24 21:37:0920
andybonsad92aa32015-08-31 02:27:4421`MetaFrames` is (was?) a class that was used to communicate frame color data to
22the window manager around the Hardy days. (It's still defined in most of
23[XFCE's themes](http://packages.ubuntu.com/maverick/gtk2-engines-xfce)). In
24chrome's implementation, `MetaFrames` derives from `GtkWindow`.
andybons3322f762015-08-24 21:37:0925
andybonsad92aa32015-08-31 02:27:4426If you are happy with the defaults that chrome has picked, no action is
27necessary on the part of the theme author.
andybons3322f762015-08-24 21:37:0928
andybonsad92aa32015-08-31 02:27:4429## Introducing `ChromeGtkFrame`
andybons3322f762015-08-24 21:37:0930
andybonsad92aa32015-08-31 02:27:4431For cases where you want control of the colors chrome uses, Chrome gives you a
32number of style properties for injecting colors and other information about how
33to draw the frame. For example, here's the proposed modifications to Ubuntu's
34Ambiance:
andybons3322f762015-08-24 21:37:0935
36```
37style "chrome-gtk-frame"
38{
39 ChromeGtkFrame::frame-color = @fg_color
40 ChromeGtkFrame::inactive-frame-color = lighter(@fg_color)
41
42 ChromeGtkFrame::frame-gradient-size = 16
43 ChromeGtkFrame::frame-gradient-color = "#5c5b56"
44
45 ChromeGtkFrame::scrollbar-trough-color = @bg_color
46 ChromeGtkFrame::scrollbar-slider-prelight-color = "#F8F6F2"
47 ChromeGtkFrame::scrollbar-slider-normal-color = "#E7E0D3"
48}
49
50class "ChromeGtkFrame" style "chrome-gtk-frame"
51```
52
andybonsad92aa32015-08-31 02:27:4453### Frame color properties
andybons3322f762015-08-24 21:37:0954
55These are the frame's main solid color.
56
57| **Property** | **Type** | **Description** | **If unspecified** |
58|:-------------|:---------|:----------------|:-------------------|
59| `frame-color` | `GdkColor` | The main color of active chrome windows. | Darkens `MetaFrame::bg[SELECTED]` |
60| `inactive-frame-color` | `GdkColor` | The main color of inactive chrome windows. | Darkens `MetaFrame::bg[INSENSITIVE]` |
61| `incognito-frame-color` | `GdkColor` | The main color of active incognito windows. | Tints `frame-color` by the default incognito tint |
62| `incognito-inactive-frame-color` | `GdkColor` | The main color of inactive incognito windows. | Tints `inactive-frame-color` by the default incognito tint |
63
andybonsad92aa32015-08-31 02:27:4464### Frame gradient properties
andybons3322f762015-08-24 21:37:0965
andybonsad92aa32015-08-31 02:27:4466Chrome's frame (along with many normal window manager themes) have a slight
67gradient at the top, before filling the rest of the frame background image with
68a solid color. For example, the top `frame-gradient-size` pixels would be a
69gradient starting from `frame-gradient-color` at the top to `frame-color` at the
70bottom, with the rest of the frame being filled with `frame-color`.
andybons3322f762015-08-24 21:37:0971
72| **Property** | **Type** | **Description** | **If unspecified** |
73|:-------------|:---------|:----------------|:-------------------|
74| `frame-gradient-size` | Integers 0 through 128 | How large the gradient should be. Set to zero to disable drawing a gradient | Defaults to 16 pixels tall |
75| `frame-gradient-color` | `GdkColor` | Top color of the gradient | Lightens `frame-color` |
76| `inactive-frame-gradient-color` | `GdkColor` | Top color of the inactive gradient | Lightents `inactive-frame-color` |
77| `incognito-frame-gradient-color` | `GdkColor` | Top color of the incognito gradient | Lightens `incognito-frame-color` |
78| `incognito-inactive-frame-gradient-color` | `GdkColor` | Top color of the incognito inactive gradient. | Lightens `incognito-inactive-frame-color` |
79
andybonsad92aa32015-08-31 02:27:4480### Scrollbar control
andybons3322f762015-08-24 21:37:0981
andybonsad92aa32015-08-31 02:27:4482Because widget rendering is done in a separate, sandboxed process that doesn't
83have access to the X server or the filesystem, there's no current way to do
84GTK+ widget rendering. We instead pass WebKit a few colors and let it draw a
85default scrollbar. We have a very
86[complex fallback](http://git.chromium.org/gitweb/?p=chromium.git;a=blob;f=chrome/browser/gtk/gtk_theme_provider.cc;h=a57ab6b182b915192c84177f1a574914c44e2e71;hb=3f873177e192f5c6b66ae591b8b7205d8a707918#l424)
87where we render the widget and then average colors if this information isn't
88provided.
andybons3322f762015-08-24 21:37:0989
90| **Property** | **Type** | **Description** |
91|:-------------|:---------|:----------------|
92| `scrollbar-slider-prelight-color` | `GdkColor` | Color of the slider on mouse hover. |
93| `scrollbar-slider-normal-color` | `GdkColor` | Color of the slider otherwise |
94| `scrollbar-trough-color` | `GdkColor` | Color of the scrollbar trough |
95
andybonsad92aa32015-08-31 02:27:4496## Anticipated Q&A
andybons3322f762015-08-24 21:37:0997
andybonsad92aa32015-08-31 02:27:4498### Will you patch themes upstream?
andybons3322f762015-08-24 21:37:0999
andybonsad92aa32015-08-31 02:27:44100I am at the very least hoping we can get Radiance and Ambiance patches since we
101make very poor frame decisions on those themes, and hopefully a few others.
andybons3322f762015-08-24 21:37:09102
andybonsad92aa32015-08-31 02:27:44103### How about control over the min/max/close buttons?
andybons3322f762015-08-24 21:37:09104
andybonsad92aa32015-08-31 02:27:44105I actually tried this locally. There's a sort of uncanny valley effect going on;
106as the frame looks more native, it's more obvious that it isn't behaving like a
107native frame. (Also my implementation added a startup time hit.)
andybons3322f762015-08-24 21:37:09108
andybonsad92aa32015-08-31 02:27:44109### Why use style properties instead of (i.e.) `bg[STATE]`?
andybons3322f762015-08-24 21:37:09110
andybonsad92aa32015-08-31 02:27:44111There's no way to distinguish between colors set on different classes. Using
112style properties allows us to be backwards compatible and maintain the
113heuristics since not everyone is going to modify their themes for chromium (and
114the heuristics do a reasonable job).
andybons3322f762015-08-24 21:37:09115
andybonsad92aa32015-08-31 02:27:44116### Why now?
andybons3322f762015-08-24 21:37:09117
andybonsad92aa32015-08-31 02:27:44118* I (erg@) was putting off major changes to the window frame stuff in
119 anticipation of finally being able to use GTK+'s theme rendering for the
120 window border with client side decorations, but client side decorations
121 either isn't happening or isn't happening anytime soon, so there's no
122 justification for pushing this task off into the future.
123* Chrome looks pretty bad under Ambiance on Maverick.
andybons3322f762015-08-24 21:37:09124
andybonsad92aa32015-08-31 02:27:44125### Details about `MetaFrames` and `ChromeGtkFrame` relationship and history?
andybons3322f762015-08-24 21:37:09126
andybonsad92aa32015-08-31 02:27:44127`MetaFrames` is a class that was used in metacity to communicate color
128information to the window manager. During the Hardy Heron days, we slurped up
129the data and used it as a key part of our heuristics. At least on my Lucid Lynx
130machine, none of the GNOME GTK+ themes have `MetaFrames` styling. (As mentioned
131above, several of the XFCE themes do, though.)
andybons3322f762015-08-24 21:37:09132
andybonsad92aa32015-08-31 02:27:44133Internally to chrome, our `ChromeGtkFrame` class inherits from `MetaFrames`
134(again, which inherits from `GtkWindow`) so any old themes that style the
135`MetaFrames` class are backwards compatible.