diff --git a/bin/breezy_kwin_setup b/bin/breezy_kwin_setup index 67a383f..0bfdfe9 100755 --- a/bin/breezy_kwin_setup +++ b/bin/breezy_kwin_setup @@ -119,14 +119,11 @@ then pkgkwin_rc=$? set -e if [ "$pkgkwin_rc" -ne 0 ]; then - if echo "$pkgkwin_stderr" | grep -qi "could not find"; then - if [ -z "${PRINT_FULL_STDERR+x}" ]; then - print_missing_dependencies "$0" - else - echo "$pkgkwin_stderr" - fi + if echo "$pkgkwin_stderr" | grep -qi "could not find" && [ -z "${PRINT_FULL_STDERR+x}" ]; then + print_missing_dependencies "$0" + else + echo "$pkgkwin_stderr" fi - echo "" echo "Error: Breezy Desktop build failed with exit code $pkgkwin_rc" exit $pkgkwin_rc fi diff --git a/kwin/src/CMakeLists.txt b/kwin/src/CMakeLists.txt index 399840d..5b88fdd 100644 --- a/kwin/src/CMakeLists.txt +++ b/kwin/src/CMakeLists.txt @@ -52,6 +52,7 @@ target_link_libraries(breezy_desktop Qt6::Core Qt6::Gui Qt6::Quick + Qt6::DBus KF6::ConfigCore KF6::ConfigGui diff --git a/kwin/src/breezydesktopeffect.cpp b/kwin/src/breezydesktopeffect.cpp index 330ece4..fbe5221 100644 --- a/kwin/src/breezydesktopeffect.cpp +++ b/kwin/src/breezydesktopeffect.cpp @@ -20,12 +20,36 @@ #include #include #include +#include #include #include Q_LOGGING_CATEGORY(KWIN_XR, "kwin.xr") +// A small DBus adaptor to expose effect controls to the KCM. +// Service is provided by KWin (org.kde.KWin). We only register an object path. +// Interface: com.xronlinux.BreezyDesktop, Path: /com/xronlinux/BreezyDesktop +namespace { +class BreezyDesktopDBusAdaptor : public QObject { + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "com.xronlinux.BreezyDesktop") +public: + explicit BreezyDesktopDBusAdaptor(KWin::BreezyDesktopEffect *effect) + : QObject(effect), m_effect(effect) {} + +public Q_SLOTS: + void AddVirtualDisplay(int width, int height) { + QMetaObject::invokeMethod(m_effect, [this, width, height]() { + m_effect->addVirtualDisplay(QSize(width, height)); + }, Qt::QueuedConnection); + } + +private: + KWin::BreezyDesktopEffect *m_effect; +}; +} // namespace + namespace DataView { const QString SHM_DIR = QStringLiteral("/dev/shm"); @@ -129,6 +153,16 @@ BreezyDesktopEffect::BreezyDesktopEffect() m_cursorUpdateTimer->start(); enableDriver(); + + // Register DBus object under KWin's session bus name + auto *adaptor = new BreezyDesktopDBusAdaptor(this); + const bool dbusOk = QDBusConnection::sessionBus().registerObject( + QStringLiteral("/com/xronlinux/BreezyDesktop"), + adaptor, + QDBusConnection::ExportAllSlots); + if (!dbusOk) { + qCWarning(KWIN_XR) << "Failed to register DBus object /com/xronlinux/BreezyDesktop"; + } } void BreezyDesktopEffect::setupGlobalShortcut(const BreezyShortcuts::Shortcut &shortcut, std::function triggeredFunc) { @@ -550,4 +584,4 @@ void BreezyDesktopEffect::updateCursorPos() } } -#include "moc_breezydesktopeffect.cpp" \ No newline at end of file +#include "breezydesktopeffect.moc" \ No newline at end of file diff --git a/kwin/src/kcm/CMakeLists.txt b/kwin/src/kcm/CMakeLists.txt index 87ceacc..1df5bc2 100644 --- a/kwin/src/kcm/CMakeLists.txt +++ b/kwin/src/kcm/CMakeLists.txt @@ -5,6 +5,7 @@ qt_add_dbus_interface(breezy_desktop_config_SOURCES ${KWIN_EFFECTS_INTERFACE} kw kcoreaddons_add_plugin(breezy_desktop_config INSTALL_NAMESPACE "kwin/effects/configs" SOURCES ${breezy_desktop_config_SOURCES}) kconfig_add_kcfg_files(breezy_desktop_config ../breezydesktopconfig.kcfgc) target_link_libraries(breezy_desktop_config + Qt6::DBus KF6::ConfigCore KF6::ConfigGui KF6::ConfigWidgets diff --git a/kwin/src/kcm/breezydesktopeffectkcm.cpp b/kwin/src/kcm/breezydesktopeffectkcm.cpp index 5135087..51c6c2f 100644 --- a/kwin/src/kcm/breezydesktopeffectkcm.cpp +++ b/kwin/src/kcm/breezydesktopeffectkcm.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -21,6 +22,8 @@ #include #include #include +#include +#include Q_LOGGING_CATEGORY(KWIN_XR, "kwin.xr") @@ -43,6 +46,20 @@ BreezyDesktopEffectConfig::BreezyDesktopEffectConfig(QObject *parent, const KPlu ui.setupUi(widget()); addConfig(BreezyDesktopConfig::self(), widget()); + // Show/enable Virtual Display controls only when we're on Wayland + const bool isWaylandSession = QGuiApplication::platformName().contains(QStringLiteral("wayland"), Qt::CaseInsensitive) + || qEnvironmentVariable("XDG_SESSION_TYPE").compare(QStringLiteral("wayland"), Qt::CaseInsensitive) == 0; + if (isWaylandSession) { + if (auto lbl = widget()->findChild(QStringLiteral("labelVirtualDisplays"))) { + lbl->setVisible(true); + lbl->setEnabled(true); + } + if (auto row = widget()->findChild(QStringLiteral("widgetVirtualDisplayButtons"))) { + row->setVisible(true); + row->setEnabled(true); + } + } + m_statePollTimer.setInterval(2000); m_statePollTimer.setTimerType(Qt::CoarseTimer); connect(&m_statePollTimer, &QTimer::timeout, this, &BreezyDesktopEffectConfig::pollDriverState); @@ -118,6 +135,28 @@ BreezyDesktopEffectConfig::BreezyDesktopEffectConfig(QObject *parent, const KPlu tokenEdit->installEventFilter(this); } } + + // Wire Add Virtual Display buttons via DBus to the effect + auto callAddVirtualDisplay = [](int w, int h) { + QDBusInterface iface( + QStringLiteral("org.kde.KWin"), + QStringLiteral("/com/xronlinux/BreezyDesktop"), + QStringLiteral("com.xronlinux.BreezyDesktop"), + QDBusConnection::sessionBus()); + if (iface.isValid()) { + iface.call(QDBus::NoBlock, QStringLiteral("AddVirtualDisplay"), w, h); + } + }; + if (auto btn1080p = widget()->findChild("buttonAdd1080p")) { + connect(btn1080p, &QPushButton::clicked, this, [callAddVirtualDisplay]() { + callAddVirtualDisplay(1920, 1080); + }); + } + if (auto btn1440p = widget()->findChild("buttonAdd1440p")) { + connect(btn1440p, &QPushButton::clicked, this, [callAddVirtualDisplay]() { + callAddVirtualDisplay(2560, 1440); + }); + } } BreezyDesktopEffectConfig::~BreezyDesktopEffectConfig() diff --git a/kwin/src/kcm/breezydesktopeffectkcm.ui b/kwin/src/kcm/breezydesktopeffectkcm.ui index fbca9ed..5bcb098 100644 --- a/kwin/src/kcm/breezydesktopeffectkcm.ui +++ b/kwin/src/kcm/breezydesktopeffectkcm.ui @@ -112,59 +112,46 @@ - - - - Display Horizontal Offset: - - - - - - - 2 - - - QSlider::TicksBelow - - - 50 - - - Qt::Horizontal - - - true - - - - - - - Display Vertical Offset: - - - - - - - 2 - - - QSlider::TicksBelow - - - 50 - - - Qt::Horizontal - - - true - - - - + + + + Add Virtual Display: + + + false + + + false + + + + + + + false + + + false + + + + + + + 1080p + + + + + + + + 1440p + + + + + + + @@ -212,6 +199,58 @@ + + + + Display Horizontal Offset: + + + + + + + 2 + + + QSlider::TicksBelow + + + 50 + + + Qt::Horizontal + + + true + + + + + + + Display Vertical Offset: + + + + + + + 2 + + + QSlider::TicksBelow + + + 50 + + + Qt::Horizontal + + + true + + + diff --git a/kwin/src/qml/BreezyDesktop.qml b/kwin/src/qml/BreezyDesktop.qml index 621ee0c..68fa21c 100644 --- a/kwin/src/qml/BreezyDesktop.qml +++ b/kwin/src/qml/BreezyDesktop.qml @@ -120,7 +120,7 @@ Node { duration: 150 running: false onFinished: { - const unfocusedDisplay = zoomInAnimation.target; + const unfocusedDisplay = zoomOutAnimation.target; if (unfocusedDisplay) { unfocusedDisplay.monitorDistance = Qt.binding(function() { return effect.allDisplaysDistance; }); }