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/. */
6 #ifndef widget_windows_WinCompositorWidget_h
7 #define widget_windows_WinCompositorWidget_h
9 #include "CompositorWidget.h"
10 #include "mozilla/Atomics.h"
11 #include "mozilla/gfx/CriticalSection.h"
12 #include "mozilla/gfx/Point.h"
13 #include "mozilla/layers/LayersTypes.h"
14 #include "mozilla/Mutex.h"
15 #include "mozilla/widget/WinCompositorWindowThread.h"
16 #include "FxROutputHandler.h"
17 #include "nsIWidget.h"
21 namespace mozilla::widget
{
23 class PlatformCompositorWidgetDelegate
: public CompositorWidgetDelegate
{
25 // Callbacks for nsWindow.
26 virtual void EnterPresentLock() = 0;
27 virtual void LeavePresentLock() = 0;
28 virtual void OnDestroyWindow() = 0;
29 virtual bool OnWindowResize(const LayoutDeviceIntSize
& aSize
) = 0;
30 virtual void OnWindowModeChange(nsSizeMode aSizeMode
) = 0;
32 // Transparency handling.
33 virtual void UpdateTransparency(TransparencyMode aMode
) = 0;
34 virtual void ClearTransparentWindow() = 0;
36 // Deliver visibility info
37 virtual void NotifyVisibilityUpdated(nsSizeMode aSizeMode
,
38 bool aIsFullyOccluded
) = 0;
40 // CompositorWidgetDelegate Overrides
42 PlatformCompositorWidgetDelegate
* AsPlatformSpecificDelegate() override
{
47 class WinCompositorWidgetInitData
;
49 // This is the Windows-specific implementation of CompositorWidget. For
50 // the most part it only requires an HWND, however it maintains extra state
51 // for transparent windows, as well as for synchronizing WM_SETTEXT messages
52 // with the compositor.
53 class WinCompositorWidget
: public CompositorWidget
{
55 WinCompositorWidget(const WinCompositorWidgetInitData
& aInitData
,
56 const layers::CompositorOptions
& aOptions
);
57 ~WinCompositorWidget() override
;
59 // CompositorWidget Overrides
61 uintptr_t GetWidgetKey() override
;
62 WinCompositorWidget
* AsWindows() override
{ return this; }
64 HWND
GetHwnd() const {
65 return mCompositorWnds
.mCompositorWnd
? mCompositorWnds
.mCompositorWnd
69 HWND
GetCompositorHwnd() const { return mCompositorWnds
.mCompositorWnd
; }
71 void EnsureCompositorWindow();
72 void DestroyCompositorWindow();
73 void UpdateCompositorWndSizeIfNecessary();
75 void RequestFxrOutput();
76 bool HasFxrOutputHandler() const { return !!mFxrHandler
; }
77 FxROutputHandler
* GetFxrOutputHandler() const { return mFxrHandler
.get(); }
79 virtual nsSizeMode
GetWindowSizeMode() const = 0;
80 virtual bool GetWindowIsFullyOccluded() const = 0;
82 virtual void UpdateCompositorWnd(const HWND aCompositorWnd
,
83 const HWND aParentWnd
) = 0;
84 virtual void SetRootLayerTreeID(const layers::LayersId
& aRootLayerTreeId
) = 0;
87 bool mSetParentCompleted
;
93 WinCompositorWnds mCompositorWnds
;
94 LayoutDeviceIntSize mLastCompositorWndSize
;
96 UniquePtr
<FxROutputHandler
> mFxrHandler
;
99 } // namespace mozilla::widget
101 #endif // widget_windows_WinCompositorWidget_h