Subpixel rendering[iOS]: <select> decoration is misaligned when the renderer is on...
[WebKit-https.git] / Source / WebCore / platform / gtk / RenderThemeGtk.h
1 /*
2  * This file is part of the WebKit project.
3  *
4  * Copyright (C) 2006 Apple Inc.
5  * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
6  * Copyright (C) 2007 Holger Hans Peter Freyther
7  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
8  * Copyright (C) 2010 Igalia S.L.
9  * All rights reserved.
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Library General Public
13  * License as published by the Free Software Foundation; either
14  * version 2 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Library General Public License for more details.
20  *
21  * You should have received a copy of the GNU Library General Public License
22  * along with this library; see the file COPYING.LIB.  If not, write to
23  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24  * Boston, MA 02110-1301, USA.
25  *
26  */
27
28 #ifndef RenderThemeGtk_h
29 #define RenderThemeGtk_h
30
31 #include <wtf/gobject/GRefPtr.h>
32 #include "RenderTheme.h"
33
34 typedef struct _GdkColormap GdkColormap;
35
36 namespace WebCore {
37
38 class RenderThemeGtk : public RenderTheme {
39 private:
40     RenderThemeGtk();
41     virtual ~RenderThemeGtk();
42
43 public:
44     static PassRefPtr<RenderTheme> create();
45
46     // A method asking if the theme's controls actually care about redrawing when hovered.
47     virtual bool supportsHover(const RenderStyle*) const { return true; }
48
49     // A method asking if the theme is able to draw the focus ring.
50     virtual bool supportsFocusRing(const RenderStyle*) const;
51
52     // A method asking if the control changes its tint when the window has focus or not.
53     virtual bool controlSupportsTints(const RenderObject&) const;
54
55     // A general method asking if any control tinting is supported at all.
56     virtual bool supportsControlTints() const { return true; }
57
58     virtual void adjustRepaintRect(const RenderObject&, IntRect&);
59
60     // A method to obtain the baseline position for a "leaf" control.  This will only be used if a baseline
61     // position cannot be determined by examining child content. Checkboxes and radio buttons are examples of
62     // controls that need to do this.
63     virtual int baselinePosition(const RenderObject&) const;
64
65     // The platform selection color.
66     virtual Color platformActiveSelectionBackgroundColor() const;
67     virtual Color platformInactiveSelectionBackgroundColor() const;
68     virtual Color platformActiveSelectionForegroundColor() const;
69     virtual Color platformInactiveSelectionForegroundColor() const;
70
71     // List Box selection color
72     virtual Color activeListBoxSelectionBackgroundColor() const;
73     virtual Color activeListBoxSelectionForegroundColor() const;
74     virtual Color inactiveListBoxSelectionBackgroundColor() const;
75     virtual Color inactiveListBoxSelectionForegroundColor() const;
76
77     virtual double caretBlinkInterval() const;
78
79     virtual void platformColorsDidChange();
80
81     // System fonts and colors.
82     virtual void systemFont(CSSValueID, FontDescription&) const;
83     virtual Color systemColor(CSSValueID) const;
84
85     virtual bool popsMenuBySpaceOrReturn() const override { return true; }
86
87 #if ENABLE(VIDEO)
88     virtual String extraMediaControlsStyleSheet();
89     virtual String formatMediaControlsCurrentTime(float currentTime, float duration) const;
90     virtual bool supportsClosedCaptioning() const override { return true; }
91     virtual String mediaControlsScript();
92
93 #if ENABLE(FULLSCREEN_API)
94     virtual String extraFullScreenStyleSheet();
95 #endif
96 #endif
97
98 #if ENABLE(DATALIST_ELEMENT)
99     // Returns size of one slider tick mark for a horizontal track.
100     // For vertical tracks we rotate it and use it. i.e. Width is always length along the track.
101     virtual IntSize sliderTickSize() const;
102     // Returns the distance of slider tick origin from the slider track center.
103     virtual int sliderTickOffsetFromTrackCenter() const;
104 #endif
105
106 #ifdef GTK_API_VERSION_2
107     GtkWidget* gtkContainer() const;
108     GtkWidget* gtkEntry() const;
109     GtkWidget* gtkVScrollbar() const;
110     GtkWidget* gtkHScrollbar() const;
111     static void getIndicatorMetrics(ControlPart, int& indicatorSize, int& indicatorSpacing);
112 #else
113     GtkStyleContext* gtkScrollbarStyle();
114 #endif
115
116 protected:
117     virtual bool paintCheckbox(const RenderObject&, const PaintInfo&, const IntRect&);
118     virtual void setCheckboxSize(RenderStyle* style) const;
119
120     virtual bool paintRadio(const RenderObject&, const PaintInfo&, const IntRect&);
121     virtual void setRadioSize(RenderStyle* style) const;
122
123     virtual void adjustButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
124     virtual bool paintButton(const RenderObject&, const PaintInfo&, const IntRect&);
125
126     virtual bool paintTextField(const RenderObject&, const PaintInfo&, const IntRect&);
127     virtual bool paintTextArea(const RenderObject&, const PaintInfo&, const IntRect&);
128
129     int popupInternalPaddingLeft(RenderStyle*) const;
130     int popupInternalPaddingRight(RenderStyle*) const;
131     int popupInternalPaddingTop(RenderStyle*) const;
132     int popupInternalPaddingBottom(RenderStyle*) const;
133
134     // The Mac port differentiates between the "menu list" and the "menu list button."
135     // The former is used when a menu list button has been styled. This is used to ensure
136     // Aqua themed controls whenever possible. We always want to use GTK+ theming, so
137     // we don't maintain this differentiation.
138     virtual void adjustMenuListStyle(StyleResolver*, RenderStyle*, Element*) const;
139     virtual void adjustMenuListButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
140     virtual bool paintMenuList(const RenderObject&, const PaintInfo&, const IntRect&);
141     virtual bool paintMenuListButtonDecorations(const RenderObject&, const PaintInfo&, const FloatRect&);
142
143     virtual void adjustSearchFieldResultsDecorationPartStyle(StyleResolver*, RenderStyle*, Element*) const;
144     virtual bool paintSearchFieldResultsDecorationPart(const RenderObject&, const PaintInfo&, const IntRect&);
145
146     virtual void adjustSearchFieldStyle(StyleResolver*, RenderStyle*, Element*) const;
147     virtual bool paintSearchField(const RenderObject&, const PaintInfo&, const IntRect&);
148
149     virtual void adjustSearchFieldResultsButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
150     virtual bool paintSearchFieldResultsButton(const RenderObject&, const PaintInfo&, const IntRect&);
151
152     virtual void adjustSearchFieldCancelButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
153     virtual bool paintSearchFieldCancelButton(const RenderObject&, const PaintInfo&, const IntRect&);
154
155     virtual bool paintSliderTrack(const RenderObject&, const PaintInfo&, const IntRect&);
156     virtual void adjustSliderTrackStyle(StyleResolver*, RenderStyle*, Element*) const;
157
158     virtual bool paintSliderThumb(const RenderObject&, const PaintInfo&, const IntRect&);
159     virtual void adjustSliderThumbStyle(StyleResolver*, RenderStyle*, Element*) const;
160
161     virtual void adjustSliderThumbSize(RenderStyle*, Element*) const;
162
163 #if ENABLE(VIDEO)
164     void initMediaColors();
165     void initMediaButtons();
166     virtual bool hasOwnDisabledStateHandlingFor(ControlPart) const;
167     virtual bool paintMediaFullscreenButton(const RenderObject&, const PaintInfo&, const IntRect&);
168     virtual bool paintMediaPlayButton(const RenderObject&, const PaintInfo&, const IntRect&);
169     virtual bool paintMediaMuteButton(const RenderObject&, const PaintInfo&, const IntRect&);
170     virtual bool paintMediaSeekBackButton(const RenderObject&, const PaintInfo&, const IntRect&);
171     virtual bool paintMediaSeekForwardButton(const RenderObject&, const PaintInfo&, const IntRect&);
172     virtual bool paintMediaSliderTrack(const RenderObject&, const PaintInfo&, const IntRect&);
173     virtual bool paintMediaSliderThumb(const RenderObject&, const PaintInfo&, const IntRect&);
174     virtual bool paintMediaVolumeSliderContainer(const RenderObject&, const PaintInfo&, const IntRect&);
175     virtual bool paintMediaVolumeSliderTrack(const RenderObject&, const PaintInfo&, const IntRect&);
176     virtual bool paintMediaVolumeSliderThumb(const RenderObject&, const PaintInfo&, const IntRect&);
177     virtual bool paintMediaCurrentTime(const RenderObject&, const PaintInfo&, const IntRect&);
178 #if ENABLE(VIDEO_TRACK)
179     virtual bool paintMediaToggleClosedCaptionsButton(const RenderObject&, const PaintInfo&, const IntRect&);
180 #endif
181 #endif
182
183 #if ENABLE(PROGRESS_ELEMENT)
184     virtual double animationRepeatIntervalForProgressBar(RenderProgress*) const;
185     virtual double animationDurationForProgressBar(RenderProgress*) const;
186     virtual void adjustProgressBarStyle(StyleResolver*, RenderStyle*, Element*) const;
187     virtual bool paintProgressBar(const RenderObject&, const PaintInfo&, const IntRect&);
188 #endif
189
190     virtual bool paintCapsLockIndicator(const RenderObject&, const PaintInfo&, const IntRect&);
191
192     virtual void adjustInnerSpinButtonStyle(StyleResolver*, RenderStyle*, Element*) const;
193     virtual bool paintInnerSpinButton(const RenderObject&, const PaintInfo&, const IntRect&);
194
195 private:
196     virtual String fileListNameForWidth(const FileList*, const Font&, int width, bool multipleFilesAllowed) const override;
197
198     void platformInit();
199     static void setTextInputBorders(RenderStyle*);
200     static double getScreenDPI();
201
202 #if ENABLE(VIDEO)
203     bool paintMediaButton(const RenderObject&, GraphicsContext*, const IntRect&, const char* symbolicIconName, const char* fallbackStockIconName);
204 #endif
205
206 #if ENABLE(PROGRESS_ELEMENT)
207     static IntRect calculateProgressRect(const RenderObject&, const IntRect&);
208 #endif
209
210     mutable Color m_panelColor;
211     mutable Color m_sliderColor;
212     mutable Color m_sliderThumbColor;
213     const int m_mediaIconSize;
214     const int m_mediaSliderHeight;
215
216 #ifdef GTK_API_VERSION_2
217     void setupWidgetAndAddToContainer(GtkWidget*, GtkWidget*) const;
218     void refreshComboBoxChildren() const;
219     void getComboBoxPadding(RenderStyle*, int& left, int& top, int& right, int& bottom) const;
220     int getComboBoxSeparatorWidth() const;
221     int comboBoxArrowSize(RenderStyle*) const;
222
223     GtkWidget* gtkButton() const;
224     GtkWidget* gtkTreeView() const;
225     GtkWidget* gtkVScale() const;
226     GtkWidget* gtkHScale() const;
227     GtkWidget* gtkRadioButton() const;
228     GtkWidget* gtkCheckButton() const;
229     GtkWidget* gtkProgressBar() const;
230     GtkWidget* gtkComboBox() const;
231     GtkWidget* gtkComboBoxButton() const;
232     GtkWidget* gtkComboBoxArrow() const;
233     GtkWidget* gtkComboBoxSeparator() const;
234     GtkWidget* gtkSpinButton() const;
235
236     GdkColormap* m_colormap;
237     mutable GtkWidget* m_gtkWindow;
238     mutable GtkWidget* m_gtkContainer;
239     mutable GtkWidget* m_gtkButton;
240     mutable GtkWidget* m_gtkEntry;
241     mutable GtkWidget* m_gtkTreeView;
242     mutable GtkWidget* m_gtkVScale;
243     mutable GtkWidget* m_gtkHScale;
244     mutable GtkWidget* m_gtkRadioButton;
245     mutable GtkWidget* m_gtkCheckButton;
246     mutable GtkWidget* m_gtkProgressBar;
247     mutable GtkWidget* m_gtkComboBox;
248     mutable GtkWidget* m_gtkComboBoxButton;
249     mutable GtkWidget* m_gtkComboBoxArrow;
250     mutable GtkWidget* m_gtkComboBoxSeparator;
251     mutable GtkWidget* m_gtkVScrollbar;
252     mutable GtkWidget* m_gtkHScrollbar;
253     mutable GtkWidget* m_gtkSpinButton;
254     bool m_themePartsHaveRGBAColormap;
255     friend class WidgetRenderingContext;
256 #endif
257 };
258
259 }
260
261 #endif // RenderThemeGtk_h