]>
Commit | Line | Data |
---|---|---|
3de22d0e JR |
1 | diff -up firefox-47.0/widget/gtk/gtk3drawing.c.gtk3-20 firefox-47.0/widget/gtk/gtk3drawing.c |
2 | --- firefox-47.0/widget/gtk/gtk3drawing.c.gtk3-20 2016-06-01 06:11:44.000000000 +0200 | |
3 | +++ firefox-47.0/widget/gtk/gtk3drawing.c 2016-06-23 10:21:37.072462099 +0200 | |
4 | @@ -17,34 +17,85 @@ | |
f0a96e4f JR |
5 | |
6 | #include <math.h> | |
7 | ||
8 | +#define MOZ_WIDGET_STYLES 4 | |
9 | + | |
10 | +typedef struct { | |
11 | + GtkWidget* widget; | |
12 | + | |
13 | + union { | |
14 | + struct { | |
15 | + GtkStyleContext* style; | |
16 | + GtkStyleContext* styleSelection; | |
17 | + } entry; | |
18 | + | |
19 | + struct { | |
20 | + GtkStyleContext* style; | |
21 | + } button; | |
22 | + | |
23 | + struct { | |
24 | + GtkStyleContext* style; | |
f0a96e4f JR |
25 | + } tooltip; |
26 | + | |
27 | + struct { | |
28 | + GtkStyleContext* style; | |
29 | + GtkStyleContext* styleContents; | |
30 | + GtkStyleContext* styleTrough; | |
31 | + GtkStyleContext* styleSlider; | |
32 | + } scroll; | |
33 | + | |
34 | + struct { | |
35 | + GtkStyleContext* style; | |
36 | + GtkStyleContext* styleCheck; | |
37 | + GtkStyleContext* styleLabel; | |
38 | + } check; | |
39 | + | |
40 | + struct { | |
41 | + GtkStyleContext* style; | |
42 | + GtkStyleContext* styleTrough; | |
43 | + GtkStyleContext* styleProgress; | |
44 | + } progress; | |
45 | + | |
46 | + struct { | |
47 | + GtkStyleContext* style; | |
48 | + GtkStyleContext* styleEntry; | |
49 | + GtkStyleContext* styleButtonUp; | |
50 | + GtkStyleContext* styleButtonDown; | |
51 | + } spin; | |
52 | + | |
53 | + struct { | |
54 | + GtkStyleContext* style[MOZ_WIDGET_STYLES]; | |
55 | + } all; | |
56 | + }; | |
57 | +} MozGtkWidget; | |
58 | + | |
59 | static GtkWidget* gProtoWindow; | |
60 | static GtkWidget* gProtoLayout; | |
61 | -static GtkWidget* gButtonWidget; | |
62 | +static MozGtkWidget gButton; | |
63 | static GtkWidget* gToggleButtonWidget; | |
64 | static GtkWidget* gButtonArrowWidget; | |
65 | -static GtkWidget* gCheckboxWidget; | |
66 | -static GtkWidget* gRadiobuttonWidget; | |
67 | -static GtkWidget* gHorizScrollbarWidget; | |
68 | -static GtkWidget* gVertScrollbarWidget; | |
69 | -static GtkWidget* gSpinWidget; | |
70 | +static MozGtkWidget gCheckbox; | |
71 | +static MozGtkWidget gRadiobutton; | |
72 | +static MozGtkWidget gVertScrollbar; | |
73 | +static MozGtkWidget gHorizScrollbar; | |
74 | +static MozGtkWidget gSpin; | |
75 | static GtkWidget* gHScaleWidget; | |
76 | static GtkWidget* gVScaleWidget; | |
77 | -static GtkWidget* gEntryWidget; | |
78 | +static MozGtkWidget gEntry; | |
79 | static GtkWidget* gComboBoxWidget; | |
80 | static GtkWidget* gComboBoxButtonWidget; | |
81 | static GtkWidget* gComboBoxArrowWidget; | |
82 | static GtkWidget* gComboBoxSeparatorWidget; | |
83 | static GtkWidget* gComboBoxEntryWidget; | |
84 | -static GtkWidget* gComboBoxEntryTextareaWidget; | |
85 | +static MozGtkWidget gComboBoxEntryTextarea; | |
86 | static GtkWidget* gComboBoxEntryButtonWidget; | |
87 | static GtkWidget* gComboBoxEntryArrowWidget; | |
88 | static GtkWidget* gHandleBoxWidget; | |
89 | static GtkWidget* gToolbarWidget; | |
90 | static GtkWidget* gFrameWidget; | |
91 | static GtkWidget* gStatusbarWidget; | |
92 | -static GtkWidget* gProgressWidget; | |
93 | +static MozGtkWidget gProgressBar; | |
94 | static GtkWidget* gTabWidget; | |
95 | -static GtkWidget* gTooltipWidget; | |
96 | +static MozGtkWidget gTooltip; | |
97 | static GtkWidget* gMenuBarWidget; | |
98 | static GtkWidget* gMenuBarItemWidget; | |
99 | static GtkWidget* gMenuPopupWidget; | |
3de22d0e | 100 | @@ -78,6 +129,37 @@ static gboolean is_initialized; |
f0a96e4f JR |
101 | #define GTK_STATE_FLAG_CHECKED (1 << 11) |
102 | #endif | |
103 | ||
104 | +void moz_gtk_widget_free(MozGtkWidget *aMozWidget) | |
105 | +{ | |
106 | + // This was removed as a child of gProtoWindow | |
107 | + if (aMozWidget->widget) { | |
108 | + aMozWidget->widget = NULL; | |
109 | + } | |
110 | + | |
111 | + for(int i = 0; i < MOZ_WIDGET_STYLES; i++) { | |
112 | + if (aMozWidget->all.style[i]) { | |
113 | + g_object_unref(aMozWidget->all.style[i]); | |
114 | + aMozWidget->all.style[i] = NULL; | |
115 | + } | |
116 | + } | |
117 | +} | |
118 | + | |
119 | +// TODO - weak dep!! (dlsym) | |
120 | +#if GTK_CHECK_VERSION(3, 19, 2) | |
121 | +#define moz_gtk_path_set_class_name gtk_widget_path_iter_set_object_name | |
122 | +#else | |
123 | +#define moz_gtk_path_set_class_name gtk_widget_path_iter_add_class | |
124 | +#endif | |
125 | +//gtk_widget_path_iter_get_state | |
126 | + | |
127 | +static void | |
128 | +moz_gtk_get_style_border(GtkStyleContext* style, GtkStateFlags state_flags, | |
129 | + GtkBorder *border); | |
130 | + | |
131 | +static void | |
132 | +moz_gtk_get_style_padding(GtkStyleContext* style, GtkStateFlags state_flags, | |
133 | + GtkBorder *padding); | |
134 | + | |
135 | static GtkStateFlags | |
136 | GetStateFlagsFromGtkWidgetState(GtkWidgetState* state) | |
137 | { | |
3de22d0e | 138 | @@ -97,6 +179,41 @@ GetStateFlagsFromGtkWidgetState(GtkWidge |
f0a96e4f JR |
139 | return stateFlags; |
140 | } | |
141 | ||
142 | +GtkStyleContext * | |
143 | +moz_gtk_style_create(GtkCssNode *node, GtkStyleContext *parent) | |
144 | +{ | |
145 | + GtkWidgetPath *path; | |
146 | + GtkStyleContext *context; | |
147 | + | |
148 | + if (parent) | |
149 | + path = gtk_widget_path_copy (gtk_style_context_get_path (parent)); | |
150 | + else | |
151 | + path = gtk_widget_path_new (); | |
152 | + | |
153 | + gtk_widget_path_append_type (path, node->type); | |
154 | + if (node->name) | |
155 | + moz_gtk_path_set_class_name(path, -1, node->name); | |
156 | + if (node->class1) | |
157 | + gtk_widget_path_iter_add_class(path, -1, node->class1); | |
158 | + if (node->class2) | |
159 | + gtk_widget_path_iter_add_class(path, -1, node->class2); | |
160 | + | |
161 | + context = gtk_style_context_new (); | |
162 | + gtk_style_context_set_path (context, path); | |
163 | + gtk_style_context_set_parent (context, parent); | |
164 | + | |
165 | + if(!gtk_check_version(3, 14, 0)) { | |
166 | + /* Unfortunately, we have to explicitly set the state again here | |
167 | + * for it to take effect | |
168 | + */ | |
169 | + gtk_style_context_set_state (context, gtk_widget_path_iter_get_state (path, -1)); | |
170 | + } | |
171 | + | |
172 | + gtk_widget_path_unref (path); | |
173 | + | |
174 | + return context; | |
175 | +} | |
176 | + | |
177 | /* Because we have such an unconventional way of drawing widgets, signal to the GTK theme engine | |
178 | that they are drawing for Mozilla instead of a conventional GTK app so they can do any specific | |
179 | things they may want to do. */ | |
3de22d0e | 180 | @@ -141,9 +258,16 @@ setup_widget_prototype(GtkWidget* widget |
f0a96e4f JR |
181 | static gint |
182 | ensure_button_widget() | |
183 | { | |
184 | - if (!gButtonWidget) { | |
185 | - gButtonWidget = gtk_button_new_with_label("M"); | |
186 | - setup_widget_prototype(gButtonWidget); | |
187 | + if (!gButton.widget) { | |
188 | + GtkCssNode path[] = { | |
189 | + { GTK_TYPE_BUTTON, "button", NULL, NULL } | |
190 | + }; | |
191 | + | |
192 | + gButton.widget = gtk_button_new_with_label("M"); | |
193 | + setup_widget_prototype(gButton.widget); | |
194 | + gtk_widget_show(gButton.widget); | |
195 | + | |
196 | + gButton.button.style = moz_gtk_style_create(&path[0], NULL); | |
197 | } | |
198 | return MOZ_GTK_SUCCESS; | |
199 | } | |
3de22d0e | 200 | @@ -195,9 +319,21 @@ ensure_button_arrow_widget() |
f0a96e4f JR |
201 | static gint |
202 | ensure_checkbox_widget() | |
203 | { | |
204 | - if (!gCheckboxWidget) { | |
205 | - gCheckboxWidget = gtk_check_button_new_with_label("M"); | |
206 | - setup_widget_prototype(gCheckboxWidget); | |
207 | + if (!gCheckbox.widget) { | |
208 | + GtkCssNode path[] = { | |
209 | + { GTK_TYPE_TOGGLE_BUTTON, "checkbutton", NULL, NULL }, | |
210 | + { G_TYPE_NONE, "check", NULL, NULL }, | |
211 | + { G_TYPE_NONE, "label", NULL, NULL } | |
212 | + }; | |
213 | + | |
214 | + gCheckbox.widget = gtk_check_button_new_with_label("M"); | |
215 | + setup_widget_prototype(gCheckbox.widget); | |
216 | + | |
217 | + gCheckbox.check.style = moz_gtk_style_create(&path[0], NULL); | |
218 | + gCheckbox.check.styleCheck = moz_gtk_style_create(&path[1], | |
219 | + gCheckbox.check.style); | |
220 | + gCheckbox.check.styleLabel = moz_gtk_style_create(&path[2], | |
221 | + gCheckbox.check.style); | |
222 | } | |
223 | return MOZ_GTK_SUCCESS; | |
224 | } | |
3de22d0e | 225 | @@ -205,9 +341,21 @@ ensure_checkbox_widget() |
f0a96e4f JR |
226 | static gint |
227 | ensure_radiobutton_widget() | |
228 | { | |
229 | - if (!gRadiobuttonWidget) { | |
230 | - gRadiobuttonWidget = gtk_radio_button_new_with_label(NULL, "M"); | |
231 | - setup_widget_prototype(gRadiobuttonWidget); | |
232 | + if (!gRadiobutton.widget) { | |
233 | + GtkCssNode path[] = { | |
234 | + { GTK_TYPE_TOGGLE_BUTTON, "radiobutton", NULL, NULL }, | |
235 | + { G_TYPE_NONE, "radio", NULL, NULL }, | |
236 | + { G_TYPE_NONE, "label", NULL, NULL } | |
237 | + }; | |
238 | + | |
239 | + gRadiobutton.widget = gtk_radio_button_new_with_label(NULL, "M"); | |
240 | + setup_widget_prototype(gRadiobutton.widget); | |
241 | + | |
242 | + gRadiobutton.check.style = moz_gtk_style_create(&path[0], NULL); | |
243 | + gRadiobutton.check.styleCheck = moz_gtk_style_create(&path[1], | |
244 | + gRadiobutton.check.style); | |
245 | + gRadiobutton.check.styleLabel = moz_gtk_style_create(&path[2], | |
246 | + gRadiobutton.check.style); | |
247 | } | |
248 | return MOZ_GTK_SUCCESS; | |
249 | } | |
3de22d0e | 250 | @@ -215,25 +363,62 @@ ensure_radiobutton_widget() |
f0a96e4f JR |
251 | static gint |
252 | ensure_scrollbar_widget() | |
253 | { | |
254 | - if (!gVertScrollbarWidget) { | |
255 | - gVertScrollbarWidget = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, NULL); | |
256 | - setup_widget_prototype(gVertScrollbarWidget); | |
257 | - } | |
258 | - if (!gHorizScrollbarWidget) { | |
259 | - gHorizScrollbarWidget = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, NULL); | |
260 | - setup_widget_prototype(gHorizScrollbarWidget); | |
261 | - } | |
262 | + if (!gVertScrollbar.widget && !gHorizScrollbar.widget) { | |
263 | + GtkCssNode path[] = { | |
264 | + { GTK_TYPE_SCROLLBAR, "scrollbar", "horizontal", "bottom"}, | |
265 | + { GTK_TYPE_SCROLLBAR, "scrollbar", "vertical", "right" }, | |
266 | + { G_TYPE_NONE, "contents", NULL, NULL }, | |
267 | + { G_TYPE_NONE, "trough", NULL, NULL }, | |
268 | + { G_TYPE_NONE, "slider", NULL, NULL } | |
269 | + }; | |
270 | + | |
271 | + gHorizScrollbar.widget = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, NULL); | |
272 | + setup_widget_prototype(gHorizScrollbar.widget); | |
273 | + | |
274 | + gHorizScrollbar.scroll.style = moz_gtk_style_create(path, NULL); | |
275 | + gHorizScrollbar.scroll.styleContents = moz_gtk_style_create(path+2, | |
276 | + gHorizScrollbar.scroll.style); | |
277 | + gHorizScrollbar.scroll.styleTrough = moz_gtk_style_create(path+3, | |
278 | + gHorizScrollbar.scroll.styleContents); | |
279 | + gHorizScrollbar.scroll.styleSlider = moz_gtk_style_create(path+4, | |
280 | + gHorizScrollbar.scroll.styleTrough); | |
281 | + | |
282 | + gVertScrollbar.widget = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, NULL); | |
283 | + setup_widget_prototype(gVertScrollbar.widget); | |
284 | + | |
285 | + gVertScrollbar.scroll.style = moz_gtk_style_create(path+1, NULL); | |
286 | + gVertScrollbar.scroll.styleContents = moz_gtk_style_create(path+2, | |
287 | + gVertScrollbar.scroll.style); | |
288 | + gVertScrollbar.scroll.styleTrough = moz_gtk_style_create(path+3, | |
289 | + gVertScrollbar.scroll.styleContents); | |
290 | + gVertScrollbar.scroll.styleSlider = moz_gtk_style_create(path+4, | |
291 | + gVertScrollbar.scroll.styleTrough); | |
292 | + | |
293 | + } | |
294 | return MOZ_GTK_SUCCESS; | |
295 | } | |
296 | ||
297 | static gint | |
298 | ensure_spin_widget() | |
299 | { | |
300 | - if (!gSpinWidget) { | |
301 | - gSpinWidget = gtk_spin_button_new(NULL, 1, 0); | |
302 | - setup_widget_prototype(gSpinWidget); | |
303 | - } | |
304 | - return MOZ_GTK_SUCCESS; | |
305 | + if (!gSpin.widget) { | |
306 | + GtkCssNode path[] = { | |
307 | + { GTK_TYPE_SPIN_BUTTON, "spinbutton", "horizontal", NULL }, | |
308 | + { GTK_TYPE_SPIN_BUTTON, "spinbutton", "vertical", NULL }, | |
309 | + { GTK_TYPE_ENTRY, "entry", NULL, NULL }, | |
310 | + { G_TYPE_NONE, "button", "up", NULL }, | |
311 | + { G_TYPE_NONE, "button", "down", NULL } | |
312 | + }; | |
313 | + | |
314 | + gSpin.widget = gtk_spin_button_new(NULL, 1, 0); | |
315 | + setup_widget_prototype(gSpin.widget); | |
316 | + | |
317 | + gSpin.spin.style = moz_gtk_style_create(path, NULL); | |
318 | + gSpin.spin.styleButtonUp = moz_gtk_style_create(path+3, gSpin.spin.style); | |
319 | + gSpin.spin.styleButtonDown = moz_gtk_style_create(path+4, gSpin.spin.style); | |
320 | + gSpin.spin.styleEntry = moz_gtk_style_create(path+2, gSpin.spin.style); | |
321 | + } | |
322 | + return MOZ_GTK_SUCCESS; | |
323 | } | |
324 | ||
325 | static gint | |
3de22d0e | 326 | @@ -253,9 +438,19 @@ ensure_scale_widget() |
f0a96e4f JR |
327 | static gint |
328 | ensure_entry_widget() | |
329 | { | |
330 | - if (!gEntryWidget) { | |
331 | - gEntryWidget = gtk_entry_new(); | |
332 | - setup_widget_prototype(gEntryWidget); | |
333 | + if (!gEntry.widget) { | |
334 | + GtkCssNode path[] = { | |
335 | + { GTK_TYPE_ENTRY, "entry", NULL, NULL }, | |
336 | + { G_TYPE_NONE, "selection", NULL, NULL } | |
337 | + }; | |
338 | + | |
339 | + gEntry.widget = gtk_entry_new(); | |
340 | + setup_widget_prototype(gEntry.widget); | |
341 | + gtk_widget_show(gEntry.widget); | |
342 | + | |
343 | + gEntry.entry.style = moz_gtk_style_create(&path[0], NULL); | |
344 | + gEntry.entry.styleSelection = moz_gtk_style_create(&path[1], | |
345 | + gEntry.entry.style); | |
346 | } | |
347 | return MOZ_GTK_SUCCESS; | |
348 | } | |
3de22d0e | 349 | @@ -387,9 +582,9 @@ moz_gtk_get_combo_box_entry_inner_widget |
f0a96e4f JR |
350 | g_object_add_weak_pointer(G_OBJECT(widget), |
351 | (gpointer) &gComboBoxEntryButtonWidget); | |
352 | } else if (GTK_IS_ENTRY(widget)) { | |
353 | - gComboBoxEntryTextareaWidget = widget; | |
354 | + gComboBoxEntryTextarea.widget = widget; | |
355 | g_object_add_weak_pointer(G_OBJECT(widget), | |
356 | - (gpointer) &gComboBoxEntryTextareaWidget); | |
357 | + (gpointer) &gComboBoxEntryTextarea.widget); | |
358 | } else | |
359 | return; | |
360 | gtk_widget_realize(widget); | |
3de22d0e | 361 | @@ -411,7 +606,7 @@ ensure_combo_box_entry_widgets() |
f0a96e4f JR |
362 | { |
363 | GtkWidget* buttonChild; | |
364 | ||
365 | - if (gComboBoxEntryTextareaWidget && | |
366 | + if (gComboBoxEntryTextarea.widget && | |
367 | gComboBoxEntryButtonWidget && | |
368 | gComboBoxEntryArrowWidget) | |
369 | return MOZ_GTK_SUCCESS; | |
3de22d0e | 370 | @@ -427,9 +622,9 @@ ensure_combo_box_entry_widgets() |
f0a96e4f JR |
371 | moz_gtk_get_combo_box_entry_inner_widgets, |
372 | NULL); | |
373 | ||
374 | - if (!gComboBoxEntryTextareaWidget) { | |
375 | + if (!gComboBoxEntryTextarea.widget) { | |
376 | ensure_entry_widget(); | |
377 | - gComboBoxEntryTextareaWidget = gEntryWidget; | |
378 | + gComboBoxEntryTextarea.widget = gEntry.widget; | |
379 | } | |
380 | ||
381 | if (gComboBoxEntryButtonWidget) { | |
3de22d0e | 382 | @@ -507,12 +702,16 @@ ensure_toolbar_separator_widget() |
f0a96e4f JR |
383 | static gint |
384 | ensure_tooltip_widget() | |
385 | { | |
386 | - if (!gTooltipWidget) { | |
387 | - gTooltipWidget = gtk_window_new(GTK_WINDOW_POPUP); | |
388 | - GtkStyleContext* style = gtk_widget_get_style_context(gTooltipWidget); | |
389 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP); | |
390 | - gtk_widget_realize(gTooltipWidget); | |
391 | - moz_gtk_set_widget_name(gTooltipWidget); | |
392 | + if (!gTooltip.widget) { | |
3de22d0e | 393 | + GtkCssNode path[] = { |
f0a96e4f JR |
394 | + { GTK_TYPE_TOOLTIP, "tooltip", "background", NULL}, |
395 | + }; | |
396 | + | |
397 | + gTooltip.widget = gtk_window_new(GTK_WINDOW_POPUP); | |
398 | + gtk_widget_realize(gTooltip.widget); | |
399 | + moz_gtk_set_widget_name(gTooltip.widget); | |
400 | + | |
401 | + gTooltip.tooltip.style = moz_gtk_style_create(&path[0], NULL); | |
f0a96e4f JR |
402 | } |
403 | return MOZ_GTK_SUCCESS; | |
404 | } | |
3de22d0e | 405 | @@ -530,9 +729,21 @@ ensure_tab_widget() |
f0a96e4f JR |
406 | static gint |
407 | ensure_progress_widget() | |
408 | { | |
409 | - if (!gProgressWidget) { | |
410 | - gProgressWidget = gtk_progress_bar_new(); | |
411 | - setup_widget_prototype(gProgressWidget); | |
412 | + if (!gProgressBar.widget) { | |
413 | + GtkCssNode path[] = { | |
414 | + { GTK_TYPE_LABEL, "progressbar", NULL, NULL }, | |
415 | + { G_TYPE_NONE, "trough", NULL, NULL }, | |
416 | + { G_TYPE_NONE, "progress", NULL, NULL }, | |
417 | + }; | |
418 | + | |
419 | + gProgressBar.widget = gtk_progress_bar_new(); | |
420 | + setup_widget_prototype(gProgressBar.widget); | |
421 | + | |
422 | + gProgressBar.progress.style = moz_gtk_style_create(&path[0], NULL); | |
423 | + gProgressBar.progress.styleTrough = moz_gtk_style_create(&path[1], | |
424 | + gProgressBar.progress.style); | |
425 | + gProgressBar.progress.styleProgress = moz_gtk_style_create(&path[2], | |
426 | + gProgressBar.progress.styleTrough); | |
427 | } | |
428 | return MOZ_GTK_SUCCESS; | |
429 | } | |
3de22d0e | 430 | @@ -638,6 +849,11 @@ static gint |
f0a96e4f JR |
431 | ensure_check_menu_item_widget() |
432 | { | |
433 | if (!gCheckMenuItemWidget) { | |
434 | + GtkCssNode path[] = { | |
435 | + { GTK_TYPE_CHECK_MENU_ITEM, "menuitem", NULL, NULL }, | |
436 | + { G_TYPE_NONE, "check", NULL, NULL } | |
437 | + }; | |
438 | + | |
439 | ensure_menu_popup_widget(); | |
440 | gCheckMenuItemWidget = gtk_check_menu_item_new_with_label("M"); | |
441 | gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), | |
3de22d0e | 442 | @@ -752,7 +968,7 @@ moz_gtk_checkbox_get_metrics(gint* indic |
f0a96e4f JR |
443 | { |
444 | ensure_checkbox_widget(); | |
445 | ||
446 | - gtk_widget_style_get (gCheckboxWidget, | |
447 | + gtk_widget_style_get (gCheckbox.widget, | |
448 | "indicator_size", indicator_size, | |
449 | "indicator_spacing", indicator_spacing, | |
450 | NULL); | |
3de22d0e | 451 | @@ -765,7 +981,7 @@ moz_gtk_radio_get_metrics(gint* indicato |
f0a96e4f JR |
452 | { |
453 | ensure_radiobutton_widget(); | |
454 | ||
455 | - gtk_widget_style_get (gRadiobuttonWidget, | |
456 | + gtk_widget_style_get (gRadiobutton.widget, | |
457 | "indicator_size", indicator_size, | |
458 | "indicator_spacing", indicator_spacing, | |
459 | NULL); | |
3de22d0e | 460 | @@ -778,13 +994,13 @@ moz_gtk_get_focus_outline_size(gint* foc |
f0a96e4f JR |
461 | { |
462 | GtkBorder border; | |
463 | GtkBorder padding; | |
464 | - GtkStyleContext *style; | |
465 | + GtkStyleContext* style; | |
466 | ||
467 | ensure_entry_widget(); | |
468 | - style = gtk_widget_get_style_context(gEntryWidget); | |
469 | ||
470 | - gtk_style_context_get_border(style, 0, &border); | |
471 | - gtk_style_context_get_padding(style, 0, &padding); | |
472 | + style = gEntry.entry.style; | |
473 | + gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); | |
474 | + gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); | |
475 | *focus_h_width = border.left + padding.left; | |
476 | *focus_v_width = border.top + padding.top; | |
477 | return MOZ_GTK_SUCCESS; | |
3de22d0e | 478 | @@ -821,7 +1037,7 @@ moz_gtk_button_get_default_overflow(gint |
f0a96e4f JR |
479 | GtkBorder* default_outside_border; |
480 | ||
481 | ensure_button_widget(); | |
482 | - gtk_widget_style_get(gButtonWidget, | |
483 | + gtk_widget_style_get(gButton.widget, | |
484 | "default-outside-border", &default_outside_border, | |
485 | NULL); | |
486 | ||
3de22d0e | 487 | @@ -844,7 +1060,7 @@ moz_gtk_button_get_default_border(gint* |
f0a96e4f JR |
488 | GtkBorder* default_border; |
489 | ||
490 | ensure_button_widget(); | |
491 | - gtk_widget_style_get(gButtonWidget, | |
492 | + gtk_widget_style_get(gButton.widget, | |
493 | "default-border", &default_border, | |
494 | NULL); | |
495 | ||
3de22d0e | 496 | @@ -935,7 +1151,7 @@ moz_gtk_button_paint(cairo_t *cr, GdkRec |
f0a96e4f JR |
497 | |
498 | if (state->focused) { | |
499 | GtkBorder border; | |
500 | - gtk_style_context_get_border(style, state_flags, &border); | |
501 | + moz_gtk_get_style_border(style, state_flags, &border); | |
502 | x += border.left; | |
503 | y += border.top; | |
504 | width -= (border.left + border.right); | |
3de22d0e | 505 | @@ -956,15 +1172,14 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec |
f0a96e4f JR |
506 | gint indicator_size, indicator_spacing; |
507 | gint x, y, width, height; | |
508 | gint focus_x, focus_y, focus_width, focus_height; | |
509 | - GtkWidget *w; | |
510 | - GtkStyleContext *style; | |
511 | + MozGtkWidget *w; | |
512 | ||
513 | if (isradio) { | |
514 | moz_gtk_radio_get_metrics(&indicator_size, &indicator_spacing); | |
515 | - w = gRadiobuttonWidget; | |
516 | + w = &gRadiobutton; | |
517 | } else { | |
518 | moz_gtk_checkbox_get_metrics(&indicator_size, &indicator_spacing); | |
519 | - w = gCheckboxWidget; | |
520 | + w = &gCheckbox; | |
521 | } | |
522 | ||
523 | // XXX we should assert rect->height >= indicator_size too | |
3de22d0e | 524 | @@ -983,11 +1198,9 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec |
f0a96e4f JR |
525 | focus_width = width + 2 * indicator_spacing; |
526 | focus_height = height + 2 * indicator_spacing; | |
527 | ||
528 | - style = gtk_widget_get_style_context(w); | |
529 | - | |
530 | - gtk_widget_set_sensitive(w, !state->disabled); | |
531 | - gtk_widget_set_direction(w, direction); | |
532 | - gtk_style_context_save(style); | |
533 | + gtk_widget_set_sensitive(w->widget, !state->disabled); | |
534 | + gtk_widget_set_direction(w->widget, direction); | |
535 | + gtk_style_context_save(w->check.styleCheck); | |
536 | ||
537 | if (selected) | |
538 | state_flags |= checkbox_check_state; | |
3de22d0e | 539 | @@ -995,13 +1208,15 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec |
f0a96e4f JR |
540 | if (inconsistent) |
541 | state_flags |= GTK_STATE_FLAG_INCONSISTENT; | |
542 | ||
543 | - gtk_style_context_set_state(style, state_flags); | |
544 | + gtk_style_context_set_state(w->check.styleCheck, state_flags); | |
545 | + | |
546 | + gtk_render_background(w->check.styleCheck, cr, x, y, width, height); | |
547 | + gtk_render_frame(w->check.styleCheck, cr, x, y, width, height); | |
548 | ||
549 | if (isradio) { | |
550 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_RADIO); | |
551 | - gtk_render_option(style, cr, x, y, width, height); | |
552 | + gtk_render_option(w->check.styleCheck, cr, x, y, width, height); | |
553 | if (state->focused) { | |
554 | - gtk_render_focus(style, cr, focus_x, focus_y, | |
555 | + gtk_render_focus(w->check.styleCheck, cr, focus_x, focus_y, | |
556 | focus_width, focus_height); | |
557 | } | |
558 | } | |
3de22d0e | 559 | @@ -1010,15 +1225,14 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec |
f0a96e4f JR |
560 | * 'indeterminate' type on checkboxes. In GTK, the shadow type |
561 | * must also be changed for the state to be drawn. | |
562 | */ | |
563 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_CHECK); | |
564 | - gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(gCheckboxWidget), inconsistent); | |
565 | - gtk_render_check(style, cr, x, y, width, height); | |
566 | + gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(w->widget), inconsistent); | |
567 | + gtk_render_check(w->check.styleCheck, cr, x, y, width, height); | |
568 | if (state->focused) { | |
569 | - gtk_render_focus(style, cr, | |
570 | + gtk_render_focus(w->check.styleCheck, cr, | |
571 | focus_x, focus_y, focus_width, focus_height); | |
572 | } | |
573 | } | |
574 | - gtk_style_context_restore(style); | |
575 | + gtk_style_context_restore(w->check.styleCheck); | |
576 | ||
577 | return MOZ_GTK_SUCCESS; | |
578 | } | |
3de22d0e | 579 | @@ -1035,8 +1249,8 @@ calculate_button_inner_rect(GtkWidget* b |
f0a96e4f JR |
580 | style = gtk_widget_get_style_context(button); |
581 | ||
582 | /* This mirrors gtkbutton's child positioning */ | |
583 | - gtk_style_context_get_border(style, 0, &border); | |
584 | - gtk_style_context_get_padding(style, 0, &padding); | |
585 | + gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); | |
586 | + gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); | |
587 | ||
588 | inner_rect->x = rect->x + border.left + padding.left; | |
589 | inner_rect->y = rect->y + padding.top + border.top; | |
3de22d0e | 590 | @@ -1099,9 +1313,9 @@ moz_gtk_scrollbar_button_paint(cairo_t * |
f0a96e4f JR |
591 | ensure_scrollbar_widget(); |
592 | ||
593 | if (flags & MOZ_GTK_STEPPER_VERTICAL) | |
594 | - scrollbar = gVertScrollbarWidget; | |
595 | + scrollbar = gVertScrollbar.widget; | |
596 | else | |
597 | - scrollbar = gHorizScrollbarWidget; | |
598 | + scrollbar = gHorizScrollbar.widget; | |
599 | ||
600 | gtk_widget_set_direction(scrollbar, direction); | |
601 | ||
3de22d0e | 602 | @@ -1181,25 +1395,22 @@ moz_gtk_scrollbar_trough_paint(GtkThemeW |
f0a96e4f JR |
603 | GtkTextDirection direction) |
604 | { | |
605 | GtkStyleContext* style; | |
606 | - GtkScrollbar *scrollbar; | |
607 | ||
608 | ensure_scrollbar_widget(); | |
609 | ||
610 | - if (widget == MOZ_GTK_SCROLLBAR_HORIZONTAL) | |
611 | - scrollbar = GTK_SCROLLBAR(gHorizScrollbarWidget); | |
612 | - else | |
613 | - scrollbar = GTK_SCROLLBAR(gVertScrollbarWidget); | |
614 | - | |
615 | - gtk_widget_set_direction(GTK_WIDGET(scrollbar), direction); | |
616 | - | |
617 | if (flags & MOZ_GTK_TRACK_OPAQUE) { | |
618 | style = gtk_widget_get_style_context(GTK_WIDGET(gProtoWindow)); | |
619 | gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); | |
620 | } | |
621 | ||
622 | - style = gtk_widget_get_style_context(GTK_WIDGET(scrollbar)); | |
623 | - gtk_style_context_save(style); | |
624 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH); | |
625 | + if (widget == MOZ_GTK_SCROLLBAR_HORIZONTAL) { | |
626 | + gtk_widget_set_direction(GTK_WIDGET(gHorizScrollbar.widget), direction); | |
627 | + style = gHorizScrollbar.scroll.style; | |
628 | + } | |
629 | + else { | |
630 | + gtk_widget_set_direction(GTK_WIDGET(gVertScrollbar.widget), direction); | |
631 | + style = gVertScrollbar.scroll.style; | |
632 | + } | |
633 | ||
634 | gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); | |
635 | gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); | |
3de22d0e | 636 | @@ -1208,7 +1419,6 @@ moz_gtk_scrollbar_trough_paint(GtkThemeW |
f0a96e4f JR |
637 | gtk_render_focus(style, cr, |
638 | rect->x, rect->y, rect->width, rect->height); | |
639 | } | |
640 | - gtk_style_context_restore(style); | |
641 | return MOZ_GTK_SUCCESS; | |
642 | } | |
643 | ||
3de22d0e | 644 | @@ -1220,24 +1430,20 @@ moz_gtk_scrollbar_thumb_paint(GtkThemeWi |
f0a96e4f JR |
645 | { |
646 | GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); | |
647 | GtkStyleContext* style; | |
648 | - GtkScrollbar *scrollbar; | |
649 | GtkBorder margin; | |
650 | ||
651 | ensure_scrollbar_widget(); | |
652 | ||
653 | - if (widget == MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL) | |
654 | - scrollbar = GTK_SCROLLBAR(gHorizScrollbarWidget); | |
655 | - else | |
656 | - scrollbar = GTK_SCROLLBAR(gVertScrollbarWidget); | |
657 | - | |
658 | - gtk_widget_set_direction(GTK_WIDGET(scrollbar), direction); | |
659 | - | |
660 | - style = gtk_widget_get_style_context(GTK_WIDGET(scrollbar)); | |
661 | - gtk_style_context_save(style); | |
662 | + if (widget == MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL) { | |
663 | + style = gHorizScrollbar.scroll.styleSlider; | |
664 | + gtk_widget_set_direction(GTK_WIDGET(gHorizScrollbar.widget), direction); | |
665 | + } | |
666 | + else { | |
667 | + style = gVertScrollbar.scroll.styleSlider; | |
668 | + gtk_widget_set_direction(GTK_WIDGET(gVertScrollbar.widget), direction); | |
669 | + } | |
670 | ||
671 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_SLIDER); | |
672 | gtk_style_context_set_state(style, state_flags); | |
673 | - | |
674 | gtk_style_context_get_margin (style, state_flags, &margin); | |
675 | ||
676 | gtk_render_slider(style, cr, | |
3de22d0e | 677 | @@ -1248,8 +1454,6 @@ moz_gtk_scrollbar_thumb_paint(GtkThemeWi |
f0a96e4f JR |
678 | (widget == MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL) ? |
679 | GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL); | |
680 | ||
681 | - gtk_style_context_restore(style); | |
682 | - | |
683 | return MOZ_GTK_SUCCESS; | |
684 | } | |
685 | ||
3de22d0e | 686 | @@ -1260,8 +1464,8 @@ moz_gtk_spin_paint(cairo_t *cr, GdkRecta |
f0a96e4f JR |
687 | GtkStyleContext* style; |
688 | ||
689 | ensure_spin_widget(); | |
690 | - gtk_widget_set_direction(gSpinWidget, direction); | |
691 | - style = gtk_widget_get_style_context(gSpinWidget); | |
692 | + gtk_widget_set_direction(gSpin.widget, direction); | |
693 | + style = gSpin.spin.style; | |
694 | gtk_style_context_save(style); | |
695 | gtk_style_context_add_class(style, GTK_STYLE_CLASS_SPINBUTTON); | |
696 | gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); | |
3de22d0e | 697 | @@ -1280,11 +1484,10 @@ moz_gtk_spin_updown_paint(cairo_t *cr, G |
f0a96e4f JR |
698 | GtkStyleContext* style; |
699 | ||
700 | ensure_spin_widget(); | |
701 | - style = gtk_widget_get_style_context(gSpinWidget); | |
702 | + style = gSpin.spin.style; | |
703 | gtk_style_context_save(style); | |
704 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_SPINBUTTON); | |
705 | gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state)); | |
706 | - gtk_widget_set_direction(gSpinWidget, direction); | |
707 | + gtk_widget_set_direction(gSpin.widget, direction); | |
708 | ||
709 | gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); | |
710 | gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); | |
3de22d0e | 711 | @@ -1450,15 +1653,13 @@ moz_gtk_vpaned_paint(cairo_t *cr, GdkRec |
f0a96e4f JR |
712 | static gint |
713 | moz_gtk_entry_paint(cairo_t *cr, GdkRectangle* rect, | |
714 | GtkWidgetState* state, | |
715 | - GtkWidget* widget, GtkTextDirection direction) | |
716 | + MozGtkWidget* w, GtkTextDirection direction) | |
717 | { | |
718 | gint x = rect->x, y = rect->y, width = rect->width, height = rect->height; | |
719 | - GtkStyleContext* style; | |
720 | int draw_focus_outline_only = state->depressed; // NS_THEME_FOCUS_OUTLINE | |
721 | + GtkStyleContext* style = w->entry.style; | |
722 | ||
723 | - gtk_widget_set_direction(widget, direction); | |
724 | - | |
725 | - style = gtk_widget_get_style_context(widget); | |
726 | + gtk_widget_set_direction(w->widget, direction); | |
727 | ||
728 | if (draw_focus_outline_only) { | |
729 | // Inflate the given 'rect' with the focus outline size. | |
3de22d0e | 730 | @@ -1478,10 +1679,9 @@ moz_gtk_entry_paint(cairo_t *cr, GdkRect |
f0a96e4f JR |
731 | * textarea window uses gtk_paint_flat_box when exposed */ |
732 | ||
733 | /* This gets us a lovely greyish disabledish look */ | |
734 | - gtk_widget_set_sensitive(widget, !state->disabled); | |
735 | + gtk_widget_set_sensitive(w->widget, !state->disabled); | |
736 | ||
737 | gtk_style_context_save(style); | |
738 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_ENTRY); | |
739 | ||
740 | /* Now paint the shadow and focus border. | |
741 | * We do like in gtk_entry_draw_frame, we first draw the shadow, a tad | |
3de22d0e | 742 | @@ -1531,7 +1731,7 @@ moz_gtk_treeview_paint(cairo_t *cr, GdkR |
f0a96e4f JR |
743 | style = gtk_widget_get_style_context(gScrolledWindowWidget); |
744 | gtk_style_context_save(style); | |
745 | gtk_style_context_add_class(style, GTK_STYLE_CLASS_FRAME); | |
746 | - gtk_style_context_get_border(style, state_flags, &border); | |
747 | + moz_gtk_get_style_border(style, state_flags, &border); | |
748 | xthickness = border.left; | |
749 | ythickness = border.top; | |
750 | ||
3de22d0e | 751 | @@ -1702,7 +1902,7 @@ moz_gtk_combo_box_paint(cairo_t *cr, Gdk |
f0a96e4f JR |
752 | if (direction == GTK_TEXT_DIR_LTR) { |
753 | GtkBorder padding; | |
754 | GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); | |
755 | - gtk_style_context_get_padding(style, state_flags, &padding); | |
756 | + moz_gtk_get_style_padding(style, state_flags, &padding); | |
757 | arrow_rect.x -= padding.left; | |
758 | } | |
759 | else | |
3de22d0e | 760 | @@ -1804,29 +2004,27 @@ moz_gtk_container_paint(cairo_t *cr, Gdk |
f0a96e4f JR |
761 | gboolean isradio, GtkTextDirection direction) |
762 | { | |
763 | GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); | |
764 | - GtkStyleContext* style; | |
765 | - GtkWidget *widget; | |
766 | + MozGtkWidget *widget; | |
767 | ||
768 | if (isradio) { | |
769 | ensure_radiobutton_widget(); | |
770 | - widget = gRadiobuttonWidget; | |
771 | + widget = &gRadiobutton; | |
772 | } else { | |
773 | ensure_checkbox_widget(); | |
774 | - widget = gCheckboxWidget; | |
775 | + widget = &gCheckbox; | |
776 | } | |
777 | - gtk_widget_set_direction(widget, direction); | |
778 | + gtk_widget_set_direction(widget->widget, direction); | |
779 | ||
780 | - style = gtk_widget_get_style_context(widget); | |
781 | - gtk_style_context_save(style); | |
782 | - gtk_style_context_set_state(style, state_flags); | |
783 | + gtk_style_context_save(widget->check.style); | |
784 | + gtk_style_context_set_state(widget->check.style, state_flags); | |
785 | ||
786 | /* this is for drawing a prelight box */ | |
787 | if (state_flags & GTK_STATE_FLAG_PRELIGHT) { | |
788 | - gtk_render_background(style, cr, | |
789 | + gtk_render_background(widget->check.style, cr, | |
790 | rect->x, rect->y, rect->width, rect->height); | |
791 | } | |
792 | ||
793 | - gtk_style_context_restore(style); | |
794 | + gtk_style_context_restore(widget->check.style); | |
795 | ||
796 | return MOZ_GTK_SUCCESS; | |
797 | } | |
3de22d0e | 798 | @@ -1836,32 +2034,26 @@ moz_gtk_toggle_label_paint(cairo_t *cr, |
f0a96e4f JR |
799 | GtkWidgetState* state, |
800 | gboolean isradio, GtkTextDirection direction) | |
801 | { | |
802 | - GtkStyleContext *style; | |
803 | - GtkWidget *widget; | |
804 | + MozGtkWidget *widget; | |
805 | ||
806 | if (!state->focused) | |
807 | return MOZ_GTK_SUCCESS; | |
808 | ||
809 | if (isradio) { | |
810 | ensure_radiobutton_widget(); | |
811 | - widget = gRadiobuttonWidget; | |
812 | + widget = &gRadiobutton; | |
813 | } else { | |
814 | ensure_checkbox_widget(); | |
815 | - widget = gCheckboxWidget; | |
816 | - } | |
817 | - style = gtk_widget_get_style_context(widget); | |
818 | - gtk_style_context_save(style); | |
819 | - if (isradio) { | |
820 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_RADIO); | |
821 | - } else { | |
822 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_CHECK); | |
823 | + widget = &gCheckbox; | |
824 | } | |
825 | - gtk_widget_set_direction(widget, direction); | |
826 | + gtk_style_context_save(widget->check.styleLabel); | |
827 | + gtk_widget_set_direction(widget->widget, direction); | |
828 | ||
829 | - gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state)); | |
830 | - gtk_render_focus(style, cr, | |
831 | + gtk_style_context_set_state(widget->check.styleLabel, | |
832 | + GetStateFlagsFromGtkWidgetState(state)); | |
833 | + gtk_render_focus(widget->check.styleLabel, cr, | |
834 | rect->x, rect->y, rect->width, rect->height); | |
835 | - gtk_style_context_restore(style); | |
836 | + gtk_style_context_restore(widget->check.styleLabel); | |
837 | ||
838 | return MOZ_GTK_SUCCESS; | |
839 | } | |
3de22d0e | 840 | @@ -1922,7 +2114,7 @@ moz_gtk_toolbar_separator_paint(cairo_t |
f0a96e4f JR |
841 | rect->height * (end_fraction - start_fraction)); |
842 | } else { | |
843 | GtkBorder padding; | |
844 | - gtk_style_context_get_padding(style, 0, &padding); | |
845 | + gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); | |
846 | ||
847 | paint_width = padding.left; | |
848 | if (paint_width > rect->width) | |
3de22d0e | 849 | @@ -1945,9 +2137,9 @@ moz_gtk_tooltip_paint(cairo_t *cr, GdkRe |
f0a96e4f JR |
850 | GtkStyleContext* style; |
851 | ||
852 | ensure_tooltip_widget(); | |
853 | - gtk_widget_set_direction(gTooltipWidget, direction); | |
854 | + gtk_widget_set_direction(gTooltip.widget, direction); | |
855 | ||
856 | - style = gtk_widget_get_style_context(gTooltipWidget); | |
3de22d0e | 857 | + style = gTooltip.tooltip.style; |
f0a96e4f JR |
858 | gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); |
859 | gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); | |
860 | return MOZ_GTK_SUCCESS; | |
3de22d0e | 861 | @@ -2006,18 +2198,13 @@ static gint |
f0a96e4f JR |
862 | moz_gtk_progressbar_paint(cairo_t *cr, GdkRectangle* rect, |
863 | GtkTextDirection direction) | |
864 | { | |
865 | - GtkStyleContext* style; | |
866 | - | |
867 | ensure_progress_widget(); | |
868 | - gtk_widget_set_direction(gProgressWidget, direction); | |
869 | + gtk_widget_set_direction(gProgressBar.widget, direction); | |
870 | ||
871 | - style = gtk_widget_get_style_context(gProgressWidget); | |
872 | - gtk_style_context_save(style); | |
873 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH); | |
874 | - | |
875 | - gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); | |
876 | - gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); | |
877 | - gtk_style_context_restore(style); | |
878 | + gtk_render_background(gProgressBar.progress.styleTrough, cr, | |
879 | + rect->x, rect->y, rect->width, rect->height); | |
880 | + gtk_render_frame(gProgressBar.progress.styleTrough, cr, | |
881 | + rect->x, rect->y, rect->width, rect->height); | |
882 | ||
883 | return MOZ_GTK_SUCCESS; | |
884 | } | |
3de22d0e | 885 | @@ -2027,15 +2214,8 @@ moz_gtk_progress_chunk_paint(cairo_t *cr |
f0a96e4f JR |
886 | GtkTextDirection direction, |
887 | GtkThemeWidgetType widget) | |
888 | { | |
889 | - GtkStyleContext* style; | |
890 | - | |
891 | ensure_progress_widget(); | |
892 | - gtk_widget_set_direction(gProgressWidget, direction); | |
893 | - | |
894 | - style = gtk_widget_get_style_context(gProgressWidget); | |
895 | - gtk_style_context_save(style); | |
896 | - gtk_style_context_remove_class(style, GTK_STYLE_CLASS_TROUGH); | |
897 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_PROGRESSBAR); | |
898 | + gtk_widget_set_direction(gProgressBar.widget, direction); | |
899 | ||
900 | if (widget == MOZ_GTK_PROGRESS_CHUNK_INDETERMINATE || | |
901 | widget == MOZ_GTK_PROGRESS_CHUNK_VERTICAL_INDETERMINATE) { | |
3de22d0e | 902 | @@ -2074,12 +2254,14 @@ moz_gtk_progress_chunk_paint(cairo_t *cr |
f0a96e4f JR |
903 | // gtk_render_activity was used to render progress chunks on GTK versions |
904 | // before 3.13.7, see bug 1173907. | |
905 | if (!gtk_check_version(3, 13, 7)) { | |
906 | - gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); | |
907 | - gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); | |
908 | + gtk_render_background(gProgressBar.progress.styleProgress, cr, | |
909 | + rect->x, rect->y, rect->width, rect->height); | |
910 | + gtk_render_frame(gProgressBar.progress.styleProgress, cr, | |
911 | + rect->x, rect->y, rect->width, rect->height); | |
912 | } else { | |
913 | - gtk_render_activity(style, cr, rect->x, rect->y, rect->width, rect->height); | |
914 | + gtk_render_activity(gProgressBar.progress.styleProgress, cr, | |
915 | + rect->x, rect->y, rect->width, rect->height); | |
916 | } | |
917 | - gtk_style_context_restore(style); | |
918 | ||
919 | return MOZ_GTK_SUCCESS; | |
920 | } | |
3de22d0e | 921 | @@ -2096,7 +2278,7 @@ moz_gtk_get_tab_thickness(void) |
f0a96e4f JR |
922 | |
923 | style = gtk_widget_get_style_context(gTabWidget); | |
924 | gtk_style_context_add_class(style, GTK_STYLE_CLASS_NOTEBOOK); | |
925 | - gtk_style_context_get_border(style, 0, &border); | |
926 | + gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); | |
927 | ||
928 | if (border.top < 2) | |
929 | return 2; /* some themes don't set ythickness correctly */ | |
3de22d0e | 930 | @@ -2292,7 +2474,7 @@ moz_gtk_tab_paint(cairo_t *cr, GdkRectan |
f0a96e4f JR |
931 | gtk_style_context_save(style); |
932 | moz_gtk_tab_prepare_style_context(style, flags); | |
933 | ||
934 | - gtk_style_context_get_padding(style, GetStateFlagsFromGtkWidgetState(state), &padding); | |
935 | + moz_gtk_get_style_padding(style, GetStateFlagsFromGtkWidgetState(state), &padding); | |
936 | ||
937 | focusRect.x += padding.left; | |
938 | focusRect.width -= (padding.left + padding.right); | |
3de22d0e | 939 | @@ -2408,7 +2590,7 @@ moz_gtk_tab_scroll_arrow_paint(cairo_t * |
f0a96e4f JR |
940 | } |
941 | ||
942 | static gint | |
943 | -moz_gtk_menu_bar_paint(cairo_t *cr, GdkRectangle* rect, | |
944 | +moz_gtk_menu_bar_paint(cairo_t *cr, GdkRectangle* rect, GtkWidgetState* state, | |
945 | GtkTextDirection direction) | |
946 | { | |
947 | GtkStyleContext* style; | |
3de22d0e | 948 | @@ -2468,7 +2650,7 @@ moz_gtk_menu_separator_paint(cairo_t *cr |
f0a96e4f JR |
949 | border_width = gtk_container_get_border_width(GTK_CONTAINER(gMenuSeparatorWidget)); |
950 | ||
951 | style = gtk_widget_get_style_context(gMenuSeparatorWidget); | |
952 | - gtk_style_context_get_padding(style, 0, &padding); | |
953 | + gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); | |
954 | ||
955 | x = rect->x + border_width; | |
956 | y = rect->y + border_width; | |
3de22d0e | 957 | @@ -2521,7 +2703,8 @@ moz_gtk_menu_item_paint(cairo_t *cr, Gdk |
f0a96e4f JR |
958 | item_widget = gMenuItemWidget; |
959 | } | |
960 | style = gtk_widget_get_style_context(item_widget); | |
961 | - gtk_style_context_save(style); | |
962 | +// TODO - FIX! | |
963 | +// gtk_style_context_save(style); | |
964 | ||
965 | if (flags & MOZ_TOPLEVEL_MENU_ITEM) { | |
966 | gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUBAR); | |
3de22d0e | 967 | @@ -2540,7 +2723,7 @@ moz_gtk_menu_item_paint(cairo_t *cr, Gdk |
f0a96e4f JR |
968 | |
969 | gtk_render_background(style, cr, x, y, w, h); | |
970 | gtk_render_frame(style, cr, x, y, w, h); | |
971 | - gtk_style_context_restore(style); | |
972 | +// gtk_style_context_restore(style); | |
973 | } | |
974 | ||
975 | return MOZ_GTK_SUCCESS; | |
3de22d0e | 976 | @@ -2556,7 +2739,10 @@ moz_gtk_menu_arrow_paint(cairo_t *cr, Gd |
f0a96e4f JR |
977 | |
978 | ensure_menu_item_widget(); | |
979 | gtk_widget_set_direction(gMenuItemWidget, direction); | |
980 | - | |
981 | +/* | |
982 | + state_flags |= (direction == GTK_TEXT_DIR_LTR) ? GTK_STATE_FLAG_DIR_LTR : | |
983 | + GTK_STATE_FLAG_DIR_RTL; | |
984 | +*/ | |
985 | style = gtk_widget_get_style_context(gMenuItemWidget); | |
986 | gtk_style_context_save(style); | |
987 | gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUITEM); | |
3de22d0e | 988 | @@ -2606,7 +2792,7 @@ moz_gtk_check_menu_item_paint(cairo_t *c |
f0a96e4f JR |
989 | } |
990 | ||
991 | gtk_style_context_set_state(style, state_flags); | |
992 | - gtk_style_context_get_padding(style, state_flags, &padding); | |
993 | + moz_gtk_get_style_padding(style, state_flags, &padding); | |
994 | ||
995 | offset = gtk_container_get_border_width(GTK_CONTAINER(gCheckMenuItemWidget)) + | |
996 | padding.left + 2; | |
3de22d0e | 997 | @@ -2658,7 +2844,7 @@ moz_gtk_add_style_border(GtkStyleContext |
f0a96e4f JR |
998 | { |
999 | GtkBorder border; | |
1000 | ||
1001 | - gtk_style_context_get_border(style, 0, &border); | |
1002 | + gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); | |
1003 | ||
1004 | *left += border.left; | |
1005 | *right += border.right; | |
3de22d0e | 1006 | @@ -2667,12 +2853,22 @@ moz_gtk_add_style_border(GtkStyleContext |
f0a96e4f JR |
1007 | } |
1008 | ||
1009 | static void | |
1010 | +moz_gtk_get_style_border(GtkStyleContext* style, GtkStateFlags state_flags, | |
1011 | + GtkBorder *border) | |
1012 | +{ | |
1013 | + gtk_style_context_save(style); | |
1014 | + gtk_style_context_set_state(style, state_flags); | |
1015 | + gtk_style_context_get_border(style, gtk_style_context_get_state(style), border); | |
1016 | + gtk_style_context_restore(style); | |
1017 | +} | |
1018 | + | |
1019 | +static void | |
1020 | moz_gtk_add_style_padding(GtkStyleContext* style, | |
1021 | gint* left, gint* top, gint* right, gint* bottom) | |
1022 | { | |
1023 | GtkBorder padding; | |
1024 | ||
1025 | - gtk_style_context_get_padding(style, 0, &padding); | |
1026 | + gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); | |
1027 | ||
1028 | *left += padding.left; | |
1029 | *right += padding.right; | |
3de22d0e | 1030 | @@ -2680,6 +2876,16 @@ moz_gtk_add_style_padding(GtkStyleContex |
f0a96e4f JR |
1031 | *bottom += padding.bottom; |
1032 | } | |
1033 | ||
1034 | +static void | |
1035 | +moz_gtk_get_style_padding(GtkStyleContext* style, GtkStateFlags state_flags, | |
1036 | + GtkBorder *padding) | |
1037 | +{ | |
1038 | + gtk_style_context_save(style); | |
1039 | + gtk_style_context_set_state(style, state_flags); | |
1040 | + gtk_style_context_get_padding(style, gtk_style_context_get_state(style), padding); | |
1041 | + gtk_style_context_restore(style); | |
1042 | +} | |
1043 | + | |
1044 | gint | |
1045 | moz_gtk_get_widget_border(GtkThemeWidgetType widget, gint* left, gint* top, | |
1046 | gint* right, gint* bottom, GtkTextDirection direction, | |
3de22d0e | 1047 | @@ -2694,37 +2900,35 @@ moz_gtk_get_widget_border(GtkThemeWidget |
f0a96e4f JR |
1048 | case MOZ_GTK_TOOLBAR_BUTTON: |
1049 | { | |
1050 | ensure_button_widget(); | |
1051 | - style = gtk_widget_get_style_context(gButtonWidget); | |
1052 | - | |
1053 | - *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(gButtonWidget)); | |
1054 | ||
1055 | - if (widget == MOZ_GTK_TOOLBAR_BUTTON) { | |
1056 | - gtk_style_context_save(style); | |
1057 | - gtk_style_context_add_class(style, "image-button"); | |
1058 | - } | |
1059 | - | |
1060 | - moz_gtk_add_style_padding(style, left, top, right, bottom); | |
1061 | - | |
1062 | - if (widget == MOZ_GTK_TOOLBAR_BUTTON) | |
1063 | - gtk_style_context_restore(style); | |
1064 | + *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(gButton.widget)); | |
1065 | + moz_gtk_add_style_padding(gButton.button.style, left, top, right, bottom); | |
1066 | ||
1067 | // XXX: Subtract 1 pixel from the border to account for the added | |
1068 | // -moz-focus-inner border (Bug 1228281). | |
1069 | *left -= 1; *top -= 1; *right -= 1; *bottom -= 1; | |
1070 | - moz_gtk_add_style_border(style, left, top, right, bottom); | |
1071 | + moz_gtk_add_style_border(gButton.button.style, left, top, right, bottom); | |
1072 | + | |
1073 | return MOZ_GTK_SUCCESS; | |
1074 | } | |
1075 | case MOZ_GTK_ENTRY: | |
1076 | { | |
1077 | ensure_entry_widget(); | |
1078 | - style = gtk_widget_get_style_context(gEntryWidget); | |
1079 | ||
1080 | // XXX: Subtract 1 pixel from the padding to account for the default | |
1081 | // padding in forms.css. See bug 1187385. | |
1082 | *left = *top = *right = *bottom = -1; | |
1083 | - moz_gtk_add_style_padding(style, left, top, right, bottom); | |
1084 | - moz_gtk_add_style_border(style, left, top, right, bottom); | |
1085 | ||
1086 | + moz_gtk_add_style_padding(gEntry.entry.style, left, top, right, bottom); | |
1087 | + moz_gtk_add_style_border(gEntry.entry.style, left, top, right, bottom); | |
1088 | + | |
1089 | + return MOZ_GTK_SUCCESS; | |
1090 | + } | |
1091 | + case MOZ_GTK_TOOLTIP: | |
1092 | + { | |
1093 | + ensure_tooltip_widget(); | |
3de22d0e JR |
1094 | + moz_gtk_add_style_padding(gTooltip.tooltip.style, left, top, right, bottom); |
1095 | + moz_gtk_add_style_border(gTooltip.tooltip.style, left, top, right, bottom); | |
f0a96e4f JR |
1096 | return MOZ_GTK_SUCCESS; |
1097 | } | |
1098 | case MOZ_GTK_TREEVIEW: | |
3de22d0e | 1099 | @@ -2759,7 +2963,7 @@ moz_gtk_get_widget_border(GtkThemeWidget |
f0a96e4f JR |
1100 | break; |
1101 | case MOZ_GTK_DROPDOWN_ENTRY: | |
1102 | ensure_combo_box_entry_widgets(); | |
1103 | - w = gComboBoxEntryTextareaWidget; | |
1104 | + w = gComboBoxEntryTextarea.widget; | |
1105 | break; | |
1106 | case MOZ_GTK_DROPDOWN_ARROW: | |
1107 | ensure_combo_box_entry_widgets(); | |
3de22d0e | 1108 | @@ -2795,7 +2999,7 @@ moz_gtk_get_widget_border(GtkThemeWidget |
f0a96e4f JR |
1109 | |
1110 | if (!wide_separators) { | |
1111 | style = gtk_widget_get_style_context(gComboBoxSeparatorWidget); | |
1112 | - gtk_style_context_get_border(style, 0, &border); | |
1113 | + gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); | |
1114 | separator_width = border.left; | |
1115 | } | |
1116 | } | |
3de22d0e | 1117 | @@ -2814,14 +3018,17 @@ moz_gtk_get_widget_border(GtkThemeWidget |
f0a96e4f JR |
1118 | w = gTabWidget; |
1119 | break; | |
1120 | case MOZ_GTK_PROGRESSBAR: | |
1121 | - ensure_progress_widget(); | |
1122 | - w = gProgressWidget; | |
1123 | - break; | |
1124 | + { | |
1125 | + ensure_progress_widget(); | |
1126 | + moz_gtk_add_style_border(gProgressBar.progress.styleTrough, | |
1127 | + left, top, right, bottom); | |
1128 | + return MOZ_GTK_SUCCESS; | |
1129 | + } | |
1130 | case MOZ_GTK_SPINBUTTON_ENTRY: | |
1131 | case MOZ_GTK_SPINBUTTON_UP: | |
1132 | case MOZ_GTK_SPINBUTTON_DOWN: | |
1133 | ensure_spin_widget(); | |
1134 | - w = gSpinWidget; | |
1135 | + w = gSpin.widget; | |
1136 | break; | |
1137 | case MOZ_GTK_SCALE_HORIZONTAL: | |
1138 | ensure_scale_widget(); | |
3de22d0e | 1139 | @@ -2840,12 +3047,13 @@ moz_gtk_get_widget_border(GtkThemeWidget |
f0a96e4f JR |
1140 | { |
1141 | if (widget == MOZ_GTK_CHECKBUTTON_CONTAINER) { | |
1142 | ensure_checkbox_widget(); | |
1143 | - w = gCheckboxWidget; | |
1144 | + w = gCheckbox.widget; | |
1145 | + style = gCheckbox.check.styleCheck; | |
1146 | } else { | |
1147 | ensure_radiobutton_widget(); | |
1148 | - w = gRadiobuttonWidget; | |
1149 | + w = gRadiobutton.widget; | |
1150 | + style = gRadiobutton.check.styleCheck; | |
1151 | } | |
1152 | - style = gtk_widget_get_style_context(w); | |
1153 | ||
1154 | *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(w)); | |
1155 | moz_gtk_add_style_border(style, | |
3de22d0e | 1156 | @@ -2904,7 +3112,6 @@ moz_gtk_get_widget_border(GtkThemeWidget |
f0a96e4f JR |
1157 | case MOZ_GTK_MENUSEPARATOR: |
1158 | /* These widgets have no borders.*/ | |
1159 | case MOZ_GTK_SPINBUTTON: | |
1160 | - case MOZ_GTK_TOOLTIP: | |
1161 | case MOZ_GTK_WINDOW: | |
1162 | case MOZ_GTK_RESIZER: | |
1163 | case MOZ_GTK_MENUARROW: | |
3de22d0e | 1164 | @@ -2978,6 +3185,32 @@ moz_gtk_get_combo_box_entry_button_size( |
f0a96e4f JR |
1165 | } |
1166 | ||
1167 | gint | |
1168 | +moz_gtk_get_entry_height(gint* height) | |
1169 | +{ | |
1170 | + GtkRequisition requisition; | |
1171 | + ensure_entry_widget(); | |
1172 | + | |
1173 | + gtk_widget_get_preferred_size(gEntry.widget, NULL, &requisition); | |
1174 | + *height = requisition.height; | |
1175 | + | |
1176 | + return MOZ_GTK_SUCCESS; | |
1177 | +} | |
1178 | + | |
1179 | + | |
1180 | +gint | |
1181 | +moz_gtk_get_button_height(gint* height) | |
1182 | +{ | |
1183 | + GtkRequisition requisition; | |
1184 | + ensure_entry_widget(); | |
1185 | + | |
1186 | + gtk_widget_get_preferred_size(gButton.widget, NULL, &requisition); | |
1187 | + *height = requisition.height; | |
1188 | + | |
1189 | + return MOZ_GTK_SUCCESS; | |
1190 | +} | |
1191 | + | |
1192 | + | |
1193 | +gint | |
1194 | moz_gtk_get_tab_scroll_arrow_size(gint* width, gint* height) | |
1195 | { | |
1196 | gint arrow_size; | |
3de22d0e | 1197 | @@ -3030,7 +3263,7 @@ moz_gtk_get_toolbar_separator_width(gint |
f0a96e4f JR |
1198 | "separator-width", &separator_width, |
1199 | NULL); | |
1200 | /* Just in case... */ | |
1201 | - gtk_style_context_get_border(style, 0, &border); | |
1202 | + gtk_style_context_get_border(style, gtk_style_context_get_state(style), &border); | |
1203 | *size = MAX(*size, (wide_separators ? separator_width : border.left)); | |
1204 | return MOZ_GTK_SUCCESS; | |
1205 | } | |
3de22d0e | 1206 | @@ -3072,7 +3305,7 @@ moz_gtk_get_menu_separator_height(gint * |
f0a96e4f JR |
1207 | border_width = gtk_container_get_border_width(GTK_CONTAINER(gMenuSeparatorWidget)); |
1208 | ||
1209 | style = gtk_widget_get_style_context(gMenuSeparatorWidget); | |
1210 | - gtk_style_context_get_padding(style, 0, &padding); | |
1211 | + gtk_style_context_get_padding(style, gtk_style_context_get_state(style), &padding); | |
1212 | ||
1213 | gtk_style_context_save(style); | |
1214 | gtk_style_context_add_class(style, GTK_STYLE_CLASS_SEPARATOR); | |
3de22d0e | 1215 | @@ -3130,15 +3363,21 @@ moz_gtk_get_scrollbar_metrics(MozGtkScro |
f0a96e4f JR |
1216 | { |
1217 | ensure_scrollbar_widget(); | |
1218 | ||
1219 | - gtk_widget_style_get (gHorizScrollbarWidget, | |
1220 | + gtk_widget_style_get (gHorizScrollbar.widget, | |
1221 | "slider_width", &metrics->slider_width, | |
1222 | "trough_border", &metrics->trough_border, | |
1223 | "stepper_size", &metrics->stepper_size, | |
1224 | "stepper_spacing", &metrics->stepper_spacing, | |
1225 | NULL); | |
1226 | ||
1227 | - metrics->min_slider_size = | |
1228 | - gtk_range_get_min_slider_size(GTK_RANGE(gHorizScrollbarWidget)); | |
1229 | + if (!gtk_check_version(3,19,7)) { | |
1230 | + gtk_style_context_get(gVertScrollbar.scroll.styleSlider, | |
1231 | + gtk_style_context_get_state(gVertScrollbar.scroll.styleSlider), | |
1232 | + "min-height", &metrics->min_slider_size, NULL); | |
1233 | + } else { | |
1234 | + metrics->min_slider_size = | |
1235 | + gtk_range_get_min_slider_size(GTK_RANGE(gVertScrollbar.widget)); | |
1236 | + } | |
1237 | ||
1238 | return MOZ_GTK_SUCCESS; | |
1239 | } | |
3de22d0e | 1240 | @@ -3163,7 +3402,7 @@ moz_gtk_images_in_buttons() |
f0a96e4f JR |
1241 | GtkSettings* settings; |
1242 | ||
1243 | ensure_button_widget(); | |
1244 | - settings = gtk_widget_get_settings(gButtonWidget); | |
1245 | + settings = gtk_widget_get_settings(gButton.widget); | |
1246 | ||
1247 | g_object_get(settings, "gtk-button-images", &result, NULL); | |
1248 | return result; | |
3de22d0e | 1249 | @@ -3191,7 +3430,7 @@ moz_gtk_widget_paint(GtkThemeWidgetType |
f0a96e4f JR |
1250 | } |
1251 | ensure_button_widget(); | |
1252 | return moz_gtk_button_paint(cr, rect, state, | |
1253 | - (GtkReliefStyle) flags, gButtonWidget, | |
1254 | + (GtkReliefStyle) flags, gButton.widget, | |
1255 | direction); | |
1256 | break; | |
1257 | case MOZ_GTK_CHECKBUTTON: | |
3de22d0e | 1258 | @@ -3241,7 +3480,7 @@ moz_gtk_widget_paint(GtkThemeWidgetType |
f0a96e4f JR |
1259 | case MOZ_GTK_SPINBUTTON_ENTRY: |
1260 | ensure_spin_widget(); | |
1261 | return moz_gtk_entry_paint(cr, rect, state, | |
1262 | - gSpinWidget, direction); | |
1263 | + &gSpin, direction); | |
1264 | break; | |
1265 | case MOZ_GTK_GRIPPER: | |
1266 | return moz_gtk_gripper_paint(cr, rect, state, | |
3de22d0e | 1267 | @@ -3268,7 +3507,7 @@ moz_gtk_widget_paint(GtkThemeWidgetType |
f0a96e4f JR |
1268 | case MOZ_GTK_ENTRY: |
1269 | ensure_entry_widget(); | |
1270 | return moz_gtk_entry_paint(cr, rect, state, | |
1271 | - gEntryWidget, direction); | |
1272 | + &gEntry, direction); | |
1273 | break; | |
1274 | case MOZ_GTK_DROPDOWN: | |
1275 | return moz_gtk_combo_box_paint(cr, rect, state, direction); | |
3de22d0e | 1276 | @@ -3280,7 +3519,7 @@ moz_gtk_widget_paint(GtkThemeWidgetType |
f0a96e4f JR |
1277 | case MOZ_GTK_DROPDOWN_ENTRY: |
1278 | ensure_combo_box_entry_widgets(); | |
1279 | return moz_gtk_entry_paint(cr, rect, state, | |
1280 | - gComboBoxEntryTextareaWidget, direction); | |
1281 | + &gComboBoxEntryTextarea, direction); | |
1282 | break; | |
1283 | case MOZ_GTK_CHECKBUTTON_CONTAINER: | |
1284 | case MOZ_GTK_RADIOBUTTON_CONTAINER: | |
3de22d0e | 1285 | @@ -3332,7 +3571,7 @@ moz_gtk_widget_paint(GtkThemeWidgetType |
f0a96e4f JR |
1286 | (GtkArrowType) flags, direction); |
1287 | break; | |
1288 | case MOZ_GTK_MENUBAR: | |
1289 | - return moz_gtk_menu_bar_paint(cr, rect, direction); | |
1290 | + return moz_gtk_menu_bar_paint(cr, rect, state, direction); | |
1291 | break; | |
1292 | case MOZ_GTK_MENUPOPUP: | |
1293 | return moz_gtk_menu_popup_paint(cr, rect, direction); | |
3de22d0e | 1294 | @@ -3383,7 +3622,7 @@ GtkWidget* moz_gtk_get_scrollbar_widget( |
f0a96e4f JR |
1295 | { |
1296 | MOZ_ASSERT(is_initialized, "Forgot to call moz_gtk_init()"); | |
1297 | ensure_scrollbar_widget(); | |
1298 | - return gHorizScrollbarWidget; | |
1299 | + return gVertScrollbar.widget; | |
1300 | } | |
1301 | ||
1302 | gboolean moz_gtk_has_scrollbar_buttons(void) | |
3de22d0e | 1303 | @@ -3391,7 +3630,7 @@ gboolean moz_gtk_has_scrollbar_buttons(v |
f0a96e4f JR |
1304 | gboolean backward, forward, secondary_backward, secondary_forward; |
1305 | MOZ_ASSERT(is_initialized, "Forgot to call moz_gtk_init()"); | |
1306 | ensure_scrollbar_widget(); | |
1307 | - gtk_widget_style_get (gHorizScrollbarWidget, | |
1308 | + gtk_widget_style_get (gHorizScrollbar.widget, | |
1309 | "has-backward-stepper", &backward, | |
1310 | "has-forward-stepper", &forward, | |
1311 | "has-secondary-backward-stepper", &secondary_backward, | |
3de22d0e | 1312 | @@ -3403,8 +3642,8 @@ gboolean moz_gtk_has_scrollbar_buttons(v |
f0a96e4f JR |
1313 | gint |
1314 | moz_gtk_shutdown() | |
1315 | { | |
1316 | - if (gTooltipWidget) | |
1317 | - gtk_widget_destroy(gTooltipWidget); | |
1318 | + moz_gtk_widget_free(&gTooltip); | |
1319 | + | |
1320 | /* This will destroy all of our widgets */ | |
1321 | if (gProtoWindow) | |
1322 | gtk_widget_destroy(gProtoWindow); | |
3de22d0e | 1323 | @@ -3415,17 +3654,19 @@ moz_gtk_shutdown() |
f0a96e4f JR |
1324 | |
1325 | gProtoWindow = NULL; | |
1326 | gProtoLayout = NULL; | |
1327 | - gButtonWidget = NULL; | |
1328 | + | |
1329 | + // MozWidgets | |
1330 | + moz_gtk_widget_free(&gButton); | |
1331 | gToggleButtonWidget = NULL; | |
1332 | gButtonArrowWidget = NULL; | |
1333 | - gCheckboxWidget = NULL; | |
1334 | - gRadiobuttonWidget = NULL; | |
1335 | - gHorizScrollbarWidget = NULL; | |
1336 | - gVertScrollbarWidget = NULL; | |
1337 | - gSpinWidget = NULL; | |
1338 | + moz_gtk_widget_free(&gCheckbox); | |
1339 | + moz_gtk_widget_free(&gRadiobutton); | |
1340 | + moz_gtk_widget_free(&gHorizScrollbar); | |
1341 | + moz_gtk_widget_free(&gVertScrollbar); | |
1342 | + moz_gtk_widget_free(&gSpin); | |
1343 | gHScaleWidget = NULL; | |
1344 | gVScaleWidget = NULL; | |
1345 | - gEntryWidget = NULL; | |
1346 | + moz_gtk_widget_free(&gEntry); | |
1347 | gComboBoxWidget = NULL; | |
1348 | gComboBoxButtonWidget = NULL; | |
1349 | gComboBoxSeparatorWidget = NULL; | |
3de22d0e | 1350 | @@ -3433,14 +3674,13 @@ moz_gtk_shutdown() |
f0a96e4f JR |
1351 | gComboBoxEntryWidget = NULL; |
1352 | gComboBoxEntryButtonWidget = NULL; | |
1353 | gComboBoxEntryArrowWidget = NULL; | |
1354 | - gComboBoxEntryTextareaWidget = NULL; | |
1355 | + moz_gtk_widget_free(&gComboBoxEntryTextarea); | |
1356 | gHandleBoxWidget = NULL; | |
1357 | gToolbarWidget = NULL; | |
1358 | gStatusbarWidget = NULL; | |
1359 | gFrameWidget = NULL; | |
1360 | - gProgressWidget = NULL; | |
1361 | + moz_gtk_widget_free(&gProgressBar); | |
1362 | gTabWidget = NULL; | |
1363 | - gTooltipWidget = NULL; | |
1364 | gMenuBarWidget = NULL; | |
1365 | gMenuBarItemWidget = NULL; | |
1366 | gMenuPopupWidget = NULL; | |
3de22d0e JR |
1367 | diff -up firefox-47.0/widget/gtk/gtkdrawing.h.gtk3-20 firefox-47.0/widget/gtk/gtkdrawing.h |
1368 | --- firefox-47.0/widget/gtk/gtkdrawing.h.gtk3-20 2016-05-12 19:13:34.000000000 +0200 | |
1369 | +++ firefox-47.0/widget/gtk/gtkdrawing.h 2016-06-23 10:21:37.072462099 +0200 | |
f0a96e4f JR |
1370 | @@ -67,6 +67,13 @@ typedef enum { |
1371 | MOZ_GTK_TAB_SELECTED = 1 << 10 | |
1372 | } GtkTabFlags; | |
1373 | ||
1374 | +typedef struct { | |
1375 | + GType type; | |
1376 | + const gchar *name; | |
1377 | + const gchar *class1; | |
1378 | + const gchar *class2; | |
1379 | +} GtkCssNode; | |
1380 | + | |
1381 | /** flags for menuitems **/ | |
1382 | typedef enum { | |
1383 | /* menuitem is part of the menubar */ | |
1384 | @@ -396,6 +403,9 @@ void | |
1385 | moz_gtk_get_arrow_size(GtkThemeWidgetType widgetType, | |
1386 | gint* width, gint* height); | |
1387 | ||
1388 | +gint moz_gtk_get_entry_height(gint* height); | |
1389 | +gint moz_gtk_get_button_height(gint* height); | |
1390 | + | |
1391 | /** | |
1392 | * Get the desired size of a toolbar separator | |
1393 | * size: [OUT] the desired width | |
1394 | @@ -466,6 +476,12 @@ gboolean moz_gtk_images_in_buttons(void) | |
1395 | */ | |
1396 | gboolean moz_gtk_has_scrollbar_buttons(void); | |
1397 | ||
1398 | + | |
1399 | +GtkStyleContext * | |
1400 | +moz_gtk_style_create(GtkCssNode *node, GtkStyleContext *parent); | |
1401 | + | |
1402 | + | |
1403 | + | |
1404 | #ifdef __cplusplus | |
1405 | } | |
1406 | #endif /* __cplusplus */ | |
3de22d0e JR |
1407 | diff -up firefox-47.0/widget/gtk/mozgtk/mozgtk.c.gtk3-20 firefox-47.0/widget/gtk/mozgtk/mozgtk.c |
1408 | --- firefox-47.0/widget/gtk/mozgtk/mozgtk.c.gtk3-20 2016-05-12 19:13:34.000000000 +0200 | |
1409 | +++ firefox-47.0/widget/gtk/mozgtk/mozgtk.c 2016-06-23 10:26:36.495774041 +0200 | |
1410 | @@ -504,9 +504,15 @@ STUB(gtk_window_set_type_hint) | |
f0a96e4f JR |
1411 | STUB(gtk_window_set_wmclass) |
1412 | STUB(gtk_window_unfullscreen) | |
1413 | STUB(gtk_window_unmaximize) | |
1414 | +STUB(gtk_widget_get_preferred_height_and_baseline_for_width) | |
1415 | +STUB(gtk_entry_get_text_area) | |
1416 | +STUB(gtk_check_menu_item_get_type) | |
1417 | +STUB(gtk_spin_button_get_type) | |
1418 | +STUB(gtk_button_get_type) | |
1419 | #endif | |
1420 | ||
1421 | #ifdef GTK3_SYMBOLS | |
3de22d0e JR |
1422 | +STUB(gtk_box_new) |
1423 | STUB(gdk_device_get_source) | |
1424 | STUB(gdk_device_manager_get_client_pointer) | |
1425 | STUB(gdk_disable_multidevice) | |
1426 | @@ -581,6 +587,15 @@ STUB(gtk_color_chooser_get_type) | |
f0a96e4f JR |
1427 | STUB(gtk_color_chooser_set_rgba) |
1428 | STUB(gtk_color_chooser_get_rgba) | |
1429 | STUB(gtk_color_chooser_set_use_alpha) | |
1430 | +STUB(gtk_style_context_get_path) | |
3de22d0e | 1431 | +STUB(gtk_widget_path_append_for_widget) |
f0a96e4f JR |
1432 | +STUB(gtk_widget_path_copy) |
1433 | +STUB(gtk_widget_path_iter_set_object_name) | |
1434 | +STUB(gtk_widget_path_iter_add_class) | |
1435 | +STUB(gtk_widget_path_iter_get_state) | |
1436 | +STUB(gtk_style_context_set_parent) | |
1437 | +STUB(gtk_widget_path_unref) | |
1438 | +STUB(gtk_tooltip_get_type) | |
1439 | #endif | |
1440 | ||
1441 | #ifdef GTK2_SYMBOLS | |
3de22d0e JR |
1442 | diff -up firefox-47.0/widget/gtk/nsLookAndFeel.cpp.gtk3-20 firefox-47.0/widget/gtk/nsLookAndFeel.cpp |
1443 | --- firefox-47.0/widget/gtk/nsLookAndFeel.cpp.gtk3-20 2016-06-01 06:11:44.000000000 +0200 | |
1444 | +++ firefox-47.0/widget/gtk/nsLookAndFeel.cpp 2016-06-23 10:21:37.073462100 +0200 | |
f0a96e4f JR |
1445 | @@ -353,14 +353,18 @@ nsLookAndFeel::NativeGetColor(ColorID aI |
1446 | case eColorID_activeborder: | |
1447 | // active window border | |
1448 | gtk_style_context_get_border_color(mBackgroundStyle, | |
1449 | - GTK_STATE_FLAG_NORMAL, &gdk_color); | |
1450 | + gtk_style_context_get_state(mBackgroundStyle), | |
1451 | + &gdk_color); | |
1452 | aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); | |
1453 | break; | |
1454 | case eColorID_inactiveborder: | |
1455 | // inactive window border | |
1456 | + gtk_style_context_save(mBackgroundStyle); | |
1457 | + gtk_style_context_set_state(mBackgroundStyle, GTK_STATE_FLAG_INSENSITIVE); | |
1458 | gtk_style_context_get_border_color(mBackgroundStyle, | |
1459 | - GTK_STATE_FLAG_INSENSITIVE, | |
1460 | + gtk_style_context_get_state(mBackgroundStyle), | |
1461 | &gdk_color); | |
1462 | + gtk_style_context_restore(mBackgroundStyle); | |
1463 | aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); | |
1464 | break; | |
1465 | case eColorID_graytext: // disabled text in windows, menus, etc. | |
1466 | @@ -369,9 +373,12 @@ nsLookAndFeel::NativeGetColor(ColorID aI | |
1467 | break; | |
1468 | case eColorID_inactivecaption: | |
1469 | // inactive window caption | |
1470 | + gtk_style_context_save(mBackgroundStyle); | |
1471 | + gtk_style_context_set_state(mBackgroundStyle, GTK_STATE_FLAG_INSENSITIVE); | |
1472 | gtk_style_context_get_background_color(mBackgroundStyle, | |
1473 | - GTK_STATE_FLAG_INSENSITIVE, | |
1474 | + gtk_style_context_get_state(mBackgroundStyle), | |
1475 | &gdk_color); | |
1476 | + gtk_style_context_restore(mBackgroundStyle); | |
1477 | aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); | |
1478 | break; | |
1479 | #endif | |
1480 | @@ -497,13 +504,17 @@ nsLookAndFeel::NativeGetColor(ColorID aI | |
1481 | case eColorID__moz_buttondefault: | |
1482 | // default button border color | |
1483 | gtk_style_context_get_border_color(mButtonStyle, | |
1484 | - GTK_STATE_FLAG_NORMAL, &gdk_color); | |
1485 | + gtk_style_context_get_state(mButtonStyle), | |
1486 | + &gdk_color); | |
1487 | aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); | |
1488 | break; | |
1489 | case eColorID__moz_buttonhoverface: | |
1490 | + gtk_style_context_save(mButtonStyle); | |
1491 | + gtk_style_context_set_state(mButtonStyle, GTK_STATE_FLAG_PRELIGHT); | |
1492 | gtk_style_context_get_background_color(mButtonStyle, | |
1493 | - GTK_STATE_FLAG_PRELIGHT, | |
1494 | + gtk_style_context_get_state(mButtonStyle), | |
1495 | &gdk_color); | |
1496 | + gtk_style_context_restore(mButtonStyle); | |
1497 | aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); | |
1498 | break; | |
1499 | case eColorID__moz_buttonhovertext: | |
3de22d0e JR |
1500 | @@ -1019,6 +1030,29 @@ create_context(GtkWidgetPath *path) |
1501 | } | |
1502 | #endif | |
1503 | ||
1504 | +GtkStyleContext* | |
1505 | +CreateStyleForWidget(GtkWidget* aWidget, GtkStyleContext* aParentStyle) | |
1506 | +{ | |
1507 | + GtkWidgetPath* path = | |
1508 | + gtk_widget_path_copy(gtk_style_context_get_path(aParentStyle)); | |
1509 | + | |
1510 | + // Work around https://bugzilla.gnome.org/show_bug.cgi?id=767312 | |
1511 | + // which exists in GTK+ 3.20. | |
1512 | + gtk_widget_get_style_context(aWidget); | |
1513 | + | |
1514 | + gtk_widget_path_append_for_widget(path, aWidget); | |
1515 | + // Release any floating reference on aWidget. | |
1516 | + g_object_ref_sink(aWidget); | |
1517 | + g_object_unref(aWidget); | |
1518 | + | |
1519 | + GtkStyleContext *context = gtk_style_context_new(); | |
1520 | + gtk_style_context_set_path(context, path); | |
1521 | + gtk_style_context_set_parent(context, aParentStyle); | |
1522 | + gtk_widget_path_unref(path); | |
1523 | + | |
1524 | + return context; | |
1525 | +} | |
1526 | + | |
1527 | void | |
1528 | nsLookAndFeel::Init() | |
1529 | { | |
1530 | @@ -1122,26 +1156,36 @@ nsLookAndFeel::Init() | |
f0a96e4f JR |
1531 | style = create_context(path); |
1532 | gtk_style_context_add_class(style, GTK_STYLE_CLASS_SCROLLBAR); | |
1533 | gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH); | |
1534 | - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1535 | + gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); | |
1536 | sMozScrollbar = GDK_RGBA_TO_NS_RGBA(color); | |
1537 | g_object_unref(style); | |
1538 | ||
1539 | // Window colors | |
1540 | style = create_context(path); | |
1541 | - gtk_style_context_save(style); | |
1542 | gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND); | |
1543 | - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1544 | + gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); | |
1545 | sMozWindowBackground = GDK_RGBA_TO_NS_RGBA(color); | |
1546 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1547 | + gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); | |
1548 | sMozWindowText = GDK_RGBA_TO_NS_RGBA(color); | |
1549 | - gtk_style_context_restore(style); | |
1550 | + g_object_unref(style); | |
1551 | ||
1552 | // tooltip foreground and background | |
1553 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP); | |
3de22d0e JR |
1554 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND); |
1555 | - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
f0a96e4f | 1556 | + GtkCssNode tooltipPath[] = { |
3de22d0e | 1557 | + { GTK_TYPE_TOOLTIP, "tooltip", "background", NULL}, |
f0a96e4f JR |
1558 | + }; |
1559 | + style = moz_gtk_style_create(tooltipPath, NULL); | |
f0a96e4f JR |
1560 | + gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); |
1561 | sInfoBackground = GDK_RGBA_TO_NS_RGBA(color); | |
1562 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
3de22d0e JR |
1563 | + { |
1564 | + GtkStyleContext* boxStyle = | |
1565 | + CreateStyleForWidget(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0), | |
1566 | + style); | |
1567 | + GtkStyleContext* labelStyle = | |
1568 | + CreateStyleForWidget(gtk_label_new(nullptr), boxStyle); | |
1569 | + gtk_style_context_get_color(labelStyle, GTK_STATE_FLAG_NORMAL, &color); | |
1570 | + g_object_unref(labelStyle); | |
1571 | + g_object_unref(boxStyle); | |
1572 | + } | |
1573 | sInfoText = GDK_RGBA_TO_NS_RGBA(color); | |
f0a96e4f JR |
1574 | g_object_unref(style); |
1575 | ||
3de22d0e | 1576 | @@ -1156,20 +1200,26 @@ nsLookAndFeel::Init() |
f0a96e4f JR |
1577 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
1578 | ||
1579 | style = gtk_widget_get_style_context(accel_label); | |
1580 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1581 | + gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); | |
1582 | sMenuText = GDK_RGBA_TO_NS_RGBA(color); | |
1583 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_INSENSITIVE, &color); | |
1584 | + gtk_style_context_save(style); | |
1585 | + gtk_style_context_set_state(style, GTK_STATE_FLAG_INSENSITIVE); | |
1586 | + gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); | |
1587 | sMenuTextInactive = GDK_RGBA_TO_NS_RGBA(color); | |
1588 | + gtk_style_context_restore(style); | |
1589 | ||
1590 | style = gtk_widget_get_style_context(menu); | |
1591 | - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1592 | + gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); | |
1593 | sMenuBackground = GDK_RGBA_TO_NS_RGBA(color); | |
1594 | ||
1595 | style = gtk_widget_get_style_context(menuitem); | |
1596 | - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_PRELIGHT, &color); | |
1597 | + gtk_style_context_save(style); | |
1598 | + gtk_style_context_set_state(style, GTK_STATE_FLAG_PRELIGHT); | |
1599 | + gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); | |
1600 | sMenuHover = GDK_RGBA_TO_NS_RGBA(color); | |
1601 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); | |
1602 | + gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); | |
1603 | sMenuHoverText = GDK_RGBA_TO_NS_RGBA(color); | |
1604 | + gtk_style_context_restore(style); | |
1605 | ||
1606 | g_object_unref(menu); | |
1607 | #endif | |
3de22d0e | 1608 | @@ -1278,44 +1328,54 @@ nsLookAndFeel::Init() |
f0a96e4f JR |
1609 | GDK_COLOR_TO_NS_RGB(style->dark[GTK_STATE_NORMAL]); |
1610 | } | |
1611 | #else | |
1612 | + GtkCssNode labelPath[] = { | |
1613 | + { GTK_TYPE_LABEL, "label", "view", NULL }, | |
1614 | + { G_TYPE_NONE, "selection", NULL, NULL } | |
1615 | + }; | |
1616 | + | |
1617 | + GtkStyleContext *styleLabel; | |
1618 | + GtkStyleContext *styleSelection; | |
1619 | + GtkBorder padding; | |
1620 | + | |
1621 | // Text colors | |
1622 | - style = gtk_widget_get_style_context(textView); | |
1623 | - gtk_style_context_save(style); | |
1624 | - gtk_style_context_add_class(style, GTK_STYLE_CLASS_VIEW); | |
1625 | - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1626 | + styleLabel = moz_gtk_style_create(labelPath, NULL); | |
1627 | + styleSelection = moz_gtk_style_create(labelPath+1, styleLabel); | |
1628 | + | |
1629 | + gtk_style_context_get_background_color(styleLabel, gtk_style_context_get_state(styleLabel), &color); | |
1630 | sMozFieldBackground = GDK_RGBA_TO_NS_RGBA(color); | |
1631 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1632 | + gtk_style_context_get_color(styleLabel, gtk_style_context_get_state(styleLabel), &color); | |
1633 | sMozFieldText = GDK_RGBA_TO_NS_RGBA(color); | |
1634 | ||
1635 | // Selected text and background | |
1636 | - gtk_style_context_get_background_color(style, | |
1637 | - static_cast<GtkStateFlags>(GTK_STATE_FLAG_FOCUSED|GTK_STATE_FLAG_SELECTED), | |
1638 | - &color); | |
1639 | + gtk_style_context_get_background_color(styleSelection, gtk_style_context_get_state(styleSelection), &color); | |
1640 | sTextSelectedBackground = GDK_RGBA_TO_NS_RGBA(color); | |
1641 | - gtk_style_context_get_color(style, | |
1642 | - static_cast<GtkStateFlags>(GTK_STATE_FLAG_FOCUSED|GTK_STATE_FLAG_SELECTED), | |
1643 | - &color); | |
1644 | + gtk_style_context_get_color(styleSelection, gtk_style_context_get_state(styleSelection), &color); | |
1645 | sTextSelectedText = GDK_RGBA_TO_NS_RGBA(color); | |
1646 | - gtk_style_context_restore(style); | |
1647 | ||
1648 | // Button text, background, border | |
1649 | style = gtk_widget_get_style_context(label); | |
1650 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1651 | + gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); | |
1652 | sButtonText = GDK_RGBA_TO_NS_RGBA(color); | |
1653 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); | |
1654 | + gtk_style_context_save(style); | |
1655 | + gtk_style_context_set_state(style, GTK_STATE_FLAG_PRELIGHT); | |
1656 | + gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); | |
1657 | sButtonHoverText = GDK_RGBA_TO_NS_RGBA(color); | |
1658 | + gtk_style_context_restore(style); | |
1659 | ||
1660 | // Combobox text color | |
1661 | style = gtk_widget_get_style_context(comboboxLabel); | |
1662 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1663 | + gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); | |
1664 | sComboBoxText = GDK_RGBA_TO_NS_RGBA(color); | |
1665 | ||
1666 | // Menubar text and hover text colors | |
1667 | style = gtk_widget_get_style_context(menuBar); | |
1668 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1669 | + gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); | |
1670 | sMenuBarText = GDK_RGBA_TO_NS_RGBA(color); | |
1671 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); | |
1672 | + gtk_style_context_save(style); | |
1673 | + gtk_style_context_set_state(style, GTK_STATE_FLAG_PRELIGHT); | |
1674 | + gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); | |
1675 | sMenuBarHoverText = GDK_RGBA_TO_NS_RGBA(color); | |
1676 | + gtk_style_context_restore(style); | |
1677 | ||
1678 | // GTK's guide to fancy odd row background colors: | |
1679 | // 1) Check if a theme explicitly defines an odd row color | |
3de22d0e | 1680 | @@ -1328,7 +1388,7 @@ nsLookAndFeel::Init() |
f0a96e4f JR |
1681 | // Get odd row background color |
1682 | gtk_style_context_save(style); | |
1683 | gtk_style_context_add_region(style, GTK_STYLE_REGION_ROW, GTK_REGION_ODD); | |
1684 | - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1685 | + gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color); | |
1686 | sOddCellBackground = GDK_RGBA_TO_NS_RGBA(color); | |
1687 | gtk_style_context_restore(style); | |
1688 | ||
3de22d0e | 1689 | @@ -1346,9 +1406,11 @@ nsLookAndFeel::Init() |
f0a96e4f JR |
1690 | gtk_container_add(GTK_CONTAINER(parent), infoBar); |
1691 | gtk_container_add(GTK_CONTAINER(infoBarContent), infoBarLabel); | |
1692 | style = gtk_widget_get_style_context(infoBarLabel); | |
1693 | + gtk_style_context_save(style); | |
1694 | gtk_style_context_add_class(style, GTK_STYLE_CLASS_INFO); | |
1695 | - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); | |
1696 | + gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color); | |
1697 | sInfoBarText = GDK_RGBA_TO_NS_RGBA(color); | |
1698 | + gtk_style_context_restore(style); | |
1699 | #endif | |
1700 | // Some themes have a unified menu bar, and support window dragging on it | |
1701 | gboolean supports_menubar_drag = FALSE; | |
3de22d0e JR |
1702 | diff -up firefox-47.0/widget/gtk/nsNativeThemeGTK.cpp.gtk3-20 firefox-47.0/widget/gtk/nsNativeThemeGTK.cpp |
1703 | --- firefox-47.0/widget/gtk/nsNativeThemeGTK.cpp.gtk3-20 2016-06-01 06:11:44.000000000 +0200 | |
1704 | +++ firefox-47.0/widget/gtk/nsNativeThemeGTK.cpp 2016-06-23 10:21:37.074462101 +0200 | |
1705 | @@ -1570,9 +1570,6 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n | |
f0a96e4f JR |
1706 | case NS_THEME_RADIO_CONTAINER: |
1707 | case NS_THEME_CHECKBOX_LABEL: | |
1708 | case NS_THEME_RADIO_LABEL: | |
1709 | - case NS_THEME_BUTTON: | |
1710 | - case NS_THEME_DROPDOWN: | |
1711 | - case NS_THEME_TOOLBAR_BUTTON: | |
1712 | case NS_THEME_TREEVIEW_HEADER_CELL: | |
1713 | { | |
1714 | if (aWidgetType == NS_THEME_DROPDOWN) { | |
3de22d0e | 1715 | @@ -1591,6 +1588,21 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n |
f0a96e4f JR |
1716 | aResult->height += border.top + border.bottom; |
1717 | } | |
1718 | break; | |
1719 | + case NS_THEME_BUTTON: | |
1720 | + case NS_THEME_DROPDOWN: | |
1721 | + case NS_THEME_TOOLBAR_BUTTON: | |
1722 | + { | |
1723 | + moz_gtk_get_button_height(&aResult->height); | |
1724 | + } | |
1725 | + break; | |
1726 | + case NS_THEME_FOCUS_OUTLINE: | |
1727 | + case NS_THEME_NUMBER_INPUT: | |
1728 | + case NS_THEME_TEXTFIELD: | |
1729 | + case NS_THEME_TEXTFIELD_MULTILINE: | |
1730 | + { | |
1731 | + moz_gtk_get_entry_height(&aResult->height); | |
1732 | + } | |
1733 | + break; | |
1734 | case NS_THEME_TOOLBAR_SEPARATOR: | |
1735 | { | |
1736 | gint separator_width; |