diff --git a/CMakeLists.txt b/CMakeLists.txt index a29bf20..3e415d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,15 +4,18 @@ set(PROJECT_NAME cutefish-dock) project(${PROJECT_NAME}) set(CMAKE_INCLUDE_CURRENT_DIR ON) +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/compat") set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) -find_package(Qt5 CONFIG REQUIRED Widgets DBus X11Extras Concurrent LinguistTools QuickControls2) +find_package(Qt6 CONFIG REQUIRED Widgets DBus Concurrent LinguistTools QuickControls2) -find_package(KF5WindowSystem REQUIRED) +find_package(KF6WindowSystem REQUIRED) +find_package(PkgConfig REQUIRED) +pkg_check_modules(XCB REQUIRED IMPORTED_TARGET xcb) set(SRCS src/applicationitem.h @@ -36,25 +39,25 @@ set(RESOURCES resources.qrc ) -qt5_add_dbus_adaptor(DBUS_SOURCES +qt6_add_dbus_adaptor(DBUS_SOURCES src/com.cutefish.Dock.xml src/mainwindow.h MainWindow) set_source_files_properties(${DBUS_SOURCES} PROPERTIES SKIP_AUTOGEN ON) add_executable(${PROJECT_NAME} ${SRCS} ${DBUS_SOURCES} ${RESOURCES}) target_link_libraries(${PROJECT_NAME} PRIVATE - Qt5::Core - Qt5::Widgets - Qt5::Quick - Qt5::QuickControls2 - Qt5::X11Extras - Qt5::Concurrent - Qt5::DBus - KF5::WindowSystem + Qt6::Core + Qt6::Widgets + Qt6::Quick + Qt6::QuickControls2 + Qt6::Concurrent + Qt6::DBus + KF6::WindowSystem + PkgConfig::XCB ) file(GLOB TS_FILES translations/*.ts) -qt5_add_translation(QM_FILES ${TS_FILES}) +qt6_add_translation(QM_FILES ${TS_FILES}) add_custom_target(translations DEPENDS ${QM_FILES} SOURCES ${TS_FILES}) add_dependencies(${PROJECT_NAME} translations) diff --git a/compat/QX11Info b/compat/QX11Info new file mode 100644 index 0000000..43e1989 --- /dev/null +++ b/compat/QX11Info @@ -0,0 +1,47 @@ +/* Qt 6 compatibility layer for the legacy QX11Info API. */ +#ifndef CUTEFISH_QX11INFO_COMPAT +#define CUTEFISH_QX11INFO_COMPAT + +#include +#include +#include + +class QX11Info +{ +public: + static bool isPlatformX11() + { + return nativeInterface() != nullptr; + } + + static xcb_connection_t *connection() + { + const auto native = nativeInterface(); + return native ? native->connection() : nullptr; + } + + static Display *display() + { + const auto native = nativeInterface(); + return native ? native->display() : nullptr; + } + + static xcb_window_t appRootWindow() + { + xcb_connection_t *c = connection(); + if (!c) + return XCB_WINDOW_NONE; + + const xcb_setup_t *setup = xcb_get_setup(c); + const xcb_screen_iterator_t iterator = xcb_setup_roots_iterator(setup); + return iterator.data ? iterator.data->root : XCB_WINDOW_NONE; + } + +private: + static QNativeInterface::QX11Application *nativeInterface() + { + return qGuiApp ? qGuiApp->nativeInterface() : nullptr; + } +}; + +#endif diff --git a/qml/DockItem.qml b/qml/DockItem.qml index bb292b2..33e513f 100644 --- a/qml/DockItem.qml +++ b/qml/DockItem.qml @@ -19,7 +19,7 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 -import QtGraphicalEffects 1.0 +import Qt5Compat.GraphicalEffects import Cutefish.Dock 1.0 import FishUI 1.0 as FishUI diff --git a/qml/main.qml b/qml/main.qml index 1229879..488ece7 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -20,7 +20,7 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 -import QtGraphicalEffects 1.0 +import Qt5Compat.GraphicalEffects import Cutefish.Dock 1.0 import FishUI 1.0 as FishUI diff --git a/src/activity.cpp b/src/activity.cpp index b7e3a13..0c59d3c 100644 --- a/src/activity.cpp +++ b/src/activity.cpp @@ -21,7 +21,8 @@ #include "docksettings.h" #include -#include +#include +#include static Activity *SELF = nullptr; @@ -39,9 +40,9 @@ Activity::Activity(QObject *parent) { onActiveWindowChanged(); - connect(KWindowSystem::self(), &KWindowSystem::activeWindowChanged, this, &Activity::onActiveWindowChanged); - connect(KWindowSystem::self(), static_cast(&KWindowSystem::windowChanged), - this, &Activity::onActiveWindowChanged); + connect(KX11Extras::self(), &KX11Extras::activeWindowChanged, this, &Activity::onActiveWindowChanged); + connect(KX11Extras::self(), &KX11Extras::windowChanged, this, + [this](WId, NET::Properties, NET::Properties2) { onActiveWindowChanged(); }); } bool Activity::existsWindowMaximized() const @@ -56,7 +57,7 @@ bool Activity::launchPad() const #include void Activity::onActiveWindowChanged() { - KWindowInfo info(KWindowSystem::activeWindow(), + KWindowInfo info(KX11Extras::activeWindow(), NET::WMState | NET::WMVisibleName, NET::WM2WindowClass); @@ -65,7 +66,7 @@ void Activity::onActiveWindowChanged() if (DockSettings::self()->visibility() == DockSettings::IntellHide) { bool existsWindowMaximized = false; - for (WId wid : KWindowSystem::windows()) { + for (WId wid : KX11Extras::windows()) { KWindowInfo i(wid, NET::WMState, NET::WM2WindowClass); if (i.isMinimized() || i.hasState(NET::SkipTaskbar)) diff --git a/src/fakewindow.cpp b/src/fakewindow.cpp index 2a6ec16..4463b35 100644 --- a/src/fakewindow.cpp +++ b/src/fakewindow.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include // X11 #include @@ -86,7 +86,7 @@ bool FakeWindow::event(QEvent *e) m_delayedMouseTimer.start(); } } else if (e->type() == QEvent::Show) { - KWindowSystem::setState(winId(), NET::SkipTaskbar | NET::SkipPager | NET::SkipSwitcher); + KX11Extras::setState(winId(), NET::SkipTaskbar | NET::SkipPager | NET::SkipSwitcher); } return QQuickView::event(e); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index fe14b89..63587d6 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -31,7 +31,7 @@ #include #include -#include +#include #include MainWindow::MainWindow(QQuickView *parent) @@ -53,8 +53,8 @@ MainWindow::MainWindow(QQuickView *parent) setColor(Qt::transparent); setFlags(Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus); - // KWindowSystem::setOnDesktop(winId(), NET::OnAllDesktops); - KWindowSystem::setType(winId(), NET::Dock); + // KX11Extras::setOnDesktop(winId(), NET::OnAllDesktops); + KX11Extras::setType(winId(), NET::Dock); engine()->rootContext()->setContextProperty("appModel", m_appModel); engine()->rootContext()->setContextProperty("process", new ProcessProvider); @@ -286,7 +286,7 @@ void MainWindow::initSlideWindow() else if (m_settings->direction() == DockSettings::Bottom) location = KWindowEffects::BottomEdge; - KWindowEffects::slideWindow(winId(), location); + KWindowEffects::slideWindow(this, location); } void MainWindow::updateViewStruts() diff --git a/src/systemappmonitor.cpp b/src/systemappmonitor.cpp index 535e4dc..dfe9a48 100644 --- a/src/systemappmonitor.cpp +++ b/src/systemappmonitor.cpp @@ -110,7 +110,6 @@ void SystemAppMonitor::addApplication(const QString &filePath) return; QSettings desktop(filePath, QSettings::IniFormat); - desktop.setIniCodec("UTF-8"); desktop.beginGroup("Desktop Entry"); if (desktop.value("Terminal").toBool()) diff --git a/src/utils.cpp b/src/utils.cpp index 1b7e2cf..dd0f2db 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -27,7 +27,7 @@ #include #include -#include +#include static Utils *INSTANCE = nullptr; diff --git a/src/xwindowinterface.cpp b/src/xwindowinterface.cpp index c2e5773..b3c04db 100644 --- a/src/xwindowinterface.cpp +++ b/src/xwindowinterface.cpp @@ -27,7 +27,7 @@ #include #include -#include +#include #include // X11 @@ -46,24 +46,24 @@ XWindowInterface *XWindowInterface::instance() XWindowInterface::XWindowInterface(QObject *parent) : QObject(parent) { - connect(KWindowSystem::self(), &KWindowSystem::windowAdded, this, &XWindowInterface::onWindowadded); - connect(KWindowSystem::self(), &KWindowSystem::windowRemoved, this, &XWindowInterface::windowRemoved); - connect(KWindowSystem::self(), &KWindowSystem::activeWindowChanged, this, &XWindowInterface::activeChanged); + connect(KX11Extras::self(), &KX11Extras::windowAdded, this, &XWindowInterface::onWindowadded); + connect(KX11Extras::self(), &KX11Extras::windowRemoved, this, &XWindowInterface::windowRemoved); + connect(KX11Extras::self(), &KX11Extras::activeWindowChanged, this, &XWindowInterface::activeChanged); } void XWindowInterface::enableBlurBehind(QWindow *view, bool enable, const QRegion ®ion) { - KWindowEffects::enableBlurBehind(view->winId(), enable, region); + KWindowEffects::enableBlurBehind(view, enable, region); } WId XWindowInterface::activeWindow() { - return KWindowSystem::activeWindow(); + return KX11Extras::activeWindow(); } void XWindowInterface::minimizeWindow(WId win) { - KWindowSystem::minimizeWindow(win); + KX11Extras::minimizeWindow(win); } void XWindowInterface::closeWindow(WId id) @@ -74,7 +74,7 @@ void XWindowInterface::closeWindow(WId id) void XWindowInterface::forceActiveWindow(WId win) { - KWindowSystem::forceActiveWindow(win); + KX11Extras::forceActiveWindow(win); } QMap XWindowInterface::requestInfo(quint64 wid) @@ -94,7 +94,7 @@ QMap XWindowInterface::requestInfo(quint64 wid) const QString winClass = QString(winfo.windowClassClass()); result.insert("iconName", winClass.toLower()); - result.insert("active", wid == KWindowSystem::activeWindow()); + result.insert("active", wid == KX11Extras::activeWindow()); result.insert("visibleName", winfo.visibleName()); result.insert("id", winClass); @@ -179,7 +179,7 @@ void XWindowInterface::setViewStruts(QWindow *view, DockSettings::Direction dire break; } - KWindowSystem::setExtendedStrut(view->winId(), + KX11Extras::setExtendedStrut(view->winId(), strut.left_width, strut.left_start, strut.left_end, strut.right_width, strut.right_start, strut.right_end, strut.top_width, strut.top_start, strut.top_end, @@ -189,12 +189,12 @@ void XWindowInterface::setViewStruts(QWindow *view, DockSettings::Direction dire void XWindowInterface::clearViewStruts(QWindow *view) { - KWindowSystem::setExtendedStrut(view->winId(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + KX11Extras::setExtendedStrut(view->winId(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } void XWindowInterface::startInitWindows() { - for (auto wid : KWindowSystem::self()->windows()) { + for (auto wid : KX11Extras::self()->windows()) { onWindowadded(wid); } }