1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
// Copyright 2013 Max Eliaser
// SPDX-License-Identifier: GPL-2.0-or-later
// See XInput2.cpp for extensive documentation.
#pragma once
#include <array>
extern "C" {
#include <X11/Xlib.h>
#include <X11/extensions/XInput2.h>
#include <X11/keysym.h>
}
#include "Common/Matrix.h"
#include "InputCommon/ControllerInterface/ControllerInterface.h"
namespace ciface::XInput2
{
void PopulateDevices(void* const hwnd);
class KeyboardMouse : public Core::Device
{
private:
struct State
{
std::array<char, 32> keyboard;
unsigned int buttons;
Common::Vec2 cursor;
Common::Vec2 axis;
Common::Vec2 relative_mouse;
};
class Key : public Input
{
friend class KeyboardMouse;
public:
std::string GetName() const override { return m_keyname; }
Key(Display* display, KeyCode keycode, const char* keyboard);
ControlState GetState() const override;
private:
std::string m_keyname;
Display* const m_display;
const char* const m_keyboard;
const KeyCode m_keycode;
};
class Button : public Input
{
public:
std::string GetName() const override { return name; }
Button(unsigned int index, unsigned int* buttons);
ControlState GetState() const override;
private:
const unsigned int* m_buttons;
const unsigned int m_index;
std::string name;
};
class Cursor : public Input
{
public:
std::string GetName() const override { return name; }
bool IsDetectable() const override { return false; }
Cursor(u8 index, bool positive, const float* cursor);
ControlState GetState() const override;
private:
const float* m_cursor;
const u8 m_index;
const bool m_positive;
std::string name;
};
class Axis : public Input
{
public:
std::string GetName() const override { return name; }
bool IsDetectable() const override { return false; }
Axis(u8 index, bool positive, const float* axis);
ControlState GetState() const override;
private:
const float* m_axis;
const u8 m_index;
const bool m_positive;
std::string name;
};
class RelativeMouse : public Input
{
public:
std::string GetName() const override { return name; }
bool IsDetectable() const override { return false; }
RelativeMouse(u8 index, bool positive, const float* axis);
ControlState GetState() const override;
private:
const float* m_axis;
const u8 m_index;
const bool m_positive;
std::string name;
};
private:
void SelectEventsForDevice(XIEventMask* mask, int deviceid);
void UpdateCursor();
public:
void UpdateInput() override;
KeyboardMouse(Window window, int opcode, int pointer_deviceid, int keyboard_deviceid);
~KeyboardMouse();
std::string GetName() const override;
std::string GetSource() const override;
private:
Window m_window;
Display* m_display;
State m_state{};
const int xi_opcode;
const int pointer_deviceid;
const int keyboard_deviceid;
std::string name;
};
} // namespace ciface::XInput2
|