47113e09b8
Currently, dealing with sub-surfaces is very difficult due to the scene design being heavily influenced by X11 requirements. The goal of this change is to re-work scene abstractions to make improving the wayland support easier. The Item class is based on the QQuickItem class. My hope is that one day we will be able to transition to QtQuick for painting scene, but in meanwhile it makes more sense to have a minimalistic internal item class. The WindowItem class represents a window. The SurfaceItem class represents the contents of either an X11, or a Wayland, or an internal surface. The DecorationItem and the ShadowItem class represent the server-side deco and drop-shadow, respectively. At the moment, the SurfaceItem is bound to the scene window, but the long term plan is to break that connection so we could re-use the SurfaceItem for things such as software cursors and drag-and-drop additional icons. One of the responsibilities of the Item is to schedule repaints as needed. Ideally, there shouldn't be any addRepaint() calls in the core code. The Item class schedules repaints on geometry updates. In the future, it also has to request an update if its opacity or visibility changes.
57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
/*
|
|
KWin - the KDE window manager
|
|
This file is part of the KDE project.
|
|
|
|
SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#include "xwaylandclient.h"
|
|
|
|
#include <KWaylandServer/surface_interface.h>
|
|
|
|
using namespace KWaylandServer;
|
|
|
|
namespace KWin
|
|
{
|
|
|
|
XwaylandClient::XwaylandClient()
|
|
{
|
|
// The wayland surface is associated with the Xwayland window asynchronously.
|
|
connect(this, &Toplevel::surfaceChanged, this, &XwaylandClient::associate);
|
|
}
|
|
|
|
void XwaylandClient::associate()
|
|
{
|
|
if (surface()->isMapped()) {
|
|
initialize();
|
|
} else {
|
|
// Queued connection because we want to mark the window ready for painting after
|
|
// the associated surface item has processed the new surface state.
|
|
connect(surface(), &SurfaceInterface::mapped, this, &XwaylandClient::initialize, Qt::QueuedConnection);
|
|
}
|
|
}
|
|
|
|
void XwaylandClient::initialize()
|
|
{
|
|
if (!readyForPainting()) { // avoid "setReadyForPainting()" function calling overhead
|
|
if (syncRequest().counter == XCB_NONE) { // cannot detect complete redraw, consider done now
|
|
setReadyForPainting();
|
|
setupWindowManagementInterface();
|
|
}
|
|
}
|
|
}
|
|
|
|
bool XwaylandClient::wantsSyncCounter() const
|
|
{
|
|
// When the frame window is resized, the attached buffer will be destroyed by
|
|
// Xwayland, causing unexpected invalid previous and current window pixmaps.
|
|
// With the addition of multiple window buffers in Xwayland 1.21, X11 clients
|
|
// are no longer able to destroy the buffer after it's been committed and not
|
|
// released by the compositor yet.
|
|
static const quint32 xwaylandVersion = xcb_get_setup(connection())->release_number;
|
|
return xwaylandVersion >= 12100000;
|
|
}
|
|
|
|
} // namespace KWin
|