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