firefox/firefox-gtk3-20.patch
2016-01-13 16:43:54 +01:00

835 lines
33 KiB
Diff

diff -up firefox-43.0.3/widget/gtk/gtk3drawing.c.gtk3-20 firefox-43.0.3/widget/gtk/gtk3drawing.c
--- firefox-43.0.3/widget/gtk/gtk3drawing.c.gtk3-20 2015-12-23 23:11:14.000000000 +0100
+++ firefox-43.0.3/widget/gtk/gtk3drawing.c 2016-01-13 16:40:37.940796568 +0100
@@ -17,15 +17,35 @@
#include <math.h>
+typedef struct {
+ GtkWidget* widget;
+ GtkStyleContext* styleScrollbar;
+ GtkStyleContext* styleTrough;
+ GtkStyleContext* styleSlider;
+} GtkWidgetScrollbar;
+
+typedef struct {
+ GtkWidget* widget;
+ GtkStyleContext* styleButton;
+ GtkStyleContext* styleCheck;
+ GtkStyleContext* styleLabel;
+} GtkWidgetToogleBox;
+
+typedef struct {
+ GtkWidget* widget;
+ GtkStyleContext* styleProgress;
+ GtkStyleContext* styleTrough;
+} GtkWidgetProgressBar;
+
static GtkWidget* gProtoWindow;
static GtkWidget* gProtoLayout;
static GtkWidget* gButtonWidget;
static GtkWidget* gToggleButtonWidget;
static GtkWidget* gButtonArrowWidget;
-static GtkWidget* gCheckboxWidget;
-static GtkWidget* gRadiobuttonWidget;
-static GtkWidget* gHorizScrollbarWidget;
-static GtkWidget* gVertScrollbarWidget;
+static GtkWidgetToogleBox gCheckbox;
+static GtkWidgetToogleBox gRadiobutton;
+static GtkWidgetScrollbar gVertScrollbar;
+static GtkWidgetScrollbar gHorizScrollbar;
static GtkWidget* gSpinWidget;
static GtkWidget* gHScaleWidget;
static GtkWidget* gVScaleWidget;
@@ -42,7 +62,7 @@ static GtkWidget* gHandleBoxWidget;
static GtkWidget* gToolbarWidget;
static GtkWidget* gFrameWidget;
static GtkWidget* gStatusbarWidget;
-static GtkWidget* gProgressWidget;
+static GtkWidgetProgressBar gProgressBar;
static GtkWidget* gTabWidget;
static GtkWidget* gTooltipWidget;
static GtkWidget* gMenuBarWidget;
@@ -97,6 +117,33 @@ GetStateFlagsFromGtkWidgetState(GtkWidge
return stateFlags;
}
+GtkStyleContext *
+moz_gtk_style_create(GtkCssNode *node, GtkStyleContext *parent)
+{
+ GtkWidgetPath *path;
+ GtkStyleContext *context;
+
+ if (parent)
+ path = gtk_widget_path_copy (gtk_style_context_get_path (parent));
+ else
+ path = gtk_widget_path_new ();
+
+ gtk_widget_path_append_type (path, node->type);
+ if (node->name)
+ gtk_widget_path_iter_set_object_name (path, -1, node->name);
+ if (node->class1)
+ gtk_widget_path_iter_add_class (path, -1, node->class1);
+ if (node->class2)
+ gtk_widget_path_iter_add_class (path, -1, node->class2);
+
+ context = gtk_style_context_new ();
+ gtk_style_context_set_path (context, path);
+ gtk_style_context_set_parent (context, parent);
+ gtk_widget_path_unref (path);
+
+ return context;
+}
+
/* Because we have such an unconventional way of drawing widgets, signal to the GTK theme engine
that they are drawing for Mozilla instead of a conventional GTK app so they can do any specific
things they may want to do. */
@@ -195,9 +242,21 @@ ensure_button_arrow_widget()
static gint
ensure_checkbox_widget()
{
- if (!gCheckboxWidget) {
- gCheckboxWidget = gtk_check_button_new_with_label("M");
- setup_widget_prototype(gCheckboxWidget);
+ if (!gCheckbox.widget) {
+ GtkCssNode path[] = {
+ { GTK_TYPE_LABEL, "checkbutton", NULL, NULL },
+ { G_TYPE_NONE, "check", NULL, NULL },
+ { G_TYPE_NONE, "label", NULL, NULL }
+ };
+
+ gCheckbox.widget = gtk_check_button_new_with_label("M");
+ setup_widget_prototype(gCheckbox.widget);
+
+ gCheckbox.styleButton = moz_gtk_style_create(&path[0], NULL);
+ gCheckbox.styleCheck = moz_gtk_style_create(&path[1],
+ gCheckbox.styleButton);
+ gCheckbox.styleLabel = moz_gtk_style_create(&path[2],
+ gCheckbox.styleButton);
}
return MOZ_GTK_SUCCESS;
}
@@ -205,9 +264,21 @@ ensure_checkbox_widget()
static gint
ensure_radiobutton_widget()
{
- if (!gRadiobuttonWidget) {
- gRadiobuttonWidget = gtk_radio_button_new_with_label(NULL, "M");
- setup_widget_prototype(gRadiobuttonWidget);
+ if (!gRadiobutton.widget) {
+ GtkCssNode path[] = {
+ { GTK_TYPE_LABEL, "radiobutton", NULL, NULL },
+ { G_TYPE_NONE, "radio", NULL, NULL },
+ { G_TYPE_NONE, "label", NULL, NULL }
+ };
+
+ gRadiobutton.widget = gtk_radio_button_new_with_label(NULL, "M");
+ setup_widget_prototype(gRadiobutton.widget);
+
+ gRadiobutton.styleButton = moz_gtk_style_create(&path[0], NULL);
+ gRadiobutton.styleCheck = moz_gtk_style_create(&path[1],
+ gRadiobutton.styleButton);
+ gRadiobutton.styleLabel = moz_gtk_style_create(&path[2],
+ gRadiobutton.styleButton);
}
return MOZ_GTK_SUCCESS;
}
@@ -215,13 +286,31 @@ ensure_radiobutton_widget()
static gint
ensure_scrollbar_widget()
{
- if (!gVertScrollbarWidget) {
- gVertScrollbarWidget = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, NULL);
- setup_widget_prototype(gVertScrollbarWidget);
- }
- if (!gHorizScrollbarWidget) {
- gHorizScrollbarWidget = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, NULL);
- setup_widget_prototype(gHorizScrollbarWidget);
+ if (!gVertScrollbar.widget && !gHorizScrollbar.widget) {
+ GtkCssNode path[] = {
+ { GTK_TYPE_SCROLLBAR, "scrollbar", "horizontal", NULL },
+ { GTK_TYPE_SCROLLBAR, "scrollbar", "vertical", NULL },
+ { G_TYPE_NONE, "trough", NULL, NULL },
+ { G_TYPE_NONE, "slider", NULL, NULL }
+ };
+
+ gVertScrollbar.widget = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, NULL);
+ setup_widget_prototype(gVertScrollbar.widget);
+
+ gVertScrollbar.styleScrollbar = moz_gtk_style_create(path+1, NULL);
+ gVertScrollbar.styleTrough = moz_gtk_style_create(path+2,
+ gVertScrollbar.styleScrollbar);
+ gVertScrollbar.styleSlider = moz_gtk_style_create(path+3,
+ gVertScrollbar.styleTrough);
+
+ gHorizScrollbar.widget = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, NULL);
+ setup_widget_prototype(gHorizScrollbar.widget);
+
+ gHorizScrollbar.styleScrollbar = moz_gtk_style_create(path, NULL);
+ gHorizScrollbar.styleTrough = moz_gtk_style_create(path+2,
+ gHorizScrollbar.styleScrollbar);
+ gHorizScrollbar.styleSlider = moz_gtk_style_create(path+3,
+ gHorizScrollbar.styleTrough);
}
return MOZ_GTK_SUCCESS;
}
@@ -528,9 +617,18 @@ ensure_tab_widget()
static gint
ensure_progress_widget()
{
- if (!gProgressWidget) {
- gProgressWidget = gtk_progress_bar_new();
- setup_widget_prototype(gProgressWidget);
+ if (!gProgressBar.widget) {
+ GtkCssNode path[] = {
+ { GTK_TYPE_LABEL, "progressbar", NULL, NULL },
+ { G_TYPE_NONE, "trough", NULL, NULL },
+ };
+
+ gProgressBar.widget = gtk_progress_bar_new();
+ setup_widget_prototype(gProgressBar.widget);
+
+ gProgressBar.styleProgress = moz_gtk_style_create(&path[0], NULL);
+ gProgressBar.styleTrough = moz_gtk_style_create(&path[1],
+ gProgressBar.styleProgress);
}
return MOZ_GTK_SUCCESS;
}
@@ -757,7 +855,7 @@ moz_gtk_checkbox_get_metrics(gint* indic
{
ensure_checkbox_widget();
- gtk_widget_style_get (gCheckboxWidget,
+ gtk_widget_style_get (gCheckbox.widget,
"indicator_size", indicator_size,
"indicator_spacing", indicator_spacing,
NULL);
@@ -770,7 +868,7 @@ moz_gtk_radio_get_metrics(gint* indicato
{
ensure_radiobutton_widget();
- gtk_widget_style_get (gRadiobuttonWidget,
+ gtk_widget_style_get (gRadiobutton.widget,
"indicator_size", indicator_size,
"indicator_spacing", indicator_spacing,
NULL);
@@ -961,15 +1059,14 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec
gint indicator_size, indicator_spacing;
gint x, y, width, height;
gint focus_x, focus_y, focus_width, focus_height;
- GtkWidget *w;
- GtkStyleContext *style;
+ GtkWidgetToogleBox *w;
if (isradio) {
moz_gtk_radio_get_metrics(&indicator_size, &indicator_spacing);
- w = gRadiobuttonWidget;
+ w = &gRadiobutton;
} else {
moz_gtk_checkbox_get_metrics(&indicator_size, &indicator_spacing);
- w = gCheckboxWidget;
+ w = &gCheckbox;
}
// XXX we should assert rect->height >= indicator_size too
@@ -988,11 +1085,9 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec
focus_width = width + 2 * indicator_spacing;
focus_height = height + 2 * indicator_spacing;
- style = gtk_widget_get_style_context(w);
-
- gtk_widget_set_sensitive(w, !state->disabled);
- gtk_widget_set_direction(w, direction);
- gtk_style_context_save(style);
+ gtk_widget_set_sensitive(w->widget, !state->disabled);
+ gtk_widget_set_direction(w->widget, direction);
+ gtk_style_context_save(w->styleCheck);
if (selected)
state_flags |= checkbox_check_state;
@@ -1000,13 +1095,12 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec
if (inconsistent)
state_flags |= GTK_STATE_FLAG_INCONSISTENT;
- gtk_style_context_set_state(style, state_flags);
+ gtk_style_context_set_state(w->styleCheck, state_flags);
if (isradio) {
- gtk_style_context_add_class(style, GTK_STYLE_CLASS_RADIO);
- gtk_render_option(style, cr, x, y, width, height);
+ gtk_render_option(w->styleCheck, cr, x, y, width, height);
if (state->focused) {
- gtk_render_focus(style, cr, focus_x, focus_y,
+ gtk_render_focus(w->styleCheck, cr, focus_x, focus_y,
focus_width, focus_height);
}
}
@@ -1015,15 +1109,14 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec
* 'indeterminate' type on checkboxes. In GTK, the shadow type
* must also be changed for the state to be drawn.
*/
- gtk_style_context_add_class(style, GTK_STYLE_CLASS_CHECK);
- gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(gCheckboxWidget), inconsistent);
- gtk_render_check(style, cr, x, y, width, height);
+ gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(gCheckbox.widget), inconsistent);
+ gtk_render_check(w->styleCheck, cr, x, y, width, height);
if (state->focused) {
- gtk_render_focus(style, cr,
+ gtk_render_focus(w->styleCheck, cr,
focus_x, focus_y, focus_width, focus_height);
}
}
- gtk_style_context_restore(style);
+ gtk_style_context_restore(w->styleCheck);
return MOZ_GTK_SUCCESS;
}
@@ -1109,9 +1202,9 @@ moz_gtk_scrollbar_button_paint(cairo_t *
ensure_scrollbar_widget();
if (flags & MOZ_GTK_STEPPER_VERTICAL)
- scrollbar = gVertScrollbarWidget;
+ scrollbar = gVertScrollbar.widget;
else
- scrollbar = gHorizScrollbarWidget;
+ scrollbar = gHorizScrollbar.widget;
gtk_widget_set_direction(scrollbar, direction);
@@ -1177,26 +1270,22 @@ moz_gtk_scrollbar_trough_paint(GtkThemeW
GtkTextDirection direction)
{
GtkStyleContext* style;
- GtkScrollbar *scrollbar;
-
ensure_scrollbar_widget();
- if (widget == MOZ_GTK_SCROLLBAR_TRACK_HORIZONTAL)
- scrollbar = GTK_SCROLLBAR(gHorizScrollbarWidget);
- else
- scrollbar = GTK_SCROLLBAR(gVertScrollbarWidget);
-
- gtk_widget_set_direction(GTK_WIDGET(scrollbar), direction);
+ if (widget == MOZ_GTK_SCROLLBAR_TRACK_HORIZONTAL) {
+ gtk_widget_set_direction(GTK_WIDGET(gHorizScrollbar.widget), direction);
+ style = gHorizScrollbar.styleTrough;
+ }
+ else {
+ gtk_widget_set_direction(GTK_WIDGET(gVertScrollbar.widget), direction);
+ style = gVertScrollbar.styleTrough;
+ }
if (flags & MOZ_GTK_TRACK_OPAQUE) {
style = gtk_widget_get_style_context(GTK_WIDGET(gProtoWindow));
gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height);
}
- style = gtk_widget_get_style_context(GTK_WIDGET(scrollbar));
- gtk_style_context_save(style);
- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH);
-
gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height);
gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height);
@@ -1204,7 +1293,6 @@ moz_gtk_scrollbar_trough_paint(GtkThemeW
gtk_render_focus(style, cr,
rect->x, rect->y, rect->width, rect->height);
}
- gtk_style_context_restore(style);
return MOZ_GTK_SUCCESS;
}
@@ -1222,19 +1310,16 @@ moz_gtk_scrollbar_thumb_paint(GtkThemeWi
ensure_scrollbar_widget();
- if (widget == MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL)
- scrollbar = GTK_SCROLLBAR(gHorizScrollbarWidget);
- else
- scrollbar = GTK_SCROLLBAR(gVertScrollbarWidget);
-
- gtk_widget_set_direction(GTK_WIDGET(scrollbar), direction);
-
- style = gtk_widget_get_style_context(GTK_WIDGET(scrollbar));
- gtk_style_context_save(style);
+ if (widget == MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL) {
+ style = gHorizScrollbar.styleSlider;
+ gtk_widget_set_direction(GTK_WIDGET(gHorizScrollbar.widget), direction);
+ }
+ else {
+ style = gVertScrollbar.styleSlider;
+ gtk_widget_set_direction(GTK_WIDGET(gVertScrollbar.widget), direction);
+ }
- gtk_style_context_add_class(style, GTK_STYLE_CLASS_SLIDER);
gtk_style_context_set_state(style, state_flags);
-
gtk_style_context_get_margin (style, state_flags, &margin);
gtk_render_slider(style, cr,
@@ -1245,8 +1330,6 @@ moz_gtk_scrollbar_thumb_paint(GtkThemeWi
(widget == MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL) ?
GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL);
- gtk_style_context_restore(style);
-
return MOZ_GTK_SUCCESS;
}
@@ -1801,29 +1884,27 @@ moz_gtk_container_paint(cairo_t *cr, Gdk
gboolean isradio, GtkTextDirection direction)
{
GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state);
- GtkStyleContext* style;
- GtkWidget *widget;
+ GtkWidgetToogleBox *widget;
if (isradio) {
ensure_radiobutton_widget();
- widget = gRadiobuttonWidget;
+ widget = &gRadiobutton;
} else {
ensure_checkbox_widget();
- widget = gCheckboxWidget;
+ widget = &gCheckbox;
}
- gtk_widget_set_direction(widget, direction);
+ gtk_widget_set_direction(widget->widget, direction);
- style = gtk_widget_get_style_context(widget);
- gtk_style_context_save(style);
- gtk_style_context_set_state(style, state_flags);
+ gtk_style_context_save(widget->styleButton);
+ gtk_style_context_set_state(widget->styleButton, state_flags);
/* this is for drawing a prelight box */
if (state_flags & GTK_STATE_FLAG_PRELIGHT) {
- gtk_render_background(style, cr,
+ gtk_render_background(widget->styleButton, cr,
rect->x, rect->y, rect->width, rect->height);
}
- gtk_style_context_restore(style);
+ gtk_style_context_restore(widget->styleButton);
return MOZ_GTK_SUCCESS;
}
@@ -1833,32 +1914,25 @@ moz_gtk_toggle_label_paint(cairo_t *cr,
GtkWidgetState* state,
gboolean isradio, GtkTextDirection direction)
{
- GtkStyleContext *style;
- GtkWidget *widget;
+ GtkWidgetToogleBox *widget;
if (!state->focused)
return MOZ_GTK_SUCCESS;
if (isradio) {
ensure_radiobutton_widget();
- widget = gRadiobuttonWidget;
+ widget = &gRadiobutton;
} else {
ensure_checkbox_widget();
- widget = gCheckboxWidget;
+ widget = &gCheckbox;
}
- style = gtk_widget_get_style_context(widget);
- gtk_style_context_save(style);
- if (isradio) {
- gtk_style_context_add_class(style, GTK_STYLE_CLASS_RADIO);
- } else {
- gtk_style_context_add_class(style, GTK_STYLE_CLASS_CHECK);
- }
- gtk_widget_set_direction(widget, direction);
+ gtk_style_context_save(widget->styleLabel);
+ gtk_widget_set_direction(widget->widget, direction);
- gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state));
- gtk_render_focus(style, cr,
+ gtk_style_context_set_state(widget->styleLabel, GetStateFlagsFromGtkWidgetState(state));
+ gtk_render_focus(widget->styleLabel, cr,
rect->x, rect->y, rect->width, rect->height);
- gtk_style_context_restore(style);
+ gtk_style_context_restore(widget->styleLabel);
return MOZ_GTK_SUCCESS;
}
@@ -2006,18 +2080,13 @@ static gint
moz_gtk_progressbar_paint(cairo_t *cr, GdkRectangle* rect,
GtkTextDirection direction)
{
- GtkStyleContext* style;
-
ensure_progress_widget();
- gtk_widget_set_direction(gProgressWidget, direction);
+ gtk_widget_set_direction(gProgressBar.widget, direction);
- style = gtk_widget_get_style_context(gProgressWidget);
- gtk_style_context_save(style);
- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH);
-
- gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height);
- gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height);
- gtk_style_context_restore(style);
+ gtk_render_background(gProgressBar.styleProgress, cr,
+ rect->x, rect->y, rect->width, rect->height);
+ gtk_render_frame(gProgressBar.styleProgress, cr,
+ rect->x, rect->y, rect->width, rect->height);
return MOZ_GTK_SUCCESS;
}
@@ -2027,16 +2096,9 @@ moz_gtk_progress_chunk_paint(cairo_t *cr
GtkTextDirection direction,
GtkThemeWidgetType widget)
{
- GtkStyleContext* style;
-
ensure_progress_widget();
- gtk_widget_set_direction(gProgressWidget, direction);
-
- style = gtk_widget_get_style_context(gProgressWidget);
- gtk_style_context_save(style);
- gtk_style_context_remove_class(style, GTK_STYLE_CLASS_TROUGH);
- gtk_style_context_add_class(style, GTK_STYLE_CLASS_PROGRESSBAR);
-
+ gtk_widget_set_direction(gProgressBar.widget, direction);
+
if (widget == MOZ_GTK_PROGRESS_CHUNK_INDETERMINATE ||
widget == MOZ_GTK_PROGRESS_CHUNK_VERTICAL_INDETERMINATE) {
/**
@@ -2074,12 +2136,14 @@ moz_gtk_progress_chunk_paint(cairo_t *cr
// gtk_render_activity was used to render progress chunks on GTK versions
// before 3.13.7, see bug 1173907.
if (!gtk_check_version(3, 13, 7)) {
- gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height);
- gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height);
+ gtk_render_background(gProgressBar.styleTrough, cr,
+ rect->x, rect->y, rect->width, rect->height);
+ gtk_render_frame(gProgressBar.styleTrough, cr,
+ rect->x, rect->y, rect->width, rect->height);
} else {
- gtk_render_activity(style, cr, rect->x, rect->y, rect->width, rect->height);
- }
- gtk_style_context_restore(style);
+ gtk_render_activity(gProgressBar.styleTrough, cr,
+ rect->x, rect->y, rect->width, rect->height);
+ }
return MOZ_GTK_SUCCESS;
}
@@ -2815,9 +2879,12 @@ moz_gtk_get_widget_border(GtkThemeWidget
w = gTabWidget;
break;
case MOZ_GTK_PROGRESSBAR:
- ensure_progress_widget();
- w = gProgressWidget;
- break;
+ {
+ ensure_progress_widget();
+ moz_gtk_add_style_border(gProgressBar.styleProgress,
+ left, top, right, bottom);
+ return MOZ_GTK_SUCCESS;
+ }
case MOZ_GTK_SPINBUTTON_ENTRY:
case MOZ_GTK_SPINBUTTON_UP:
case MOZ_GTK_SPINBUTTON_DOWN:
@@ -2841,12 +2908,13 @@ moz_gtk_get_widget_border(GtkThemeWidget
{
if (widget == MOZ_GTK_CHECKBUTTON_CONTAINER) {
ensure_checkbox_widget();
- w = gCheckboxWidget;
+ w = gCheckbox.widget;
+ style = gCheckbox.styleCheck;
} else {
ensure_radiobutton_widget();
- w = gRadiobuttonWidget;
+ w = gRadiobutton.widget;
+ style = gRadiobutton.styleCheck;
}
- style = gtk_widget_get_style_context(w);
*left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(w));
moz_gtk_add_style_border(style,
@@ -3123,7 +3191,7 @@ moz_gtk_get_scrollbar_metrics(MozGtkScro
{
ensure_scrollbar_widget();
- gtk_widget_style_get (gHorizScrollbarWidget,
+ gtk_widget_style_get (gHorizScrollbar.widget,
"slider_width", &metrics->slider_width,
"trough_border", &metrics->trough_border,
"stepper_size", &metrics->stepper_size,
@@ -3131,7 +3199,7 @@ moz_gtk_get_scrollbar_metrics(MozGtkScro
NULL);
metrics->min_slider_size =
- gtk_range_get_min_slider_size(GTK_RANGE(gHorizScrollbarWidget));
+ gtk_range_get_min_slider_size(GTK_RANGE(gHorizScrollbar.widget));
return MOZ_GTK_SUCCESS;
}
@@ -3377,7 +3445,7 @@ GtkWidget* moz_gtk_get_scrollbar_widget(
{
MOZ_ASSERT(is_initialized, "Forgot to call moz_gtk_init()");
ensure_scrollbar_widget();
- return gHorizScrollbarWidget;
+ return gHorizScrollbar.widget;
}
gboolean moz_gtk_has_scrollbar_buttons(void)
@@ -3385,7 +3453,7 @@ gboolean moz_gtk_has_scrollbar_buttons(v
gboolean backward, forward, secondary_backward, secondary_forward;
MOZ_ASSERT(is_initialized, "Forgot to call moz_gtk_init()");
ensure_scrollbar_widget();
- gtk_widget_style_get (gHorizScrollbarWidget,
+ gtk_widget_style_get (gHorizScrollbar.widget,
"has-backward-stepper", &backward,
"has-forward-stepper", &forward,
"has-secondary-backward-stepper", &secondary_backward,
@@ -3414,10 +3482,10 @@ moz_gtk_shutdown()
gButtonWidget = NULL;
gToggleButtonWidget = NULL;
gButtonArrowWidget = NULL;
- gCheckboxWidget = NULL;
- gRadiobuttonWidget = NULL;
- gHorizScrollbarWidget = NULL;
- gVertScrollbarWidget = NULL;
+// gCheckboxWidget = NULL;
+// gRadiobuttonWidget = NULL;
+// gHorizScrollbarWidget = NULL;
+// gVertScrollbarWidget = NULL;
gSpinWidget = NULL;
gHScaleWidget = NULL;
gVScaleWidget = NULL;
@@ -3434,7 +3502,7 @@ moz_gtk_shutdown()
gToolbarWidget = NULL;
gStatusbarWidget = NULL;
gFrameWidget = NULL;
- gProgressWidget = NULL;
+ //gProgressBar = NULL;
gTabWidget = NULL;
gTooltipWidget = NULL;
gMenuBarWidget = NULL;
diff -up firefox-43.0.3/widget/gtk/gtkdrawing.h.gtk3-20 firefox-43.0.3/widget/gtk/gtkdrawing.h
--- firefox-43.0.3/widget/gtk/gtkdrawing.h.gtk3-20 2015-12-23 23:11:14.000000000 +0100
+++ firefox-43.0.3/widget/gtk/gtkdrawing.h 2016-01-13 14:54:34.231234533 +0100
@@ -67,6 +67,13 @@ typedef enum {
MOZ_GTK_TAB_SELECTED = 1 << 10
} GtkTabFlags;
+typedef struct {
+ GType type;
+ const gchar *name;
+ const gchar *class1;
+ const gchar *class2;
+} GtkCssNode;
+
/** flags for menuitems **/
typedef enum {
/* menuitem is part of the menubar */
@@ -464,6 +471,10 @@ gboolean moz_gtk_images_in_buttons(void)
*/
gboolean moz_gtk_has_scrollbar_buttons(void);
+
+GtkStyleContext *
+moz_gtk_style_create(GtkCssNode *node, GtkStyleContext *parent);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff -up firefox-43.0.3/widget/gtk/mozgtk/mozgtk.c.gtk3-20 firefox-43.0.3/widget/gtk/mozgtk/mozgtk.c
--- firefox-43.0.3/widget/gtk/mozgtk/mozgtk.c.gtk3-20 2015-12-23 23:11:14.000000000 +0100
+++ firefox-43.0.3/widget/gtk/mozgtk/mozgtk.c 2016-01-13 14:54:34.231234533 +0100
@@ -547,6 +547,7 @@ STUB(gtk_style_context_get_border_color)
STUB(gtk_style_context_get_color)
STUB(gtk_style_context_get_margin)
STUB(gtk_style_context_get_padding)
+STUB(gtk_style_context_get_state)
STUB(gtk_style_context_has_class)
STUB(gtk_style_context_new)
STUB(gtk_style_context_remove_class)
@@ -574,6 +575,12 @@ STUB(gtk_color_chooser_get_type)
STUB(gtk_color_chooser_set_rgba)
STUB(gtk_color_chooser_get_rgba)
STUB(gtk_color_chooser_set_use_alpha)
+STUB(gtk_style_context_get_path)
+STUB(gtk_widget_path_copy)
+STUB(gtk_widget_path_iter_set_object_name)
+STUB(gtk_widget_path_iter_add_class)
+STUB(gtk_style_context_set_parent)
+STUB(gtk_widget_path_unref)
#endif
#ifdef GTK2_SYMBOLS
diff -up firefox-43.0.3/widget/gtk/nsLookAndFeel.cpp.gtk3-20 firefox-43.0.3/widget/gtk/nsLookAndFeel.cpp
--- firefox-43.0.3/widget/gtk/nsLookAndFeel.cpp.gtk3-20 2015-12-23 23:11:14.000000000 +0100
+++ firefox-43.0.3/widget/gtk/nsLookAndFeel.cpp 2016-01-13 14:54:34.232234536 +0100
@@ -983,7 +983,7 @@ nsLookAndFeel::Init()
style = create_context(path);
gtk_style_context_add_class(style, GTK_STYLE_CLASS_SCROLLBAR);
gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH);
- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color);
sMozScrollbar = GDK_RGBA_TO_NS_RGBA(color);
g_object_unref(style);
@@ -991,18 +991,18 @@ nsLookAndFeel::Init()
style = create_context(path);
gtk_style_context_save(style);
gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND);
- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color);
sMozWindowBackground = GDK_RGBA_TO_NS_RGBA(color);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sMozWindowText = GDK_RGBA_TO_NS_RGBA(color);
gtk_style_context_restore(style);
// tooltip foreground and background
gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP);
gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND);
- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color);
sInfoBackground = GDK_RGBA_TO_NS_RGBA(color);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sInfoText = GDK_RGBA_TO_NS_RGBA(color);
g_object_unref(style);
@@ -1017,20 +1017,26 @@ nsLookAndFeel::Init()
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
style = gtk_widget_get_style_context(accel_label);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sMenuText = GDK_RGBA_TO_NS_RGBA(color);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_INSENSITIVE, &color);
+ gtk_style_context_save(style);
+ gtk_style_context_set_state(style, GTK_STATE_FLAG_INSENSITIVE);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sMenuTextInactive = GDK_RGBA_TO_NS_RGBA(color);
+ gtk_style_context_restore(style);
style = gtk_widget_get_style_context(menu);
- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color);
sMenuBackground = GDK_RGBA_TO_NS_RGBA(color);
style = gtk_widget_get_style_context(menuitem);
- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_PRELIGHT, &color);
+ gtk_style_context_save(style);
+ gtk_style_context_set_state(style, GTK_STATE_FLAG_PRELIGHT);
+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color);
sMenuHover = GDK_RGBA_TO_NS_RGBA(color);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sMenuHoverText = GDK_RGBA_TO_NS_RGBA(color);
+ gtk_style_context_restore(style);
g_object_unref(menu);
#endif
@@ -1139,44 +1145,53 @@ nsLookAndFeel::Init()
GDK_COLOR_TO_NS_RGB(style->dark[GTK_STATE_NORMAL]);
}
#else
+ GtkCssNode labelPath[] = {
+ { GTK_TYPE_LABEL, "label", "view", NULL },
+ { G_TYPE_NONE, "selection", NULL, NULL }
+ };
+
+ GtkStyleContext *styleLabel;
+ GtkStyleContext *styleSelection;
+
// Text colors
- style = gtk_widget_get_style_context(textView);
- gtk_style_context_save(style);
- gtk_style_context_add_class(style, GTK_STYLE_CLASS_VIEW);
- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ styleLabel = moz_gtk_style_create(labelPath, NULL);
+ styleSelection = moz_gtk_style_create(labelPath+1, styleLabel);
+ gtk_style_context_get_background_color(styleLabel, gtk_style_context_get_state(styleLabel), &color);
sMozFieldBackground = GDK_RGBA_TO_NS_RGBA(color);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_color(styleLabel, gtk_style_context_get_state(styleLabel), &color);
sMozFieldText = GDK_RGBA_TO_NS_RGBA(color);
// Selected text and background
- gtk_style_context_get_background_color(style,
- static_cast<GtkStateFlags>(GTK_STATE_FLAG_FOCUSED|GTK_STATE_FLAG_SELECTED),
- &color);
+ gtk_style_context_set_state (styleLabel, GTK_STATE_FLAG_SELECTED);
+ gtk_style_context_get_background_color(styleSelection, gtk_style_context_get_state(styleSelection), &color);
sTextSelectedBackground = GDK_RGBA_TO_NS_RGBA(color);
- gtk_style_context_get_color(style,
- static_cast<GtkStateFlags>(GTK_STATE_FLAG_FOCUSED|GTK_STATE_FLAG_SELECTED),
- &color);
+ gtk_style_context_get_color(styleSelection, gtk_style_context_get_state(styleSelection), &color);
sTextSelectedText = GDK_RGBA_TO_NS_RGBA(color);
- gtk_style_context_restore(style);
// Button text, background, border
style = gtk_widget_get_style_context(label);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sButtonText = GDK_RGBA_TO_NS_RGBA(color);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color);
+ gtk_style_context_save(style);
+ gtk_style_context_set_state(style, GTK_STATE_FLAG_PRELIGHT);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sButtonHoverText = GDK_RGBA_TO_NS_RGBA(color);
+ gtk_style_context_restore(style);
// Combobox text color
style = gtk_widget_get_style_context(comboboxLabel);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sComboBoxText = GDK_RGBA_TO_NS_RGBA(color);
// Menubar text and hover text colors
style = gtk_widget_get_style_context(menuBar);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sMenuBarText = GDK_RGBA_TO_NS_RGBA(color);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color);
+ gtk_style_context_save(style);
+ gtk_style_context_set_state(style, GTK_STATE_FLAG_PRELIGHT);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sMenuBarHoverText = GDK_RGBA_TO_NS_RGBA(color);
+ gtk_style_context_restore(style);
// GTK's guide to fancy odd row background colors:
// 1) Check if a theme explicitly defines an odd row color
@@ -1189,7 +1204,7 @@ nsLookAndFeel::Init()
// Get odd row background color
gtk_style_context_save(style);
gtk_style_context_add_region(style, GTK_STYLE_REGION_ROW, GTK_REGION_ODD);
- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_background_color(style, gtk_style_context_get_state(style), &color);
sOddCellBackground = GDK_RGBA_TO_NS_RGBA(color);
gtk_style_context_restore(style);
@@ -1199,7 +1214,7 @@ nsLookAndFeel::Init()
// TODO GTK3 - update sFrameOuterLightBorder
// for GTK_BORDER_STYLE_INSET/OUTSET/GROVE/RIDGE border styles (Bug 978172).
style = gtk_widget_get_style_context(frame);
- gtk_style_context_get_border_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_border_color(style, gtk_style_context_get_state(style), &color);
sFrameInnerDarkBorder = sFrameOuterLightBorder = GDK_RGBA_TO_NS_RGBA(color);
gtk_widget_path_free(path);
@@ -1211,9 +1226,11 @@ nsLookAndFeel::Init()
gtk_container_add(GTK_CONTAINER(parent), infoBar);
gtk_container_add(GTK_CONTAINER(infoBarContent), infoBarLabel);
style = gtk_widget_get_style_context(infoBarLabel);
+ gtk_style_context_save(style);
gtk_style_context_add_class(style, GTK_STYLE_CLASS_INFO);
- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ gtk_style_context_get_color(style, gtk_style_context_get_state(style), &color);
sInfoBarText = GDK_RGBA_TO_NS_RGBA(color);
+ gtk_style_context_restore(style);
#endif
// Some themes have a unified menu bar, and support window dragging on it
gboolean supports_menubar_drag = FALSE;