2020-08-02 22:22:19 +00:00
|
|
|
/*
|
|
|
|
KWin - the KDE window manager
|
|
|
|
This file is part of the KDE project.
|
2020-04-27 18:44:12 +00:00
|
|
|
|
2020-08-02 22:22:19 +00:00
|
|
|
SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
2020-04-27 18:44:12 +00:00
|
|
|
|
2020-08-02 22:22:19 +00:00
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
*/
|
2020-04-27 18:44:12 +00:00
|
|
|
|
|
|
|
#include "xwaylandclient.h"
|
|
|
|
|
2021-02-03 20:15:34 +00:00
|
|
|
#include <KWaylandServer/surface_interface.h>
|
|
|
|
|
|
|
|
using namespace KWaylandServer;
|
|
|
|
|
2020-04-27 18:44:12 +00:00
|
|
|
namespace KWin
|
|
|
|
{
|
|
|
|
|
2021-02-03 20:15:34 +00:00
|
|
|
XwaylandClient::XwaylandClient()
|
|
|
|
{
|
2021-02-04 09:07:20 +00:00
|
|
|
// The wayland surface is associated with the Xwayland window asynchronously.
|
|
|
|
connect(this, &Toplevel::surfaceChanged, this, &XwaylandClient::associate);
|
2021-02-03 20:15:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void XwaylandClient::associate()
|
|
|
|
{
|
|
|
|
if (surface()->isMapped()) {
|
|
|
|
initialize();
|
|
|
|
} else {
|
2021-02-04 09:07:20 +00:00
|
|
|
// 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);
|
2021-02-03 20:15:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void XwaylandClient::initialize()
|
|
|
|
{
|
2021-02-04 09:07:20 +00:00
|
|
|
if (!readyForPainting()) { // avoid "setReadyForPainting()" function calling overhead
|
|
|
|
if (syncRequest().counter == XCB_NONE) { // cannot detect complete redraw, consider done now
|
|
|
|
setReadyForPainting();
|
|
|
|
setupWindowManagementInterface();
|
|
|
|
}
|
|
|
|
}
|
2021-02-03 20:15:34 +00:00
|
|
|
}
|
|
|
|
|
2020-04-27 18:44:12 +00:00
|
|
|
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
|