Bumping manifests a=b2g-bump
[gecko.git] / dom / ipc / ScreenManagerParent.cpp
blobe71de6e2e6c58d73d7ae2404e755b7f850786401
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* vim: set sw=4 ts=8 et tw=80 : */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/dom/TabParent.h"
8 #include "mozilla/unused.h"
9 #include "nsIWidget.h"
10 #include "nsServiceManagerUtils.h"
11 #include "ScreenManagerParent.h"
13 namespace mozilla {
14 namespace dom {
16 static const char *sScreenManagerContractID = "@mozilla.org/gfx/screenmanager;1";
18 ScreenManagerParent::ScreenManagerParent(uint32_t* aNumberOfScreens,
19 float* aSystemDefaultScale,
20 bool* aSuccess)
22 mScreenMgr = do_GetService(sScreenManagerContractID);
23 if (!mScreenMgr) {
24 MOZ_CRASH("Couldn't get nsIScreenManager from ScreenManagerParent.");
27 unused << AnswerRefresh(aNumberOfScreens, aSystemDefaultScale, aSuccess);
30 bool
31 ScreenManagerParent::AnswerRefresh(uint32_t* aNumberOfScreens,
32 float* aSystemDefaultScale,
33 bool* aSuccess)
35 *aSuccess = false;
37 nsresult rv = mScreenMgr->GetNumberOfScreens(aNumberOfScreens);
38 if (NS_FAILED(rv)) {
39 return true;
42 rv = mScreenMgr->GetSystemDefaultScale(aSystemDefaultScale);
43 if (NS_FAILED(rv)) {
44 return true;
47 *aSuccess = true;
48 return true;
51 bool
52 ScreenManagerParent::AnswerScreenRefresh(const uint32_t& aId,
53 ScreenDetails* aRetVal,
54 bool* aSuccess)
56 *aSuccess = false;
58 nsCOMPtr<nsIScreen> screen;
59 nsresult rv = mScreenMgr->ScreenForId(aId, getter_AddRefs(screen));
60 if (NS_FAILED(rv)) {
61 return true;
64 ScreenDetails details;
65 unused << ExtractScreenDetails(screen, details);
67 *aRetVal = details;
68 *aSuccess = true;
69 return true;
72 bool
73 ScreenManagerParent::AnswerGetPrimaryScreen(ScreenDetails* aRetVal,
74 bool* aSuccess)
76 *aSuccess = false;
78 nsCOMPtr<nsIScreen> screen;
79 nsresult rv = mScreenMgr->GetPrimaryScreen(getter_AddRefs(screen));
81 NS_ENSURE_SUCCESS(rv, true);
83 ScreenDetails details;
84 if (!ExtractScreenDetails(screen, details)) {
85 return true;
88 *aRetVal = details;
89 *aSuccess = true;
90 return true;
93 bool
94 ScreenManagerParent::AnswerScreenForRect(const int32_t& aLeft,
95 const int32_t& aTop,
96 const int32_t& aWidth,
97 const int32_t& aHeight,
98 ScreenDetails* aRetVal,
99 bool* aSuccess)
101 *aSuccess = false;
103 nsCOMPtr<nsIScreen> screen;
104 nsresult rv = mScreenMgr->ScreenForRect(aLeft, aTop, aWidth, aHeight, getter_AddRefs(screen));
106 NS_ENSURE_SUCCESS(rv, true);
108 ScreenDetails details;
109 if (!ExtractScreenDetails(screen, details)) {
110 return true;
113 *aRetVal = details;
114 *aSuccess = true;
115 return true;
118 bool
119 ScreenManagerParent::AnswerScreenForBrowser(PBrowserParent* aBrowser,
120 ScreenDetails* aRetVal,
121 bool* aSuccess)
123 *aSuccess = false;
125 // Find the mWidget associated with the tabparent, and then return
126 // the nsIScreen it's on.
127 TabParent* tabParent = static_cast<TabParent*>(aBrowser);
128 nsCOMPtr<nsIWidget> widget = tabParent->GetWidget();
129 if (!widget) {
130 return true;
133 nsCOMPtr<nsIScreen> screen;
134 if (widget->GetNativeData(NS_NATIVE_WINDOW)) {
135 mScreenMgr->ScreenForNativeWidget(widget->GetNativeData(NS_NATIVE_WINDOW),
136 getter_AddRefs(screen));
139 NS_ENSURE_TRUE(screen, true);
141 ScreenDetails details;
142 if (!ExtractScreenDetails(screen, details)) {
143 return true;
146 *aRetVal = details;
147 *aSuccess = true;
148 return true;
151 bool
152 ScreenManagerParent::ExtractScreenDetails(nsIScreen* aScreen, ScreenDetails &aDetails)
154 uint32_t id;
155 nsresult rv = aScreen->GetId(&id);
156 NS_ENSURE_SUCCESS(rv, false);
157 aDetails.id() = id;
159 nsIntRect rect;
160 rv = aScreen->GetRect(&rect.x, &rect.y, &rect.width, &rect.height);
161 NS_ENSURE_SUCCESS(rv, false);
162 aDetails.rect() = rect;
164 nsIntRect rectDisplayPix;
165 rv = aScreen->GetRectDisplayPix(&rectDisplayPix.x, &rectDisplayPix.y,
166 &rectDisplayPix.width, &rectDisplayPix.height);
167 NS_ENSURE_SUCCESS(rv, false);
168 aDetails.rectDisplayPix() = rectDisplayPix;
170 nsIntRect availRect;
171 rv = aScreen->GetAvailRect(&availRect.x, &availRect.y, &availRect.width,
172 &availRect.height);
173 NS_ENSURE_SUCCESS(rv, false);
174 aDetails.availRect() = availRect;
176 nsIntRect availRectDisplayPix;
177 rv = aScreen->GetAvailRectDisplayPix(&availRectDisplayPix.x,
178 &availRectDisplayPix.y,
179 &availRectDisplayPix.width,
180 &availRectDisplayPix.height);
181 NS_ENSURE_SUCCESS(rv, false);
182 aDetails.availRectDisplayPix() = availRectDisplayPix;
184 int32_t pixelDepth = 0;
185 rv = aScreen->GetPixelDepth(&pixelDepth);
186 NS_ENSURE_SUCCESS(rv, false);
187 aDetails.pixelDepth() = pixelDepth;
189 int32_t colorDepth = 0;
190 rv = aScreen->GetColorDepth(&colorDepth);
191 NS_ENSURE_SUCCESS(rv, false);
192 aDetails.colorDepth() = colorDepth;
194 double contentsScaleFactor = 1.0;
195 rv = aScreen->GetContentsScaleFactor(&contentsScaleFactor);
196 NS_ENSURE_SUCCESS(rv, false);
197 aDetails.contentsScaleFactor() = contentsScaleFactor;
199 return true;
202 void
203 ScreenManagerParent::ActorDestroy(ActorDestroyReason why)
207 } // namespace dom
208 } // namespace mozilla