summaryrefslogtreecommitdiffstats
path: root/tests/shared
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2023-08-15 21:04:46 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2023-09-12 02:47:24 +0200
commit3cb3c1d9a8e5cfe262be8d6e9800f604d4d48c97 (patch)
tree282d3ef55ac040a7981315de68498af37c0ee550 /tests/shared
parentbbf0022d99b223239c7ce7769af9f58c01fc5c68 (diff)
xcb: Implement native window helper for embeddedwindows/foreign window test
Pick-to: 6.6 Change-Id: I73720f8f49a5d7e5df7c95bf4b17ef910180e01c Reviewed-by: Liang Qi <liang.qi@qt.io>
Diffstat (limited to 'tests/shared')
-rw-r--r--tests/shared/nativewindow.h78
1 files changed, 77 insertions, 1 deletions
diff --git a/tests/shared/nativewindow.h b/tests/shared/nativewindow.h
index 1ab5fc40ce..087b7da0fc 100644
--- a/tests/shared/nativewindow.h
+++ b/tests/shared/nativewindow.h
@@ -12,6 +12,8 @@
# define VIEW_BASE UIView
#elif defined(Q_OS_WIN)
# include <winuser.h>
+#elif QT_CONFIG(xcb)
+# include <xcb/xcb.h>
#endif
class NativeWindow
@@ -21,7 +23,7 @@ public:
NativeWindow();
~NativeWindow();
- operator WId() const { return reinterpret_cast<WId>(m_handle); }
+ operator WId() const;
WId parentWinId() const;
void setGeometry(const QRect &rect);
@@ -32,6 +34,8 @@ private:
VIEW_BASE *m_handle = nullptr;
#elif defined(Q_OS_WIN)
HWND m_handle = nullptr;
+#elif QT_CONFIG(xcb)
+ xcb_window_t m_handle = 0;
#endif
};
@@ -78,6 +82,11 @@ QRect NativeWindow::geometry() const
return QRectF::fromCGRect(m_handle.frame).toRect();
}
+NativeWindow::operator WId() const
+{
+ return reinterpret_cast<WId>(m_handle);
+}
+
WId NativeWindow::parentWinId() const
{
return WId(m_handle.superview);
@@ -122,11 +131,78 @@ QRect NativeWindow::geometry() const
return {};
}
+NativeWindow::operator WId() const
+{
+ return reinterpret_cast<WId>(m_handle);
+}
+
WId NativeWindow::parentWinId() const
{
return WId(GetAncestor(m_handle, GA_PARENT));
}
+#elif QT_CONFIG(xcb)
+
+struct Connection
+{
+ Connection() : m_connection(xcb_connect(nullptr, nullptr)) {}
+ ~Connection() { xcb_disconnect(m_connection); }
+ operator xcb_connection_t*() const { return m_connection; }
+ xcb_connection_t *m_connection = nullptr;
+};
+
+static Connection connection;
+
+NativeWindow::NativeWindow()
+{
+ m_handle = xcb_generate_id(connection);
+
+ xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(connection)).data;
+
+ xcb_create_window(connection, XCB_COPY_FROM_PARENT, m_handle,
+ screen->root, 0, 0, 1, 1, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
+ screen->root_visual, XCB_CW_BACK_PIXEL,
+ (const uint32_t []){ 0xffffaaff });
+
+ xcb_flush(connection);
+}
+
+NativeWindow::~NativeWindow()
+{
+ xcb_destroy_window(connection, m_handle);
+}
+
+void NativeWindow::setGeometry(const QRect &rect)
+{
+ const quint32 mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y
+ | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
+ const qint32 values[] = { rect.x(), rect.y(), rect.width(), rect.height() };
+ xcb_configure_window(connection, m_handle, mask,
+ reinterpret_cast<const quint32*>(values));
+ xcb_flush(connection);
+}
+
+QRect NativeWindow::geometry() const
+{
+ xcb_get_geometry_reply_t *geometry = xcb_get_geometry_reply(
+ connection, xcb_get_geometry(connection, m_handle), nullptr);
+ const auto cleanup = qScopeGuard([&]{ free(geometry); });
+ return QRect(geometry->x, geometry->y, geometry->width, geometry->height);
+}
+
+NativeWindow::operator WId() const
+{
+ return m_handle;
+}
+
+WId NativeWindow::parentWinId() const
+{
+ xcb_query_tree_reply_t *tree = xcb_query_tree_reply(
+ connection, xcb_query_tree(connection, m_handle), nullptr);
+ const auto cleanup = qScopeGuard([&]{ free(tree); });
+ return tree->parent;
+}
+
#endif
#endif // NATIVEWINDOW_H