Backed out changeset b71c8c052463 (bug 1943846) for causing mass failures. CLOSED...
[gecko.git] / widget / gtk / GtkCompositorWidget.cpp
blob4b1b1b1fbbdf7c414573b40a0e3580b599ca33db
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"
11 #include "nsWindow.h"
13 #ifdef MOZ_X11
14 # include "mozilla/X11Util.h"
15 #endif
17 #ifdef MOZ_WAYLAND
18 # include "mozilla/layers/NativeLayerWayland.h"
19 #endif
21 #ifdef MOZ_LOGGING
22 # undef LOG
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 */
29 namespace mozilla {
30 namespace widget {
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") {
39 #if defined(MOZ_X11)
40 if (GdkIsX11Display()) {
41 ConfigureX11Backend((Window)aInitData.XWindow());
42 LOG("GtkCompositorWidget::GtkCompositorWidget() [%p] mXWindow %p\n",
43 (void*)mWidget.get(), (void*)aInitData.XWindow());
45 #endif
46 #if defined(MOZ_WAYLAND)
47 if (GdkIsWaylandDisplay()) {
48 ConfigureWaylandBackend();
49 LOG("GtkCompositorWidget::GtkCompositorWidget() [%p] mWidget %p\n",
50 (void*)mWidget.get(), (void*)mWidget);
52 #endif
55 GtkCompositorWidget::~GtkCompositorWidget() {
56 LOG("GtkCompositorWidget::~GtkCompositorWidget [%p]\n", (void*)mWidget.get());
57 CleanupResources();
58 RefPtr<nsIWidget> widget = mWidget.forget();
59 NS_ReleaseOnMainThread("GtkCompositorWidget::mWidget", widget.forget());
62 already_AddRefed<gfx::DrawTarget> GtkCompositorWidget::StartRemoteDrawing() {
63 return nullptr;
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();
87 *size = aClientSize;
90 LayoutDeviceIntSize GtkCompositorWidget::GetClientSize() {
91 auto size = mClientSize.Lock();
92 return *size;
95 EGLNativeWindowType GtkCompositorWidget::GetEGLNativeWindow() {
96 EGLNativeWindowType window = nullptr;
97 if (mWidget) {
98 window = (EGLNativeWindowType)mWidget->GetNativeData(NS_NATIVE_EGL_WINDOW);
100 #if defined(MOZ_X11)
101 else {
102 window = (EGLNativeWindowType)mProvider.GetXWindow();
104 #endif
105 LOG("GtkCompositorWidget::GetEGLNativeWindow [%p] window %p\n", mWidget.get(),
106 window);
107 return window;
110 bool GtkCompositorWidget::SetEGLNativeWindowSize(
111 const LayoutDeviceIntSize& aEGLWindowSize) {
112 #if defined(MOZ_WAYLAND)
113 if (mWidget) {
114 return mWidget->SetEGLNativeWindowSize(aEGLWindowSize);
116 #endif
117 return true;
120 LayoutDeviceIntRegion GtkCompositorWidget::GetTransparentRegion() {
121 LayoutDeviceIntRegion fullRegion(
122 LayoutDeviceIntRect(LayoutDeviceIntPoint(), GetClientSize()));
123 if (mWidget) {
124 fullRegion.SubOut(mWidget->GetOpaqueRegion());
126 return fullRegion;
129 #ifdef MOZ_WAYLAND
130 RefPtr<mozilla::layers::NativeLayerRoot>
131 GtkCompositorWidget::GetNativeLayerRoot() {
132 # if 0
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;
143 # endif
144 return nullptr;
146 #endif
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);
157 #endif
159 #if defined(MOZ_X11)
160 void GtkCompositorWidget::ConfigureX11Backend(Window aXWindow) {
161 // We don't have X window yet.
162 if (!aXWindow) {
163 mProvider.CleanupResources();
164 return;
166 // Initialize the window surface provider
167 mProvider.Initialize(aXWindow);
169 #endif
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();
179 #endif
180 #if defined(MOZ_X11)
181 if (GdkIsX11Display()) {
182 LOG(" configure XWindow %p\n", (void*)aXWindow);
183 ConfigureX11Backend((Window)aXWindow);
185 #endif
188 #ifdef MOZ_LOGGING
189 bool GtkCompositorWidget::IsPopup() {
190 return mWidget ? mWidget->IsPopup() : false;
192 #endif
194 UniquePtr<WaylandSurfaceLock> GtkCompositorWidget::LockSurface() {
195 return mWidget ? mWidget->LockSurface() : nullptr;
198 } // namespace widget
199 } // namespace mozilla