michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include michael@0: #include michael@0: michael@0: #include "nsScreenManagerQt.h" michael@0: #include "nsScreenQt.h" michael@0: michael@0: nsScreenManagerQt::nsScreenManagerQt() michael@0: { michael@0: mInitialized = false; michael@0: desktop = 0; michael@0: screens = 0; michael@0: } michael@0: michael@0: nsScreenManagerQt::~nsScreenManagerQt() michael@0: { michael@0: delete [] screens; michael@0: } michael@0: michael@0: // addref, release, QI michael@0: NS_IMPL_ISUPPORTS(nsScreenManagerQt, nsIScreenManager) michael@0: michael@0: void nsScreenManagerQt::init() michael@0: { michael@0: if (mInitialized) michael@0: return; michael@0: michael@0: nScreens = QGuiApplication::screens().size(); michael@0: screens = new nsCOMPtr[nScreens]; michael@0: michael@0: for (int i = 0; i < nScreens; ++i) michael@0: screens[i] = new nsScreenQt(i); michael@0: mInitialized = true; michael@0: } michael@0: michael@0: // michael@0: // ScreenForRect michael@0: // michael@0: // Returns the screen that contains the rectangle. If the rect overlaps michael@0: // multiple screens, it picks the screen with the greatest area of intersection. michael@0: // michael@0: // The coordinates are in pixels (not twips) and in screen coordinates. michael@0: // michael@0: NS_IMETHODIMP michael@0: nsScreenManagerQt::ScreenForRect(int32_t inLeft, int32_t inTop, michael@0: int32_t inWidth, int32_t inHeight, michael@0: nsIScreen **outScreen) michael@0: { michael@0: if (!mInitialized) michael@0: init(); michael@0: michael@0: QRect r(inLeft, inTop, inWidth, inHeight); michael@0: int best = 0; michael@0: int area = 0; michael@0: for (int i = 0; i < nScreens; ++i) { michael@0: const QRect& rect = QGuiApplication::screens()[i]->geometry(); michael@0: QRect intersection = r▭ michael@0: int a = intersection.width()*intersection.height(); michael@0: if (a > area) { michael@0: best = i; michael@0: area = a; michael@0: } michael@0: } michael@0: michael@0: NS_IF_ADDREF(*outScreen = screens[best]); michael@0: return NS_OK; michael@0: } michael@0: michael@0: // michael@0: // GetPrimaryScreen michael@0: // michael@0: // The screen with the menubar/taskbar. This shouldn't be needed very michael@0: // often. michael@0: // michael@0: NS_IMETHODIMP michael@0: nsScreenManagerQt::GetPrimaryScreen(nsIScreen **aPrimaryScreen) michael@0: { michael@0: if (!desktop) michael@0: init(); michael@0: michael@0: NS_IF_ADDREF(*aPrimaryScreen = screens[0]); michael@0: return NS_OK; michael@0: } michael@0: michael@0: // michael@0: // GetNumberOfScreens michael@0: // michael@0: // Returns how many physical screens are available. michael@0: // michael@0: NS_IMETHODIMP michael@0: nsScreenManagerQt::GetNumberOfScreens(uint32_t *aNumberOfScreens) michael@0: { michael@0: if (!desktop) michael@0: init(); michael@0: michael@0: *aNumberOfScreens = nScreens; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsScreenManagerQt::GetSystemDefaultScale(float *aDefaultScale) michael@0: { michael@0: *aDefaultScale = 1.0f; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsScreenManagerQt::ScreenForNativeWidget(void *aWidget, nsIScreen **outScreen) michael@0: { michael@0: // I don't know how to go from GtkWindow to nsIScreen, especially michael@0: // given xinerama and stuff, so let's just do this michael@0: QRect rect(0, 0, 1, 1); michael@0: return ScreenForRect(rect.x(), rect.y(), rect.width(), rect.height(), outScreen); michael@0: }