13#include <QApplication>
16#include <private/qtx11extras_p.h>
19#include <xcb/xcb_icccm.h>
30 void testSizeHints_data();
32 void testSizeHintsEmpty();
33 void testSizeHintsNotSet();
34 void geometryHintsBeforeInit();
35 void geometryHintsBeforeRead();
41void TestXcbSizeHints::initTestCase()
43 qApp->setProperty(
"x11RootWindow", QVariant::fromValue<quint32>(QX11Info::appRootWindow()));
44 qApp->setProperty(
"x11Connection", QVariant::fromValue<void *>(QX11Info::connection()));
47void TestXcbSizeHints::init()
49 const uint32_t values[] = {
true};
50 m_testWindow.
create(QRect(0, 0, 10, 10), XCB_WINDOW_CLASS_INPUT_ONLY, XCB_CW_OVERRIDE_REDIRECT, values);
51 QVERIFY(m_testWindow.
isValid());
54void TestXcbSizeHints::cleanup()
59void TestXcbSizeHints::testSizeHints_data()
62 QTest::addColumn<QPoint>(
"userPos");
63 QTest::addColumn<QSize>(
"userSize");
64 QTest::addColumn<QSize>(
"minSize");
65 QTest::addColumn<QSize>(
"maxSize");
66 QTest::addColumn<QSize>(
"resizeInc");
67 QTest::addColumn<QSize>(
"minAspect");
68 QTest::addColumn<QSize>(
"maxAspect");
69 QTest::addColumn<QSize>(
"baseSize");
70 QTest::addColumn<qint32>(
"gravity");
72 QTest::addColumn<qint32>(
"expectedFlags");
73 QTest::addColumn<qint32>(
"expectedPad0");
74 QTest::addColumn<qint32>(
"expectedPad1");
75 QTest::addColumn<qint32>(
"expectedPad2");
76 QTest::addColumn<qint32>(
"expectedPad3");
77 QTest::addColumn<qint32>(
"expectedMinWidth");
78 QTest::addColumn<qint32>(
"expectedMinHeight");
79 QTest::addColumn<qint32>(
"expectedMaxWidth");
80 QTest::addColumn<qint32>(
"expectedMaxHeight");
81 QTest::addColumn<qint32>(
"expectedWidthInc");
82 QTest::addColumn<qint32>(
"expectedHeightInc");
83 QTest::addColumn<qint32>(
"expectedMinAspectNum");
84 QTest::addColumn<qint32>(
"expectedMinAspectDen");
85 QTest::addColumn<qint32>(
"expectedMaxAspectNum");
86 QTest::addColumn<qint32>(
"expectedMaxAspectDen");
87 QTest::addColumn<qint32>(
"expectedBaseWidth");
88 QTest::addColumn<qint32>(
"expectedBaseHeight");
90 QTest::addColumn<QSize>(
"expectedMinSize");
91 QTest::addColumn<QSize>(
"expectedMaxSize");
92 QTest::addColumn<QSize>(
"expectedResizeIncrements");
93 QTest::addColumn<QSize>(
"expectedMinAspect");
94 QTest::addColumn<QSize>(
"expectedMaxAspect");
95 QTest::addColumn<QSize>(
"expectedBaseSize");
96 QTest::addColumn<qint32>(
"expectedGravity");
98 QTest::newRow(
"userPos") << QPoint(1, 2) << QSize() << QSize() << QSize() << QSize() << QSize() << QSize() << QSize() << 0
99 << 1 << 1 << 2 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0
100 << QSize(0, 0) << QSize(INT_MAX, INT_MAX) << QSize(1, 1) << QSize(1, INT_MAX) << QSize(INT_MAX, 1) << QSize(0, 0) << qint32(XCB_GRAVITY_NORTH_WEST);
101 QTest::newRow(
"userSize") << QPoint() << QSize(1, 2) << QSize() << QSize() << QSize() << QSize() << QSize() << QSize() << 0
102 << 2 << 0 << 0 << 1 << 2 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0
103 << QSize(0, 0) << QSize(INT_MAX, INT_MAX) << QSize(1, 1) << QSize(1, INT_MAX) << QSize(INT_MAX, 1) << QSize(0, 0) << qint32(XCB_GRAVITY_NORTH_WEST);
104 QTest::newRow(
"minSize") << QPoint() << QSize() << QSize(1, 2) << QSize() << QSize() << QSize() << QSize() << QSize() << 0
105 << 16 << 0 << 0 << 0 << 0 << 1 << 2 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0
106 << QSize(1, 2) << QSize(INT_MAX, INT_MAX) << QSize(1, 1) << QSize(1, INT_MAX) << QSize(INT_MAX, 1) << QSize(0, 0) << qint32(XCB_GRAVITY_NORTH_WEST);
107 QTest::newRow(
"maxSize") << QPoint() << QSize() << QSize() << QSize(1, 2) << QSize() << QSize() << QSize() << QSize() << 0
108 << 32 << 0 << 0 << 0 << 0 << 0 << 0 << 1 << 2 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0
109 << QSize(0, 0) << QSize(1, 2) << QSize(1, 1) << QSize(1, INT_MAX) << QSize(INT_MAX, 1) << QSize(0, 0) << qint32(XCB_GRAVITY_NORTH_WEST);
110 QTest::newRow(
"maxSize0") << QPoint() << QSize() << QSize() << QSize(0, 0) << QSize() << QSize() << QSize() << QSize() << 0
111 << 32 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0
112 << QSize(0, 0) << QSize(1, 1) << QSize(1, 1) << QSize(1, INT_MAX) << QSize(INT_MAX, 1) << QSize(0, 0) << qint32(XCB_GRAVITY_NORTH_WEST);
113 QTest::newRow(
"min/maxSize") << QPoint() << QSize() << QSize(1, 2) << QSize(3, 4) << QSize() << QSize() << QSize() << QSize() << 0
114 << 48 << 0 << 0 << 0 << 0 << 1 << 2 << 3 << 4 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0
115 << QSize(1, 2) << QSize(3, 4) << QSize(1, 1) << QSize(1, INT_MAX) << QSize(INT_MAX, 1) << QSize(0, 0) << qint32(XCB_GRAVITY_NORTH_WEST);
116 QTest::newRow(
"resizeInc") << QPoint() << QSize() << QSize() << QSize() << QSize(1, 2) << QSize() << QSize() << QSize() << 0
117 << 64 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 1 << 2 << 0 << 0 << 0 << 0 << 0 << 0
118 << QSize(0, 0) << QSize(INT_MAX, INT_MAX) << QSize(1, 2) << QSize(1, INT_MAX) << QSize(INT_MAX, 1) << QSize(0, 0) << qint32(XCB_GRAVITY_NORTH_WEST);
119 QTest::newRow(
"resizeInc0") << QPoint() << QSize() << QSize() << QSize() << QSize(0, 0) << QSize() << QSize() << QSize() << 0
120 << 64 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0
121 << QSize(0, 0) << QSize(INT_MAX, INT_MAX) << QSize(1, 1) << QSize(1, INT_MAX) << QSize(INT_MAX, 1) << QSize(0, 0) << qint32(XCB_GRAVITY_NORTH_WEST);
122 QTest::newRow(
"aspect") << QPoint() << QSize() << QSize() << QSize() << QSize() << QSize(1, 2) << QSize(3, 4) << QSize() << 0
123 << 128 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 1 << 2 << 3 << 4 << 0 << 0
124 << QSize(0, 0) << QSize(INT_MAX, INT_MAX) << QSize(1, 1) << QSize(1, 2) << QSize(3, 4) << QSize(0, 0) << qint32(XCB_GRAVITY_NORTH_WEST);
125 QTest::newRow(
"aspectDivision0") << QPoint() << QSize() << QSize() << QSize() << QSize() << QSize(1, 0) << QSize(3, 0) << QSize() << 0
126 << 128 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 1 << 0 << 3 << 0 << 0 << 0
127 << QSize(0, 0) << QSize(INT_MAX, INT_MAX) << QSize(1, 1) << QSize(1, 1) << QSize(3, 1) << QSize(0, 0) << qint32(XCB_GRAVITY_NORTH_WEST);
128 QTest::newRow(
"baseSize") << QPoint() << QSize() << QSize() << QSize() << QSize() << QSize() << QSize() << QSize(1, 2) << 0
129 << 256 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 1 << 2
130 << QSize(1, 2) << QSize(INT_MAX, INT_MAX) << QSize(1, 1) << QSize(1, INT_MAX) << QSize(INT_MAX, 1) << QSize(1, 2) << qint32(XCB_GRAVITY_NORTH_WEST);
131 QTest::newRow(
"gravity") << QPoint() << QSize() << QSize() << QSize() << QSize() << QSize() << QSize() << QSize() << qint32(XCB_GRAVITY_STATIC)
132 << 512 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0
133 << QSize(0, 0) << QSize(INT_MAX, INT_MAX) << QSize(1, 1) << QSize(1, INT_MAX) << QSize(INT_MAX, 1) << QSize(0, 0) << qint32(XCB_GRAVITY_STATIC);
134 QTest::newRow(
"all") << QPoint(1, 2) << QSize(3, 4) << QSize(5, 6) << QSize(7, 8) << QSize(9, 10) << QSize(11, 12) << QSize(13, 14) << QSize(15, 16) << 1
135 << 1011 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16
136 << QSize(5, 6) << QSize(7, 8) << QSize(9, 10) << QSize(11, 12) << QSize(13, 14) << QSize(15, 16) << qint32(XCB_GRAVITY_NORTH_WEST);
139void TestXcbSizeHints::testSizeHints()
141 xcb_size_hints_t hints;
142 memset(&hints, 0,
sizeof(hints));
143 QFETCH(QPoint, userPos);
144 if (!userPos.isNull()) {
145 xcb_icccm_size_hints_set_position(&hints, 1, userPos.x(), userPos.y());
147 QFETCH(QSize, userSize);
148 if (userSize.isValid()) {
149 xcb_icccm_size_hints_set_size(&hints, 1, userSize.width(), userSize.height());
151 QFETCH(QSize, minSize);
152 if (minSize.isValid()) {
153 xcb_icccm_size_hints_set_min_size(&hints, minSize.width(), minSize.height());
155 QFETCH(QSize, maxSize);
156 if (maxSize.isValid()) {
157 xcb_icccm_size_hints_set_max_size(&hints, maxSize.width(), maxSize.height());
159 QFETCH(QSize, resizeInc);
160 if (resizeInc.isValid()) {
161 xcb_icccm_size_hints_set_resize_inc(&hints, resizeInc.width(), resizeInc.height());
163 QFETCH(QSize, minAspect);
164 QFETCH(QSize, maxAspect);
165 if (minAspect.isValid() && maxAspect.isValid()) {
166 xcb_icccm_size_hints_set_aspect(&hints, minAspect.width(), minAspect.height(), maxAspect.width(), maxAspect.height());
168 QFETCH(QSize, baseSize);
169 if (baseSize.isValid()) {
170 xcb_icccm_size_hints_set_base_size(&hints, baseSize.width(), baseSize.height());
172 QFETCH(qint32, gravity);
174 xcb_icccm_size_hints_set_win_gravity(&hints, (xcb_gravity_t)gravity);
176 xcb_icccm_set_wm_normal_hints(QX11Info::connection(), m_testWindow, &hints);
177 xcb_flush(QX11Info::connection());
180 geoHints.
init(m_testWindow);
182 QCOMPARE(geoHints.
hasAspect(), minAspect.isValid() && maxAspect.isValid());
183 QCOMPARE(geoHints.
hasBaseSize(), baseSize.isValid());
184 QCOMPARE(geoHints.
hasMaxSize(), maxSize.isValid());
185 QCOMPARE(geoHints.
hasMinSize(), minSize.isValid());
186 QCOMPARE(geoHints.
hasPosition(), !userPos.isNull());
188 QCOMPARE(geoHints.
hasSize(), userSize.isValid());
190 QTEST(geoHints.
baseSize().toSize(),
"expectedBaseSize");
191 QTEST(geoHints.
maxAspect(),
"expectedMaxAspect");
192 QTEST(geoHints.
maxSize().toSize(),
"expectedMaxSize");
193 QTEST(geoHints.
minAspect(),
"expectedMinAspect");
194 QTEST(geoHints.
minSize().toSize(),
"expectedMinSize");
198 auto sizeHints = geoHints.m_sizeHints;
200 QTEST(sizeHints->flags,
"expectedFlags");
201 QTEST(sizeHints->pad[0],
"expectedPad0");
202 QTEST(sizeHints->pad[1],
"expectedPad1");
203 QTEST(sizeHints->pad[2],
"expectedPad2");
204 QTEST(sizeHints->pad[3],
"expectedPad3");
205 QTEST(sizeHints->minWidth,
"expectedMinWidth");
206 QTEST(sizeHints->minHeight,
"expectedMinHeight");
207 QTEST(sizeHints->maxWidth,
"expectedMaxWidth");
208 QTEST(sizeHints->maxHeight,
"expectedMaxHeight");
209 QTEST(sizeHints->widthInc,
"expectedWidthInc");
210 QTEST(sizeHints->heightInc,
"expectedHeightInc");
211 QTEST(sizeHints->minAspect[0],
"expectedMinAspectNum");
212 QTEST(sizeHints->minAspect[1],
"expectedMinAspectDen");
213 QTEST(sizeHints->maxAspect[0],
"expectedMaxAspectNum");
214 QTEST(sizeHints->maxAspect[1],
"expectedMaxAspectDen");
215 QTEST(sizeHints->baseWidth,
"expectedBaseWidth");
216 QTEST(sizeHints->baseHeight,
"expectedBaseHeight");
217 QCOMPARE(sizeHints->winGravity, gravity);
221 QTEST(sizeHints2.
flags,
"expectedFlags");
222 QTEST(sizeHints2.
pad[0],
"expectedPad0");
223 QTEST(sizeHints2.
pad[1],
"expectedPad1");
224 QTEST(sizeHints2.
pad[2],
"expectedPad2");
225 QTEST(sizeHints2.
pad[3],
"expectedPad3");
226 QTEST(sizeHints2.
minWidth,
"expectedMinWidth");
227 QTEST(sizeHints2.
minHeight,
"expectedMinHeight");
228 QTEST(sizeHints2.
maxWidth,
"expectedMaxWidth");
229 QTEST(sizeHints2.
maxHeight,
"expectedMaxHeight");
230 QTEST(sizeHints2.
widthInc,
"expectedWidthInc");
231 QTEST(sizeHints2.
heightInc,
"expectedHeightInc");
232 QTEST(sizeHints2.
minAspect[0],
"expectedMinAspectNum");
233 QTEST(sizeHints2.
minAspect[1],
"expectedMinAspectDen");
234 QTEST(sizeHints2.
maxAspect[0],
"expectedMaxAspectNum");
235 QTEST(sizeHints2.
maxAspect[1],
"expectedMaxAspectDen");
236 QTEST(sizeHints2.
baseWidth,
"expectedBaseWidth");
237 QTEST(sizeHints2.
baseHeight,
"expectedBaseHeight");
241void TestXcbSizeHints::testSizeHintsEmpty()
243 xcb_size_hints_t xcbHints;
244 memset(&xcbHints, 0,
sizeof(xcbHints));
245 xcb_icccm_set_wm_normal_hints(QX11Info::connection(), m_testWindow, &xcbHints);
246 xcb_flush(QX11Info::connection());
249 hints.
init(m_testWindow);
260 QCOMPARE(hints.
baseSize(), QSize(0, 0));
261 QCOMPARE(hints.
maxAspect(), QSize(INT_MAX, 1));
262 QCOMPARE(hints.
maxSize(), QSize(INT_MAX, INT_MAX));
263 QCOMPARE(hints.
minAspect(), QSize(1, INT_MAX));
264 QCOMPARE(hints.
minSize(), QSize(0, 0));
268 auto sizeHints = hints.m_sizeHints;
270 QCOMPARE(sizeHints->flags, 0);
271 QCOMPARE(sizeHints->pad[0], 0);
272 QCOMPARE(sizeHints->pad[1], 0);
273 QCOMPARE(sizeHints->pad[2], 0);
274 QCOMPARE(sizeHints->pad[3], 0);
275 QCOMPARE(sizeHints->minWidth, 0);
276 QCOMPARE(sizeHints->minHeight, 0);
277 QCOMPARE(sizeHints->maxWidth, 0);
278 QCOMPARE(sizeHints->maxHeight, 0);
279 QCOMPARE(sizeHints->widthInc, 0);
280 QCOMPARE(sizeHints->heightInc, 0);
281 QCOMPARE(sizeHints->minAspect[0], 0);
282 QCOMPARE(sizeHints->minAspect[1], 0);
283 QCOMPARE(sizeHints->maxAspect[0], 0);
284 QCOMPARE(sizeHints->maxAspect[1], 0);
285 QCOMPARE(sizeHints->baseWidth, 0);
286 QCOMPARE(sizeHints->baseHeight, 0);
287 QCOMPARE(sizeHints->winGravity, 0);
290void TestXcbSizeHints::testSizeHintsNotSet()
293 hints.
init(m_testWindow);
295 QVERIFY(!hints.m_sizeHints);
305 QCOMPARE(hints.
baseSize(), QSize(0, 0));
306 QCOMPARE(hints.
maxAspect(), QSize(INT_MAX, 1));
307 QCOMPARE(hints.
maxSize(), QSize(INT_MAX, INT_MAX));
308 QCOMPARE(hints.
minAspect(), QSize(1, INT_MAX));
309 QCOMPARE(hints.
minSize(), QSize(0, 0));
314void TestXcbSizeHints::geometryHintsBeforeInit()
326 QCOMPARE(hints.
baseSize(), QSize(0, 0));
327 QCOMPARE(hints.
maxAspect(), QSize(INT_MAX, 1));
328 QCOMPARE(hints.
maxSize(), QSize(INT_MAX, INT_MAX));
329 QCOMPARE(hints.
minAspect(), QSize(1, INT_MAX));
330 QCOMPARE(hints.
minSize(), QSize(0, 0));
335void TestXcbSizeHints::geometryHintsBeforeRead()
337 xcb_size_hints_t xcbHints;
338 memset(&xcbHints, 0,
sizeof(xcbHints));
339 xcb_icccm_size_hints_set_position(&xcbHints, 1, 1, 2);
340 xcb_icccm_set_wm_normal_hints(QX11Info::connection(), m_testWindow, &xcbHints);
341 xcb_flush(QX11Info::connection());
344 hints.
init(m_testWindow);
354 QCOMPARE(hints.
baseSize(), QSize(0, 0));
355 QCOMPARE(hints.
maxAspect(), QSize(INT_MAX, 1));
356 QCOMPARE(hints.
maxSize(), QSize(INT_MAX, INT_MAX));
357 QCOMPARE(hints.
minAspect(), QSize(1, INT_MAX));
358 QCOMPARE(hints.
minSize(), QSize(0, 0));
363Q_CONSTRUCTOR_FUNCTION(forceXcb)
365#include "test_xcb_size_hints.moc"
xcb_gravity_t windowGravity() const
void init(xcb_window_t window)
QSizeF resizeIncrements() const
bool hasResizeIncrements() const
bool hasWindowGravity() const
void create(const QRectF &geometry, uint32_t mask=0, const uint32_t *values=nullptr, xcb_window_t parent=rootWindow())
void reset(xcb_window_t window=XCB_WINDOW_NONE, bool destroy=true)
QTEST_MAIN(OnScreenNotificationTest)