1 /* -*- Mode: C++; tab-width: 2; 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 
6 #include "CompositorWidgetChild.h"
7 #include "mozilla/Unused.h"
8 #include "mozilla/gfx/Logging.h"
9 #include "mozilla/widget/CompositorWidgetVsyncObserver.h"
10 #include "mozilla/widget/PlatformWidgetTypes.h"
11 #include "nsBaseWidget.h"
12 #include "VsyncDispatcher.h"
13 #include "gfxPlatform.h"
14 #include "RemoteBackbuffer.h"
15 
16 namespace mozilla {
17 namespace widget {
18 
CompositorWidgetChild(RefPtr<CompositorVsyncDispatcher> aVsyncDispatcher,RefPtr<CompositorWidgetVsyncObserver> aVsyncObserver,const CompositorWidgetInitData & aInitData)19 CompositorWidgetChild::CompositorWidgetChild(
20     RefPtr<CompositorVsyncDispatcher> aVsyncDispatcher,
21     RefPtr<CompositorWidgetVsyncObserver> aVsyncObserver,
22     const CompositorWidgetInitData& aInitData)
23     : mVsyncDispatcher(aVsyncDispatcher),
24       mVsyncObserver(aVsyncObserver),
25       mCompositorWnd(nullptr),
26       mWnd(reinterpret_cast<HWND>(
27           aInitData.get_WinCompositorWidgetInitData().hWnd())),
28       mTransparencyMode(
29           aInitData.get_WinCompositorWidgetInitData().transparencyMode()),
30       mRemoteBackbufferProvider() {
31   MOZ_ASSERT(XRE_IsParentProcess());
32   MOZ_ASSERT(!gfxPlatform::IsHeadless());
33   MOZ_ASSERT(mWnd && ::IsWindow(mWnd));
34 }
35 
~CompositorWidgetChild()36 CompositorWidgetChild::~CompositorWidgetChild() {}
37 
Initialize()38 bool CompositorWidgetChild::Initialize() {
39   mRemoteBackbufferProvider = std::make_unique<remote_backbuffer::Provider>();
40   if (!mRemoteBackbufferProvider->Initialize(mWnd, OtherPid(),
41                                              mTransparencyMode)) {
42     return false;
43   }
44 
45   auto maybeRemoteHandles = mRemoteBackbufferProvider->CreateRemoteHandles();
46   if (!maybeRemoteHandles) {
47     return false;
48   }
49 
50   Unused << SendInitialize(*maybeRemoteHandles);
51 
52   return true;
53 }
54 
EnterPresentLock()55 void CompositorWidgetChild::EnterPresentLock() {
56   Unused << SendEnterPresentLock();
57 }
58 
LeavePresentLock()59 void CompositorWidgetChild::LeavePresentLock() {
60   Unused << SendLeavePresentLock();
61 }
62 
OnDestroyWindow()63 void CompositorWidgetChild::OnDestroyWindow() {}
64 
OnWindowResize(const LayoutDeviceIntSize & aSize)65 bool CompositorWidgetChild::OnWindowResize(const LayoutDeviceIntSize& aSize) {
66   return true;
67 }
68 
OnWindowModeChange(nsSizeMode aSizeMode)69 void CompositorWidgetChild::OnWindowModeChange(nsSizeMode aSizeMode) {}
70 
UpdateTransparency(nsTransparencyMode aMode)71 void CompositorWidgetChild::UpdateTransparency(nsTransparencyMode aMode) {
72   mTransparencyMode = aMode;
73   mRemoteBackbufferProvider->UpdateTransparencyMode(aMode);
74   Unused << SendUpdateTransparency(aMode);
75 }
76 
ClearTransparentWindow()77 void CompositorWidgetChild::ClearTransparentWindow() {
78   Unused << SendClearTransparentWindow();
79 }
80 
RecvObserveVsync()81 mozilla::ipc::IPCResult CompositorWidgetChild::RecvObserveVsync() {
82   mVsyncDispatcher->SetCompositorVsyncObserver(mVsyncObserver);
83   return IPC_OK();
84 }
85 
RecvUnobserveVsync()86 mozilla::ipc::IPCResult CompositorWidgetChild::RecvUnobserveVsync() {
87   mVsyncDispatcher->SetCompositorVsyncObserver(nullptr);
88   return IPC_OK();
89 }
90 
RecvUpdateCompositorWnd(const WindowsHandle & aCompositorWnd,const WindowsHandle & aParentWnd,UpdateCompositorWndResolver && aResolve)91 mozilla::ipc::IPCResult CompositorWidgetChild::RecvUpdateCompositorWnd(
92     const WindowsHandle& aCompositorWnd, const WindowsHandle& aParentWnd,
93     UpdateCompositorWndResolver&& aResolve) {
94   HWND parentWnd = reinterpret_cast<HWND>(aParentWnd);
95   if (mWnd == parentWnd) {
96     mCompositorWnd = reinterpret_cast<HWND>(aCompositorWnd);
97     ::SetParent(mCompositorWnd, mWnd);
98     aResolve(true);
99   } else {
100     aResolve(false);
101     gfxCriticalNote << "Parent winow does not match";
102     MOZ_ASSERT_UNREACHABLE("unexpected to happen");
103   }
104 
105   return IPC_OK();
106 }
107 
108 }  // namespace widget
109 }  // namespace mozilla
110