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
--- 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