michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 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 "nsScreenManagerCocoa.h" michael@0: #include "nsObjCExceptions.h" michael@0: #include "nsCOMPtr.h" michael@0: #include "nsCocoaUtils.h" michael@0: michael@0: NS_IMPL_ISUPPORTS(nsScreenManagerCocoa, nsIScreenManager) michael@0: michael@0: nsScreenManagerCocoa::nsScreenManagerCocoa() michael@0: { michael@0: } michael@0: michael@0: nsScreenManagerCocoa::~nsScreenManagerCocoa() michael@0: { michael@0: } michael@0: michael@0: nsScreenCocoa* michael@0: nsScreenManagerCocoa::ScreenForCocoaScreen(NSScreen *screen) michael@0: { michael@0: for (uint32_t i = 0; i < mScreenList.Length(); ++i) { michael@0: nsScreenCocoa* sc = mScreenList[i]; michael@0: if (sc->CocoaScreen() == screen) { michael@0: // doesn't addref michael@0: return sc; michael@0: } michael@0: } michael@0: michael@0: // didn't find it; create and insert michael@0: nsRefPtr sc = new nsScreenCocoa(screen); michael@0: mScreenList.AppendElement(sc); michael@0: return sc.get(); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsScreenManagerCocoa::ScreenForRect (int32_t aX, int32_t aY, int32_t aWidth, int32_t aHeight, michael@0: nsIScreen **outScreen) michael@0: { michael@0: NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT; michael@0: michael@0: NSEnumerator *screenEnum = [[NSScreen screens] objectEnumerator]; michael@0: NSRect inRect = nsCocoaUtils::GeckoRectToCocoaRect(nsIntRect(aX, aY, aWidth, aHeight)); michael@0: NSScreen *screenWindowIsOn = [NSScreen mainScreen]; michael@0: float greatestArea = 0; michael@0: michael@0: while (NSScreen *screen = [screenEnum nextObject]) { michael@0: NSDictionary *desc = [screen deviceDescription]; michael@0: if ([desc objectForKey:NSDeviceIsScreen] == nil) michael@0: continue; michael@0: michael@0: NSRect r = NSIntersectionRect([screen frame], inRect); michael@0: float area = r.size.width * r.size.height; michael@0: if (area > greatestArea) { michael@0: greatestArea = area; michael@0: screenWindowIsOn = screen; michael@0: } michael@0: } michael@0: michael@0: *outScreen = ScreenForCocoaScreen(screenWindowIsOn); michael@0: NS_ADDREF(*outScreen); michael@0: return NS_OK; michael@0: michael@0: NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsScreenManagerCocoa::GetPrimaryScreen (nsIScreen **outScreen) michael@0: { michael@0: NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT; michael@0: michael@0: // the mainScreen is the screen with the "key window" (focus, I assume?) michael@0: NSScreen *sc = [[NSScreen screens] objectAtIndex:0]; michael@0: michael@0: *outScreen = ScreenForCocoaScreen(sc); michael@0: NS_ADDREF(*outScreen); michael@0: michael@0: return NS_OK; michael@0: michael@0: NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsScreenManagerCocoa::GetNumberOfScreens (uint32_t *aNumberOfScreens) michael@0: { michael@0: NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT; michael@0: michael@0: NSArray *ss = [NSScreen screens]; michael@0: michael@0: *aNumberOfScreens = [ss count]; michael@0: michael@0: return NS_OK; michael@0: michael@0: NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsScreenManagerCocoa::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: nsScreenManagerCocoa::ScreenForNativeWidget (void *nativeWidget, nsIScreen **outScreen) michael@0: { michael@0: NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT; michael@0: michael@0: NSWindow *window = static_cast(nativeWidget); michael@0: if (window) { michael@0: nsIScreen *screen = ScreenForCocoaScreen([window screen]); michael@0: *outScreen = screen; michael@0: NS_ADDREF(*outScreen); michael@0: return NS_OK; michael@0: } michael@0: michael@0: *outScreen = nullptr; michael@0: return NS_OK; michael@0: michael@0: NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT; michael@0: }