diff -r 000000000000 -r 6474c204b198 widget/qt/nsScreenManagerQt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widget/qt/nsScreenManagerQt.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,117 @@ +/* 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 +#include + +#include "nsScreenManagerQt.h" +#include "nsScreenQt.h" + +nsScreenManagerQt::nsScreenManagerQt() +{ + mInitialized = false; + desktop = 0; + screens = 0; +} + +nsScreenManagerQt::~nsScreenManagerQt() +{ + delete [] screens; +} + +// addref, release, QI +NS_IMPL_ISUPPORTS(nsScreenManagerQt, nsIScreenManager) + +void nsScreenManagerQt::init() +{ + if (mInitialized) + return; + + nScreens = QGuiApplication::screens().size(); + screens = new nsCOMPtr[nScreens]; + + for (int i = 0; i < nScreens; ++i) + screens[i] = new nsScreenQt(i); + mInitialized = true; +} + +// +// ScreenForRect +// +// 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 pixels (not twips) and in screen coordinates. +// +NS_IMETHODIMP +nsScreenManagerQt::ScreenForRect(int32_t inLeft, int32_t inTop, + int32_t inWidth, int32_t inHeight, + nsIScreen **outScreen) +{ + if (!mInitialized) + init(); + + QRect r(inLeft, inTop, inWidth, inHeight); + int best = 0; + int area = 0; + for (int i = 0; i < nScreens; ++i) { + const QRect& rect = QGuiApplication::screens()[i]->geometry(); + QRect intersection = r▭ + int a = intersection.width()*intersection.height(); + if (a > area) { + best = i; + area = a; + } + } + + NS_IF_ADDREF(*outScreen = screens[best]); + return NS_OK; +} + +// +// GetPrimaryScreen +// +// The screen with the menubar/taskbar. This shouldn't be needed very +// often. +// +NS_IMETHODIMP +nsScreenManagerQt::GetPrimaryScreen(nsIScreen **aPrimaryScreen) +{ + if (!desktop) + init(); + + NS_IF_ADDREF(*aPrimaryScreen = screens[0]); + return NS_OK; +} + +// +// GetNumberOfScreens +// +// Returns how many physical screens are available. +// +NS_IMETHODIMP +nsScreenManagerQt::GetNumberOfScreens(uint32_t *aNumberOfScreens) +{ + if (!desktop) + init(); + + *aNumberOfScreens = nScreens; + return NS_OK; +} + +NS_IMETHODIMP +nsScreenManagerQt::GetSystemDefaultScale(float *aDefaultScale) +{ + *aDefaultScale = 1.0f; + return NS_OK; +} + +NS_IMETHODIMP +nsScreenManagerQt::ScreenForNativeWidget(void *aWidget, nsIScreen **outScreen) +{ + // I don't know how to go from GtkWindow to nsIScreen, especially + // given xinerama and stuff, so let's just do this + QRect rect(0, 0, 1, 1); + return ScreenForRect(rect.x(), rect.y(), rect.width(), rect.height(), outScreen); +}