Bug 1271524 - Move tab widget to WidgetCache. r=acomminos

--HG--
extra : rebase_source : 4f9b654b745934054f0ec2509ec3c21996aa2e68
This commit is contained in:
Martin Stransky 2016-08-21 23:13:00 -04:00
Родитель 4af21c4cd1
Коммит 727a172dcd
5 изменённых файлов: 183 добавлений и 132 удалений

Просмотреть файл

@ -338,6 +338,14 @@ CreateScaleWidget(GtkOrientation aOrientation)
return widget;
}
static GtkWidget*
CreateNotebookWidget()
{
GtkWidget* widget = gtk_notebook_new();
AddToWindowContainer(widget);
return widget;
}
static GtkWidget*
CreateWidget(WidgetNodeType aWidgetType)
{
@ -414,6 +422,8 @@ CreateWidget(WidgetNodeType aWidgetType)
return CreateScaleWidget(GTK_ORIENTATION_HORIZONTAL);
case MOZ_GTK_SCALE_VERTICAL:
return CreateScaleWidget(GTK_ORIENTATION_VERTICAL);
case MOZ_GTK_NOTEBOOK:
return CreateNotebookWidget();
default:
/* Not implemented */
return nullptr;
@ -621,6 +631,33 @@ GetCssNodeStyleInternal(WidgetNodeType aNodeType)
style = CreateChildCSSNode(GTK_STYLE_CLASS_SLIDER,
MOZ_GTK_SCALE_TROUGH_VERTICAL);
break;
case MOZ_GTK_TAB_TOP:
{
// TODO - create from CSS node
style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK,
GTK_STYLE_CLASS_TOP);
gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB,
static_cast<GtkRegionFlags>(0));
return style;
}
case MOZ_GTK_TAB_BOTTOM:
{
// TODO - create from CSS node
style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK,
GTK_STYLE_CLASS_BOTTOM);
gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB,
static_cast<GtkRegionFlags>(0));
return style;
}
case MOZ_GTK_NOTEBOOK:
case MOZ_GTK_NOTEBOOK_HEADER:
case MOZ_GTK_TABPANELS:
case MOZ_GTK_TAB_SCROLLARROW:
{
// TODO - create from CSS node
GtkWidget* widget = GetWidget(MOZ_GTK_NOTEBOOK);
return gtk_widget_get_style_context(widget);
}
default:
// TODO - create style from style path
GtkWidget* widget = GetWidget(aNodeType);
@ -719,6 +756,30 @@ GetWidgetStyleInternal(WidgetNodeType aNodeType)
case MOZ_GTK_SCALE_THUMB_VERTICAL:
return GetWidgetStyleWithClass(MOZ_GTK_SCALE_VERTICAL,
GTK_STYLE_CLASS_SLIDER);
case MOZ_GTK_TAB_TOP:
{
GtkStyleContext* style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK,
GTK_STYLE_CLASS_TOP);
gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB,
static_cast<GtkRegionFlags>(0));
return style;
}
case MOZ_GTK_TAB_BOTTOM:
{
GtkStyleContext* style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK,
GTK_STYLE_CLASS_BOTTOM);
gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB,
static_cast<GtkRegionFlags>(0));
return style;
}
case MOZ_GTK_NOTEBOOK:
case MOZ_GTK_NOTEBOOK_HEADER:
case MOZ_GTK_TABPANELS:
case MOZ_GTK_TAB_SCROLLARROW:
{
GtkWidget* widget = GetWidget(MOZ_GTK_NOTEBOOK);
return gtk_widget_get_style_context(widget);
}
default:
GtkWidget* widget = GetWidget(aNodeType);
MOZ_ASSERT(widget);

Просмотреть файл

