/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 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/. */
// static void ScreenManager::Refresh(nsTArray<RefPtr<Screen>>&& aScreens) { if (PastShutdownPhase(ShutdownPhase::XPCOMShutdown)) { // We don't refresh screen data if starting XPCOM shutdown path. // GetSingleton returns invalid data since it is freed. return;
}
MOZ_LOG(sScreenLog, LogLevel::Debug, ("Refresh screens"));
GetSingleton().RefreshInternal(std::move(aScreens));
}
void ScreenManager::Refresh(nsTArray<mozilla::dom::ScreenDetails>&& aScreens) {
MOZ_LOG(sScreenLog, LogLevel::Debug, ("Refresh screens from IPC"));
// Returns the screen that contains the rectangle. If the rect overlaps // multiple screens, it picks the screen with the greatest area of intersection. // // The coordinates are in desktop pixels. //
NS_IMETHODIMP
ScreenManager::ScreenForRect(int32_t aX, int32_t aY, int32_t aWidth,
int32_t aHeight, nsIScreen** aOutScreen) {
DesktopIntRect rect(aX, aY, aWidth, aHeight);
nsCOMPtr<nsIScreen> screen = ScreenForRect(rect);
screen.forget(aOutScreen); return NS_OK;
}
already_AddRefed<Screen> ScreenManager::ScreenForRect( const DesktopIntRect& aRect) { #ifdefined(MOZ_WAYLAND) && defined(MOZ_LOGGING) staticbool inWayland = GdkIsWaylandDisplay(); if (inWayland) {
MOZ_LOG(sScreenLog, LogLevel::Warning,
("Getting screen in wayland, primary display will be returned."));
} #endif
if (mScreenList.IsEmpty()) {
MOZ_LOG(sScreenLog, LogLevel::Warning,
("No screen available. This can happen in xpcshell.")); auto screen = MakeRefPtr<Screen>(
LayoutDeviceIntRect(), LayoutDeviceIntRect(), 0, 0, 0,
DesktopToLayoutDeviceScale(), CSSToLayoutDeviceScale(), 96 /* dpi */,
Screen::IsPseudoDisplay::No, Screen::IsHDR::No,
hal::ScreenOrientation::None, 0); return screen.forget();
}
// Optimize for the common case. If the number of screens is only // one then just return the primary screen. if (mScreenList.Length() == 1) { return GetPrimaryScreen();
}
// which screen should we return?
Screen* which = mScreenList[0].get();
// walk the list of screens and find the one that has the most // surface area.
uint32_t area = 0; for (auto& screen : mScreenList) {
int32_t x, y, width, height;
x = y = width = height = 0;
screen->GetRectDisplayPix(&x, &y, &width, &height); // calculate the surface area
DesktopIntRect screenRect(x, y, width, height);
screenRect.IntersectRect(screenRect, aRect);
uint32_t tempArea = screenRect.Area(); if (tempArea > area) {
which = screen.get();
area = tempArea;
}
}
// If the rect intersects one or more screen, // return the screen that has the largest intersection. if (area > 0) {
RefPtr<Screen> ret = which; return ret.forget();
}
// If the rect does not intersect a screen, find // a screen that is nearest to the rect.
uint32_t distance = UINT32_MAX; for (auto& screen : mScreenList) {
int32_t x, y, width, height;
x = y = width = height = 0;
screen->GetRectDisplayPix(&x, &y, &width, &height);
uint32_t tempDistance = distanceX * distanceX + distanceY * distanceY; if (tempDistance < distance) {
which = screen.get();
distance = tempDistance; if (distance == 0) { break;
}
}
}
RefPtr<Screen> ret = which; return ret.forget();
}
// The screen with the menubar/taskbar. This shouldn't be needed very // often. //
already_AddRefed<Screen> ScreenManager::GetPrimaryScreen() { if (mScreenList.IsEmpty()) {
MOZ_LOG(sScreenLog, LogLevel::Warning,
("No screen available. This can happen in xpcshell.")); return MakeAndAddRef<Screen>(LayoutDeviceIntRect(), LayoutDeviceIntRect(),
0, 0, 0, DesktopToLayoutDeviceScale(),
CSSToLayoutDeviceScale(), 96 /* dpi */,
Screen::IsPseudoDisplay::No, Screen::IsHDR::No,
hal::ScreenOrientation::None, 0);
}
if (mScreenList.IsEmpty()) {
MOZ_LOG(sScreenLog, LogLevel::Warning,
("No screen available. This can happen in xpcshell."));
*aTotalScreenPixels = 0; return NS_OK;
}
int64_t pixels = 0; for (auto& screen : mScreenList) {
int32_t x, y, width, height;
x = y = width = height = 0;
screen->GetRect(&x, &y, &width, &height);
pixels += width * height;
}
*aTotalScreenPixels = pixels; return NS_OK;
}
} // namespace mozilla::widget
¤ Dauer der Verarbeitung: 0.26 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.