fix: Keyboard Layout plugin: wrong property for passing Short Name

KWin Wayland initially misused the DBus API and passed Long layout Name
via currentLayoutDisplayName() method which is wrong.
Instead, the new currentLayoutLongName() property should be added,
and Short Name be passed via currentLayoutDisplayName() as it is for
X11.
wilder-5.22
Andrey Butirsky 5 years ago
parent 5c70dc218e
commit 359eec5a50
  1. 55
      components/keyboardlayout/keyboardlayout.cpp
  2. 36
      components/keyboardlayout/keyboardlayout.h
  3. 2
      components/keyboardlayout/org.kde.KeyboardLayouts.xml

@ -19,8 +19,8 @@ void KeyboardLayout::requestDBusData<KeyboardLayout::CurrentLayoutDisplayName>()
{ if (mIface) requestDBusData(mIface->getLayoutDisplayName(mCurrentLayout), mCurrentLayoutDisplayName, &KeyboardLayout::currentLayoutDisplayNameChanged); } { if (mIface) requestDBusData(mIface->getLayoutDisplayName(mCurrentLayout), mCurrentLayoutDisplayName, &KeyboardLayout::currentLayoutDisplayNameChanged); }
template<> template<>
void KeyboardLayout::requestDBusData<KeyboardLayout::CurrentLayoutShortName>() void KeyboardLayout::requestDBusData<KeyboardLayout::CurrentLayoutLongName>()
{ if (mIface) requestDBusData(mIface->getCurrentLayoutShortName(), mCurrentLayoutShortName, &KeyboardLayout::currentLayoutShortNameChanged); } { if (mIface) requestDBusData(mIface->getCurrentLayoutLongName(), mCurrentLayoutLongName, &KeyboardLayout::currentLayoutLongNameChanged); }
template<> template<>
void KeyboardLayout::requestDBusData<KeyboardLayout::Layouts>() void KeyboardLayout::requestDBusData<KeyboardLayout::Layouts>()
@ -42,37 +42,50 @@ KeyboardLayout::KeyboardLayout(QObject* parent)
} }
connect(mIface, &OrgKdeKeyboardLayoutsInterface::currentLayoutChanged, connect(mIface, &OrgKdeKeyboardLayoutsInterface::currentLayoutChanged,
this, &KeyboardLayout::onCurrentLayoutChanged); this, [this](const QString &newLayout)
{
mCurrentLayout = newLayout;
requestDBusData<CurrentLayoutDisplayName>();
requestDBusData<CurrentLayoutLongName>();
});
connect(mIface, &OrgKdeKeyboardLayoutsInterface::layoutListChanged, connect(mIface, &OrgKdeKeyboardLayoutsInterface::layoutListChanged,
this, &KeyboardLayout::onLayoutListChanged); this, [this]()
{
requestDBusData<CurrentLayout>();
requestDBusData<CurrentLayoutLongName>();
requestDBusData<Layouts>();
});
connect(this, &KeyboardLayout::currentLayoutChanged, connect(this, &KeyboardLayout::currentLayoutChanged,
this, &KeyboardLayout::requestDBusData<CurrentLayoutDisplayName>); this, &KeyboardLayout::requestDBusData<CurrentLayoutDisplayName>);
requestDBusData<CurrentLayout>(); emit mIface->OrgKdeKeyboardLayoutsInterface::layoutListChanged();
requestDBusData<CurrentLayoutShortName>();
requestDBusData<Layouts>();
} }
KeyboardLayout::~KeyboardLayout() KeyboardLayout::~KeyboardLayout()
{ {
} }
void KeyboardLayout::onCurrentLayoutChanged(const QString &newLayout) void KeyboardLayout::setCurrentLayout(const QString &layout)
{
mCurrentLayout = newLayout;
requestDBusData<CurrentLayoutShortName>();
requestDBusData<CurrentLayoutDisplayName>();
}
void KeyboardLayout::onLayoutListChanged()
{ {
requestDBusData<CurrentLayout>(); if (mIface) mIface->setLayout(layout);
requestDBusData<CurrentLayoutShortName>();
requestDBusData<Layouts>();
} }
void KeyboardLayout::setCurrentLayout(const QString &layout) template<class T>
void KeyboardLayout::requestDBusData(QDBusPendingReply<T> pendingReply, T &out, void (KeyboardLayout::*notify)())
{ {
if (mIface) mIface->setLayout(layout); const QDBusPendingCallWatcher * const watcher = new QDBusPendingCallWatcher(pendingReply, this);
connect(watcher, &QDBusPendingCallWatcher::finished, this,
[this, &out, notify](QDBusPendingCallWatcher *watcher)
{
QDBusPendingReply<T> reply = *watcher;
if (reply.isError()) {
qCWarning(KEYBOARD_LAYOUT) << reply.error().message();
} else {
out = reply.value();
emit (this->*notify)();
}
watcher->deleteLater();
}
);
} }

@ -27,9 +27,9 @@ class KeyboardLayout : public QObject
MEMBER mCurrentLayoutDisplayName MEMBER mCurrentLayoutDisplayName
NOTIFY currentLayoutDisplayNameChanged) NOTIFY currentLayoutDisplayNameChanged)
Q_PROPERTY(QString currentLayoutShortName Q_PROPERTY(QString currentLayoutLongName
MEMBER mCurrentLayoutShortName MEMBER mCurrentLayoutLongName
NOTIFY currentLayoutShortNameChanged) NOTIFY currentLayoutLongNameChanged)
Q_PROPERTY(QStringList layouts Q_PROPERTY(QStringList layouts
MEMBER mLayouts MEMBER mLayouts
@ -42,46 +42,24 @@ public:
Q_SIGNALS: Q_SIGNALS:
void currentLayoutChanged(); void currentLayoutChanged();
void currentLayoutDisplayNameChanged(); void currentLayoutDisplayNameChanged();
void currentLayoutShortNameChanged(); void currentLayoutLongNameChanged();
void layoutsChanged(); void layoutsChanged();
private: private:
void setCurrentLayout(const QString &layout); void setCurrentLayout(const QString &layout);
enum DBusData {CurrentLayout, CurrentLayoutDisplayName, CurrentLayoutShortName, Layouts}; enum DBusData {CurrentLayout, CurrentLayoutDisplayName, CurrentLayoutLongName, Layouts};
template<class T> template<class T>
void requestDBusData(QDBusPendingReply<T> pendingReply, T &out, void (KeyboardLayout::*notify)()); void requestDBusData(QDBusPendingReply<T> pendingReply, T &out, void (KeyboardLayout::*notify)());
template<DBusData> template<DBusData>
inline void requestDBusData(); inline void requestDBusData();
void onCurrentLayoutChanged(const QString &newLayout);
void onLayoutListChanged();
QStringList mLayouts;
QString mCurrentLayout; QString mCurrentLayout;
QString mCurrentLayoutDisplayName; QString mCurrentLayoutDisplayName;
QString mCurrentLayoutShortName; QString mCurrentLayoutLongName;
QStringList mLayouts;
OrgKdeKeyboardLayoutsInterface *mIface; OrgKdeKeyboardLayoutsInterface *mIface;
}; };
template<class T>
void KeyboardLayout::requestDBusData(QDBusPendingReply<T> pendingReply, T &out, void (KeyboardLayout::*notify)())
{
const QDBusPendingCallWatcher * const watcher = new QDBusPendingCallWatcher(pendingReply, this);
connect(watcher, &QDBusPendingCallWatcher::finished, this,
[this, &out, notify](QDBusPendingCallWatcher *watcher)
{
QDBusPendingReply<T> reply = *watcher;
if (reply.isError()) {
qCWarning(KEYBOARD_LAYOUT) << reply.error().message();
} else {
out = reply.value();
emit (this->*notify)();
}
watcher->deleteLater();
}
);
}
#endif // KEYBOARDLAYOUT_H #endif // KEYBOARDLAYOUT_H

@ -14,7 +14,7 @@
<method name="getCurrentLayout"> <method name="getCurrentLayout">
<arg type="s" direction="out"/> <arg type="s" direction="out"/>
</method> </method>
<method name="getCurrentLayoutShortName"> <method name="getCurrentLayoutLongName">
<arg type="s" direction="out"/> <arg type="s" direction="out"/>
</method> </method>
<method name="getLayoutsList"> <method name="getLayoutsList">

Loading…
Cancel
Save