@ -2281,7 +2281,7 @@ moz_gtk_progress_chunk_paint(GdkDrawable* drawable, GdkRectangle* rect,
}
gint
moz_gtk_get_tab_thickness(void)
moz_gtk_get_tab_thickness(WidgetNodeType aNodeType)
{
ensure_tab_widget();
if (YTHICKNESS(gTabWidget->style) < 2)
@ -2293,7 +2293,8 @@ moz_gtk_get_tab_thickness(void)
static gint
moz_gtk_tab_paint(GdkDrawable* drawable, GdkRectangle* rect,
GdkRectangle* cliprect, GtkWidgetState* state,
GtkTabFlags flags, GtkTextDirection direction)
GtkTabFlags flags, GtkTextDirection direction,
WidgetNodeType widget)
{
/* When the tab isn't selected, we just draw a notebook extension.
* When it is selected, we overwrite the adjacent border of the tabpanel
@ -2302,6 +2303,7 @@ moz_gtk_tab_paint(GdkDrawable* drawable, GdkRectangle* rect,
GtkStyle* style;
GdkRectangle focusRect;
gboolean isBottomTab = (widget == MOZ_GTK_TAB_BOTTOM);
ensure_tab_widget();
gtk_widget_set_direction(gTabWidget, direction);
@ -2315,8 +2317,7 @@ moz_gtk_tab_paint(GdkDrawable* drawable, GdkRectangle* rect,
gtk_paint_extension(style, drawable, GTK_STATE_ACTIVE, GTK_SHADOW_OUT,
cliprect, gTabWidget, "tab",
rect->x, rect->y, rect->width, rect->height,
(flags & MOZ_GTK_TAB_BOTTOM) ?
GTK_POS_TOP : GTK_POS_BOTTOM );
isBottomTab ? GTK_POS_TOP : GTK_POS_BOTTOM );
} else {
/* Draw the tab and the gap
* We want the gap to be positioned exactly on the tabpanel top
@ -2357,7 +2358,7 @@ moz_gtk_tab_paint(GdkDrawable* drawable, GdkRectangle* rect,
gint gap_loffset, gap_roffset, gap_voffset, gap_height;
/* Get height needed by the gap */
gap_height = moz_gtk_get_tab_thickness();
gap_height = moz_gtk_get_tab_thickness(widget);
/* Extract gap_voffset from the first bits of flags */
gap_voffset = flags & MOZ_GTK_TAB_MARGIN_MASK;
@ -2373,7 +2374,7 @@ moz_gtk_tab_paint(GdkDrawable* drawable, GdkRectangle* rect,
gap_loffset = 0;
}
if (flags & MOZ_GTK_TAB_BOTTOM) {
if (isBottomTab) {
/* Draw the tab */
focusRect.y += gap_voffset;
focusRect.height -= gap_voffset;
@ -2971,7 +2972,8 @@ moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top,
ensure_check_menu_item_widget();
w = gCheckMenuItemWidget;
break;
case MOZ_GTK_TAB:
case MOZ_GTK_TAB_TOP:
case MOZ_GTK_TAB_BOTTOM:
ensure_tab_widget();
w = gTabWidget;
break;
@ -3019,14 +3021,15 @@ moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top,
gint
moz_gtk_get_tab_border(gint* left, gint* top, gint* right, gint* bottom,
GtkTextDirection direction, GtkTabFlags flags)
GtkTextDirection direction, GtkTabFlags flags,
WidgetNodeType widget)
{
moz_gtk_get_widget_border(MOZ_GTK_TAB, left, top,
moz_gtk_get_widget_border(widget, left, top,
right, bottom, direction,
FALSE);
// Top tabs have no bottom border, bottom tabs have no top border
if (flags & MOZ_GTK_TAB_BOTTOM) {
if (widget == MOZ_GTK_TAB_BOTTOM) {
*top = 0;
} else {
*bottom = 0;
@ -3368,9 +3371,10 @@ moz_gtk_widget_paint(WidgetNodeType widget, GdkDrawable* drawable,
return moz_gtk_progress_chunk_paint(drawable, rect, cliprect,
direction, widget);
break;
case MOZ_GTK_TAB:
case MOZ_GTK_TAB_TOP:
case MOZ_GTK_TAB_BOTTOM:
return moz_gtk_tab_paint(drawable, rect, cliprect, state,
(GtkTabFlags) flags, direction);
(GtkTabFlags) flags, direction, widget);
break;
case MOZ_GTK_TABPANELS:
return moz_gtk_tabpanels_paint(drawable, rect, cliprect, direction);

Просмотреть файл

@ -27,7 +27,6 @@ static GtkWidget* gComboBoxEntryWidget;
static GtkWidget* gComboBoxEntryTextareaWidget;
static GtkWidget* gComboBoxEntryButtonWidget;
static GtkWidget* gComboBoxEntryArrowWidget;
static GtkWidget* gTabWidget;
static style_prop_t style_prop_func;
static gboolean have_arrow_scaling;
@ -44,6 +43,9 @@ static gboolean is_initialized;
#define GTK_STATE_FLAG_CHECKED (1 << 11)
#endif
static gint
moz_gtk_get_tab_thickness(GtkStyleContext *style);
static GtkStateFlags
GetStateFlagsFromGtkWidgetState(GtkWidgetState* state)
{
@ -63,6 +65,13 @@ GetStateFlagsFromGtkWidgetState(GtkWidgetState* state)
return stateFlags;
}
static GtkStateFlags
GetStateFlagsFromGtkTabFlags(GtkTabFlags flags)
{
return ((flags & MOZ_GTK_TAB_SELECTED) == 0) ?
GTK_STATE_FLAG_NORMAL : GTK_STATE_FLAG_ACTIVE;
}
gint
moz_gtk_enable_style_props(style_prop_t styleGetProp)
{
@ -276,16 +285,6 @@ ensure_combo_box_entry_widgets()
return MOZ_GTK_SUCCESS;
}
static gint
ensure_tab_widget()
{
if (!gTabWidget) {
gTabWidget = gtk_notebook_new();
setup_widget_prototype(gTabWidget);
}
return MOZ_GTK_SUCCESS;
}
gint
moz_gtk_init()
{
@ -301,13 +300,17 @@ moz_gtk_init()
else
checkbox_check_state = GTK_STATE_FLAG_ACTIVE;
if(!gtk_check_version(3, 12, 0)) {
ensure_tab_widget();
gtk_style_context_get_style(gtk_widget_get_style_context(gTabWidget),
if (gtk_check_version(3, 12, 0) == nullptr &&
gtk_check_version(3, 20, 0) != nullptr)
{
// Deprecated for Gtk >= 3.20+
GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_TAB_TOP);
gtk_style_context_get_style(style,
"has-tab-gap", &notebook_has_tab_gap, NULL);
ReleaseStyleContext(style);
}
else {
notebook_has_tab_gap = TRUE;
notebook_has_tab_gap = true;
}
return MOZ_GTK_SUCCESS;
@ -1563,46 +1566,35 @@ moz_gtk_progress_chunk_paint(cairo_t *cr, GdkRectangle* rect,
return MOZ_GTK_SUCCESS;
}
gint
moz_gtk_get_tab_thickness(void)
static gint
moz_gtk_get_tab_thickness(GtkStyleContext *style)
{
GtkBorder border;
GtkStyleContext * style;
ensure_tab_widget();
if (!notebook_has_tab_gap)
return 0; /* tabs do not overdraw the tabpanel border with "no gap" style */
style = gtk_widget_get_style_context(gTabWidget);
gtk_style_context_add_class(style, GTK_STYLE_CLASS_NOTEBOOK);
GtkBorder border;
gtk_style_context_get_border(style, GTK_STATE_FLAG_NORMAL, &border);
if (border.top < 2)
return 2; /* some themes don't set ythickness correctly */
return border.top;
}
static void
moz_gtk_tab_prepare_style_context(GtkStyleContext *style,
GtkTabFlags flags)
gint
moz_gtk_get_tab_thickness(WidgetNodeType aNodeType)
{
gtk_style_context_set_state(style, ((flags & MOZ_GTK_TAB_SELECTED) == 0) ?
GTK_STATE_FLAG_NORMAL :
GTK_STATE_FLAG_ACTIVE);
gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB,
(flags & MOZ_GTK_TAB_FIRST) ?
GTK_REGION_FIRST : static_cast<GtkRegionFlags>(0));
gtk_style_context_add_class(style, (flags & MOZ_GTK_TAB_BOTTOM) ?
GTK_STYLE_CLASS_BOTTOM :
GTK_STYLE_CLASS_TOP);
GtkStyleContext *style = ClaimStyleContext(aNodeType);
int thickness = moz_gtk_get_tab_thickness(style);
ReleaseStyleContext(style);
return thickness;
}
/* actual small tabs */
static gint
moz_gtk_tab_paint(cairo_t *cr, GdkRectangle* rect,
GtkWidgetState* state,
GtkTabFlags flags, GtkTextDirection direction)
GtkTabFlags flags, GtkTextDirection direction,
WidgetNodeType widget)
{
/* When the tab isn't selected, we just draw a notebook extension.
* When it is selected, we overwrite the adjacent border of the tabpanel
@ -1614,14 +1606,10 @@ moz_gtk_tab_paint(cairo_t *cr, GdkRectangle* rect,
GdkRectangle focusRect;
GdkRectangle backRect;
int initial_gap = 0;
bool isBottomTab = (widget == MOZ_GTK_TAB_BOTTOM);
ensure_tab_widget();
gtk_widget_set_direction(gTabWidget, direction);
style = gtk_widget_get_style_context(gTabWidget);
gtk_style_context_save(style);
moz_gtk_tab_prepare_style_context(style, flags);
style = ClaimStyleContext(widget, direction,
GetStateFlagsFromGtkTabFlags(flags));
tabRect = *rect;
if (flags & MOZ_GTK_TAB_FIRST) {
@ -1640,8 +1628,7 @@ moz_gtk_tab_paint(cairo_t *cr, GdkRectangle* rect,
/* Only draw the tab */
gtk_render_extension(style, cr,
tabRect.x, tabRect.y, tabRect.width, tabRect.height,
(flags & MOZ_GTK_TAB_BOTTOM) ?
GTK_POS_TOP : GTK_POS_BOTTOM );
isBottomTab ? GTK_POS_TOP : GTK_POS_BOTTOM );
} else {
/* Draw the tab and the gap
* We want the gap to be positioned exactly on the tabpanel top
@ -1682,7 +1669,7 @@ moz_gtk_tab_paint(cairo_t *cr, GdkRectangle* rect,
gint gap_loffset, gap_roffset, gap_voffset, gap_height;
/* Get height needed by the gap */
gap_height = moz_gtk_get_tab_thickness();
gap_height = moz_gtk_get_tab_thickness(style);
/* Extract gap_voffset from the first bits of flags */
gap_voffset = flags & MOZ_GTK_TAB_MARGIN_MASK;
@ -1698,7 +1685,7 @@ moz_gtk_tab_paint(cairo_t *cr, GdkRectangle* rect,
gap_loffset = initial_gap;
}
if (flags & MOZ_GTK_TAB_BOTTOM) {
if (isBottomTab) {
/* Draw the tab on bottom */
focusRect.y += gap_voffset;
focusRect.height -= gap_voffset;
@ -1762,15 +1749,9 @@ moz_gtk_tab_paint(cairo_t *cr, GdkRectangle* rect,
gtk_render_frame(style, cr, tabRect.x, tabRect.y, tabRect.width, tabRect.height);
}
gtk_style_context_restore(style);
if (state->focused) {
/* Paint the focus ring */
GtkBorder padding;
gtk_style_context_save(style);
moz_gtk_tab_prepare_style_context(style, flags);
gtk_style_context_get_padding(style, GetStateFlagsFromGtkWidgetState(state), &padding);
focusRect.x += padding.left;
@ -1780,10 +1761,8 @@ moz_gtk_tab_paint(cairo_t *cr, GdkRectangle* rect,
gtk_render_focus(style, cr,
focusRect.x, focusRect.y, focusRect.width, focusRect.height);
gtk_style_context_restore(style);
}
ReleaseStyleContext(style);
return MOZ_GTK_SUCCESS;
}
@ -1793,14 +1772,7 @@ static gint
moz_gtk_tabpanels_paint(cairo_t *cr, GdkRectangle* rect,
GtkTextDirection direction)
{
GtkStyleContext* style;
ensure_tab_widget();
gtk_widget_set_direction(gTabWidget, direction);
style = gtk_widget_get_style_context(gTabWidget);
gtk_style_context_save(style);
GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_TABPANELS, direction);
gtk_render_background(style, cr, rect->x, rect->y,
rect->width, rect->height);
/*
@ -1837,7 +1809,7 @@ moz_gtk_tabpanels_paint(cairo_t *cr, GdkRectangle* rect,
GTK_POS_TOP, 0, 1);
cairo_restore(cr);
gtk_style_context_restore(style);
ReleaseStyleContext(style);
return MOZ_GTK_SUCCESS;
}
@ -1847,17 +1819,12 @@ moz_gtk_tab_scroll_arrow_paint(cairo_t *cr, GdkRectangle* rect,
GtkArrowType arrow_type,
GtkTextDirection direction)
{
GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state);
GtkStyleContext* style;
gdouble arrow_angle;
gint arrow_size = MIN(rect->width, rect->height);
gint x = rect->x + (rect->width - arrow_size) / 2;
gint y = rect->y + (rect->height - arrow_size) / 2;
ensure_tab_widget();
style = gtk_widget_get_style_context(gTabWidget);
gtk_style_context_save(style);
if (direction == GTK_TEXT_DIR_RTL) {
arrow_type = (arrow_type == GTK_ARROW_LEFT) ?
GTK_ARROW_RIGHT : GTK_ARROW_LEFT;
@ -1877,12 +1844,12 @@ moz_gtk_tab_scroll_arrow_paint(cairo_t *cr, GdkRectangle* rect,
break;
}
if (arrow_type != GTK_ARROW_NONE) {
gtk_style_context_add_class(style, GTK_STYLE_CLASS_NOTEBOOK); /* TODO TEST */
gtk_style_context_set_state(style, state_flags);
style = ClaimStyleContext(MOZ_GTK_TAB_SCROLLARROW, direction,
GetStateFlagsFromGtkWidgetState(state));
gtk_render_arrow(style, cr, arrow_angle,
x, y, arrow_size);
ReleaseStyleContext(style);
}
gtk_style_context_restore(style);
return MOZ_GTK_SUCCESS;
}
@ -2269,8 +2236,7 @@ moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top,
return MOZ_GTK_SUCCESS;
}
case MOZ_GTK_TABPANELS:
ensure_tab_widget();
w = gTabWidget;
w = GetWidget(MOZ_GTK_TABPANELS);
break;
case MOZ_GTK_PROGRESSBAR:
w = GetWidget(MOZ_GTK_PROGRESSBAR);
@ -2376,35 +2342,48 @@ moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top,
gint
moz_gtk_get_tab_border(gint* left, gint* top, gint* right, gint* bottom,
GtkTextDirection direction, GtkTabFlags flags)
GtkTextDirection direction, GtkTabFlags flags,
WidgetNodeType widget)
{
GtkStyleContext* style;
int tab_curvature;
ensure_tab_widget();
style = gtk_widget_get_style_context(gTabWidget);
gtk_style_context_save(style);
moz_gtk_tab_prepare_style_context(style, flags);
GtkStyleContext* style = ClaimStyleContext(widget, direction,
GetStateFlagsFromGtkTabFlags(flags));
*left = *top = *right = *bottom = 0;
moz_gtk_add_style_padding(style, left, top, right, bottom);
// Gtk >= 3.20 does not use those styles
if (gtk_check_version(3, 20, 0) != nullptr) {
int tab_curvature;
gtk_style_context_get_style(style, "tab-curvature", &tab_curvature, NULL);
*left += tab_curvature;
*right += tab_curvature;
if (flags & MOZ_GTK_TAB_FIRST) {
int initial_gap;
int initial_gap = 0;
gtk_style_context_get_style(style, "initial-gap", &initial_gap, NULL);
if (direction == GTK_TEXT_DIR_RTL)
*right += initial_gap;
else
*left += initial_gap;
}
} else {
GtkBorder margin;
gtk_style_context_restore(style);
gtk_style_context_get_margin(style, GTK_STATE_FLAG_NORMAL, &margin);
*left += margin.left;
*right += margin.right;
if (flags & MOZ_GTK_TAB_FIRST) {
ReleaseStyleContext(style);
style = ClaimStyleContext(MOZ_GTK_NOTEBOOK_HEADER, direction);
gtk_style_context_get_margin(style, GTK_STATE_FLAG_NORMAL, &margin);
*left += margin.left;
*right += margin.right;
}
}
ReleaseStyleContext(style);
return MOZ_GTK_SUCCESS;
}
@ -2431,10 +2410,11 @@ moz_gtk_get_tab_scroll_arrow_size(gint* width, gint* height)
{
gint arrow_size;
ensure_tab_widget();
gtk_style_context_get_style(gtk_widget_get_style_context(gTabWidget),
GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_TABPANELS);
gtk_style_context_get_style(style,
"scroll-arrow-hlength", &arrow_size,
NULL);
ReleaseStyleContext(style);
*height = *width = arrow_size;
@ -2816,9 +2796,10 @@ moz_gtk_widget_paint(WidgetNodeType widget, cairo_t *cr,
return moz_gtk_progress_chunk_paint(cr, rect,
direction, widget);
break;
case MOZ_GTK_TAB:
case MOZ_GTK_TAB_TOP:
case MOZ_GTK_TAB_BOTTOM:
return moz_gtk_tab_paint(cr, rect, state,
(GtkTabFlags) flags, direction);
(GtkTabFlags) flags, direction, widget);
break;
case MOZ_GTK_TABPANELS:
return moz_gtk_tabpanels_paint(cr, rect, direction);
@ -2911,7 +2892,6 @@ moz_gtk_shutdown()
gComboBoxEntryButtonWidget = NULL;
gComboBoxEntryArrowWidget = NULL;
gComboBoxEntryTextareaWidget = NULL;
gTabWidget = NULL;
is_initialized = FALSE;

Просмотреть файл

@ -61,8 +61,6 @@ typedef enum {
typedef enum {
/* first eight bits are used to pass a margin */
MOZ_GTK_TAB_MARGIN_MASK = 0xFF,
/* bottom tabs */
MOZ_GTK_TAB_BOTTOM = 1 << 8,
/* the first tab in the group */
MOZ_GTK_TAB_FIRST = 1 << 9,
/* the selected tab */
@ -178,8 +176,14 @@ typedef enum {
MOZ_GTK_PROGRESS_CHUNK_INDETERMINATE,
/* Paints a progress chunk of a vertical indeterminated GtkProgressBar. */
MOZ_GTK_PROGRESS_CHUNK_VERTICAL_INDETERMINATE,
/* Used as root style of whole GtkNotebook widget */
MOZ_GTK_NOTEBOOK,
/* Used as root style of active GtkNotebook area which contains tabs and arrows. */
MOZ_GTK_NOTEBOOK_HEADER,
/* Paints a tab of a GtkNotebook. flags is a GtkTabFlags, defined above. */
MOZ_GTK_TAB,
MOZ_GTK_TAB_TOP,
/* Paints a tab of a GtkNotebook. flags is a GtkTabFlags, defined above. */
MOZ_GTK_TAB_BOTTOM,
/* Paints the background and border of a GtkNotebook. */
MOZ_GTK_TABPANELS,
/* Paints a GtkArrow for a GtkNotebook. flags is a GtkArrowType. */
@ -314,12 +318,14 @@ gint moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top,
* top/bottom: [OUT] the tab's top/bottom border
* direction: the text direction for the widget
* flags: tab-dependant flags; see the GtkTabFlags definition.
* widget: tab widget
*
* returns: MOZ_GTK_SUCCESS if there was no error, an error code otherwise
*/
gint
moz_gtk_get_tab_border(gint* left, gint* top, gint* right, gint* bottom,
GtkTextDirection direction, GtkTabFlags flags);
GtkTextDirection direction, GtkTabFlags flags,
WidgetNodeType widget);
/**
* Get the desired size of a GtkCheckButton
@ -495,7 +501,8 @@ GtkWidget* moz_gtk_get_scrollbar_widget(void);
/**
* Get the YTHICKNESS of a tab (notebook extension).
*/
gint moz_gtk_get_tab_thickness(void);
gint
moz_gtk_get_tab_thickness(WidgetNodeType aNodeType);
/**
* Get a boolean which indicates whether or not to use images in menus.

Просмотреть файл

@ -638,17 +638,17 @@ nsNativeThemeGTK::GetGtkWidgetAndState(uint8_t aWidgetType, nsIFrame* aFrame,
break;
case NS_THEME_TAB:
{
if (IsBottomTab(aFrame)) {
aGtkWidgetType = MOZ_GTK_TAB_BOTTOM;
} else {
aGtkWidgetType = MOZ_GTK_TAB_TOP;
}
if (aWidgetFlags) {
/* First bits will be used to store max(0,-bmargin) where bmargin
* is the bottom margin of the tab in pixels (resp. top margin,
* for bottom tabs). */
if (IsBottomTab(aFrame)) {
*aWidgetFlags = MOZ_GTK_TAB_BOTTOM;
} else {
*aWidgetFlags = 0;
}
*aWidgetFlags |= GetTabMarginPixels(aFrame);
*aWidgetFlags = GetTabMarginPixels(aFrame);
if (IsSelectedTab(aFrame))
*aWidgetFlags |= MOZ_GTK_TAB_SELECTED;
@ -656,8 +656,6 @@ nsNativeThemeGTK::GetGtkWidgetAndState(uint8_t aWidgetType, nsIFrame* aFrame,
if (IsFirstTab(aFrame))
*aWidgetFlags |= MOZ_GTK_TAB_FIRST;
}
aGtkWidgetType = MOZ_GTK_TAB;
}
break;
case NS_THEME_SPLITTER:
@ -1071,7 +1069,8 @@ nsNativeThemeGTK::GetExtraSizeForWidget(nsIFrame* aFrame, uint8_t aWidgetType,
if (!IsSelectedTab(aFrame))
return false;
gint gap_height = moz_gtk_get_tab_thickness();
gint gap_height = moz_gtk_get_tab_thickness(IsBottomTab(aFrame) ?
MOZ_GTK_TAB_BOTTOM : MOZ_GTK_TAB_TOP);
if (!gap_height)
return false;
@ -1298,7 +1297,7 @@ nsNativeThemeGTK::GetWidgetBorder(nsDeviceContext* aContext, nsIFrame* aFrame,
moz_gtk_get_tab_border(&aResult->left, &aResult->top,
&aResult->right, &aResult->bottom, direction,
(GtkTabFlags)flags);
(GtkTabFlags)flags, gtkWidgetType);
}
break;
case NS_THEME_MENUITEM: