From 382fe423e53a6db2cae7b75d75dca50d3613ac60 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 8 Jan 2021 16:33:36 +0000 Subject: Issue #1705 - Part 7: Implement scrollbar-width:thin on Windows. --- widget/windows/nsNativeThemeWin.cpp | 41 +++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) (limited to 'widget/windows') diff --git a/widget/windows/nsNativeThemeWin.cpp b/widget/windows/nsNativeThemeWin.cpp index e84a2b80ce..0947019caa 100644 --- a/widget/windows/nsNativeThemeWin.cpp +++ b/widget/windows/nsNativeThemeWin.cpp @@ -1388,6 +1388,12 @@ GetThemeDpiScaleFactor(nsIFrame* aFrame) return 1.0; } +static bool +IsScrollbarWidthThin(nsIFrame* aFrame) +{ + return aFrame->StyleUserInterface()->mScrollbarWidth == StyleScrollbarWidth::Thin; +} + NS_IMETHODIMP nsNativeThemeWin::DrawWidgetBackground(nsRenderingContext* aContext, nsIFrame* aFrame, @@ -2788,14 +2794,21 @@ nsNativeThemeWin::ClassicGetMinimumWidgetSize(nsIFrame* aFrame, break; case NS_THEME_SCROLLBARBUTTON_UP: case NS_THEME_SCROLLBARBUTTON_DOWN: - (*aResult).width = ::GetSystemMetrics(SM_CXVSCROLL); - (*aResult).height = ::GetSystemMetrics(SM_CYVSCROLL); + // Get scrollbar button metrics from the system, except in the case of + // thin scrollbars, where we leave them at 0 (collapsing them to invisible) + if (!IsScrollbarWidthThin(aFrame)) { + (*aResult).width = ::GetSystemMetrics(SM_CXVSCROLL); + (*aResult).height = ::GetSystemMetrics(SM_CYVSCROLL); + } *aIsOverridable = false; break; case NS_THEME_SCROLLBARBUTTON_LEFT: case NS_THEME_SCROLLBARBUTTON_RIGHT: - (*aResult).width = ::GetSystemMetrics(SM_CXHSCROLL); - (*aResult).height = ::GetSystemMetrics(SM_CYHSCROLL); + // See comment above. + if (!IsScrollbarWidthThin(aFrame)) { + (*aResult).width = ::GetSystemMetrics(SM_CXHSCROLL); + (*aResult).height = ::GetSystemMetrics(SM_CYHSCROLL); + } *aIsOverridable = false; break; case NS_THEME_SCROLLBAR_VERTICAL: @@ -2871,8 +2884,14 @@ nsNativeThemeWin::ClassicGetMinimumWidgetSize(nsIFrame* aFrame, (*aResult).height = ::GetSystemMetrics(SM_CYVTHUMB); // Without theming, divide the thumb size by two in order to look more // native - if (!GetTheme(aWidgetType)) - (*aResult).height >>= 1; + if (!GetTheme(aWidgetType)) { + (*aResult).height /= 2; + } + // If scrollbar-width is thin, divide the thickness by three to make + // it more compact. + if (IsScrollbarWidthThin(aFrame)) { + (*aResult).width /= 3; + } *aIsOverridable = false; break; case NS_THEME_SCROLLBARTHUMB_HORIZONTAL: @@ -2880,8 +2899,14 @@ nsNativeThemeWin::ClassicGetMinimumWidgetSize(nsIFrame* aFrame, (*aResult).height = ::GetSystemMetrics(SM_CYHSCROLL); // Without theming, divide the thumb size by two in order to look more // native - if (!GetTheme(aWidgetType)) - (*aResult).width >>= 1; + if (!GetTheme(aWidgetType)) { + (*aResult).width /= 2; + } + // If scrollbar-width is thin, divide the thickness by three to make + // it more compact. + if (IsScrollbarWidthThin(aFrame)) { + (*aResult).height /= 3; + } *aIsOverridable = false; break; case NS_THEME_SCROLLBAR_HORIZONTAL: -- cgit v1.2.3