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 #ifndef widget_windows_RemoteBackbuffer_h
7 #define widget_windows_RemoteBackbuffer_h
8 
9 #include "nsIWidget.h"
10 #include "mozilla/widget/PCompositorWidgetParent.h"
11 #include "mozilla/Maybe.h"
12 #include "prthread.h"
13 #include <windows.h>
14 
15 namespace mozilla {
16 namespace widget {
17 namespace remote_backbuffer {
18 
19 struct IpcRect;
20 struct SharedData;
21 struct BorrowResponseData;
22 struct PresentRequestData;
23 struct PresentResponseData;
24 class SharedImage;
25 class PresentableSharedImage;
26 
27 class Provider {
28  public:
29   Provider();
30   ~Provider();
31 
32   bool Initialize(HWND aWindowHandle, DWORD aTargetProcessId,
33                   nsTransparencyMode aTransparencyMode);
34 
35   Maybe<RemoteBackbufferHandles> CreateRemoteHandles();
36 
37   void UpdateTransparencyMode(nsTransparencyMode aTransparencyMode);
38 
39   Provider(const Provider&) = delete;
40   Provider(Provider&&) = delete;
41   Provider& operator=(const Provider&) = delete;
42   Provider& operator=(Provider&&) = delete;
43 
44  private:
45   void ThreadMain();
46 
47   void HandleBorrowRequest(BorrowResponseData* aResponseData,
48                            bool aAllowSameBuffer);
49   void HandlePresentRequest(const PresentRequestData& aRequestData,
50                             PresentResponseData* aResponseData);
51 
52   HWND mWindowHandle;
53   DWORD mTargetProcessId;
54   HANDLE mFileMapping;
55   HANDLE mRequestReadyEvent;
56   HANDLE mResponseReadyEvent;
57   SharedData* mSharedDataPtr;
58   bool mStopServiceThread;
59   PRThread* mServiceThread;
60   std::unique_ptr<PresentableSharedImage> mBackbuffer;
61   mozilla::Atomic<nsTransparencyMode, MemoryOrdering::Relaxed>
62       mTransparencyMode;
63 };
64 
65 class Client {
66  public:
67   Client();
68   ~Client();
69 
70   bool Initialize(const RemoteBackbufferHandles& aRemoteHandles);
71 
72   already_AddRefed<gfx::DrawTarget> BorrowDrawTarget();
73   bool PresentDrawTarget(gfx::IntRegion aDirtyRegion);
74 
75   Client(const Client&) = delete;
76   Client(Client&&) = delete;
77   Client& operator=(const Client&) = delete;
78   Client& operator=(Client&&) = delete;
79 
80  private:
81   HANDLE mFileMapping;
82   HANDLE mRequestReadyEvent;
83   HANDLE mResponseReadyEvent;
84   SharedData* mSharedDataPtr;
85   std::unique_ptr<SharedImage> mBackbuffer;
86 };
87 
88 }  // namespace remote_backbuffer
89 }  // namespace widget
90 }  // namespace mozilla
91 
92 #endif  // widget_windows_RemoteBackbuffer_h
93