summaryrefslogtreecommitdiffstats
path: root/widget/gtk/GtkCompositorWidget.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/gtk/GtkCompositorWidget.h')
-rw-r--r--widget/gtk/GtkCompositorWidget.h140
1 files changed, 140 insertions, 0 deletions
diff --git a/widget/gtk/GtkCompositorWidget.h b/widget/gtk/GtkCompositorWidget.h
new file mode 100644
index 0000000000..5bf89835d7
--- /dev/null
+++ b/widget/gtk/GtkCompositorWidget.h
@@ -0,0 +1,140 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef widget_gtk_GtkCompositorWidget_h
+#define widget_gtk_GtkCompositorWidget_h
+
+#include "GLDefs.h"
+#include "mozilla/DataMutex.h"
+#include "mozilla/widget/CompositorWidget.h"
+#include "WindowSurfaceProvider.h"
+
+class nsIWidget;
+class nsWindow;
+
+namespace mozilla {
+
+namespace layers {
+class NativeLayerRootWayland;
+} // namespace layers
+
+namespace widget {
+
+class PlatformCompositorWidgetDelegate : public CompositorWidgetDelegate {
+ public:
+ virtual void NotifyClientSizeChanged(
+ const LayoutDeviceIntSize& aClientSize) = 0;
+ virtual GtkCompositorWidget* AsGtkCompositorWidget() { return nullptr; };
+
+ virtual void DisableRendering() = 0;
+ virtual void EnableRendering(const uintptr_t aXWindow,
+ const bool aShaped) = 0;
+
+ // CompositorWidgetDelegate Overrides
+
+ PlatformCompositorWidgetDelegate* AsPlatformSpecificDelegate() override {
+ return this;
+ }
+};
+
+class GtkCompositorWidgetInitData;
+
+class GtkCompositorWidget : public CompositorWidget,
+ public PlatformCompositorWidgetDelegate {
+ public:
+ GtkCompositorWidget(const GtkCompositorWidgetInitData& aInitData,
+ const layers::CompositorOptions& aOptions,
+ RefPtr<nsWindow> aWindow /* = nullptr*/);
+ ~GtkCompositorWidget();
+
+ // CompositorWidget Overrides
+
+ already_AddRefed<gfx::DrawTarget> StartRemoteDrawing() override;
+ void EndRemoteDrawing() override;
+
+ already_AddRefed<gfx::DrawTarget> StartRemoteDrawingInRegion(
+ const LayoutDeviceIntRegion& aInvalidRegion,
+ layers::BufferMode* aBufferMode) override;
+ void EndRemoteDrawingInRegion(
+ gfx::DrawTarget* aDrawTarget,
+ const LayoutDeviceIntRegion& aInvalidRegion) override;
+
+ LayoutDeviceIntSize GetClientSize() override;
+ void RemoteLayoutSizeUpdated(const LayoutDeviceRect& aSize);
+
+ nsIWidget* RealWidget() override;
+ GtkCompositorWidget* AsGTK() override { return this; }
+ CompositorWidgetDelegate* AsDelegate() override { return this; }
+
+ EGLNativeWindowType GetEGLNativeWindow();
+
+ LayoutDeviceIntRegion GetTransparentRegion() override;
+
+ // Suspend rendering of this remote widget and clear all resources.
+ // Can be used when underlying window is hidden/unmapped.
+ void DisableRendering() override;
+
+ // Resume rendering with to given aXWindow (X11) or nsWindow (Wayland).
+ void EnableRendering(const uintptr_t aXWindow, const bool aShaped) override;
+
+ // If we fail to set window size (due to different screen scale or so)
+ // we can't paint the frame by compositor.
+ bool SetEGLNativeWindowSize(const LayoutDeviceIntSize& aEGLWindowSize);
+
+#if defined(MOZ_X11)
+ Window XWindow() const { return mXWindow; }
+#endif
+#if defined(MOZ_WAYLAND)
+ RefPtr<mozilla::layers::NativeLayerRoot> GetNativeLayerRoot() override;
+#endif
+
+ bool PreRender(WidgetRenderingContext* aContext) override {
+ return !mIsRenderingSuspended;
+ }
+ bool IsHidden() const override { return mIsRenderingSuspended; }
+
+ // PlatformCompositorWidgetDelegate Overrides
+
+ void NotifyClientSizeChanged(const LayoutDeviceIntSize& aClientSize) override;
+ GtkCompositorWidget* AsGtkCompositorWidget() override { return this; }
+
+ private:
+#if defined(MOZ_WAYLAND)
+ bool ConfigureWaylandBackend();
+#endif
+#if defined(MOZ_X11)
+ bool ConfigureX11Backend(Window aXWindow, bool aShaped);
+#endif
+#ifdef MOZ_LOGGING
+ bool IsPopup();
+#endif
+
+ protected:
+ RefPtr<nsWindow> mWidget;
+
+ private:
+ // This field is written to on the main thread and read from on the compositor
+ // or renderer thread. During window resizing, this is subject to a (largely
+ // benign) read/write race, see bug 1665726. The DataMutex doesn't prevent the
+ // read/write race, but it does make it Not Undefined Behaviour, and also
+ // ensures we only ever use the old or new size, and not some weird synthesis
+ // of the two.
+ DataMutex<LayoutDeviceIntSize> mClientSize;
+
+ WindowSurfaceProvider mProvider;
+
+#if defined(MOZ_X11)
+ Window mXWindow = {};
+#endif
+#ifdef MOZ_WAYLAND
+ RefPtr<mozilla::layers::NativeLayerRootWayland> mNativeLayerRoot;
+#endif
+ Atomic<bool> mIsRenderingSuspended{true};
+};
+
+} // namespace widget
+} // namespace mozilla
+
+#endif // widget_gtk_GtkCompositorWidget_h