2020-08-02 22:22:19 +00:00
|
|
|
/*
|
|
|
|
KWin - the KDE window manager
|
|
|
|
This file is part of the KDE project.
|
2017-02-15 16:47:38 +00:00
|
|
|
|
2020-08-02 22:22:19 +00:00
|
|
|
SPDX-FileCopyrightText: 2013, 2016, 2017 Martin Gräßlin <mgraesslin@kde.org>
|
2017-02-15 16:47:38 +00:00
|
|
|
|
2020-08-02 22:22:19 +00:00
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
*/
|
2017-02-15 16:47:38 +00:00
|
|
|
#ifndef KWIN_XKB_H
|
|
|
|
#define KWIN_XKB_H
|
|
|
|
#include "input.h"
|
2020-11-05 12:54:12 +00:00
|
|
|
#include <xkbcommon/xkbcommon.h>
|
2017-02-15 16:47:38 +00:00
|
|
|
|
|
|
|
#include <kwin_export.h>
|
|
|
|
|
|
|
|
#include <KSharedConfig>
|
|
|
|
|
|
|
|
#include <QLoggingCategory>
|
|
|
|
Q_DECLARE_LOGGING_CATEGORY(KWIN_XKB)
|
|
|
|
|
|
|
|
struct xkb_context;
|
|
|
|
struct xkb_keymap;
|
|
|
|
struct xkb_state;
|
|
|
|
struct xkb_compose_table;
|
|
|
|
struct xkb_compose_state;
|
|
|
|
typedef uint32_t xkb_mod_index_t;
|
|
|
|
typedef uint32_t xkb_led_index_t;
|
|
|
|
typedef uint32_t xkb_keysym_t;
|
|
|
|
typedef uint32_t xkb_layout_index_t;
|
|
|
|
|
2020-04-29 15:18:41 +00:00
|
|
|
namespace KWaylandServer
|
2017-08-13 18:53:36 +00:00
|
|
|
{
|
|
|
|
class SeatInterface;
|
|
|
|
}
|
|
|
|
|
2017-02-15 16:47:38 +00:00
|
|
|
namespace KWin
|
|
|
|
{
|
|
|
|
|
2017-08-13 18:43:28 +00:00
|
|
|
class KWIN_EXPORT Xkb : public QObject
|
2017-02-15 16:47:38 +00:00
|
|
|
{
|
2017-08-13 18:43:28 +00:00
|
|
|
Q_OBJECT
|
2017-02-15 16:47:38 +00:00
|
|
|
public:
|
2017-08-13 18:43:28 +00:00
|
|
|
Xkb(QObject *parent = nullptr);
|
Run clang-tidy with modernize-use-override check
Summary:
Currently code base of kwin can be viewed as two pieces. One is very
ancient, and the other one is more modern, which uses new C++ features.
The main problem with the ancient code is that it was written before
C++11 era. So, no override or final keywords, lambdas, etc.
Quite recently, KDE compiler settings were changed to show a warning if
a virtual method has missing override keyword. As you might have already
guessed, this fired back at us because of that ancient code. We had
about 500 new compiler warnings.
A "solution" was proposed to that problem - disable -Wno-suggest-override
and the other similar warning for clang. It's hard to call a solution
because those warnings are disabled not only for the old code, but also
for new. This is not what we want!
The main argument for not actually fixing the problem was that git
history will be screwed as well because of human factor. While good git
history is a very important thing, we should not go crazy about it and
block every change that somehow alters git history. git blame allows to
specify starting revision for a reason.
The other argument (human factor) can be easily solved by using tools
such as clang-tidy. clang-tidy is a clang-based linter for C++. It can
be used for various things, e.g. fixing coding style(e.g. add missing
braces to if statements, readability-braces-around-statements check),
or in our case add missing override keywords.
Test Plan: Compiles.
Reviewers: #kwin, davidedmundson
Reviewed By: #kwin, davidedmundson
Subscribers: davidedmundson, apol, romangg, kwin
Tags: #kwin
Differential Revision: https://phabricator.kde.org/D22371
2019-07-22 16:52:26 +00:00
|
|
|
~Xkb() override;
|
2017-02-15 16:47:38 +00:00
|
|
|
void setConfig(KSharedConfigPtr config) {
|
2019-10-29 22:04:15 +00:00
|
|
|
m_config = std::move(config);
|
2017-02-15 16:47:38 +00:00
|
|
|
}
|
2018-10-25 17:46:36 +00:00
|
|
|
void setNumLockConfig(KSharedConfigPtr config) {
|
2019-10-29 22:04:15 +00:00
|
|
|
m_numLockConfig = std::move(config);
|
2018-10-25 17:46:36 +00:00
|
|
|
}
|
2017-02-15 16:47:38 +00:00
|
|
|
void reconfigure();
|
|
|
|
|
|
|
|
void installKeymap(int fd, uint32_t size);
|
|
|
|
void updateModifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group);
|
|
|
|
void updateKey(uint32_t key, InputRedirection::KeyboardKeyState state);
|
|
|
|
xkb_keysym_t toKeysym(uint32_t key);
|
|
|
|
xkb_keysym_t currentKeysym() const {
|
|
|
|
return m_keysym;
|
|
|
|
}
|
|
|
|
QString toString(xkb_keysym_t keysym);
|
|
|
|
Qt::Key toQtKey(xkb_keysym_t keysym) const;
|
2017-08-16 19:18:01 +00:00
|
|
|
xkb_keysym_t fromQtKey(Qt::Key key, Qt::KeyboardModifiers mods) const;
|
|
|
|
xkb_keysym_t fromKeyEvent(QKeyEvent *event) const;
|
2017-02-15 16:47:38 +00:00
|
|
|
Qt::KeyboardModifiers modifiers() const;
|
|
|
|
Qt::KeyboardModifiers modifiersRelevantForGlobalShortcuts() const;
|
|
|
|
bool shouldKeyRepeat(quint32 key) const;
|
|
|
|
|
|
|
|
void switchToNextLayout();
|
|
|
|
void switchToPreviousLayout();
|
|
|
|
void switchToLayout(xkb_layout_index_t layout);
|
|
|
|
|
|
|
|
enum class LED {
|
|
|
|
NumLock = 1 << 0,
|
|
|
|
CapsLock = 1 << 1,
|
|
|
|
ScrollLock = 1 << 2
|
|
|
|
};
|
|
|
|
Q_DECLARE_FLAGS(LEDs, LED)
|
|
|
|
LEDs leds() const {
|
|
|
|
return m_leds;
|
|
|
|
}
|
|
|
|
|
|
|
|
xkb_keymap *keymap() const {
|
|
|
|
return m_keymap;
|
|
|
|
}
|
|
|
|
|
|
|
|
xkb_state *state() const {
|
|
|
|
return m_state;
|
|
|
|
}
|
|
|
|
|
|
|
|
quint32 currentLayout() const {
|
|
|
|
return m_currentLayout;
|
|
|
|
}
|
|
|
|
QString layoutName() const;
|
2020-11-05 12:54:12 +00:00
|
|
|
const QString &layoutShortName() const;
|
2017-02-15 16:47:38 +00:00
|
|
|
QMap<xkb_layout_index_t, QString> layoutNames() const;
|
|
|
|
quint32 numberOfLayouts() const;
|
|
|
|
|
2017-04-14 19:01:20 +00:00
|
|
|
/**
|
|
|
|
* Forwards the current modifier state to the Wayland seat
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2017-04-14 19:01:20 +00:00
|
|
|
void forwardModifiers();
|
|
|
|
|
2020-04-29 15:18:41 +00:00
|
|
|
void setSeat(KWaylandServer::SeatInterface *seat);
|
2017-08-13 18:53:36 +00:00
|
|
|
|
2017-08-13 18:43:28 +00:00
|
|
|
Q_SIGNALS:
|
|
|
|
void ledsChanged(const LEDs &leds);
|
|
|
|
|
2017-02-15 16:47:38 +00:00
|
|
|
private:
|
2020-11-05 12:54:12 +00:00
|
|
|
void applyEnvironmentRules(xkb_rule_names &);
|
2017-02-15 16:47:38 +00:00
|
|
|
xkb_keymap *loadKeymapFromConfig();
|
|
|
|
xkb_keymap *loadDefaultKeymap();
|
|
|
|
void updateKeymap(xkb_keymap *keymap);
|
|
|
|
void createKeymapFile();
|
|
|
|
void updateModifiers();
|
|
|
|
void updateConsumedModifiers(uint32_t key);
|
|
|
|
QString layoutName(xkb_layout_index_t layout) const;
|
|
|
|
xkb_context *m_context;
|
|
|
|
xkb_keymap *m_keymap;
|
2020-11-05 12:54:12 +00:00
|
|
|
QStringList m_layoutList;
|
2017-02-15 16:47:38 +00:00
|
|
|
xkb_state *m_state;
|
|
|
|
xkb_mod_index_t m_shiftModifier;
|
|
|
|
xkb_mod_index_t m_capsModifier;
|
|
|
|
xkb_mod_index_t m_controlModifier;
|
|
|
|
xkb_mod_index_t m_altModifier;
|
|
|
|
xkb_mod_index_t m_metaModifier;
|
2018-10-25 17:46:36 +00:00
|
|
|
xkb_mod_index_t m_numModifier;
|
2017-02-15 16:47:38 +00:00
|
|
|
xkb_led_index_t m_numLock;
|
|
|
|
xkb_led_index_t m_capsLock;
|
|
|
|
xkb_led_index_t m_scrollLock;
|
|
|
|
Qt::KeyboardModifiers m_modifiers;
|
|
|
|
Qt::KeyboardModifiers m_consumedModifiers;
|
|
|
|
xkb_keysym_t m_keysym;
|
|
|
|
quint32 m_currentLayout = 0;
|
|
|
|
|
|
|
|
struct {
|
|
|
|
xkb_compose_table *table = nullptr;
|
|
|
|
xkb_compose_state *state = nullptr;
|
|
|
|
} m_compose;
|
|
|
|
LEDs m_leds;
|
|
|
|
KSharedConfigPtr m_config;
|
2018-10-25 17:46:36 +00:00
|
|
|
KSharedConfigPtr m_numLockConfig;
|
2017-04-14 19:01:20 +00:00
|
|
|
|
|
|
|
struct {
|
|
|
|
xkb_mod_index_t depressed = 0;
|
|
|
|
xkb_mod_index_t latched = 0;
|
|
|
|
xkb_mod_index_t locked = 0;
|
|
|
|
} m_modifierState;
|
2017-08-13 18:53:36 +00:00
|
|
|
|
2018-10-25 17:46:36 +00:00
|
|
|
enum class Ownership {
|
|
|
|
Server,
|
|
|
|
Client
|
|
|
|
};
|
|
|
|
Ownership m_ownership = Ownership::Server;
|
|
|
|
|
2020-04-29 15:18:41 +00:00
|
|
|
QPointer<KWaylandServer::SeatInterface> m_seat;
|
2017-02-15 16:47:38 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
inline
|
|
|
|
Qt::KeyboardModifiers Xkb::modifiers() const
|
|
|
|
{
|
|
|
|
return m_modifiers;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Q_DECLARE_METATYPE(KWin::Xkb::LED)
|
|
|
|
Q_DECLARE_METATYPE(KWin::Xkb::LEDs)
|
|
|
|
|
|
|
|
#endif
|