gui: Fix inverted scrolling in KSNI for KDE

This commit is contained in:
Tasos Sahanidis
2025-11-03 11:57:23 +02:00
parent 8a5d897104
commit 31ae51fb33
5 changed files with 16 additions and 11 deletions
+2 -2
View File
@@ -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);
});
@@ -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<KDbusImageVector>();
qDBusRegisterMetaType<KDbusToolTipStruct>();
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;
@@ -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);
}
@@ -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);
@@ -171,6 +171,7 @@ public:
bool standardActionsEnabled : 1;
bool quitAborted = false;
bool isMenu = false;
bool isKde;
};
#endif