Bug 1406533 - Implement a way to transfer shape option from nsWindow to WindowSurfaceX11Image, r?lsalzman draft
authorMartin Stransky <stransky@redhat.com>
Tue, 24 Jul 2018 16:07:04 +0200
changeset 822011 19379418823411fb7a4b70b4c62d93c1b611dd34
parent 822010 42d7abf8fe0d4061c91f7a43f6f7e6ad88055ab8
child 822012 406a961164b0021b7361209a6c79f308322ae33c
push id117252
push userstransky@redhat.com
push dateTue, 24 Jul 2018 14:29:28 +0000
reviewerslsalzman
bugs1406533
milestone63.0a1
Bug 1406533 - Implement a way to transfer shape option from nsWindow to WindowSurfaceX11Image, r?lsalzman Add a new config attribute to GtkCompositorWidgetInitData to allow transfer the shape option from nsWindow. Also when shape is requested don't use XRender or Shm widgets - only X11Image is supported now. MozReview-Commit-ID: ElxnGQpLOry
widget/gtk/GtkCompositorWidget.cpp
widget/gtk/PlatformWidgetTypes.ipdlh
widget/gtk/WindowSurfaceProvider.cpp
widget/gtk/WindowSurfaceProvider.h
--- a/widget/gtk/GtkCompositorWidget.cpp
+++ b/widget/gtk/GtkCompositorWidget.cpp
@@ -45,18 +45,18 @@ GtkCompositorWidget::GtkCompositorWidget
     Visual*   visual = windowAttrs.visual;
     int       depth = windowAttrs.depth;
 
     // Initialize the window surface provider
     mProvider.Initialize(
       mXDisplay,
       mXWindow,
       visual,
-      depth
-      );
+      depth,
+      aInitData.Shaped());
   }
   mClientSize = aInitData.InitialClientSize();
 }
 
 GtkCompositorWidget::~GtkCompositorWidget()
 {
   mProvider.CleanupResources();
 
--- a/widget/gtk/PlatformWidgetTypes.ipdlh
+++ b/widget/gtk/PlatformWidgetTypes.ipdlh
@@ -10,16 +10,17 @@ using mozilla::LayoutDeviceIntSize from 
 
 namespace mozilla {
 namespace widget {
 
 struct GtkCompositorWidgetInitData
 {
   uintptr_t           XWindow;
   nsCString           XDisplayString;
+  bool                Shaped;
 
   LayoutDeviceIntSize InitialClientSize;
 };
 
 union CompositorWidgetInitData
 {
   GtkCompositorWidgetInitData;
   HeadlessCompositorWidgetInitData;
--- a/widget/gtk/WindowSurfaceProvider.cpp
+++ b/widget/gtk/WindowSurfaceProvider.cpp
@@ -26,35 +26,38 @@ WindowSurfaceProvider::WindowSurfaceProv
     , mXDisplay(nullptr)
     , mXWindow(0)
     , mXVisual(nullptr)
     , mXDepth(0)
     , mWindowSurface(nullptr)
 #ifdef MOZ_WAYLAND
     , mWidget(nullptr)
 #endif
+    , mIsShaped(false)
 {
 }
 
 void WindowSurfaceProvider::Initialize(
       Display* aDisplay,
       Window aWindow,
       Visual* aVisual,
-      int aDepth)
+      int aDepth,
+      bool aIsShaped)
 {
   // We should not be initialized
   MOZ_ASSERT(!mXDisplay);
 
   // This should also be a valid initialization
   MOZ_ASSERT(aDisplay && aWindow != X11None && aVisual);
 
   mXDisplay = aDisplay;
   mXWindow = aWindow;
   mXVisual = aVisual;
   mXDepth = aDepth;
+  mIsShaped = aIsShaped;
   mIsX11Display = true;
 }
 
 #ifdef MOZ_WAYLAND
 void WindowSurfaceProvider::Initialize(nsWindow *aWidget)
 {
   MOZ_ASSERT(aWidget->GetWaylandDisplay(),
              "We are supposed to have a Wayland display!");
@@ -83,31 +86,32 @@ WindowSurfaceProvider::CreateWindowSurfa
   MOZ_ASSERT(mXDisplay);
 
   // Blit to the window with the following priority:
   // 1. XRender (iff XRender is enabled && we are in-process)
   // 2. MIT-SHM
   // 3. XPutImage
 
 #ifdef MOZ_WIDGET_GTK
-  if (gfxVars::UseXRender()) {
+  if (!mIsShaped && gfxVars::UseXRender()) {
     LOGDRAW(("Drawing to nsWindow %p using XRender\n", (void*)this));
     return MakeUnique<WindowSurfaceXRender>(mXDisplay, mXWindow, mXVisual, mXDepth);
   }
 #endif // MOZ_WIDGET_GTK
 
 #ifdef MOZ_HAVE_SHMIMAGE
-  if (nsShmImage::UseShm()) {
+  if (!mIsShaped && nsShmImage::UseShm()) {
     LOGDRAW(("Drawing to nsWindow %p using MIT-SHM\n", (void*)this));
     return MakeUnique<WindowSurfaceX11SHM>(mXDisplay, mXWindow, mXVisual, mXDepth);
   }
 #endif // MOZ_HAVE_SHMIMAGE
 
   LOGDRAW(("Drawing to nsWindow %p using XPutImage\n", (void*)this));
-  return MakeUnique<WindowSurfaceX11Image>(mXDisplay, mXWindow, mXVisual, mXDepth);
+  return MakeUnique<WindowSurfaceX11Image>(mXDisplay, mXWindow, mXVisual,
+    mXDepth, mIsShaped);
 }
 
 already_AddRefed<gfx::DrawTarget>
 WindowSurfaceProvider::StartRemoteDrawingInRegion(LayoutDeviceIntRegion& aInvalidRegion,
                                                 layers::BufferMode* aBufferMode)
 {
   if (aInvalidRegion.IsEmpty())
     return nullptr;
@@ -120,17 +124,17 @@ WindowSurfaceProvider::StartRemoteDrawin
 
   *aBufferMode = BufferMode::BUFFER_NONE;
   RefPtr<DrawTarget> dt = nullptr;
   if (!(dt = mWindowSurface->Lock(aInvalidRegion)) &&
       mIsX11Display && !mWindowSurface->IsFallback()) {
     // We can't use WindowSurfaceX11Image fallback on Wayland but
     // Lock() call on WindowSurfaceWayland should never fail.
     gfxWarningOnce() << "Failed to lock WindowSurface, falling back to XPutImage backend.";
-    mWindowSurface = MakeUnique<WindowSurfaceX11Image>(mXDisplay, mXWindow, mXVisual, mXDepth);
+    mWindowSurface = MakeUnique<WindowSurfaceX11Image>(mXDisplay, mXWindow, mXVisual, mXDepth, mIsShaped);
     dt = mWindowSurface->Lock(aInvalidRegion);
   }
   return dt.forget();
 }
 
 void
 WindowSurfaceProvider::EndRemoteDrawingInRegion(gfx::DrawTarget* aDrawTarget,
                                               LayoutDeviceIntRegion& aInvalidRegion)
--- a/widget/gtk/WindowSurfaceProvider.h
+++ b/widget/gtk/WindowSurfaceProvider.h
@@ -39,17 +39,18 @@ public:
    * handle and display to attach to. WindowSurfaceProvider doesn't
    * own the Display, Window, etc, and they must continue to exist
    * while WindowSurfaceProvider is used.
    */
   void Initialize(
       Display* aDisplay,
       Window aWindow,
       Visual* aVisual,
-      int aDepth);
+      int aDepth,
+      bool aIsShaped);
 
 #ifdef MOZ_WAYLAND
    void Initialize(nsWindow *aWidget);
 #endif
 
   /**
    * Releases any surfaces created by this provider.
    * This is used by GtkCompositorWidget to get rid
@@ -71,14 +72,15 @@ private:
   Display*    mXDisplay;
   Window      mXWindow;
   Visual*     mXVisual;
   int         mXDepth;
   UniquePtr<WindowSurface> mWindowSurface;
 #ifdef MOZ_WAYLAND
   nsWindow*   mWidget;
 #endif
+  bool        mIsShaped;
 };
 
 }  // namespace widget
 }  // namespace mozilla
 
 #endif // _MOZILLA_WIDGET_GTK_WINDOW_SURFACE_PROVIDER_H