19namespace KeyboardLayoutSwitching
39 if (previousLayout != currentLayout) {
46 if (policy.toLower() == QStringLiteral(
"desktop")) {
47 return std::make_unique<VirtualDesktopPolicy>(xkb, layout, config);
49 if (policy.toLower() == QStringLiteral(
"window")) {
50 return std::make_unique<WindowPolicy>(xkb, layout);
52 if (policy.toLower() == QStringLiteral(
"winclass")) {
53 return std::make_unique<ApplicationPolicy>(xkb, layout, config);
55 return std::make_unique<GlobalPolicy>(xkb, layout, config);
67 for (
const auto &layoutEntry : layoutEntryList) {
72const QString GlobalPolicy::defaultLayoutEntryKey()
const
78 :
Policy(xkb, _layout, config)
83 m_config.writeEntry(defaultLayoutEntryKey(), layout);
89 setLayout(m_config.readEntry(defaultLayoutEntryKey(), 0));
97 :
Policy(xkb, layout, config)
100 this, &VirtualDesktopPolicy::desktopChanged);
105 for (
auto i = m_layouts.constBegin(); i != m_layouts.constEnd(); ++i) {
106 if (
const uint layout = *i) {
114 const auto &desktops = VirtualDesktopManager::self()->desktops();
115 for (KWin::VirtualDesktop *const desktop : desktops) {
116 const uint layout = m_config.readEntry(defaultLayoutEntryKey() % QString::number(desktop->x11DesktopNumber()), 0u);
118 m_layouts.insert(desktop, layout);
119 connect(desktop, &VirtualDesktop::aboutToBeDestroyed, this, [this, desktop]() {
120 m_layouts.remove(desktop);
129VirtualDesktopPolicy::~VirtualDesktopPolicy() =
default;
131void VirtualDesktopPolicy::clearCache()
138template<
typename T,
typename U>
139quint32 getLayout(
const T &layouts,
const U &reference)
141 auto it = layouts.constFind(reference);
142 if (it == layouts.constEnd()) {
150void VirtualDesktopPolicy::desktopChanged()
152 auto d = VirtualDesktopManager::self()->currentDesktop();
156 setLayout(getLayout(m_layouts, d));
159void VirtualDesktopPolicy::layoutChanged(uint index)
161 auto d = VirtualDesktopManager::self()->currentDesktop();
165 auto it = m_layouts.find(d);
166 if (it == m_layouts.end()) {
167 m_layouts.insert(d, index);
172 if (it.value() == index) {
210 if (window->isDesktop() || window->isDock()) {
214 auto it = m_layouts.find(window);
215 if (it == m_layouts.end()) {
216 m_layouts.insert(window, index);
218 m_layouts.remove(window);
221 if (it.value() == index) {
229 :
Policy(xkb, layout, config)
236 for (
auto i = m_layouts.constBegin(); i != m_layouts.constEnd(); ++i) {
237 if (
const uint layout = *i) {
238 const QString desktopFileName = i.key()->desktopFileName();
239 if (!desktopFileName.isEmpty()) {
248 const QString keyPrefix = defaultLayoutEntryKey();
249 const QStringList keyList = m_config.keyList().filter(keyPrefix);
250 for (const QString &key : keyList) {
251 m_layoutsRestored.insert(
252 QStringView(key).mid(keyPrefix.size()).toLatin1(),
253 m_config.readEntry(key, 0));
256 m_layoutsRestored.squeeze();
260ApplicationPolicy::~ApplicationPolicy()
264void ApplicationPolicy::windowActivated(
Window *window)
273 auto it = m_layouts.constFind(window);
274 if (it != m_layouts.constEnd()) {
275 setLayout(it.value());
278 for (it = m_layouts.constBegin(); it != m_layouts.constEnd(); it++) {
280 const uint layout = it.value();
282 layoutChanged(layout);
287 if (
const uint index = m_xkb->currentLayout()) {
288 layoutChanged(index);
292void ApplicationPolicy::clearCache()
297void ApplicationPolicy::layoutChanged(uint index)
308 auto it = m_layouts.find(window);
309 if (it == m_layouts.end()) {
310 m_layouts.insert(window, index);
312 m_layouts.remove(window);
315 if (it.value() == index) {
321 for (it = m_layouts.begin(); it != m_layouts.end(); it++) {
331#include "moc_keyboard_layout_switching.cpp"
void layoutChanged(uint index)
void layoutsReconfigured()
ApplicationPolicy(Xkb *xkb, KeyboardLayout *layout, const KConfigGroup &config)
QString name() const override
GlobalPolicy(Xkb *xkb, KeyboardLayout *layout, const KConfigGroup &config)
QString name() const override
virtual const QString defaultLayoutEntryKey() const
static const char defaultLayoutEntryKeyPrefix[]
static std::unique_ptr< Policy > create(Xkb *xkb, KeyboardLayout *layout, const KConfigGroup &config, const QString &policy)
Policy(Xkb *xkb, KeyboardLayout *layout, const KConfigGroup &config=KConfigGroup())
virtual void layoutChanged(uint index)=0
void setLayout(uint index)
virtual QString name() const =0
virtual void clearCache()=0
QString name() const override
VirtualDesktopPolicy(Xkb *xkb, KeyboardLayout *layout, const KConfigGroup &config)
void clearCache() override
void layoutChanged(uint index) override
void loadSessionRequested(const QString &name)
void prepareSessionSaveRequested(const QString &name)
void aboutToBeDestroyed()
void currentChanged(KWin::VirtualDesktop *previousDesktop, KWin::VirtualDesktop *newDesktop)
static bool belongToSameApplication(const Window *c1, const Window *c2, SameApplicationChecks checks=SameApplicationChecks())
Window * activeWindow() const
void windowActivated(KWin::Window *)
quint32 numberOfLayouts() const
quint32 currentLayout() const
bool switchToLayout(xkb_layout_index_t layout)