mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-23 10:15:41 +00:00
5a403b0cdd
wl_egl_window size must exactly march GL rendering pipeline setting. Compositor and widget can have different window sizes during window resize when widget is resized faster than layout can render. Firefox window is rendered misplaced then and it's "jumping" as layout size is behind toolkit size. Differential Revision: https://phabricator.services.mozilla.com/D49136 --HG-- extra : moz-landing-system : lando
121 lines
3.6 KiB
C++
121 lines
3.6 KiB
C++
/* -*- 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/. */
|
|
|
|
#include "GtkCompositorWidget.h"
|
|
|
|
#include "gfxPlatformGtk.h"
|
|
#include "mozilla/layers/CompositorThread.h"
|
|
#include "mozilla/widget/InProcessCompositorWidget.h"
|
|
#include "mozilla/widget/PlatformWidgetTypes.h"
|
|
#include "nsWindow.h"
|
|
|
|
namespace mozilla {
|
|
namespace widget {
|
|
|
|
GtkCompositorWidget::GtkCompositorWidget(
|
|
const GtkCompositorWidgetInitData& aInitData,
|
|
const layers::CompositorOptions& aOptions, nsWindow* aWindow)
|
|
: CompositorWidget(aOptions), mWidget(aWindow) {
|
|
// If we have a nsWindow, then grab the already existing display connection
|
|
// If we don't, then use the init data to connect to the display
|
|
if (aWindow) {
|
|
mXDisplay = aWindow->XDisplay();
|
|
} else {
|
|
mXDisplay = XOpenDisplay(aInitData.XDisplayString().get());
|
|
}
|
|
|
|
#ifdef MOZ_WAYLAND
|
|
if (!mXDisplay) {
|
|
MOZ_RELEASE_ASSERT(
|
|
aWindow, "We're running on Wayland and but without valid nsWindow.");
|
|
mProvider.Initialize(aWindow);
|
|
} else
|
|
#endif
|
|
{
|
|
mXWindow = (Window)aInitData.XWindow();
|
|
|
|
// Grab the window's visual and depth
|
|
XWindowAttributes windowAttrs;
|
|
if (!XGetWindowAttributes(mXDisplay, mXWindow, &windowAttrs)) {
|
|
NS_WARNING("GtkCompositorWidget(): XGetWindowAttributes() failed!");
|
|
}
|
|
|
|
Visual* visual = windowAttrs.visual;
|
|
int depth = windowAttrs.depth;
|
|
|
|
// Initialize the window surface provider
|
|
mProvider.Initialize(mXDisplay, mXWindow, visual, depth,
|
|
aInitData.Shaped());
|
|
}
|
|
mClientSize = aInitData.InitialClientSize();
|
|
}
|
|
|
|
GtkCompositorWidget::~GtkCompositorWidget() {
|
|
mProvider.CleanupResources();
|
|
|
|
// If we created our own display connection, we need to destroy it
|
|
if (!mWidget && mXDisplay) {
|
|
XCloseDisplay(mXDisplay);
|
|
mXDisplay = nullptr;
|
|
}
|
|
}
|
|
|
|
already_AddRefed<gfx::DrawTarget> GtkCompositorWidget::StartRemoteDrawing() {
|
|
return nullptr;
|
|
}
|
|
void GtkCompositorWidget::EndRemoteDrawing() {}
|
|
|
|
already_AddRefed<gfx::DrawTarget>
|
|
GtkCompositorWidget::StartRemoteDrawingInRegion(
|
|
LayoutDeviceIntRegion& aInvalidRegion, layers::BufferMode* aBufferMode) {
|
|
return mProvider.StartRemoteDrawingInRegion(aInvalidRegion, aBufferMode);
|
|
}
|
|
|
|
void GtkCompositorWidget::EndRemoteDrawingInRegion(
|
|
gfx::DrawTarget* aDrawTarget, const LayoutDeviceIntRegion& aInvalidRegion) {
|
|
mProvider.EndRemoteDrawingInRegion(aDrawTarget, aInvalidRegion);
|
|
}
|
|
|
|
nsIWidget* GtkCompositorWidget::RealWidget() { return mWidget; }
|
|
|
|
void GtkCompositorWidget::NotifyClientSizeChanged(
|
|
const LayoutDeviceIntSize& aClientSize) {
|
|
mClientSize = aClientSize;
|
|
}
|
|
|
|
#ifdef MOZ_WAYLAND
|
|
void GtkCompositorWidget::RequestsUpdatingEGLSurface() {
|
|
mWaylandRequestsUpdatingEGLSurface = true;
|
|
}
|
|
|
|
bool GtkCompositorWidget::WaylandRequestsUpdatingEGLSurface() {
|
|
bool ret = mWaylandRequestsUpdatingEGLSurface;
|
|
mWaylandRequestsUpdatingEGLSurface = false;
|
|
return ret;
|
|
}
|
|
#endif
|
|
|
|
LayoutDeviceIntSize GtkCompositorWidget::GetClientSize() { return mClientSize; }
|
|
|
|
uintptr_t GtkCompositorWidget::GetWidgetKey() {
|
|
return reinterpret_cast<uintptr_t>(mWidget);
|
|
}
|
|
|
|
EGLNativeWindowType GtkCompositorWidget::GetEGLNativeWindow() {
|
|
return (EGLNativeWindowType)mWidget->GetNativeData(NS_NATIVE_EGL_WINDOW);
|
|
}
|
|
|
|
#ifdef MOZ_WAYLAND
|
|
void GtkCompositorWidget::SetEGLNativeWindowSize(
|
|
const LayoutDeviceIntSize& aEGLWindowSize) {
|
|
if (mWidget) {
|
|
mWidget->SetEGLNativeWindowSize(aEGLWindowSize);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
} // namespace widget
|
|
} // namespace mozilla
|