Introduce the concept of an internal window system independent id
Summary: For supporting Wayland windows in the kwin_rules_dialog we need a way to pass a window id for Wayland windows to the dialog. This id needs to be sent to the dbus interface to query window information just like the interactive query. For Wayland windows we don't really have a window id and it would require to also pass the windowing system to kwin_rules_dialog and back through the dbus interface. To not complicate things this change introduces a windowing system independent id based on UUID. This could in future also be used internally for areas where it's window id based and used in both windowing systems. Test Plan: Adjusted test cases to verify the uuid is generated and passed to Deleted Reviewers: #kwin Subscribers: kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D16986
This commit is contained in:
parent
f8459a71cc
commit
3ad9ac7229
4 changed files with 38 additions and 0 deletions
|
@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "kwin_wayland_test.h"
|
||||
#include "cursor.h"
|
||||
#include "effects.h"
|
||||
#include "deleted.h"
|
||||
#include "platform.h"
|
||||
#include "shell_client.h"
|
||||
#include "screens.h"
|
||||
|
@ -95,6 +96,7 @@ private Q_SLOTS:
|
|||
|
||||
void TestShellClient::initTestCase()
|
||||
{
|
||||
qRegisterMetaType<KWin::Deleted*>();
|
||||
qRegisterMetaType<KWin::ShellClient*>();
|
||||
qRegisterMetaType<KWin::AbstractClient*>();
|
||||
qRegisterMetaType<KWayland::Client::Output*>();
|
||||
|
@ -174,6 +176,12 @@ void TestShellClient::testMapUnmapMap()
|
|||
QVERIFY(client->property("moveable").toBool());
|
||||
QVERIFY(client->property("moveableAcrossScreens").toBool());
|
||||
QVERIFY(client->property("resizeable").toBool());
|
||||
QCOMPARE(client->internalId().isNull(), false);
|
||||
const auto uuid = client->internalId();
|
||||
QUuid deletedUuid;
|
||||
QCOMPARE(deletedUuid.isNull(), true);
|
||||
|
||||
connect(client, &ShellClient::windowClosed, this, [&deletedUuid] (Toplevel *, Deleted *d) { deletedUuid = d->internalId(); });
|
||||
|
||||
// now unmap
|
||||
QSignalSpy hiddenSpy(client, &ShellClient::windowHidden);
|
||||
|
@ -212,6 +220,7 @@ void TestShellClient::testMapUnmapMap()
|
|||
QCOMPARE(hiddenSpy.count(), 2);
|
||||
QCOMPARE(client->readyForPainting(), true);
|
||||
QCOMPARE(client->isHiddenInternal(), true);
|
||||
QCOMPARE(client->internalId(), uuid);
|
||||
QVERIFY(windowClosedSpy.isEmpty());
|
||||
QCOMPARE(effectsWindowHiddenSpy.count(), 2);
|
||||
QCOMPARE(effectsWindowHiddenSpy.last().first().value<EffectWindow*>(), client->effectWindow());
|
||||
|
@ -221,6 +230,8 @@ void TestShellClient::testMapUnmapMap()
|
|||
QVERIFY(windowClosedSpy.wait());
|
||||
QCOMPARE(windowClosedSpy.count(), 1);
|
||||
QCOMPARE(effectsWindowHiddenSpy.count(), 2);
|
||||
QCOMPARE(deletedUuid.isNull(), false);
|
||||
QCOMPARE(deletedUuid, uuid);
|
||||
}
|
||||
|
||||
void TestShellClient::testDesktopPresenceChanged()
|
||||
|
|
|
@ -24,6 +24,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "effects.h"
|
||||
#include "effectloader.h"
|
||||
#include "cursor.h"
|
||||
#include "deleted.h"
|
||||
#include "platform.h"
|
||||
#include "screens.h"
|
||||
#include "shell_client.h"
|
||||
|
@ -60,6 +61,7 @@ private Q_SLOTS:
|
|||
|
||||
void X11ClientTest::initTestCase()
|
||||
{
|
||||
qRegisterMetaType<KWin::Deleted*>();
|
||||
qRegisterMetaType<KWin::ShellClient*>();
|
||||
qRegisterMetaType<KWin::AbstractClient*>();
|
||||
QSignalSpy workspaceCreatedSpy(kwinApp(), &Application::workspaceCreated);
|
||||
|
@ -352,6 +354,13 @@ void X11ClientTest::testX11WindowId()
|
|||
QCOMPARE(client->windowId(), w);
|
||||
QVERIFY(client->isActive());
|
||||
QCOMPARE(client->window(), w);
|
||||
QCOMPARE(client->internalId().isNull(), false);
|
||||
const auto uuid = client->internalId();
|
||||
QUuid deletedUuid;
|
||||
QCOMPARE(deletedUuid.isNull(), true);
|
||||
|
||||
connect(client, &Client::windowClosed, this, [&deletedUuid] (Toplevel *, Deleted *d) { deletedUuid = d->internalId(); });
|
||||
|
||||
|
||||
NETRootInfo rootInfo(c.data(), NET::WMAllProperties);
|
||||
QCOMPARE(rootInfo.activeWindow(), client->window());
|
||||
|
@ -379,6 +388,12 @@ void X11ClientTest::testX11WindowId()
|
|||
// and destroy the window again
|
||||
xcb_unmap_window(c.data(), w);
|
||||
xcb_flush(c.data());
|
||||
QSignalSpy windowClosedSpy(client, &Client::windowClosed);
|
||||
QVERIFY(windowClosedSpy.isValid());
|
||||
QVERIFY(windowClosedSpy.wait());
|
||||
|
||||
QCOMPARE(deletedUuid.isNull(), false);
|
||||
QCOMPARE(deletedUuid, uuid);
|
||||
}
|
||||
|
||||
void X11ClientTest::testCaptionChanges()
|
||||
|
|
|
@ -44,6 +44,7 @@ Toplevel::Toplevel()
|
|||
, info(NULL)
|
||||
, ready_for_painting(true)
|
||||
, m_isDamaged(false)
|
||||
, m_internalId(QUuid::createUuid())
|
||||
, m_client()
|
||||
, damage_handle(None)
|
||||
, is_shape(false)
|
||||
|
@ -107,6 +108,7 @@ void Toplevel::detectShape(Window id)
|
|||
// used only by Deleted::copy()
|
||||
void Toplevel::copyToDeleted(Toplevel* c)
|
||||
{
|
||||
m_internalId = c->internalId();
|
||||
geom = c->geom;
|
||||
m_visual = c->m_visual;
|
||||
bit_depth = c->bit_depth;
|
||||
|
|
10
toplevel.h
10
toplevel.h
|
@ -31,6 +31,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
// Qt
|
||||
#include <QObject>
|
||||
#include <QMatrix4x4>
|
||||
#include <QUuid>
|
||||
// xcb
|
||||
#include <xcb/damage.h>
|
||||
#include <xcb/xfixes.h>
|
||||
|
@ -458,6 +459,14 @@ public:
|
|||
**/
|
||||
virtual bool isPopupWindow() const;
|
||||
|
||||
/**
|
||||
* A UUID to uniquely identify this Toplevel independent of windowing system.
|
||||
**/
|
||||
QUuid internalId() const
|
||||
{
|
||||
return m_internalId;
|
||||
}
|
||||
|
||||
Q_SIGNALS:
|
||||
void opacityChanged(KWin::Toplevel* toplevel, qreal oldOpacity);
|
||||
void damaged(KWin::Toplevel* toplevel, const QRect& damage);
|
||||
|
@ -577,6 +586,7 @@ protected:
|
|||
|
||||
private:
|
||||
// when adding new data members, check also copyToDeleted()
|
||||
QUuid m_internalId;
|
||||
Xcb::Window m_client;
|
||||
xcb_damage_damage_t damage_handle;
|
||||
QRegion damage_region; // damage is really damaged window (XDamage) and texture needs
|
||||
|
|
Loading…
Reference in a new issue