From 31ae51fb33fe9840047849bb178fa61e6b0c5cae Mon Sep 17 00:00:00 2001 From: Tasos Sahanidis Date: Mon, 3 Nov 2025 09:02:27 +0200 Subject: [PATCH] gui: Fix inverted scrolling in KSNI for KDE --- src/gui/ckbsystemtrayicon.cpp | 4 ++-- src/gui/kstatusnotifier/kstatusnotifieritem.cpp | 12 +++++------- .../kstatusnotifier/kstatusnotifieritemdbus_p.cpp | 7 ++++++- src/gui/kstatusnotifier/kstatusnotifieritemdbus_p.h | 3 ++- .../kstatusnotifier/kstatusnotifieritemprivate_p.h | 1 + 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/gui/ckbsystemtrayicon.cpp b/src/gui/ckbsystemtrayicon.cpp index 0e2d2308..3338468d 100644 --- a/src/gui/ckbsystemtrayicon.cpp +++ b/src/gui/ckbsystemtrayicon.cpp @@ -10,9 +10,9 @@ CkbSystemTrayIcon::CkbSystemTrayIcon(const QIcon& icon, const QString iconName, connect(this, &KStatusNotifierItem::scrollRequested, [this](int delta, Qt::Orientation orientation) { QPoint data; if(orientation == Qt::Horizontal) - data.setX(delta); // Untested (and unused), might need to be -delta too + data.setX(delta); else - data.setY(-delta); + data.setY(delta); emit scrollRequested(data); }); diff --git a/src/gui/kstatusnotifier/kstatusnotifieritem.cpp b/src/gui/kstatusnotifier/kstatusnotifieritem.cpp index 2ee8f272..626cb654 100644 --- a/src/gui/kstatusnotifier/kstatusnotifieritem.cpp +++ b/src/gui/kstatusnotifier/kstatusnotifieritem.cpp @@ -839,6 +839,9 @@ KStatusNotifierItemPrivate::KStatusNotifierItemPrivate(KStatusNotifierItem *item , onAllDesktops(false) , standardActionsEnabled(true) { + isKde = !qEnvironmentVariableIsEmpty("KDE_FULL_SESSION") + || qgetenv("XDG_CURRENT_DESKTOP") == "KDE" + || qgetenv("QT_QPA_PLATFORMTHEME").toLower() == "kde"; } void KStatusNotifierItemPrivate::init(const QString &extraId) @@ -849,7 +852,7 @@ void KStatusNotifierItemPrivate::init(const QString &extraId) qDBusRegisterMetaType(); qDBusRegisterMetaType(); - statusNotifierItemDBus = new KStatusNotifierItemDBus(q); + statusNotifierItemDBus = new KStatusNotifierItemDBus(q, isKde); QDBusServiceWatcher *watcher = new QDBusServiceWatcher(QString::fromLatin1(s_statusNotifierWatcherServiceName), QDBusConnection::sessionBus(), @@ -1006,9 +1009,7 @@ void KStatusNotifierItemPrivate::setLegacyMode(bool legacy) void KStatusNotifierItemPrivate::legacyWheelEvent(int delta) { -#if HAVE_DBUS - statusNotifierItemDBus->Scroll(delta, QStringLiteral("vertical")); -#endif + Q_EMIT q->scrollRequested(delta, Qt::Vertical); } void KStatusNotifierItemPrivate::legacyActivated(QSystemTrayIcon::ActivationReason reason) @@ -1028,9 +1029,6 @@ void KStatusNotifierItemPrivate::setLegacySystemTrayEnabled(bool enabled) } if (enabled) { - bool isKde = !qEnvironmentVariableIsEmpty("KDE_FULL_SESSION") - || qgetenv("XDG_CURRENT_DESKTOP") == "KDE" - || qgetenv("QT_QPA_PLATFORMTHEME").toLower() == "kde"; if (!systemTrayIcon && !isKde) { if (!QSystemTrayIcon::isSystemTrayAvailable()) { return; diff --git a/src/gui/kstatusnotifier/kstatusnotifieritemdbus_p.cpp b/src/gui/kstatusnotifier/kstatusnotifieritemdbus_p.cpp index e4e61680..37d58496 100644 --- a/src/gui/kstatusnotifier/kstatusnotifieritemdbus_p.cpp +++ b/src/gui/kstatusnotifier/kstatusnotifieritemdbus_p.cpp @@ -127,11 +127,12 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, KDbusToolTipStruc int KStatusNotifierItemDBus::s_serviceCount = 0; -KStatusNotifierItemDBus::KStatusNotifierItemDBus(KStatusNotifierItem *parent) +KStatusNotifierItemDBus::KStatusNotifierItemDBus(KStatusNotifierItem *parent, bool isKde_) : QObject(parent) , m_statusNotifierItem(parent) , m_connId(QStringLiteral("org.kde.StatusNotifierItem-%1-%2").arg(QCoreApplication::applicationPid()).arg(++s_serviceCount)) , m_dbus(QDBusConnection(m_connId)) + , isKde(isKde_) { m_dbus = QDBusConnection::connectToBus(QDBusConnection::SessionBus, m_connId); @@ -288,6 +289,10 @@ void KStatusNotifierItemDBus::SecondaryActivate(int x, int y) void KStatusNotifierItemDBus::Scroll(int delta, const QString &orientation) { Qt::Orientation dir = (orientation.toLower() == QLatin1String("horizontal") ? Qt::Horizontal : Qt::Vertical); + // ckb-next: It seems like all other implementations are inverted. + // They also only seem to return +/-1 + if(!isKde && std::abs(delta) == 1) + delta = -delta * 120; Q_EMIT m_statusNotifierItem->scrollRequested(delta, dir); } diff --git a/src/gui/kstatusnotifier/kstatusnotifieritemdbus_p.h b/src/gui/kstatusnotifier/kstatusnotifieritemdbus_p.h index b23965ed..30552c73 100644 --- a/src/gui/kstatusnotifier/kstatusnotifieritemdbus_p.h +++ b/src/gui/kstatusnotifier/kstatusnotifieritemdbus_p.h @@ -57,7 +57,7 @@ class KStatusNotifierItemDBus : public QObject friend class KStatusNotifierItem; public: - explicit KStatusNotifierItemDBus(KStatusNotifierItem *parent); + explicit KStatusNotifierItemDBus(KStatusNotifierItem *parent, bool isKde_); ~KStatusNotifierItemDBus() override; /** @@ -227,6 +227,7 @@ private: QString m_xdgActivationToken; QDBusConnection m_dbus; static int s_serviceCount; + bool isKde; }; const QDBusArgument &operator<<(QDBusArgument &argument, const KDbusImageStruct &icon); diff --git a/src/gui/kstatusnotifier/kstatusnotifieritemprivate_p.h b/src/gui/kstatusnotifier/kstatusnotifieritemprivate_p.h index 15673d63..fc7bb3f8 100644 --- a/src/gui/kstatusnotifier/kstatusnotifieritemprivate_p.h +++ b/src/gui/kstatusnotifier/kstatusnotifieritemprivate_p.h @@ -171,6 +171,7 @@ public: bool standardActionsEnabled : 1; bool quitAborted = false; bool isMenu = false; + bool isKde; }; #endif