ef72bae42f
The main motivation behind this change is to prepare input abstractions for virtual input devices so the wl_seat can properly advertise caps or the cursor getting properly mapped/unmapped when a fake pointer is added/removed on a system without a hardware mouse connected. With this, there are three abstractions - InputDevice, InputBackend, and InputRedirection. An InputDevice represents an input device such as a mouse, a keyboard, a tablet, etc. The InputBackend class notifies the InputRedirection about (dis-)connected devices. The InputRedirection manages the input devices. Such design allows to unify the event flow for real and virtual input devices. There can be several input backends active. For example, the libinput backend and an input backend that provides virtual input devices, e.g. libeis or org_kde_kwin_fake_input.
95 lines
2.1 KiB
C++
95 lines
2.1 KiB
C++
/*
|
|
KWin - the KDE window manager
|
|
This file is part of the KDE project.
|
|
|
|
SPDX-FileCopyrightText: 2013, 2016 Martin Gräßlin <mgraesslin@kde.org>
|
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
#ifndef KWIN_KEYBOARD_INPUT_H
|
|
#define KWIN_KEYBOARD_INPUT_H
|
|
|
|
#include "input.h"
|
|
#include "xkb.h"
|
|
|
|
#include <QObject>
|
|
#include <QPointer>
|
|
#include <QPointF>
|
|
|
|
#include <KSharedConfig>
|
|
|
|
class QWindow;
|
|
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;
|
|
|
|
namespace KWin
|
|
{
|
|
|
|
class InputDevice;
|
|
class InputRedirection;
|
|
class KeyboardLayout;
|
|
class ModifiersChangedSpy;
|
|
class Toplevel;
|
|
|
|
class KWIN_EXPORT KeyboardInputRedirection : public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
explicit KeyboardInputRedirection(InputRedirection *parent);
|
|
~KeyboardInputRedirection() override;
|
|
|
|
void init();
|
|
void reconfigure();
|
|
|
|
void update();
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
void processKey(uint32_t key, InputRedirection::KeyboardKeyState state, uint32_t time, InputDevice *device = nullptr);
|
|
/**
|
|
* @internal
|
|
*/
|
|
void processModifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group);
|
|
/**
|
|
* @internal
|
|
*/
|
|
void processKeymapChange(int fd, uint32_t size);
|
|
|
|
Xkb *xkb() const {
|
|
return m_xkb.data();
|
|
}
|
|
Qt::KeyboardModifiers modifiers() const {
|
|
return m_xkb->modifiers();
|
|
}
|
|
Qt::KeyboardModifiers modifiersRelevantForGlobalShortcuts() const {
|
|
return m_xkb->modifiersRelevantForGlobalShortcuts();
|
|
}
|
|
|
|
uint32_t lastEventTime() const {
|
|
return m_lastEventTime;
|
|
}
|
|
|
|
Q_SIGNALS:
|
|
void ledsChanged(KWin::LEDs);
|
|
|
|
private:
|
|
InputRedirection *m_input;
|
|
bool m_inited = false;
|
|
QScopedPointer<Xkb> m_xkb;
|
|
QMetaObject::Connection m_activeClientSurfaceChangedConnection;
|
|
ModifiersChangedSpy *m_modifiersChangedSpy = nullptr;
|
|
KeyboardLayout *m_keyboardLayout = nullptr;
|
|
uint32_t m_lastEventTime = 0;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|