Martin Stransky 553a4d7
# HG changeset patch
Martin Stransky 553a4d7
# User Martin Stransky <stransky@redhat.com>
Martin Stransky 3342822
# Parent  0850966fdb761c309032575cbc6748a27d794983
Martin Stransky 3342822
Bug 1073117 - Theme issues with GTK 3.14 - fix gtk button and entry size, r=?karlt
Martin Stransky 3342822
Inner borders and focus theming has been removed in Gtk 3.14 so we can't use them to calculate button size.
Martin Stransky 3342822
The size should be computed as border + padding.
Martin Stransky 3342822
Martin Stransky 553a4d7
Martin Stransky 553a4d7
diff --git a/widget/gtk/gtk2drawing.c b/widget/gtk/gtk2drawing.c
Martin Stransky 553a4d7
--- a/widget/gtk/gtk2drawing.c
Martin Stransky 553a4d7
+++ b/widget/gtk/gtk2drawing.c
Martin Stransky 553a4d7
@@ -826,17 +826,17 @@ moz_gtk_get_focus_outline_size(gint* foc
Martin Stransky 553a4d7
         *focus_v_width = YTHICKNESS(gEntryWidget->style) + focus_width;
Martin Stransky 553a4d7
     } else {
Martin Stransky 553a4d7
         *focus_h_width = focus_width;
Martin Stransky 553a4d7
         *focus_v_width = focus_width;
Martin Stransky 553a4d7
     }
Martin Stransky 553a4d7
     return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
 }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
-gint
Martin Stransky 553a4d7
+static gint
Martin Stransky 553a4d7
 moz_gtk_widget_get_focus(GtkWidget* widget, gboolean* interior_focus,
Martin Stransky 553a4d7
                          gint* focus_width, gint* focus_pad) 
Martin Stransky 553a4d7
 {
Martin Stransky 553a4d7
     gtk_widget_style_get (widget,
Martin Stransky 553a4d7
                           "interior-focus", interior_focus,
Martin Stransky 553a4d7
                           "focus-line-width", focus_width,
Martin Stransky 553a4d7
                           "focus-padding", focus_pad,
Martin Stransky 553a4d7
                           NULL);
Martin Stransky 553a4d7
@@ -923,17 +923,17 @@ moz_gtk_splitter_get_metrics(gint orient
Martin Stransky 553a4d7
         gtk_widget_style_get(gHPanedWidget, "handle_size", size, NULL);
Martin Stransky 553a4d7
     } else {
Martin Stransky 553a4d7
         ensure_vpaned_widget();
Martin Stransky 553a4d7
         gtk_widget_style_get(gVPanedWidget, "handle_size", size, NULL);
Martin Stransky 553a4d7
     }
Martin Stransky 553a4d7
     return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
 }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
-gint
Martin Stransky 553a4d7
+static gint
Martin Stransky 553a4d7
 moz_gtk_button_get_inner_border(GtkWidget* widget, GtkBorder* inner_border)
