mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
28290f66db
Make the ScreenOrientation part of the screen struct, as it should. Stop using HAL to propagate just screen orientation updates, use the more general screen manager. Instead of HAL observers, add a simple observer service notification, and clean a bunch of the code. This will simplify bug 1754802 a bit, and is generally simpler. Shouldn't change behavior. I've tested the events and some common orientation locking use cases like Youtube, and they behave the same. Differential Revision: https://phabricator.services.mozilla.com/D138477
142 lines
4.6 KiB
C++
142 lines
4.6 KiB
C++
/* -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 2; -*- */
|
|
/* vim: set sw=2 ts=8 et tw=80 : */
|
|
/* 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 "Screen.h"
|
|
|
|
#include "mozilla/dom/DOMTypes.h"
|
|
#include "mozilla/Hal.h"
|
|
#include "mozilla/StaticPrefs_layout.h"
|
|
|
|
namespace mozilla::widget {
|
|
|
|
NS_IMPL_ISUPPORTS(Screen, nsIScreen)
|
|
|
|
static hal::ScreenOrientation EffectiveOrientation(
|
|
hal::ScreenOrientation aOrientation, const LayoutDeviceIntRect& aRect) {
|
|
if (aOrientation == hal::ScreenOrientation::None) {
|
|
return aRect.Width() >= aRect.Height()
|
|
? hal::ScreenOrientation::LandscapePrimary
|
|
: hal::ScreenOrientation::PortraitPrimary;
|
|
}
|
|
return aOrientation;
|
|
}
|
|
|
|
Screen::Screen(LayoutDeviceIntRect aRect, LayoutDeviceIntRect aAvailRect,
|
|
uint32_t aPixelDepth, uint32_t aColorDepth,
|
|
DesktopToLayoutDeviceScale aContentsScale,
|
|
CSSToLayoutDeviceScale aDefaultCssScale, float aDPI,
|
|
hal::ScreenOrientation aOrientation,
|
|
OrientationAngle aOrientationAngle)
|
|
: mRect(aRect),
|
|
mAvailRect(aAvailRect),
|
|
mRectDisplayPix(RoundedToInt(aRect / aContentsScale)),
|
|
mAvailRectDisplayPix(RoundedToInt(aAvailRect / aContentsScale)),
|
|
mPixelDepth(aPixelDepth),
|
|
mColorDepth(aColorDepth),
|
|
mContentsScale(aContentsScale),
|
|
mDefaultCssScale(aDefaultCssScale),
|
|
mDPI(aDPI),
|
|
mScreenOrientation(EffectiveOrientation(aOrientation, aRect)),
|
|
mOrientationAngle(aOrientationAngle) {}
|
|
|
|
Screen::Screen(const dom::ScreenDetails& aScreen)
|
|
: mRect(aScreen.rect()),
|
|
mAvailRect(aScreen.availRect()),
|
|
mRectDisplayPix(aScreen.rectDisplayPix()),
|
|
mAvailRectDisplayPix(aScreen.availRectDisplayPix()),
|
|
mPixelDepth(aScreen.pixelDepth()),
|
|
mColorDepth(aScreen.colorDepth()),
|
|
mContentsScale(aScreen.contentsScaleFactor()),
|
|
mDefaultCssScale(aScreen.defaultCSSScaleFactor()),
|
|
mDPI(aScreen.dpi()),
|
|
mScreenOrientation(aScreen.orientation()),
|
|
mOrientationAngle(aScreen.orientationAngle()) {}
|
|
|
|
Screen::Screen(const Screen& aOther)
|
|
: mRect(aOther.mRect),
|
|
mAvailRect(aOther.mAvailRect),
|
|
mRectDisplayPix(aOther.mRectDisplayPix),
|
|
mAvailRectDisplayPix(aOther.mAvailRectDisplayPix),
|
|
mPixelDepth(aOther.mPixelDepth),
|
|
mColorDepth(aOther.mColorDepth),
|
|
mContentsScale(aOther.mContentsScale),
|
|
mDefaultCssScale(aOther.mDefaultCssScale),
|
|
mDPI(aOther.mDPI),
|
|
mScreenOrientation(aOther.mScreenOrientation),
|
|
mOrientationAngle(aOther.mOrientationAngle) {}
|
|
|
|
dom::ScreenDetails Screen::ToScreenDetails() const {
|
|
return dom::ScreenDetails(mRect, mRectDisplayPix, mAvailRect,
|
|
mAvailRectDisplayPix, mPixelDepth, mColorDepth,
|
|
mContentsScale, mDefaultCssScale, mDPI,
|
|
mScreenOrientation, mOrientationAngle);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Screen::GetRect(int32_t* aOutLeft, int32_t* aOutTop, int32_t* aOutWidth,
|
|
int32_t* aOutHeight) {
|
|
mRect.GetRect(aOutLeft, aOutTop, aOutWidth, aOutHeight);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Screen::GetRectDisplayPix(int32_t* aOutLeft, int32_t* aOutTop,
|
|
int32_t* aOutWidth, int32_t* aOutHeight) {
|
|
mRectDisplayPix.GetRect(aOutLeft, aOutTop, aOutWidth, aOutHeight);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Screen::GetAvailRect(int32_t* aOutLeft, int32_t* aOutTop, int32_t* aOutWidth,
|
|
int32_t* aOutHeight) {
|
|
mAvailRect.GetRect(aOutLeft, aOutTop, aOutWidth, aOutHeight);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Screen::GetAvailRectDisplayPix(int32_t* aOutLeft, int32_t* aOutTop,
|
|
int32_t* aOutWidth, int32_t* aOutHeight) {
|
|
mAvailRectDisplayPix.GetRect(aOutLeft, aOutTop, aOutWidth, aOutHeight);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Screen::GetPixelDepth(int32_t* aPixelDepth) {
|
|
*aPixelDepth = mPixelDepth;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Screen::GetColorDepth(int32_t* aColorDepth) {
|
|
*aColorDepth = mColorDepth;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Screen::GetContentsScaleFactor(double* aOutScale) {
|
|
*aOutScale = mContentsScale.scale;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Screen::GetDefaultCSSScaleFactor(double* aOutScale) {
|
|
double scale = StaticPrefs::layout_css_devPixelsPerPx();
|
|
if (scale > 0.0) {
|
|
*aOutScale = scale;
|
|
} else {
|
|
*aOutScale = mDefaultCssScale.scale;
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
Screen::GetDpi(float* aDPI) {
|
|
*aDPI = mDPI;
|
|
return NS_OK;
|
|
}
|
|
|
|
} // namespace mozilla::widget
|