mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-27 23:02:20 +00:00
40b88fe3ed
GTK already did this, sorta, in a platform-specific way: by hacking in the scale factor in the CSS screen code. I think this is cleaner, since we have a centralized place to compute the full zoom in nsPresContext, and that code path is fairly well tested. This also would make it trivial to make this text zoom rather than full zoom in the future, if we wanted (which is probably _technically_ more correct, even though less pretty less pretty). This also allows us to remove some hacks where we were undoing the text scale factor on Linux (since stuff like scrollbars already ignore full zoom). Depends on D148675 Differential Revision: https://phabricator.services.mozilla.com/D148676
135 lines
5.1 KiB
C++
135 lines
5.1 KiB
C++
/* -*- Mode: C++; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "ScrollbarDrawingGTK.h"
|
|
|
|
#include "mozilla/gfx/Helpers.h"
|
|
#include "mozilla/StaticPrefs_widget.h"
|
|
#include "nsLayoutUtils.h"
|
|
#include "nsNativeTheme.h"
|
|
|
|
using namespace mozilla;
|
|
using namespace mozilla::gfx;
|
|
using namespace mozilla::widget;
|
|
|
|
LayoutDeviceIntSize ScrollbarDrawingGTK::GetMinimumWidgetSize(
|
|
nsPresContext* aPresContext, StyleAppearance aAppearance,
|
|
nsIFrame* aFrame) {
|
|
MOZ_ASSERT(nsNativeTheme::IsWidgetScrollbarPart(aAppearance));
|
|
auto sizes = GetScrollbarSizes(aPresContext, aFrame);
|
|
MOZ_ASSERT(sizes.mHorizontal == sizes.mVertical);
|
|
LayoutDeviceIntSize size{sizes.mHorizontal, sizes.mVertical};
|
|
if (aAppearance == StyleAppearance::ScrollbarHorizontal ||
|
|
aAppearance == StyleAppearance::ScrollbarVertical ||
|
|
aAppearance == StyleAppearance::ScrollbarthumbHorizontal ||
|
|
aAppearance == StyleAppearance::ScrollbarthumbVertical) {
|
|
CSSCoord thumbSize(
|
|
StaticPrefs::widget_non_native_theme_gtk_scrollbar_thumb_cross_size());
|
|
const bool isVertical =
|
|
aAppearance == StyleAppearance::ScrollbarVertical ||
|
|
aAppearance == StyleAppearance::ScrollbarthumbVertical;
|
|
auto dpi = GetDPIRatioForScrollbarPart(aPresContext);
|
|
if (isVertical) {
|
|
size.height = thumbSize * dpi;
|
|
} else {
|
|
size.width = thumbSize * dpi;
|
|
}
|
|
}
|
|
return size;
|
|
}
|
|
|
|
Maybe<nsITheme::Transparency> ScrollbarDrawingGTK::GetScrollbarPartTransparency(
|
|
nsIFrame* aFrame, StyleAppearance aAppearance) {
|
|
if (!aFrame->PresContext()->UseOverlayScrollbars() &&
|
|
(aAppearance == StyleAppearance::ScrollbarVertical ||
|
|
aAppearance == StyleAppearance::ScrollbarHorizontal) &&
|
|
IsScrollbarTrackOpaque(aFrame)) {
|
|
return Some(nsITheme::eOpaque);
|
|
}
|
|
|
|
return Nothing();
|
|
}
|
|
|
|
template <typename PaintBackendData>
|
|
bool ScrollbarDrawingGTK::DoPaintScrollbarThumb(
|
|
PaintBackendData& aPaintData, const LayoutDeviceRect& aRect,
|
|
ScrollbarKind aScrollbarKind, nsIFrame* aFrame, const ComputedStyle& aStyle,
|
|
const ElementState& aElementState, const DocumentState& aDocumentState,
|
|
const Colors& aColors, const DPIRatio& aDpiRatio) {
|
|
sRGBColor thumbColor = ComputeScrollbarThumbColor(
|
|
aFrame, aStyle, aElementState, aDocumentState, aColors);
|
|
|
|
LayoutDeviceRect thumbRect(aRect);
|
|
|
|
const bool horizontal = aScrollbarKind == ScrollbarKind::Horizontal;
|
|
if (aFrame->PresContext()->UseOverlayScrollbars() &&
|
|
!ScrollbarDrawing::IsParentScrollbarHoveredOrActive(aFrame)) {
|
|
if (horizontal) {
|
|
thumbRect.height *= 0.5;
|
|
thumbRect.y += thumbRect.height;
|
|
} else {
|
|
thumbRect.width *= 0.5;
|
|
if (aScrollbarKind == ScrollbarKind::VerticalRight) {
|
|
thumbRect.x += thumbRect.width;
|
|
}
|
|
}
|
|
}
|
|
|
|
{
|
|
float factor = std::max(
|
|
0.0f,
|
|
1.0f - StaticPrefs::widget_non_native_theme_gtk_scrollbar_thumb_size());
|
|
thumbRect.Deflate((horizontal ? thumbRect.height : thumbRect.width) *
|
|
factor);
|
|
}
|
|
|
|
LayoutDeviceCoord radius =
|
|
StaticPrefs::widget_non_native_theme_gtk_scrollbar_round_thumb()
|
|
? (horizontal ? thumbRect.height : thumbRect.width) / 2.0f
|
|
: 0.0f;
|
|
|
|
ThemeDrawing::PaintRoundedRectWithRadius(aPaintData, thumbRect, thumbColor,
|
|
sRGBColor(), 0, radius / aDpiRatio,
|
|
aDpiRatio);
|
|
return true;
|
|
}
|
|
|
|
bool ScrollbarDrawingGTK::PaintScrollbarThumb(
|
|
DrawTarget& aDrawTarget, const LayoutDeviceRect& aRect,
|
|
ScrollbarKind aScrollbarKind, nsIFrame* aFrame, const ComputedStyle& aStyle,
|
|
const ElementState& aElementState, const DocumentState& aDocumentState,
|
|
const Colors& aColors, const DPIRatio& aDpiRatio) {
|
|
return DoPaintScrollbarThumb(aDrawTarget, aRect, aScrollbarKind, aFrame,
|
|
aStyle, aElementState, aDocumentState, aColors,
|
|
aDpiRatio);
|
|
}
|
|
|
|
bool ScrollbarDrawingGTK::PaintScrollbarThumb(
|
|
WebRenderBackendData& aWrData, const LayoutDeviceRect& aRect,
|
|
ScrollbarKind aScrollbarKind, nsIFrame* aFrame, const ComputedStyle& aStyle,
|
|
const ElementState& aElementState, const DocumentState& aDocumentState,
|
|
const Colors& aColors, const DPIRatio& aDpiRatio) {
|
|
return DoPaintScrollbarThumb(aWrData, aRect, aScrollbarKind, aFrame, aStyle,
|
|
aElementState, aDocumentState, aColors,
|
|
aDpiRatio);
|
|
}
|
|
|
|
bool ScrollbarDrawingGTK::ShouldDrawScrollbarButtons() {
|
|
if (StaticPrefs::widget_non_native_theme_enabled()) {
|
|
return StaticPrefs::widget_non_native_theme_gtk_scrollbar_allow_buttons();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void ScrollbarDrawingGTK::RecomputeScrollbarParams() {
|
|
uint32_t defaultSize = 12;
|
|
uint32_t overrideSize =
|
|
StaticPrefs::widget_non_native_theme_scrollbar_size_override();
|
|
if (overrideSize > 0) {
|
|
defaultSize = overrideSize;
|
|
}
|
|
mHorizontalScrollbarHeight = mVerticalScrollbarWidth = defaultSize;
|
|
}
|