widget/cocoa/nsScreenManagerCocoa.mm

changeset 2
7e26c7da4463
equal deleted inserted replaced
-1:000000000000 0:1d8ac4fd3428
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/. */
5
6 #include "nsScreenManagerCocoa.h"
7 #include "nsObjCExceptions.h"
8 #include "nsCOMPtr.h"
9 #include "nsCocoaUtils.h"
10
11 NS_IMPL_ISUPPORTS(nsScreenManagerCocoa, nsIScreenManager)
12
13 nsScreenManagerCocoa::nsScreenManagerCocoa()
14 {
15 }
16
17 nsScreenManagerCocoa::~nsScreenManagerCocoa()
18 {
19 }
20
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 }
31
32 // didn't find it; create and insert
33 nsRefPtr<nsScreenCocoa> sc = new nsScreenCocoa(screen);
34 mScreenList.AppendElement(sc);
35 return sc.get();
36 }
37
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;
43
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;
48
49 while (NSScreen *screen = [screenEnum nextObject]) {
50 NSDictionary *desc = [screen deviceDescription];
51 if ([desc objectForKey:NSDeviceIsScreen] == nil)
52 continue;
53
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 }
61
62 *outScreen = ScreenForCocoaScreen(screenWindowIsOn);
63 NS_ADDREF(*outScreen);
64 return NS_OK;
65
66 NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
67 }
68
69 NS_IMETHODIMP
70 nsScreenManagerCocoa::GetPrimaryScreen (nsIScreen **outScreen)
71 {
72 NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
73
74 // the mainScreen is the screen with the "key window" (focus, I assume?)
75 NSScreen *sc = [[NSScreen screens] objectAtIndex:0];
76
77 *outScreen = ScreenForCocoaScreen(sc);
78 NS_ADDREF(*outScreen);
79
80 return NS_OK;
81
82 NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
83 }
84
85 NS_IMETHODIMP
86 nsScreenManagerCocoa::GetNumberOfScreens (uint32_t *aNumberOfScreens)
87 {
88 NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
89
90 NSArray *ss = [NSScreen screens];
91
92 *aNumberOfScreens = [ss count];
93
94 return NS_OK;
95
96 NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
97 }
98
99 NS_IMETHODIMP
100 nsScreenManagerCocoa::GetSystemDefaultScale(float *aDefaultScale)
101 {
102 *aDefaultScale = 1.0f;
103 return NS_OK;
104 }
105
106 NS_IMETHODIMP
107 nsScreenManagerCocoa::ScreenForNativeWidget (void *nativeWidget, nsIScreen **outScreen)
108 {
109 NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
110
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 }
118
119 *outScreen = nullptr;
120 return NS_OK;
121
122 NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
123 }

mercurial