ScreenManagerParent.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  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. #include "mozilla/dom/ContentParent.h"
  6. #include "mozilla/dom/TabParent.h"
  7. #include "mozilla/Unused.h"
  8. #include "nsIWidget.h"
  9. #include "nsServiceManagerUtils.h"
  10. #include "ScreenManagerParent.h"
  11. #include "ContentProcessManager.h"
  12. namespace mozilla {
  13. namespace dom {
  14. static const char *sScreenManagerContractID = "@mozilla.org/gfx/screenmanager;1";
  15. ScreenManagerParent::ScreenManagerParent(uint32_t* aNumberOfScreens,
  16. float* aSystemDefaultScale,
  17. bool* aSuccess)
  18. {
  19. mScreenMgr = do_GetService(sScreenManagerContractID);
  20. if (!mScreenMgr) {
  21. MOZ_CRASH("Couldn't get nsIScreenManager from ScreenManagerParent.");
  22. }
  23. Unused << RecvRefresh(aNumberOfScreens, aSystemDefaultScale, aSuccess);
  24. }
  25. bool
  26. ScreenManagerParent::RecvRefresh(uint32_t* aNumberOfScreens,
  27. float* aSystemDefaultScale,
  28. bool* aSuccess)
  29. {
  30. *aSuccess = false;
  31. nsresult rv = mScreenMgr->GetNumberOfScreens(aNumberOfScreens);
  32. if (NS_FAILED(rv)) {
  33. return true;
  34. }
  35. rv = mScreenMgr->GetSystemDefaultScale(aSystemDefaultScale);
  36. if (NS_FAILED(rv)) {
  37. return true;
  38. }
  39. *aSuccess = true;
  40. return true;
  41. }
  42. bool
  43. ScreenManagerParent::RecvScreenRefresh(const uint32_t& aId,
  44. ScreenDetails* aRetVal,
  45. bool* aSuccess)
  46. {
  47. *aSuccess = false;
  48. nsCOMPtr<nsIScreen> screen;
  49. nsresult rv = mScreenMgr->ScreenForId(aId, getter_AddRefs(screen));
  50. if (NS_FAILED(rv)) {
  51. return true;
  52. }
  53. ScreenDetails details;
  54. Unused << ExtractScreenDetails(screen, details);
  55. *aRetVal = details;
  56. *aSuccess = true;
  57. return true;
  58. }
  59. bool
  60. ScreenManagerParent::RecvGetPrimaryScreen(ScreenDetails* aRetVal,
  61. bool* aSuccess)
  62. {
  63. *aSuccess = false;
  64. nsCOMPtr<nsIScreen> screen;
  65. nsresult rv = mScreenMgr->GetPrimaryScreen(getter_AddRefs(screen));
  66. NS_ENSURE_SUCCESS(rv, true);
  67. ScreenDetails details;
  68. if (!ExtractScreenDetails(screen, details)) {
  69. return true;
  70. }
  71. *aRetVal = details;
  72. *aSuccess = true;
  73. return true;
  74. }
  75. bool
  76. ScreenManagerParent::RecvScreenForRect(const int32_t& aLeft,
  77. const int32_t& aTop,
  78. const int32_t& aWidth,
  79. const int32_t& aHeight,
  80. ScreenDetails* aRetVal,
  81. bool* aSuccess)
  82. {
  83. *aSuccess = false;
  84. nsCOMPtr<nsIScreen> screen;
  85. nsresult rv = mScreenMgr->ScreenForRect(aLeft, aTop, aWidth, aHeight, getter_AddRefs(screen));
  86. NS_ENSURE_SUCCESS(rv, true);
  87. ScreenDetails details;
  88. if (!ExtractScreenDetails(screen, details)) {
  89. return true;
  90. }
  91. *aRetVal = details;
  92. *aSuccess = true;
  93. return true;
  94. }
  95. bool
  96. ScreenManagerParent::RecvScreenForBrowser(const TabId& aTabId,
  97. ScreenDetails* aRetVal,
  98. bool* aSuccess)
  99. {
  100. *aSuccess = false;
  101. #ifdef MOZ_VALGRIND
  102. // Zero this so that Valgrind doesn't complain when we send it to another
  103. // process.
  104. memset(aRetVal, 0, sizeof(ScreenDetails));
  105. #endif
  106. // Find the mWidget associated with the tabparent, and then return
  107. // the nsIScreen it's on.
  108. ContentParent* cp = static_cast<ContentParent*>(this->Manager());
  109. ContentProcessManager* cpm = ContentProcessManager::GetSingleton();
  110. RefPtr<TabParent> tabParent =
  111. cpm->GetTopLevelTabParentByProcessAndTabId(cp->ChildID(), aTabId);
  112. if(!tabParent){
  113. return false;
  114. }
  115. nsCOMPtr<nsIWidget> widget = tabParent->GetWidget();
  116. nsCOMPtr<nsIScreen> screen;
  117. if (widget && widget->GetNativeData(NS_NATIVE_WINDOW)) {
  118. mScreenMgr->ScreenForNativeWidget(widget->GetNativeData(NS_NATIVE_WINDOW),
  119. getter_AddRefs(screen));
  120. } else {
  121. nsresult rv = mScreenMgr->GetPrimaryScreen(getter_AddRefs(screen));
  122. if (NS_WARN_IF(NS_FAILED(rv))) {
  123. return true;
  124. }
  125. }
  126. NS_ENSURE_TRUE(screen, true);
  127. ScreenDetails details;
  128. if (!ExtractScreenDetails(screen, details)) {
  129. return true;
  130. }
  131. *aRetVal = details;
  132. *aSuccess = true;
  133. return true;
  134. }
  135. bool
  136. ScreenManagerParent::ExtractScreenDetails(nsIScreen* aScreen, ScreenDetails &aDetails)
  137. {
  138. if (!aScreen) {
  139. return false;
  140. }
  141. uint32_t id;
  142. nsresult rv = aScreen->GetId(&id);
  143. NS_ENSURE_SUCCESS(rv, false);
  144. aDetails.id() = id;
  145. nsIntRect rect;
  146. rv = aScreen->GetRect(&rect.x, &rect.y, &rect.width, &rect.height);
  147. NS_ENSURE_SUCCESS(rv, false);
  148. aDetails.rect() = rect;
  149. nsIntRect rectDisplayPix;
  150. rv = aScreen->GetRectDisplayPix(&rectDisplayPix.x, &rectDisplayPix.y,
  151. &rectDisplayPix.width, &rectDisplayPix.height);
  152. NS_ENSURE_SUCCESS(rv, false);
  153. aDetails.rectDisplayPix() = rectDisplayPix;
  154. nsIntRect availRect;
  155. rv = aScreen->GetAvailRect(&availRect.x, &availRect.y, &availRect.width,
  156. &availRect.height);
  157. NS_ENSURE_SUCCESS(rv, false);
  158. aDetails.availRect() = availRect;
  159. nsIntRect availRectDisplayPix;
  160. rv = aScreen->GetAvailRectDisplayPix(&availRectDisplayPix.x,
  161. &availRectDisplayPix.y,
  162. &availRectDisplayPix.width,
  163. &availRectDisplayPix.height);
  164. NS_ENSURE_SUCCESS(rv, false);
  165. aDetails.availRectDisplayPix() = availRectDisplayPix;
  166. int32_t pixelDepth = 0;
  167. rv = aScreen->GetPixelDepth(&pixelDepth);
  168. NS_ENSURE_SUCCESS(rv, false);
  169. aDetails.pixelDepth() = pixelDepth;
  170. int32_t colorDepth = 0;
  171. rv = aScreen->GetColorDepth(&colorDepth);
  172. NS_ENSURE_SUCCESS(rv, false);
  173. aDetails.colorDepth() = colorDepth;
  174. double contentsScaleFactor = 1.0;
  175. rv = aScreen->GetContentsScaleFactor(&contentsScaleFactor);
  176. NS_ENSURE_SUCCESS(rv, false);
  177. aDetails.contentsScaleFactor() = contentsScaleFactor;
  178. return true;
  179. }
  180. void
  181. ScreenManagerParent::ActorDestroy(ActorDestroyReason why)
  182. {
  183. }
  184. } // namespace dom
  185. } // namespace mozilla