KWin
Loading...
Searching...
No Matches
test_xcb_window.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2013 Martin Gräßlin <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#include "testutils.h"
10// KWin
11#include "utils/xcbutils.h"
12// Qt
13#include <QApplication>
14#include <QTest>
15#include <private/qtx11extras_p.h>
16// xcb
17#include <xcb/xcb.h>
18
19using namespace KWin;
20
21class TestXcbWindow : public QObject
22{
23 Q_OBJECT
24private Q_SLOTS:
25 void initTestCase();
26 void defaultCtor();
27 void ctor();
28 void classCtor();
29 void create();
30 void mapUnmap();
31 void geometry();
32 void destroy();
33 void destroyNotManaged();
34};
35
36void TestXcbWindow::initTestCase()
37{
38 qApp->setProperty("x11RootWindow", QVariant::fromValue<quint32>(QX11Info::appRootWindow()));
39 qApp->setProperty("x11Connection", QVariant::fromValue<void *>(QX11Info::connection()));
40}
41
42void TestXcbWindow::defaultCtor()
43{
44 Xcb::Window window;
45 QCOMPARE(window.isValid(), false);
46 xcb_window_t wId = window;
47 QCOMPARE(wId, noneWindow());
48
49 xcb_window_t nativeWindow = createWindow();
50 Xcb::Window window2(nativeWindow);
51 QCOMPARE(window2.isValid(), true);
52 wId = window2;
53 QCOMPARE(wId, nativeWindow);
54}
55
56void TestXcbWindow::ctor()
57{
58 const QRect geometry(0, 0, 10, 10);
59 const uint32_t values[] = {true};
60 Xcb::Window window(geometry, XCB_CW_OVERRIDE_REDIRECT, values);
61 QCOMPARE(window.isValid(), true);
62 QVERIFY(window != XCB_WINDOW_NONE);
63 Xcb::WindowGeometry windowGeometry(window);
64 QCOMPARE(windowGeometry.isNull(), false);
65 QCOMPARE(windowGeometry.rect(), geometry);
66}
67
68void TestXcbWindow::classCtor()
69{
70 const QRect geometry(0, 0, 10, 10);
71 const uint32_t values[] = {true};
72 Xcb::Window window(geometry, XCB_WINDOW_CLASS_INPUT_ONLY, XCB_CW_OVERRIDE_REDIRECT, values);
73 QCOMPARE(window.isValid(), true);
74 QVERIFY(window != XCB_WINDOW_NONE);
75 Xcb::WindowGeometry windowGeometry(window);
76 QCOMPARE(windowGeometry.isNull(), false);
77 QCOMPARE(windowGeometry.rect(), geometry);
78
79 Xcb::WindowAttributes attribs(window);
80 QCOMPARE(attribs.isNull(), false);
81 QVERIFY(attribs->_class == XCB_WINDOW_CLASS_INPUT_ONLY);
82}
83
84void TestXcbWindow::create()
85{
86 Xcb::Window window;
87 QCOMPARE(window.isValid(), false);
88 xcb_window_t wId = window;
89 QCOMPARE(wId, noneWindow());
90
91 const QRect geometry(0, 0, 10, 10);
92 const uint32_t values[] = {true};
93 window.create(geometry, XCB_CW_OVERRIDE_REDIRECT, values);
94 QCOMPARE(window.isValid(), true);
95 QVERIFY(window != XCB_WINDOW_NONE);
96 // and reset again
97 window.reset();
98 QCOMPARE(window.isValid(), false);
99 QVERIFY(window == XCB_WINDOW_NONE);
100}
101
102void TestXcbWindow::mapUnmap()
103{
104 const QRect geometry(0, 0, 10, 10);
105 const uint32_t values[] = {true};
106 Xcb::Window window(geometry, XCB_WINDOW_CLASS_INPUT_ONLY, XCB_CW_OVERRIDE_REDIRECT, values);
107 Xcb::WindowAttributes attribs(window);
108 QCOMPARE(attribs.isNull(), false);
109 QVERIFY(attribs->map_state == XCB_MAP_STATE_UNMAPPED);
110
111 window.map();
112 Xcb::WindowAttributes attribs2(window);
113 QCOMPARE(attribs2.isNull(), false);
114 QVERIFY(attribs2->map_state != XCB_MAP_STATE_UNMAPPED);
115
116 window.unmap();
117 Xcb::WindowAttributes attribs3(window);
118 QCOMPARE(attribs3.isNull(), false);
119 QVERIFY(attribs3->map_state == XCB_MAP_STATE_UNMAPPED);
120
121 // map, unmap shouldn't fail for an invalid window, it's just ignored
122 window.reset();
123 window.map();
124 window.unmap();
125}
126
127void TestXcbWindow::geometry()
128{
129 const QRect geometry(0, 0, 10, 10);
130 const uint32_t values[] = {true};
131 Xcb::Window window(geometry, XCB_WINDOW_CLASS_INPUT_ONLY, XCB_CW_OVERRIDE_REDIRECT, values);
132 Xcb::WindowGeometry windowGeometry(window);
133 QCOMPARE(windowGeometry.isNull(), false);
134 QCOMPARE(windowGeometry.rect(), geometry);
135
136 const QRect geometry2(10, 20, 100, 200);
137 window.setGeometry(geometry2);
138 Xcb::WindowGeometry windowGeometry2(window);
139 QCOMPARE(windowGeometry2.isNull(), false);
140 QCOMPARE(windowGeometry2.rect(), geometry2);
141
142 // setting a geometry on an invalid window should be ignored
143 window.reset();
144 window.setGeometry(geometry2);
145 Xcb::WindowGeometry windowGeometry3(window);
146 QCOMPARE(windowGeometry3.isNull(), true);
147}
148
149void TestXcbWindow::destroy()
150{
151 const QRect geometry(0, 0, 10, 10);
152 const uint32_t values[] = {true};
153 Xcb::Window window(geometry, XCB_CW_OVERRIDE_REDIRECT, values);
154 QCOMPARE(window.isValid(), true);
155 xcb_window_t wId = window;
156
157 window.create(geometry, XCB_CW_OVERRIDE_REDIRECT, values);
158 // wId should now be invalid
159 xcb_generic_error_t *error = nullptr;
160 UniqueCPtr<xcb_get_window_attributes_reply_t> attribs(xcb_get_window_attributes_reply(
161 connection(),
162 xcb_get_window_attributes(connection(), wId),
163 &error));
164 QVERIFY(!attribs);
165 QCOMPARE(error->error_code, uint8_t(3));
166 QCOMPARE(error->resource_id, wId);
167 free(error);
168
169 // test the same for the dtor
170 {
171 Xcb::Window scopedWindow(geometry, XCB_CW_OVERRIDE_REDIRECT, values);
172 QVERIFY(scopedWindow.isValid());
173 wId = scopedWindow;
174 }
175 error = nullptr;
176 UniqueCPtr<xcb_get_window_attributes_reply_t> attribs2(xcb_get_window_attributes_reply(
177 connection(),
178 xcb_get_window_attributes(connection(), wId),
179 &error));
180 QVERIFY(!attribs2);
181 QCOMPARE(error->error_code, uint8_t(3));
182 QCOMPARE(error->resource_id, wId);
183 free(error);
184}
185
186void TestXcbWindow::destroyNotManaged()
187{
188 Xcb::Window window;
189 // just destroy the non-existing window
190 window.reset();
191
192 // now let's add a window
193 window.reset(createWindow(), false);
194 xcb_window_t w = window;
195 window.reset();
196 Xcb::WindowAttributes attribs(w);
197 QVERIFY(attribs);
198}
199
200Q_CONSTRUCTOR_FUNCTION(forceXcb)
202#include "test_xcb_window.moc"
void create(const QRectF &geometry, uint32_t mask=0, const uint32_t *values=nullptr, xcb_window_t parent=rootWindow())
Definition xcbutils.h:1726
void setGeometry(const QRectF &geometry)
Definition xcbutils.h:1748
void reset(xcb_window_t window=XCB_WINDOW_NONE, bool destroy=true)
Definition xcbutils.h:1741
bool isValid() const
Definition xcbutils.h:1710
KWIN_EXPORT xcb_connection_t * connection()
Definition xcb.h:19
std::unique_ptr< T, CDeleter > UniqueCPtr
Definition c_ptr.h:28
QTEST_MAIN(OnScreenNotificationTest)