Issue #1705 - Part 8: Implement scrollbar-width:thin on GTK.

This commit is contained in:
Moonchild 2021-01-09 23:20:31 +00:00 • committed by roytam1
commit 2d99d18c21

View file

@ -1098,6 +1098,12 @@ nsNativeThemeGTK::GetExtraSizeForWidget(nsIFrame* aFrame, uint8_t aWidgetType,
return true; return true;
} }
static bool
IsScrollbarWidthThin(nsIFrame* aFrame)
{
return aFrame->StyleUserInterface()->mScrollbarWidth == StyleScrollbarWidth::Thin;
}
NS_IMETHODIMP NS_IMETHODIMP
nsNativeThemeGTK::DrawWidgetBackground(nsRenderingContext* aContext, nsNativeThemeGTK::DrawWidgetBackground(nsRenderingContext* aContext,
nsIFrame* aFrame, nsIFrame* aFrame,
@ -1419,32 +1425,39 @@ nsNativeThemeGTK::GetMinimumWidgetSize(nsPresContext* aPresContext,
case NS_THEME_SCROLLBARBUTTON_UP: case NS_THEME_SCROLLBARBUTTON_UP:
case NS_THEME_SCROLLBARBUTTON_DOWN: case NS_THEME_SCROLLBARBUTTON_DOWN:
{ {
if (gtk_check_version(3,20,0) == nullptr) { if (!IsScrollbarWidthThin(aFrame)) {
moz_gtk_get_widget_min_size(MOZ_GTK_SCROLLBAR_BUTTON, // Get scrollbar button metrics from the system, except in the case of
&(aResult->width), &(aResult->height)); // thin scrollbars, where we leave them at 0 (collapse)
} else { if (gtk_check_version(3,20,0) == nullptr) {
MozGtkScrollbarMetrics metrics; moz_gtk_get_widget_min_size(MOZ_GTK_SCROLLBAR_BUTTON,
moz_gtk_get_scrollbar_metrics(&metrics); &(aResult->width), &(aResult->height));
} else {
MozGtkScrollbarMetrics metrics;
moz_gtk_get_scrollbar_metrics(&metrics);
aResult->width = metrics.slider_width; aResult->width = metrics.slider_width;
aResult->height = metrics.stepper_size; aResult->height = metrics.stepper_size;
}
} }
*aIsOverridable = false; *aIsOverridable = false;
} }
break; break;
case NS_THEME_SCROLLBARBUTTON_LEFT: case NS_THEME_SCROLLBARBUTTON_LEFT:
case NS_THEME_SCROLLBARBUTTON_RIGHT: case NS_THEME_SCROLLBARBUTTON_RIGHT:
{ {
if (gtk_check_version(3,20,0) == nullptr) { if (!IsScrollbarWidthThin(aFrame)) {
moz_gtk_get_widget_min_size(MOZ_GTK_SCROLLBAR_BUTTON, // Get scrollbar button metrics from the system, except in the case of
&(aResult->width), &(aResult->height)); // thin scrollbars, where we leave them at 0 (collapse)
} else { if (gtk_check_version(3,20,0) == nullptr) {
MozGtkScrollbarMetrics metrics; moz_gtk_get_widget_min_size(MOZ_GTK_SCROLLBAR_BUTTON,
moz_gtk_get_scrollbar_metrics(&metrics); &(aResult->width), &(aResult->height));
} else {
MozGtkScrollbarMetrics metrics;
moz_gtk_get_scrollbar_metrics(&metrics);
aResult->width = metrics.stepper_size; aResult->width = metrics.stepper_size;
aResult->height = metrics.slider_width; aResult->height = metrics.slider_width;
}
} }
*aIsOverridable = false; *aIsOverridable = false;
} }
@ -1514,6 +1527,24 @@ nsNativeThemeGTK::GetMinimumWidgetSize(nsPresContext* aPresContext,
} }
break; break;
case NS_THEME_SCROLLBARTHUMB_VERTICAL: case NS_THEME_SCROLLBARTHUMB_VERTICAL:
{
if (gtk_check_version(3,20,0) == nullptr) {
moz_gtk_get_widget_min_size(NativeThemeToGtkTheme(aWidgetType, aFrame),
&(aResult->width), &(aResult->height));
} else {
MozGtkScrollbarMetrics metrics;
moz_gtk_get_scrollbar_metrics(&metrics);
aResult->width = metrics.slider_width;
aResult->height = metrics.min_slider_size;
}
if (IsScrollbarWidthThin(aFrame)) {
// If thin scrollbars, divide the thickness by 3
aResult->width /= 3;
}
*aIsOverridable = false;
}
break;
case NS_THEME_SCROLLBARTHUMB_HORIZONTAL: case NS_THEME_SCROLLBARTHUMB_HORIZONTAL:
{ {
if (gtk_check_version(3,20,0) == nullptr) { if (gtk_check_version(3,20,0) == nullptr) {
@ -1523,13 +1554,12 @@ nsNativeThemeGTK::GetMinimumWidgetSize(nsPresContext* aPresContext,
MozGtkScrollbarMetrics metrics; MozGtkScrollbarMetrics metrics;
moz_gtk_get_scrollbar_metrics(&metrics); moz_gtk_get_scrollbar_metrics(&metrics);
if (aWidgetType == NS_THEME_SCROLLBARTHUMB_VERTICAL) { aResult->height = metrics.slider_width;
aResult->width = metrics.slider_width; aResult->width = metrics.min_slider_size;
aResult->height = metrics.min_slider_size; }
} else { if (IsScrollbarWidthThin(aFrame)) {
aResult->height = metrics.slider_width; // If thin scrollbars, divide the thickness by 3
aResult->width = metrics.min_slider_size; aResult->height /= 3;
}
} }
*aIsOverridable = false; *aIsOverridable = false;
} }