widget/cocoa/nsScreenManagerCocoa.mm

Wed, 31 Dec 2014 06:55:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:50 +0100
changeset 2
7e26c7da4463
permissions
-rw-r--r--

Added tag UPSTREAM_283F7C6 for changeset ca08bd8f51b2

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "nsScreenManagerCocoa.h"
     7 #include "nsObjCExceptions.h"
     8 #include "nsCOMPtr.h"
     9 #include "nsCocoaUtils.h"
    11 NS_IMPL_ISUPPORTS(nsScreenManagerCocoa, nsIScreenManager)
    13 nsScreenManagerCocoa::nsScreenManagerCocoa()
    14 {
    15 }
    17 nsScreenManagerCocoa::~nsScreenManagerCocoa()
    18 {
    19 }
    21 nsScreenCocoa*
    22 nsScreenManagerCocoa::ScreenForCocoaScreen(NSScreen *screen)
    23 {
    24     for (uint32_t i = 0; i < mScreenList.Length(); ++i) {
    25         nsScreenCocoa* sc = mScreenList[i];
    26         if (sc->CocoaScreen() == screen) {
    27             // doesn't addref
    28             return sc;
    29         }
    30     }
    32     // didn't find it; create and insert
    33     nsRefPtr<nsScreenCocoa> sc = new nsScreenCocoa(screen);
    34     mScreenList.AppendElement(sc);
    35     return sc.get();
    36 }
    38 NS_IMETHODIMP
    39 nsScreenManagerCocoa::ScreenForRect (int32_t aX, int32_t aY, int32_t aWidth, int32_t aHeight,
    40                                      nsIScreen **outScreen)
    41 {
    42     NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
    44     NSEnumerator *screenEnum = [[NSScreen screens] objectEnumerator];
    45     NSRect inRect = nsCocoaUtils::GeckoRectToCocoaRect(nsIntRect(aX, aY, aWidth, aHeight));
    46     NSScreen *screenWindowIsOn = [NSScreen mainScreen];
    47     float greatestArea = 0;
    49     while (NSScreen *screen = [screenEnum nextObject]) {
    50         NSDictionary *desc = [screen deviceDescription];
    51         if ([desc objectForKey:NSDeviceIsScreen] == nil)
    52             continue;
    54         NSRect r = NSIntersectionRect([screen frame], inRect);
    55         float area = r.size.width * r.size.height;
    56         if (area > greatestArea) {
    57             greatestArea = area;
    58             screenWindowIsOn = screen;
    59         }
    60     }
    62     *outScreen = ScreenForCocoaScreen(screenWindowIsOn);
    63     NS_ADDREF(*outScreen);
    64     return NS_OK;
    66     NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
    67 }
    69 NS_IMETHODIMP
    70 nsScreenManagerCocoa::GetPrimaryScreen (nsIScreen **outScreen)
    71 {
    72     NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
    74     // the mainScreen is the screen with the "key window" (focus, I assume?)
    75     NSScreen *sc = [[NSScreen screens] objectAtIndex:0];
    77     *outScreen = ScreenForCocoaScreen(sc);
    78     NS_ADDREF(*outScreen);
    80     return NS_OK;
    82     NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
    83 }
    85 NS_IMETHODIMP
    86 nsScreenManagerCocoa::GetNumberOfScreens (uint32_t *aNumberOfScreens)
    87 {
    88     NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
    90     NSArray *ss = [NSScreen screens];
    92     *aNumberOfScreens = [ss count];
    94     return NS_OK;
    96     NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
    97 }
    99 NS_IMETHODIMP
   100 nsScreenManagerCocoa::GetSystemDefaultScale(float *aDefaultScale)
   101 {
   102     *aDefaultScale = 1.0f;
   103     return NS_OK;
   104 }
   106 NS_IMETHODIMP
   107 nsScreenManagerCocoa::ScreenForNativeWidget (void *nativeWidget, nsIScreen **outScreen)
   108 {
   109     NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
   111     NSWindow *window = static_cast<NSWindow*>(nativeWidget);
   112     if (window) {
   113         nsIScreen *screen = ScreenForCocoaScreen([window screen]);
   114         *outScreen = screen;
   115         NS_ADDREF(*outScreen);
   116         return NS_OK;
   117     }
   119     *outScreen = nullptr;
   120     return NS_OK;
   122     NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
   123 }

mercurial