File indexing completed on 2024-12-01 13:37:31

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2017 Martin Gräßlin <mgraesslin@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 #pragma once
0010 
0011 #include <KConfigGroup>
0012 #include <QHash>
0013 #include <QObject>
0014 #include <memory>
0015 
0016 namespace KWin
0017 {
0018 
0019 class Window;
0020 class KeyboardLayout;
0021 class Xkb;
0022 class VirtualDesktop;
0023 
0024 namespace KeyboardLayoutSwitching
0025 {
0026 
0027 class Policy : public QObject
0028 {
0029     Q_OBJECT
0030 public:
0031     ~Policy() override;
0032 
0033     virtual QString name() const = 0;
0034 
0035     static std::unique_ptr<Policy> create(Xkb *xkb, KeyboardLayout *layout, const KConfigGroup &config, const QString &policy);
0036 
0037 protected:
0038     explicit Policy(Xkb *xkb, KeyboardLayout *layout, const KConfigGroup &config = KConfigGroup());
0039     virtual void clearCache() = 0;
0040     virtual void layoutChanged(uint index) = 0;
0041 
0042     void setLayout(uint index);
0043 
0044     KConfigGroup m_config;
0045     virtual const QString defaultLayoutEntryKey() const;
0046     void clearLayouts();
0047 
0048     static const char defaultLayoutEntryKeyPrefix[];
0049     Xkb *m_xkb;
0050 
0051 private:
0052     KeyboardLayout *m_layout;
0053 };
0054 
0055 class GlobalPolicy : public Policy
0056 {
0057     Q_OBJECT
0058 public:
0059     explicit GlobalPolicy(Xkb *xkb, KeyboardLayout *layout, const KConfigGroup &config);
0060     ~GlobalPolicy() override;
0061 
0062     QString name() const override
0063     {
0064         return QStringLiteral("Global");
0065     }
0066 
0067 protected:
0068     void clearCache() override
0069     {
0070     }
0071     void layoutChanged(uint index) override
0072     {
0073     }
0074 
0075 private:
0076     const QString defaultLayoutEntryKey() const override;
0077 };
0078 
0079 class VirtualDesktopPolicy : public Policy
0080 {
0081     Q_OBJECT
0082 public:
0083     explicit VirtualDesktopPolicy(Xkb *xkb, KeyboardLayout *layout, const KConfigGroup &config);
0084     ~VirtualDesktopPolicy() override;
0085 
0086     QString name() const override
0087     {
0088         return QStringLiteral("Desktop");
0089     }
0090 
0091 protected:
0092     void clearCache() override;
0093     void layoutChanged(uint index) override;
0094 
0095 private:
0096     void desktopChanged();
0097     QHash<VirtualDesktop *, quint32> m_layouts;
0098 };
0099 
0100 class WindowPolicy : public Policy
0101 {
0102     Q_OBJECT
0103 public:
0104     explicit WindowPolicy(Xkb *xkb, KeyboardLayout *layout);
0105     ~WindowPolicy() override;
0106 
0107     QString name() const override
0108     {
0109         return QStringLiteral("Window");
0110     }
0111 
0112 protected:
0113     void clearCache() override;
0114     void layoutChanged(uint index) override;
0115 
0116 private:
0117     QHash<Window *, quint32> m_layouts;
0118 };
0119 
0120 class ApplicationPolicy : public Policy
0121 {
0122     Q_OBJECT
0123 public:
0124     explicit ApplicationPolicy(Xkb *xkb, KeyboardLayout *layout, const KConfigGroup &config);
0125     ~ApplicationPolicy() override;
0126 
0127     QString name() const override
0128     {
0129         return QStringLiteral("WinClass");
0130     }
0131 
0132 protected:
0133     void clearCache() override;
0134     void layoutChanged(uint index) override;
0135 
0136 private:
0137     void windowActivated(Window *window);
0138     QHash<Window *, quint32> m_layouts;
0139     QHash<QString, quint32> m_layoutsRestored;
0140 };
0141 
0142 }
0143 }