From f403472a8c74e5d1295228521f9663618f25f0d1 Mon Sep 17 00:00:00 2001 From: Tiernan Hubble Date: Thu, 1 Jun 2023 20:18:39 -0600 Subject: [PATCH] Fix X11 xcb integration in Qt6. --- CMakeLists.txt | 4 +++- src/lib/CMakeLists.txt | 5 ++++- src/lib/app/browserwindow.cpp | 36 ++++++++++++++++++++++++++++------- src/lib/tools/qztools.cpp | 22 ++++++++++++++++++++- 4 files changed, 57 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ca37dab7..7766958e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,7 +77,9 @@ endif() if (UNIX AND NOT APPLE AND NOT NO_X11) add_definitions(-DQZ_WS_X11) find_package(XCB REQUIRED COMPONENTS XCB UTIL) - find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} REQUIRED COMPONENTS X11Extras) + if (NOT (QT_MAJOR_VERSION STREQUAL "6")) + find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} REQUIRED COMPONENTS X11Extras) + endif() endif() if (WIN32) add_definitions(-DW7API) diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index d66a8582c..964370d07 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -620,7 +620,10 @@ endif() if (UNIX AND NOT APPLE) if (NOT NO_X11) - target_link_libraries(FalkonPrivate XCB::XCB Qt::X11Extras) + target_link_libraries(FalkonPrivate XCB::XCB) + if (NOT (QT_MAJOR_VERSION STREQUAL "6")) + target_link_libraries(FalkonPrivate Qt::X11Extras) + endif() endif() set_target_properties(FalkonPrivate PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION "3") diff --git a/src/lib/app/browserwindow.cpp b/src/lib/app/browserwindow.cpp index e4806bb83..b4b5feec3 100644 --- a/src/lib/app/browserwindow.cpp +++ b/src/lib/app/browserwindow.cpp @@ -82,7 +82,9 @@ #include #ifdef QZ_WS_X11 +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) #include +#endif #include #include #endif @@ -1569,11 +1571,27 @@ void BrowserWindow::closeTab() } #ifdef QZ_WS_X11 +static xcb_connection_t *getXcbConnection() +{ +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) + return QX11Info::connection(); +#else + const QNativeInterface::QX11Application *x11App = qApp->nativeInterface(); + if (x11App == nullptr) + return 0; + return x11App->connection(); +#endif +} + int BrowserWindow::getCurrentVirtualDesktop() const { if (QGuiApplication::platformName() != QL1S("xcb")) return 0; + xcb_connection_t *connection = getXcbConnection(); + if (connection == 0) + return 0; + xcb_intern_atom_cookie_t intern_atom; xcb_intern_atom_reply_t *atom_reply = 0; xcb_atom_t atom; @@ -1581,16 +1599,16 @@ int BrowserWindow::getCurrentVirtualDesktop() const xcb_get_property_reply_t *reply = 0; uint32_t value; - intern_atom = xcb_intern_atom(QX11Info::connection(), false, qstrlen("_NET_WM_DESKTOP"), "_NET_WM_DESKTOP"); - atom_reply = xcb_intern_atom_reply(QX11Info::connection(), intern_atom, 0); + intern_atom = xcb_intern_atom(connection, false, qstrlen("_NET_WM_DESKTOP"), "_NET_WM_DESKTOP"); + atom_reply = xcb_intern_atom_reply(connection, intern_atom, 0); if (!atom_reply) goto error; atom = atom_reply->atom; - cookie = xcb_get_property(QX11Info::connection(), false, winId(), atom, XCB_ATOM_CARDINAL, 0, 1); - reply = xcb_get_property_reply(QX11Info::connection(), cookie, 0); + cookie = xcb_get_property(connection, false, winId(), atom, XCB_ATOM_CARDINAL, 0, 1); + reply = xcb_get_property_reply(connection, cookie, 0); if (!reply || reply->type != XCB_ATOM_CARDINAL || reply->value_len != 1 || reply->format != sizeof(uint32_t) * 8) goto error; @@ -1616,19 +1634,23 @@ void BrowserWindow::moveToVirtualDesktop(int desktopId) if (desktopId < 0 || isVisible() || m_windowType == Qz::BW_FirstAppWindow) return; + xcb_connection_t *connection = getXcbConnection(); + if (connection == 0) + return; + xcb_intern_atom_cookie_t intern_atom; xcb_intern_atom_reply_t *atom_reply = 0; xcb_atom_t atom; - intern_atom = xcb_intern_atom(QX11Info::connection(), false, qstrlen("_NET_WM_DESKTOP"), "_NET_WM_DESKTOP"); - atom_reply = xcb_intern_atom_reply(QX11Info::connection(), intern_atom, 0); + intern_atom = xcb_intern_atom(connection, false, qstrlen("_NET_WM_DESKTOP"), "_NET_WM_DESKTOP"); + atom_reply = xcb_intern_atom_reply(connection, intern_atom, 0); if (!atom_reply) goto error; atom = atom_reply->atom; - xcb_change_property(QX11Info::connection(), XCB_PROP_MODE_REPLACE, winId(), atom, + xcb_change_property(connection, XCB_PROP_MODE_REPLACE, winId(), atom, XCB_ATOM_CARDINAL, 32, 1, (const void*) &desktopId); error: diff --git a/src/lib/tools/qztools.cpp b/src/lib/tools/qztools.cpp index 9cfc41e3c..1f7a19230 100644 --- a/src/lib/tools/qztools.cpp +++ b/src/lib/tools/qztools.cpp @@ -49,7 +49,9 @@ #include #ifdef QZ_WS_X11 +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) #include +#endif #include #endif @@ -867,12 +869,30 @@ bool QzTools::startExternalProcess(const QString &executable, const QString &arg return success; } +#ifdef QZ_WS_X11 +static xcb_connection_t *getXcbConnection() +{ +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) + return QX11Info::connection(); +#else + const QNativeInterface::QX11Application *x11App = qApp->nativeInterface(); + if (x11App == nullptr) + return 0; + return x11App->connection(); +#endif +} +#endif + void QzTools::setWmClass(const QString &name, const QWidget* widget) { #ifdef QZ_WS_X11 if (QGuiApplication::platformName() != QL1S("xcb")) return; + xcb_connection_t *connection = getXcbConnection(); + if (connection == 0) + return; + const QByteArray nameData = name.toUtf8(); const QByteArray classData = mApp->wmClass().isEmpty() ? QByteArrayLiteral("Falkon") : mApp->wmClass(); @@ -882,7 +902,7 @@ void QzTools::setWmClass(const QString &name, const QWidget* widget) qstrcpy(class_hint, nameData.constData()); qstrcpy(class_hint + nameData.length() + 1, classData.constData()); - xcb_change_property(QX11Info::connection(), XCB_PROP_MODE_REPLACE, widget->winId(), + xcb_change_property(connection, XCB_PROP_MODE_REPLACE, widget->winId(), XCB_ATOM_WM_CLASS, XCB_ATOM_STRING, 8, class_len, class_hint); free(class_hint);