kwin/keyboard_layout.h
Andrey Butirsky a482d73de2 feat: expose keyboard layout Short Name via DBus
Due space constraints, Short Name is the only name suitable for keyboard
layout indication on panels and systray. Usually it's just 2 symbols
corresponding to standard ISO country code.

libxkbcommon doesn't have this information, so we have to store it in
compositor for the exposing:
https://github.com/xkbcommon/libxkbcommon/issues/192

It's exposed by getLayoutDisplayName() DBus method now, as it should initially.
For Long Name, getCurrentLayoutLongName() method was added.

Relevant P-W commits:
Keyboard Layout plugin: passthrough Short Name from compositor to QML applet
fix: Keyboard Layout plugin: wrong property for passing Short Name
X11 part, P-D:
feat: expose keyboard layout Long Name via DBus

CCBUG: 390079
FEATURE:
2020-11-24 16:34:57 +03:00

101 lines
2.2 KiB
C++

/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2016, 2017 Martin Gräßlin <mgraesslin@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef KWIN_KEYBOARD_LAYOUT_H
#define KWIN_KEYBOARD_LAYOUT_H
#include "input_event_spy.h"
#include <QObject>
#include <QVector>
#include <KSharedConfig>
typedef uint32_t xkb_layout_index_t;
class KStatusNotifierItem;
class QAction;
namespace KWin
{
class Xkb;
class KeyboardLayoutDBusInterface;
namespace KeyboardLayoutSwitching
{
class Policy;
}
class KeyboardLayout : public QObject, public InputEventSpy
{
Q_OBJECT
public:
explicit KeyboardLayout(Xkb *xkb);
~KeyboardLayout() override;
void setConfig(KSharedConfigPtr config) {
m_config = config;
}
void init();
void checkLayoutChange(quint32 previousLayout);
void resetLayout();
void updateNotifier();
Q_SIGNALS:
void layoutChanged();
void layoutsReconfigured();
private Q_SLOTS:
void reconfigure();
private:
void initDBusInterface();
void notifyLayoutChange();
void initNotifierItem();
void switchToNextLayout();
void switchToPreviousLayout();
void switchToLayout(xkb_layout_index_t index);
void reinitNotifierMenu();
void loadShortcuts();
Xkb *m_xkb;
xkb_layout_index_t m_layout = 0;
KStatusNotifierItem *m_notifierItem;
KSharedConfigPtr m_config;
QVector<QAction*> m_layoutShortcuts;
KeyboardLayoutDBusInterface *m_dbusInterface = nullptr;
KeyboardLayoutSwitching::Policy *m_policy = nullptr;
};
class KeyboardLayoutDBusInterface : public QObject
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.kde.KeyboardLayouts")
public:
explicit KeyboardLayoutDBusInterface(Xkb *xkb, KeyboardLayout *parent);
~KeyboardLayoutDBusInterface() override;
public Q_SLOTS:
bool setLayout(const QString &layout);
QString getCurrentLayout();
QString getCurrentLayoutLongName() const;
QStringList getLayoutsList();
QString getLayoutDisplayName(const QString &layout);
Q_SIGNALS:
void currentLayoutChanged(QString layout);
void layoutListChanged();
private:
Xkb *m_xkb;
KeyboardLayout *m_keyboardLayout;
};
}
#endif