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)