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 #include "GtkCompositorWidget.h"
8 #include "mozilla/gfx/gfxVars.h"
9 #include "mozilla/WidgetUtilsGtk.h"
10 #include "mozilla/widget/PlatformWidgetTypes.h"
14 # include "mozilla/X11Util.h"
18 # include "mozilla/layers/NativeLayerWayland.h"
23 # define LOG(str, ...) \
24 MOZ_LOG(IsPopup() ? gWidgetPopupLog : gWidgetLog, \
25 mozilla::LogLevel::Debug, \
26 ("[%p]: " str, mWidget.get(), ##__VA_ARGS__))
27 #endif /* MOZ_LOGGING */
32 GtkCompositorWidget::GtkCompositorWidget(
33 const GtkCompositorWidgetInitData
& aInitData
,
34 const layers::CompositorOptions
& aOptions
, RefPtr
<nsWindow
> aWindow
)
35 : CompositorWidget(aOptions
),
36 mWidget(std::move(aWindow
)),
37 mClientSize(LayoutDeviceIntSize(aInitData
.InitialClientSize()),
38 "GtkCompositorWidget::mClientSize") {
40 if (GdkIsX11Display()) {
41 ConfigureX11Backend((Window
)aInitData
.XWindow());
42 LOG("GtkCompositorWidget::GtkCompositorWidget() [%p] mXWindow %p\n",
43 (void*)mWidget
.get(), (void*)aInitData
.XWindow());
46 #if defined(MOZ_WAYLAND)
47 if (GdkIsWaylandDisplay()) {
48 ConfigureWaylandBackend();
49 LOG("GtkCompositorWidget::GtkCompositorWidget() [%p] mWidget %p\n",
50 (void*)mWidget
.get(), (void*)mWidget
);
55 GtkCompositorWidget::~GtkCompositorWidget() {
56 LOG("GtkCompositorWidget::~GtkCompositorWidget [%p]\n", (void*)mWidget
.get());
58 RefPtr
<nsIWidget
> widget
= mWidget
.forget();
59 NS_ReleaseOnMainThread("GtkCompositorWidget::mWidget", widget
.forget());
62 already_AddRefed
<gfx::DrawTarget
> GtkCompositorWidget::StartRemoteDrawing() {
65 void GtkCompositorWidget::EndRemoteDrawing() {}
67 already_AddRefed
<gfx::DrawTarget
>
68 GtkCompositorWidget::StartRemoteDrawingInRegion(
69 const LayoutDeviceIntRegion
& aInvalidRegion
,
70 layers::BufferMode
* aBufferMode
) {
71 return mProvider
.StartRemoteDrawingInRegion(aInvalidRegion
, aBufferMode
);
74 void GtkCompositorWidget::EndRemoteDrawingInRegion(
75 gfx::DrawTarget
* aDrawTarget
, const LayoutDeviceIntRegion
& aInvalidRegion
) {
76 mProvider
.EndRemoteDrawingInRegion(aDrawTarget
, aInvalidRegion
);
79 nsIWidget
* GtkCompositorWidget::RealWidget() { return mWidget
; }
81 void GtkCompositorWidget::NotifyClientSizeChanged(
82 const LayoutDeviceIntSize
& aClientSize
) {
83 LOG("GtkCompositorWidget::NotifyClientSizeChanged() to %d x %d",
84 aClientSize
.width
, aClientSize
.height
);
86 auto size
= mClientSize
.Lock();
90 LayoutDeviceIntSize
GtkCompositorWidget::GetClientSize() {
91 auto size
= mClientSize
.Lock();
95 EGLNativeWindowType
GtkCompositorWidget::GetEGLNativeWindow() {
96 EGLNativeWindowType window
= nullptr;
98 window
= (EGLNativeWindowType
)mWidget
->GetNativeData(NS_NATIVE_EGL_WINDOW
);
102 window
= (EGLNativeWindowType
)mProvider
.GetXWindow();
105 LOG("GtkCompositorWidget::GetEGLNativeWindow [%p] window %p\n", mWidget
.get(),
110 bool GtkCompositorWidget::SetEGLNativeWindowSize(
111 const LayoutDeviceIntSize
& aEGLWindowSize
) {
112 #if defined(MOZ_WAYLAND)
114 return mWidget
->SetEGLNativeWindowSize(aEGLWindowSize
);
120 LayoutDeviceIntRegion
GtkCompositorWidget::GetTransparentRegion() {
121 LayoutDeviceIntRegion
fullRegion(
122 LayoutDeviceIntRect(LayoutDeviceIntPoint(), GetClientSize()));
124 fullRegion
.SubOut(mWidget
->GetOpaqueRegion());
130 RefPtr
<mozilla::layers::NativeLayerRoot
>
131 GtkCompositorWidget::GetNativeLayerRoot() {
133 if (gfx::gfxVars::UseWebRenderCompositor()) {
134 if (!mNativeLayerRoot
) {
135 LOG("GtkCompositorWidget::GetNativeLayerRoot [%p] create\n",
136 (void*)mWidget
.get());
137 MOZ_ASSERT(mWidget
&& mWidget
->GetMozContainer());
138 mNativeLayerRoot
= layers::NativeLayerRootWayland::Create(
139 MOZ_WL_SURFACE(mWidget
->GetMozContainer()));
141 return mNativeLayerRoot
;
148 void GtkCompositorWidget::CleanupResources() {
149 LOG("GtkCompositorWidget::CleanupResources [%p]\n", (void*)mWidget
.get());
150 mProvider
.CleanupResources();
153 #if defined(MOZ_WAYLAND)
154 void GtkCompositorWidget::ConfigureWaylandBackend() {
155 mProvider
.Initialize(this);
160 void GtkCompositorWidget::ConfigureX11Backend(Window aXWindow
) {
161 // We don't have X window yet.
163 mProvider
.CleanupResources();
166 // Initialize the window surface provider
167 mProvider
.Initialize(aXWindow
);
171 void GtkCompositorWidget::SetRenderingSurface(const uintptr_t aXWindow
) {
172 LOG("GtkCompositorWidget::SetRenderingSurface() [%p]\n", mWidget
.get());
174 #if defined(MOZ_WAYLAND)
175 if (GdkIsWaylandDisplay()) {
176 LOG(" configure widget %p\n", mWidget
.get());
177 ConfigureWaylandBackend();
181 if (GdkIsX11Display()) {
182 LOG(" configure XWindow %p\n", (void*)aXWindow
);
183 ConfigureX11Backend((Window
)aXWindow
);
189 bool GtkCompositorWidget::IsPopup() {
190 return mWidget
? mWidget
->IsPopup() : false;
194 UniquePtr
<WaylandSurfaceLock
> GtkCompositorWidget::LockSurface() {
195 return mWidget
? mWidget
->LockSurface() : nullptr;
198 } // namespace widget
199 } // namespace mozilla