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