Martin Stransky 553a4d7
 {
Martin Stransky 553a4d7
     static const GtkBorder default_inner_border = { 1, 1, 1, 1 };
Martin Stransky 553a4d7
     GtkBorder *tmp_border;
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     gtk_widget_style_get (widget, "inner-border", &tmp_border, NULL);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     if (tmp_border) {
Martin Stransky 553a4d7
diff --git a/widget/gtk/gtk3drawing.c b/widget/gtk/gtk3drawing.c
Martin Stransky 553a4d7
--- a/widget/gtk/gtk3drawing.c
Martin Stransky 553a4d7
+++ b/widget/gtk/gtk3drawing.c
Martin Stransky 3342822
@@ -756,48 +756,28 @@ moz_gtk_radio_get_metrics(gint* indicato
Martin Stransky 3342822
                           "indicator_spacing", indicator_spacing,
Martin Stransky 553a4d7
                           NULL);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
 }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
 gint
Martin Stransky 553a4d7
 moz_gtk_get_focus_outline_size(gint* focus_h_width, gint* focus_v_width)
Martin Stransky 3342822
-{
Martin Stransky 553a4d7
-    gboolean interior_focus;
Martin Stransky 3342822
-    gint focus_width = 0;
Martin Stransky 3342822
+{
Martin Stransky 553a4d7
+    GtkBorder border;
Martin Stransky 553a4d7
+    GtkBorder padding;
Martin Stransky 553a4d7
+    GtkStyleContext *style;
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     ensure_entry_widget();
Martin Stransky 553a4d7
-    gtk_widget_style_get(gEntryWidget,
Martin Stransky 553a4d7
-                         "interior-focus", &interior_focus,
Martin Stransky 553a4d7
-                         "focus-line-width", &focus_width,
Martin Stransky 553a4d7
-                         NULL);
Martin Stransky 553a4d7
-    if (interior_focus) {
Martin Stransky 553a4d7
-        GtkBorder border;
Martin Stransky 553a4d7
-        GtkStyleContext *style = gtk_widget_get_style_context(gEntryWidget);
Martin Stransky 553a4d7
-        gtk_style_context_get_border(style, 0, &border);
Martin Stransky 553a4d7
-        *focus_h_width = border.left + focus_width;
Martin Stransky 553a4d7
-        *focus_v_width = border.top + focus_width;
Martin Stransky 553a4d7
-    } else {
Martin Stransky 553a4d7
-        *focus_h_width = focus_width;
Martin Stransky 553a4d7
-        *focus_v_width = focus_width;
Martin Stransky 553a4d7
-    }
Martin Stransky 553a4d7
-    return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
-}
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-gint
Martin Stransky 553a4d7
-moz_gtk_widget_get_focus(GtkWidget* widget, gboolean* interior_focus,
Martin Stransky 553a4d7
-                         gint* focus_width, gint* focus_pad) 
Martin Stransky 553a4d7
-{
Martin Stransky 553a4d7
-    gtk_widget_style_get (widget,
Martin Stransky 553a4d7
-                          "interior-focus", interior_focus,
Martin Stransky 553a4d7
-                          "focus-line-width", focus_width,
Martin Stransky 553a4d7
-                          "focus-padding", focus_pad,
Martin Stransky 553a4d7
-                          NULL);
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
+    style = gtk_widget_get_style_context(gEntryWidget);
Martin Stransky 553a4d7
+
Martin Stransky 553a4d7
+    gtk_style_context_get_border(style, 0, &border);
Martin Stransky 553a4d7
+    gtk_style_context_get_padding(style, 0, &padding);
Martin Stransky 3342822
+    *focus_h_width = border.left + padding.left;
Martin Stransky 3342822
+    *focus_v_width = border.top + padding.top;
Martin Stransky 553a4d7
     return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
 }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
 gint
Martin Stransky 553a4d7
 moz_gtk_menuitem_get_horizontal_padding(gint* horizontal_padding)
Martin Stransky 553a4d7
 {
Martin Stransky 553a4d7
     ensure_menu_item_widget();
Martin Stransky 553a4d7
 
Martin Stransky 3342822
@@ -875,34 +855,16 @@ moz_gtk_splitter_get_metrics(gint orient
Martin Stransky 553a4d7
         gtk_widget_style_get(gHPanedWidget, "handle_size", size, NULL);
Martin Stransky 553a4d7
     } else {
Martin Stransky 553a4d7
         ensure_vpaned_widget();
Martin Stransky 553a4d7
         gtk_widget_style_get(gVPanedWidget, "handle_size", size, NULL);
Martin Stransky 553a4d7
     }
Martin Stransky 553a4d7
     return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
 }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
-gint
Martin Stransky 553a4d7
-moz_gtk_button_get_inner_border(GtkWidget* widget, GtkBorder* inner_border)
Martin Stransky 553a4d7
-{
Martin Stransky 553a4d7
-    static const GtkBorder default_inner_border = { 1, 1, 1, 1 };
Martin Stransky 553a4d7
-    GtkBorder *tmp_border;
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-    gtk_widget_style_get (widget, "inner-border", &tmp_border, NULL);
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-    if (tmp_border) {
Martin Stransky 553a4d7
-        *inner_border = *tmp_border;
Martin Stransky 553a4d7
-        gtk_border_free(tmp_border);
Martin Stransky 553a4d7
-    }
Martin Stransky 553a4d7
-    else
Martin Stransky 553a4d7
-        *inner_border = default_inner_border;
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-    return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
-}
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
 static gint
Martin Stransky 553a4d7
 moz_gtk_button_paint(cairo_t *cr, GdkRectangle* rect,
Martin Stransky 553a4d7
                      GtkWidgetState* state,
Martin Stransky 553a4d7
                      GtkReliefStyle relief, GtkWidget* widget,
Martin Stransky 553a4d7
                      GtkTextDirection direction)
Martin Stransky 553a4d7
 {
Martin Stransky 553a4d7
     GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state);
Martin Stransky 553a4d7
     GtkStyleContext* style = gtk_widget_get_style_context(widget);    
Martin Stransky 3342822
@@ -1032,43 +994,33 @@ moz_gtk_toggle_paint(cairo_t *cr, GdkRec
Martin Stransky 553a4d7
 }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
 static gint
Martin Stransky 553a4d7
 calculate_button_inner_rect(GtkWidget* button, GdkRectangle* rect,
Martin Stransky 553a4d7
                             GdkRectangle* inner_rect,
Martin Stransky 553a4d7
                             GtkTextDirection direction,
Martin Stransky 553a4d7
                             gboolean ignore_focus)
Martin Stransky 553a4d7
 {
Martin Stransky 553a4d7
-    GtkBorder inner_border;
Martin Stransky 553a4d7
-    gboolean interior_focus;
Martin Stransky 553a4d7
-    gint focus_width, focus_pad;
Martin Stransky 553a4d7
     GtkStyleContext* style;
Martin Stransky 553a4d7
     GtkBorder border;
Martin Stransky 553a4d7
+    GtkBorder padding = {0, 0, 0, 0};
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     style = gtk_widget_get_style_context(button);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     /* This mirrors gtkbutton's child positioning */
Martin Stransky 553a4d7
-    moz_gtk_button_get_inner_border(button, &inner_border);
Martin Stransky 553a4d7
-    moz_gtk_widget_get_focus(button, &interior_focus,
Martin Stransky 553a4d7
-                             &focus_width, &focus_pad);
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-    if (ignore_focus)
Martin Stransky 553a4d7
-        focus_width = focus_pad = 0;
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-    gtk_style_context_get_border(style, 0, &border);
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-    inner_rect->x = rect->x + border.left + focus_width + focus_pad;
Martin Stransky 3342822
-    inner_rect->x += direction == GTK_TEXT_DIR_LTR ?
Martin Stransky 553a4d7
-                        inner_border.left : inner_border.right;
Martin Stransky 553a4d7
-    inner_rect->y = rect->y + inner_border.top + border.top +
Martin Stransky 553a4d7
-                    focus_width + focus_pad;
Martin Stransky 553a4d7
-    inner_rect->width = MAX(1, rect->width - inner_border.left -
Martin Stransky 553a4d7
-       inner_border.right - (border.left + focus_pad + focus_width) * 2);
Martin Stransky 553a4d7
-    inner_rect->height = MAX(1, rect->height - inner_border.top -
Martin Stransky 553a4d7
-       inner_border.bottom - (border.top + focus_pad + focus_width) * 2);
Martin Stransky 3342822
+    gtk_style_context_get_border(style, 0, &border);
Martin Stransky 3342822
+    if (!ignore_focus)
Martin Stransky 3342822
+        gtk_style_context_get_padding(style, 0, &padding);
Martin Stransky 3342822
+
Martin Stransky 3342822
+    inner_rect->x = rect->x + border.left + padding.left;
Martin Stransky 553a4d7
+    inner_rect->y = rect->y + padding.top + border.top;
Martin Stransky 553a4d7
+    inner_rect->width = MAX(1, rect->width - padding.left -
Martin Stransky 553a4d7
+       padding.right - border.left * 2);
Martin Stransky 553a4d7
+    inner_rect->height = MAX(1, rect->height - padding.top -
Martin Stransky 553a4d7
+       padding.bottom - border.top * 2);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
 }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
 static gint
Martin Stransky 553a4d7
 calculate_arrow_rect(GtkWidget* arrow, GdkRectangle* rect,
Martin Stransky 553a4d7
                      GdkRectangle* arrow_rect, GtkTextDirection direction)
Martin Stransky 3342822
@@ -1427,29 +1379,22 @@ moz_gtk_vpaned_paint(cairo_t *cr, GdkRec
Martin Stransky 553a4d7
 // See gtk_entry_draw() for reference.
Martin Stransky 553a4d7
 static gint
Martin Stransky 553a4d7
 moz_gtk_entry_paint(cairo_t *cr, GdkRectangle* rect,
Martin Stransky 553a4d7
                     GtkWidgetState* state,
Martin Stransky 553a4d7
                     GtkWidget* widget, GtkTextDirection direction)
Martin Stransky 553a4d7
 {
Martin Stransky 553a4d7
     gint x = rect->x, y = rect->y, width = rect->width, height = rect->height;
Martin Stransky 553a4d7
     GtkStyleContext* style;
Martin Stransky 553a4d7
-    gboolean interior_focus;
Martin Stransky 553a4d7
-    gint focus_width;
Martin Stransky 553a4d7
     int draw_focus_outline_only = state->depressed; // NS_THEME_FOCUS_OUTLINE
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     gtk_widget_set_direction(widget, direction);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     style = gtk_widget_get_style_context(widget);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
-    gtk_widget_style_get(widget,
Martin Stransky 553a4d7
-                         "interior-focus", &interior_focus,
Martin Stransky 553a4d7
-                         "focus-line-width", &focus_width,
Martin Stransky 553a4d7
-                         NULL);
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
     if (draw_focus_outline_only) {
Martin Stransky 553a4d7
         // Inflate the given 'rect' with the focus outline size.
Martin Stransky 553a4d7
         gint h, v;
Martin Stransky 553a4d7
         moz_gtk_get_focus_outline_size(&h, &v);
Martin Stransky 553a4d7
         rect->x -= h;
Martin Stransky 553a4d7
         rect->width += 2 * h;
Martin Stransky 553a4d7
         rect->y -= v;
Martin Stransky 553a4d7
         rect->height += 2 * v;
Martin Stransky 3342822
@@ -1471,40 +1416,27 @@ moz_gtk_entry_paint(cairo_t *cr, GdkRect
Martin Stransky 553a4d7
     /* Now paint the shadow and focus border.
Martin Stransky 553a4d7
      * We do like in gtk_entry_draw_frame, we first draw the shadow, a tad
Martin Stransky 553a4d7
      * smaller when focused if the focus is not interior, then the focus. */
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     if (state->focused && !state->disabled) {
Martin Stransky 553a4d7
         /* This will get us the lit borders that focused textboxes enjoy on
Martin Stransky 553a4d7
          * some themes. */
Martin Stransky 553a4d7
         gtk_style_context_set_state(style, GTK_STATE_FLAG_FOCUSED);
Martin Stransky 553a4d7
-        if (!interior_focus) {
Martin Stransky 553a4d7
-            /* Indent the border a little bit if we have exterior focus 
Martin Stransky 553a4d7
-               (this is what GTK does to draw native entries) */
Martin Stransky 553a4d7
-            x += focus_width;
Martin Stransky 553a4d7
-            y += focus_width;
Martin Stransky 553a4d7
-            width -= 2 * focus_width;
Martin Stransky 553a4d7
-            height -= 2 * focus_width;
Martin Stransky 553a4d7
-        }
Martin Stransky 553a4d7
     }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     if (state->disabled) {
Martin Stransky 553a4d7
         gtk_style_context_set_state(style, GTK_STATE_FLAG_INSENSITIVE);
Martin Stransky 553a4d7
     }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     if (!draw_focus_outline_only) {
Martin Stransky 553a4d7
         gtk_render_background(style, cr, x, y, width, height);
Martin Stransky 553a4d7
     }
Martin Stransky 553a4d7
     gtk_render_frame(style, cr, x, y, width, height);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
-    if (state->focused && !state->disabled) {
Martin Stransky 553a4d7
-        if (!interior_focus) {
Martin Stransky 553a4d7
-            gtk_render_focus(style, cr, rect->x, rect->y, rect->width, rect->height);
Martin Stransky 553a4d7
-        }
Martin Stransky 553a4d7
-    }
Martin Stransky 553a4d7
     gtk_style_context_restore(style);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
 }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
 static gint 
Martin Stransky 553a4d7
 moz_gtk_treeview_paint(cairo_t *cr, GdkRectangle* rect,
Martin Stransky 553a4d7
                        GtkWidgetState* state,
Martin Stransky 3342822
@@ -1799,56 +1731,48 @@ moz_gtk_combo_box_entry_button_paint(cai
Martin Stransky 553a4d7
 static gint
Martin Stransky 553a4d7
 moz_gtk_container_paint(cairo_t *cr, GdkRectangle* rect,
Martin Stransky 553a4d7
                         GtkWidgetState* state, 
Martin Stransky 553a4d7
                         gboolean isradio, GtkTextDirection direction)
Martin Stransky 553a4d7
 {
Martin Stransky 553a4d7
     GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state);
Martin Stransky 553a4d7
     GtkStyleContext* style;
Martin Stransky 553a4d7
     GtkWidget *widget;
Martin Stransky 553a4d7
-    gboolean interior_focus;
Martin Stransky 553a4d7
-    gint focus_width, focus_pad;
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     if (isradio) {
Martin Stransky 553a4d7
         ensure_radiobutton_widget();
Martin Stransky 553a4d7
         widget = gRadiobuttonWidget;
Martin Stransky 553a4d7
     } else {
Martin Stransky 553a4d7
         ensure_checkbox_widget();
Martin Stransky 553a4d7
         widget = gCheckboxWidget;
Martin Stransky 553a4d7
     }
Martin Stransky 553a4d7
     gtk_widget_set_direction(widget, direction);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     style = gtk_widget_get_style_context(widget);
Martin Stransky 553a4d7
     gtk_style_context_save(style);
Martin Stransky 553a4d7
-    moz_gtk_widget_get_focus(widget, &interior_focus, &focus_width, &focus_pad);
Martin Stransky 553a4d7
     gtk_style_context_set_state(style, state_flags);
Martin Stransky 553a4d7
   
Martin Stransky 553a4d7
     /* this is for drawing a prelight box */
Martin Stransky 553a4d7
     if (state_flags & GTK_STATE_FLAG_PRELIGHT) {
Martin Stransky 553a4d7
         gtk_render_background(style, cr,
Martin Stransky 553a4d7
                               rect->x, rect->y, rect->width, rect->height);
Martin Stransky 553a4d7
     }
Martin Stransky 553a4d7
   
Martin Stransky 553a4d7
-    if (state->focused && !interior_focus) {
Martin Stransky 553a4d7
-        gtk_render_focus(style, cr,
Martin Stransky 553a4d7
-                        rect->x, rect->y, rect->width, rect->height);
Martin Stransky 553a4d7
-    }
Martin Stransky 553a4d7
     gtk_style_context_restore(style);
Martin Stransky 553a4d7
   
Martin Stransky 553a4d7
     return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
 }
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
 static gint
Martin Stransky 553a4d7
 moz_gtk_toggle_label_paint(cairo_t *cr, GdkRectangle* rect,
Martin Stransky 553a4d7
                            GtkWidgetState* state, 
Martin Stransky 553a4d7
                            gboolean isradio, GtkTextDirection direction)
Martin Stransky 553a4d7
 {
Martin Stransky 553a4d7
     GtkStyleContext *style;
Martin Stransky 553a4d7
     GtkWidget *widget;
Martin Stransky 553a4d7
-    gboolean interior_focus;
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     if (!state->focused)
Martin Stransky 553a4d7
         return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     if (isradio) {
Martin Stransky 553a4d7
         ensure_radiobutton_widget();
Martin Stransky 553a4d7
         widget = gRadiobuttonWidget;
Martin Stransky 553a4d7
     } else {
Martin Stransky 3342822
@@ -1859,20 +1783,16 @@ moz_gtk_toggle_label_paint(cairo_t *cr, 
Martin Stransky 553a4d7
     gtk_style_context_save(style);
Martin Stransky 553a4d7
     if (isradio) {
Martin Stransky 553a4d7
       gtk_style_context_add_class(style, GTK_STYLE_CLASS_RADIO);
Martin Stransky 553a4d7
     } else {
Martin Stransky 553a4d7
       gtk_style_context_add_class(style, GTK_STYLE_CLASS_CHECK);
Martin Stransky 553a4d7
     }
Martin Stransky 553a4d7
     gtk_widget_set_direction(widget, direction);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
-    gtk_widget_style_get(widget, "interior-focus", &interior_focus, NULL);
Martin Stransky 553a4d7
-    if (!interior_focus)
Martin Stransky 553a4d7
-        return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
     gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state));
Martin Stransky 553a4d7
     gtk_render_focus(style, cr,
Martin Stransky 553a4d7
                     rect->x, rect->y, rect->width, rect->height);
Martin Stransky 553a4d7
     gtk_style_context_restore(style);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
 }
Martin Stransky 553a4d7
 
Martin Stransky 3342822
@@ -2660,44 +2580,42 @@ moz_gtk_get_widget_border(GtkThemeWidget
Martin Stransky 3342822
 {
Martin Stransky 553a4d7
     GtkWidget* w;
Martin Stransky 553a4d7
     GtkStyleContext* style;
Martin Stransky 553a4d7
     *left = *top = *right = *bottom = 0;
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
     switch (widget) {
Martin Stransky 553a4d7
     case MOZ_GTK_BUTTON:
Martin Stransky 553a4d7
         {
Martin Stransky 3342822
-            GtkBorder inner_border;
Martin Stransky 553a4d7
-            gboolean interior_focus;
Martin Stransky 553a4d7
-            gint focus_width, focus_pad;
Martin Stransky 3342822
-
Martin Stransky 553a4d7
             ensure_button_widget();
Martin Stransky 3342822
+            style = gtk_widget_get_style_context(gButtonWidget);
Martin Stransky 3342822
+
Martin Stransky 553a4d7
             *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(gButtonWidget));
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
             /* Don't add this padding in HTML, otherwise the buttons will
Martin Stransky 3342822
                become too big and stuff the layout. */
Martin Stransky 3342822
             if (!inhtml) {
Martin Stransky 3342822
-                moz_gtk_widget_get_focus(gButtonWidget, &interior_focus, &focus_width, &focus_pad);
Martin Stransky 3342822
-                moz_gtk_button_get_inner_border(gButtonWidget, &inner_border);
Martin Stransky 3342822
-                *left += focus_width + focus_pad + inner_border.left;
Martin Stransky 3342822
-                *right += focus_width + focus_pad + inner_border.right;
Martin Stransky 3342822
-                *top += focus_width + focus_pad + inner_border.top;
Martin Stransky 3342822
-                *bottom += focus_width + focus_pad + inner_border.bottom;
Martin Stransky 3342822
+                moz_gtk_add_style_padding(style, left, top, right, bottom);
Martin Stransky 3342822
             }
Martin Stransky 3342822
 
Martin Stransky 3342822
-            moz_gtk_add_style_border(gtk_widget_get_style_context(gButtonWidget), 
Martin Stransky 3342822
-                                     left, top, right, bottom);
Martin Stransky 3342822
+            moz_gtk_add_style_border(style, left, top, right, bottom);
Martin Stransky 3342822
             return MOZ_GTK_SUCCESS;
Martin Stransky 3342822
         }
Martin Stransky 3342822
     case MOZ_GTK_ENTRY:
Martin Stransky 3342822
         {
Martin Stransky 3342822
             ensure_entry_widget();
Martin Stransky 3342822
             style = gtk_widget_get_style_context(gEntryWidget);
Martin Stransky 3342822
             moz_gtk_add_style_border(style, left, top, right, bottom);
Martin Stransky 3342822
-            moz_gtk_add_style_padding(style, left, top, right, bottom);
Martin Stransky 3342822
+
Martin Stransky 3342822
+            /* Use the document padding in HTML
Martin Stransky 3342822
+               and GTK style padding in XUL. */
Martin Stransky 3342822
+            if (!inhtml) {
Martin Stransky 3342822
+                moz_gtk_add_style_padding(style, left, top, right, bottom);
Martin Stransky 3342822
+            }
Martin Stransky 3342822
+
Martin Stransky 3342822
             return MOZ_GTK_SUCCESS;
Martin Stransky 3342822
         }
Martin Stransky 3342822
     case MOZ_GTK_TREEVIEW:
Martin Stransky 3342822
         {
Martin Stransky 3342822
             ensure_scrolled_window_widget();
Martin Stransky 3342822
             style = gtk_widget_get_style_context(gScrolledWindowWidget);
Martin Stransky 3342822
             gtk_style_context_save(style);
Martin Stransky 3342822
             gtk_style_context_add_class(style, GTK_STYLE_CLASS_FRAME);
Martin Stransky 3342822
@@ -2707,33 +2625,25 @@ moz_gtk_get_widget_border(GtkThemeWidget
Martin Stransky 553a4d7
         }
Martin Stransky 553a4d7
     case MOZ_GTK_TREE_HEADER_CELL:
Martin Stransky 553a4d7
         {
Martin Stransky 553a4d7
             /* A Tree Header in GTK is just a different styled button 
Martin Stransky 553a4d7
              * It must be placed in a TreeView for getting the correct style
Martin Stransky 553a4d7
              * assigned.
Martin Stransky 553a4d7
              * That is why the following code is the same as for MOZ_GTK_BUTTON.  
Martin Stransky 553a4d7
              * */
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-            GtkBorder inner_border;
Martin Stransky 553a4d7
-            gboolean interior_focus;
Martin Stransky 553a4d7
-            gint focus_width, focus_pad;
Martin Stransky 553a4d7
+            GtkStyleContext *style;
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
             ensure_tree_header_cell_widget();
Martin Stransky 553a4d7
             *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(gTreeHeaderCellWidget));
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
-            moz_gtk_widget_get_focus(gTreeHeaderCellWidget, &interior_focus, &focus_width, &focus_pad);
Martin Stransky 553a4d7
-            moz_gtk_button_get_inner_border(gTreeHeaderCellWidget, &inner_border);
Martin Stransky 553a4d7
-            *left += focus_width + focus_pad + inner_border.left;
Martin Stransky 553a4d7
-            *right += focus_width + focus_pad + inner_border.right;
Martin Stransky 553a4d7
-            *top += focus_width + focus_pad + inner_border.top;
Martin Stransky 553a4d7
-            *bottom += focus_width + focus_pad + inner_border.bottom;
Martin Stransky 553a4d7
-        
Martin Stransky 553a4d7
-            moz_gtk_add_style_border(gtk_widget_get_style_context(gTreeHeaderCellWidget), 
Martin Stransky 553a4d7
-                                     left, top, right, bottom);
Martin Stransky 553a4d7
+            style = gtk_widget_get_style_context(gTreeHeaderCellWidget);
Martin Stransky 553a4d7
+
Martin Stransky 553a4d7
+            moz_gtk_add_style_border(style, left, top, right, bottom);
Martin Stransky 553a4d7
+            moz_gtk_add_style_padding(style, left, top, right, bottom);
Martin Stransky 553a4d7
             return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
         }
Martin Stransky 553a4d7
     case MOZ_GTK_TREE_HEADER_SORTARROW:
Martin Stransky 553a4d7
         ensure_tree_header_cell_widget();
Martin Stransky 553a4d7
         w = gTreeHeaderSortArrowWidget;
Martin Stransky 553a4d7
         break;
Martin Stransky 553a4d7
     case MOZ_GTK_DROPDOWN_ENTRY:
Martin Stransky 553a4d7
         ensure_combo_box_entry_widgets();
Martin Stransky 3342822
@@ -2743,39 +2653,33 @@ moz_gtk_get_widget_border(GtkThemeWidget
Martin Stransky 553a4d7
         ensure_combo_box_entry_widgets();
Martin Stransky 553a4d7
         w = gComboBoxEntryButtonWidget;
Martin Stransky 553a4d7
         break;
Martin Stransky 553a4d7
     case MOZ_GTK_DROPDOWN:
Martin Stransky 553a4d7
         {
Martin Stransky 553a4d7
             /* We need to account for the arrow on the dropdown, so text
Martin Stransky 553a4d7
              * doesn't come too close to the arrow, or in some cases spill
Martin Stransky 553a4d7
              * into the arrow. */
Martin Stransky 553a4d7
-            gboolean ignored_interior_focus, wide_separators;
Martin Stransky 553a4d7
-            gint focus_width, focus_pad, separator_width;
Martin Stransky 553a4d7
+            gboolean wide_separators;
Martin Stransky 3342822
+            gint separator_width;
Martin Stransky 553a4d7
             GtkRequisition arrow_req;
Martin Stransky 553a4d7
             GtkBorder border;
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
             ensure_combo_box_widgets();
Martin Stransky 553a4d7
 
Martin Stransky 3342822
-            *left = gtk_container_get_border_width(GTK_CONTAINER(gComboBoxButtonWidget));
Martin Stransky 3342822
+            *left = *top = *right = *bottom = 
Martin Stransky 3342822
+                gtk_container_get_border_width(GTK_CONTAINER(gComboBoxButtonWidget));
Martin Stransky 3342822
+
Martin Stransky 3342822
+            style = gtk_widget_get_style_context(gComboBoxButtonWidget);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
             if (!inhtml) {
Martin Stransky 553a4d7
-                moz_gtk_widget_get_focus(gComboBoxButtonWidget,
Martin Stransky 553a4d7
-                                         &ignored_interior_focus,
Martin Stransky 553a4d7
-                                         &focus_width, &focus_pad);
Martin Stransky 553a4d7
-                *left += focus_width + focus_pad;
Martin Stransky 3342822
+                moz_gtk_add_style_padding(style, left, top, right, bottom);
Martin Stransky 553a4d7
             }
Martin Stransky 553a4d7
           
Martin Stransky 3342822
-            style = gtk_widget_get_style_context(gComboBoxButtonWidget);
Martin Stransky 3342822
-            gtk_style_context_get_border(style, 0, &border);
Martin Stransky 3342822
-
Martin Stransky 3342822
-            *top = *left + border.top;
Martin Stransky 3342822
-            *left += border.left;
Martin Stransky 3342822
-
Martin Stransky 3342822
-            *right = *left; *bottom = *top;
Martin Stransky 3342822
+            moz_gtk_add_style_border(style, left, top, right, bottom);
Martin Stransky 553a4d7
 
Martin Stransky 3342822
             /* If there is no separator, don't try to count its width. */
Martin Stransky 3342822
             separator_width = 0;
Martin Stransky 3342822
             if (gComboBoxSeparatorWidget) {
Martin Stransky 3342822
                 gtk_widget_style_get(gComboBoxSeparatorWidget,
Martin Stransky 3342822
                                      "wide-separators", &wide_separators,
Martin Stransky 3342822
                                      "separator-width", &separator_width,
Martin Stransky 3342822
                                      NULL);
Martin Stransky 3342822
@@ -2817,70 +2721,33 @@ moz_gtk_get_widget_border(GtkThemeWidget
Martin Stransky 3342822
     case MOZ_GTK_SCALE_VERTICAL:
Martin Stransky 3342822
         ensure_scale_widget();
Martin Stransky 3342822
         w = gVScaleWidget;
Martin Stransky 553a4d7
         break;
Martin Stransky 553a4d7
     case MOZ_GTK_FRAME:
Martin Stransky 553a4d7
         ensure_frame_widget();
Martin Stransky 553a4d7
         w = gFrameWidget;
Martin Stransky 553a4d7
         break;
Martin Stransky 3342822
-    case MOZ_GTK_CHECKBUTTON_LABEL:
Martin Stransky 3342822
-    case MOZ_GTK_RADIOBUTTON_LABEL:
Martin Stransky 3342822
-        {
Martin Stransky 553a4d7
-            gboolean interior_focus;
Martin Stransky 553a4d7
-            gint focus_width, focus_pad;
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-            /* If the focus is interior, then the label has a border of
Martin Stransky 553a4d7
-               (focus_width + focus_pad). */
Martin Stransky 3342822
-            if (widget == MOZ_GTK_CHECKBUTTON_LABEL) {
Martin Stransky 3342822
-                ensure_checkbox_widget();
Martin Stransky 553a4d7
-                moz_gtk_widget_get_focus(gCheckboxWidget, &interior_focus,
Martin Stransky 553a4d7
-                                           &focus_width, &focus_pad);
Martin Stransky 3342822
-            }
Martin Stransky 3342822
-            else {
Martin Stransky 3342822
-                ensure_radiobutton_widget();
Martin Stransky 553a4d7
-                moz_gtk_widget_get_focus(gRadiobuttonWidget, &interior_focus,
Martin Stransky 553a4d7
-                                        &focus_width, &focus_pad);
Martin Stransky 3342822
-            }
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-            if (interior_focus)
Martin Stransky 553a4d7
-                *left = *top = *right = *bottom = (focus_width + focus_pad);
Martin Stransky 553a4d7
-
Martin Stransky 3342822
-            return MOZ_GTK_SUCCESS;
Martin Stransky 3342822
-        }
Martin Stransky 3342822
-
Martin Stransky 553a4d7
     case MOZ_GTK_CHECKBUTTON_CONTAINER:
Martin Stransky 553a4d7
     case MOZ_GTK_RADIOBUTTON_CONTAINER:
Martin Stransky 553a4d7
         {
Martin Stransky 553a4d7
-            gboolean interior_focus;
Martin Stransky 553a4d7
-            gint focus_width, focus_pad;
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-            /* If the focus is _not_ interior, then the container has a border
Martin Stransky 553a4d7
-               of (focus_width + focus_pad). */
Martin Stransky 553a4d7
             if (widget == MOZ_GTK_CHECKBUTTON_CONTAINER) {
Martin Stransky 553a4d7
                 ensure_checkbox_widget();
Martin Stransky 553a4d7
-                moz_gtk_widget_get_focus(gCheckboxWidget, &interior_focus,
Martin Stransky 553a4d7
-                                           &focus_width, &focus_pad);
Martin Stransky 553a4d7
                 w = gCheckboxWidget;
Martin Stransky 553a4d7
             } else {
Martin Stransky 553a4d7
                 ensure_radiobutton_widget();
Martin Stransky 553a4d7
-                moz_gtk_widget_get_focus(gRadiobuttonWidget, &interior_focus,
Martin Stransky 553a4d7
-                                        &focus_width, &focus_pad);
Martin Stransky 553a4d7
                 w = gRadiobuttonWidget;
Martin Stransky 553a4d7
             }
Martin Stransky 3342822
+            style = gtk_widget_get_style_context(w);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
             *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(w));
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
-            if (!interior_focus) {
Martin Stransky 553a4d7
-                *left += (focus_width + focus_pad);
Martin Stransky 553a4d7
-                *right += (focus_width + focus_pad);
Martin Stransky 553a4d7
-                *top += (focus_width + focus_pad);
Martin Stransky 553a4d7
-                *bottom += (focus_width + focus_pad);
Martin Stransky 553a4d7
-            }
Martin Stransky 553a4d7
-
Martin Stransky 3342822
+            moz_gtk_add_style_border(style,
Martin Stransky 3342822
+                                     left, top, right, bottom);
Martin Stransky 3342822
+            moz_gtk_add_style_padding(style,
Martin Stransky 3342822
+                                      left, top, right, bottom);
Martin Stransky 553a4d7
             return MOZ_GTK_SUCCESS;
Martin Stransky 553a4d7
         }
Martin Stransky 553a4d7
     case MOZ_GTK_MENUPOPUP:
Martin Stransky 553a4d7
         ensure_menu_popup_widget();
Martin Stransky 553a4d7
         w = gMenuPopupWidget;
Martin Stransky 553a4d7
         break;
Martin Stransky 553a4d7
     case MOZ_GTK_MENUITEM:
Martin Stransky 553a4d7
     case MOZ_GTK_CHECKMENUITEM:
Martin Stransky 3342822
@@ -2897,16 +2764,18 @@ moz_gtk_get_widget_border(GtkThemeWidget
Martin Stransky 3342822
             }
Martin Stransky 3342822
 
Martin Stransky 3342822
             *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(w));
Martin Stransky 3342822
             moz_gtk_add_style_padding(gtk_widget_get_style_context(w),
Martin Stransky 3342822
                                       left, top, right, bottom);
Martin Stransky 3342822
             return MOZ_GTK_SUCCESS;
Martin Stransky 3342822
         }
Martin Stransky 3342822
     /* These widgets have no borders, since they are not containers. */
Martin Stransky 3342822
+    case MOZ_GTK_CHECKBUTTON_LABEL:
Martin Stransky 3342822
+    case MOZ_GTK_RADIOBUTTON_LABEL:
Martin Stransky 3342822
     case MOZ_GTK_SPLITTER_HORIZONTAL:
Martin Stransky 3342822
     case MOZ_GTK_SPLITTER_VERTICAL:
Martin Stransky 3342822
     case MOZ_GTK_CHECKBUTTON:
Martin Stransky 3342822
     case MOZ_GTK_RADIOBUTTON:
Martin Stransky 3342822
     case MOZ_GTK_SCROLLBAR_BUTTON:
Martin Stransky 3342822
     case MOZ_GTK_SCROLLBAR_TRACK_HORIZONTAL:
Martin Stransky 3342822
     case MOZ_GTK_SCROLLBAR_TRACK_VERTICAL:
Martin Stransky 3342822
     case MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL:
Martin Stransky 553a4d7
diff --git a/widget/gtk/gtkdrawing.h b/widget/gtk/gtkdrawing.h
Martin Stransky 553a4d7
--- a/widget/gtk/gtkdrawing.h
Martin Stransky 553a4d7
+++ b/widget/gtk/gtkdrawing.h
Martin Stransky 553a4d7
@@ -288,49 +288,26 @@ moz_gtk_checkbox_get_metrics(gint* indic
Martin Stransky 553a4d7
  * indicator_spacing:  [OUT] the spacing between the indicator and its
Martin Stransky 553a4d7
  *                     container
Martin Stransky 553a4d7
  *
Martin Stransky 553a4d7
  * returns:    MOZ_GTK_SUCCESS if there was no error, an error code otherwise
Martin Stransky 553a4d7
  */
Martin Stransky 553a4d7
 gint
Martin Stransky 553a4d7
 moz_gtk_radio_get_metrics(gint* indicator_size, gint* indicator_spacing);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
-/**
Martin Stransky 553a4d7
- * Get the inner-border value for a GtkButton widget (button or tree header)
Martin Stransky 553a4d7
- * widget:             [IN]  the widget to get the border value for 
Martin Stransky 553a4d7
- * inner_border:       [OUT] the inner border
Martin Stransky 553a4d7
- *
Martin Stransky 553a4d7
- * returns:   MOZ_GTK_SUCCESS if there was no error, an error code otherwise
Martin Stransky 553a4d7
- */
Martin Stransky 553a4d7
-gint
Martin Stransky 553a4d7
-moz_gtk_button_get_inner_border(GtkWidget* widget, GtkBorder* inner_border);
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
 /** Get the extra size for the focus ring for outline:auto.
Martin Stransky 553a4d7
  * widget:             [IN]  the widget to get the focus metrics for    
Martin Stransky 553a4d7
  * focus_h_width:      [OUT] the horizontal width
Martin Stransky 553a4d7
  * focus_v_width:      [OUT] the vertical width
Martin Stransky 553a4d7
  *
Martin Stransky 553a4d7
  * returns:    MOZ_GTK_SUCCESS
Martin Stransky 553a4d7
  */
Martin Stransky 553a4d7
 gint
Martin Stransky 553a4d7
 moz_gtk_get_focus_outline_size(gint* focus_h_width, gint* focus_v_width);
Martin Stransky 553a4d7
 
Martin Stransky 553a4d7
-/** Get the focus metrics for a treeheadercell, button, checkbox, or radio button.
Martin Stransky 553a4d7
- * widget:             [IN]  the widget to get the focus metrics for    
Martin Stransky 553a4d7
- * interior_focus:     [OUT] whether the focus is drawn around the
Martin Stransky 553a4d7
- *                           label (TRUE) or around the whole container (FALSE)
Martin Stransky 553a4d7
- * focus_width:        [OUT] the width of the focus line
Martin Stransky 553a4d7
- * focus_pad:          [OUT] the padding between the focus line and children
Martin Stransky 553a4d7
- *
Martin Stransky 553a4d7
- * returns:    MOZ_GTK_SUCCESS if there was no error, an error code otherwise
Martin Stransky 553a4d7
- */
Martin Stransky 553a4d7
-gint
Martin Stransky 553a4d7
-moz_gtk_widget_get_focus(GtkWidget* widget, gboolean* interior_focus,
Martin Stransky 553a4d7
-                         gint* focus_width, gint* focus_pad);
Martin Stransky 553a4d7
-
Martin Stransky 553a4d7
 /** Get the horizontal padding for the menuitem widget or checkmenuitem widget.
Martin Stransky 553a4d7
  * horizontal_padding: [OUT] The left and right padding of the menuitem or checkmenuitem
Martin Stransky 553a4d7
  *
Martin Stransky 553a4d7
  * returns:    MOZ_GTK_SUCCESS if there was no error, an error code otherwise
Martin Stransky 553a4d7
  */
Martin Stransky 553a4d7
 gint
Martin Stransky 553a4d7
 moz_gtk_menuitem_get_horizontal_padding(gint* horizontal_padding);
Martin Stransky 553a4d7