17#include <KDecoration2/Decoration>
21#include <linux/input.h>
26static const QString s_socketName = QStringLiteral(
"wayland_test_kwin_dont_crash_aurorae_destroy_deco-0");
34 void testBorderlessMaximizedWindows();
37void DontCrashAuroraeDestroyDecoTest::initTestCase()
40 QSKIP(
"no render node available");
43 qputenv(
"XDG_DATA_DIRS", QCoreApplication::applicationDirPath().toUtf8());
44 qRegisterMetaType<KWin::Window *>();
48 QRect(0, 0, 1280, 1024),
49 QRect(1280, 0, 1280, 1024),
52 KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig);
53 config->group(QStringLiteral(
"org.kde.kdecoration2")).writeEntry(
"library",
"org.kde.kwin.aurorae");
55 kwinApp()->setConfig(config);
58 qputenv(
"KWIN_COMPOSE", QByteArrayLiteral(
"O2"));
60 QVERIFY(applicationStartedSpy.wait());
63 QCOMPARE(outputs[0]->geometry(), QRect(0, 0, 1280, 1024));
64 QCOMPARE(outputs[1]->geometry(), QRect(1280, 0, 1280, 1024));
65 setenv(
"QT_QPA_PLATFORM",
"wayland",
true);
68void DontCrashAuroraeDestroyDecoTest::init()
74void DontCrashAuroraeDestroyDecoTest::testBorderlessMaximizedWindows()
81 KConfigGroup group = kwinApp()->config()->group(QStringLiteral(
"Windows"));
82 group.writeEntry(
"BorderlessMaximizedWindows",
true);
90 QVERIFY(!xcb_connection_has_error(c));
92 xcb_window_t windowId = xcb_generate_id(c);
93 xcb_create_window(c, XCB_COPY_FROM_PARENT, windowId,
rootWindow(), 0, 0, 100, 200, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT, 0,
nullptr);
94 xcb_map_window(c, windowId);
99 QVERIFY(windowCreatedSpy.wait());
100 X11Window *window = windowCreatedSpy.first().first().value<X11Window *>();
102 QCOMPARE(window->window(), windowId);
103 QVERIFY(window->isDecorated());
105 QCOMPARE(window->noBorder(),
false);
107 QCOMPARE(qstrcmp(window->decoration()->metaObject()->className(),
"Aurorae::Decoration"), 0);
109 QQuickItem *item = window->decoration()->property(
"item").value<QQuickItem *>()->findChild<QQuickItem *>(
"maximizeButton");
111 const QPointF scenePoint = item->mapToScene(QPoint(0, 0));
114 QMetaObject::invokeMethod(window,
"setReadyForPainting");
115 QVERIFY(window->readyForPainting());
119 quint32 timestamp = 1;
120 Test::pointerMotion(window->frameGeometry().topLeft() + scenePoint.toPoint(), timestamp++);
123 QVERIFY(maximizedStateChangedSpy.wait());
125 QCOMPARE(window->noBorder(),
true);
128 xcb_unmap_window(c, windowId);
129 xcb_destroy_window(c, windowId);
133 QVERIFY(windowClosedSpy.wait());
139#include "dont_crash_aurorae_destroy_deco.moc"
bool borderlessMaximizedWindows
void windowAdded(KWin::Window *)
QList< Output * > outputs() const
void setActiveOutput(Output *output)
#define WAYLANDTEST_MAIN(TestObject)
void setOutputConfig(const QList< QRect > &geometries)
void pointerButtonPressed(quint32 button, quint32 time)
XcbConnectionPtr createX11Connection()
QList< KWayland::Client::Output * > outputs
void pointerMotion(const QPointF &position, quint32 time)
bool renderNodeAvailable()
void pointerButtonReleased(quint32 button, quint32 time)
std::unique_ptr< xcb_connection_t, XcbConnectionDeleter > XcbConnectionPtr
KWIN_EXPORT xcb_window_t rootWindow()
@ MaximizeRestore
The window is not maximized in any direction.
@ MaximizeFull
Equal to MaximizeVertical | MaximizeHorizontal.
WaylandServer * waylandServer()
KWIN_EXPORT xcb_connection_t * connection()
InputRedirection * input()