Skip to content

Commit af1ff07

Browse files
refactor(razer): use official input data struct
Co-Authored-By: Stanislav Shvets <35340783+Pennywise007@users.noreply.github.com>
1 parent 964e894 commit af1ff07

1 file changed

Lines changed: 90 additions & 62 deletions

File tree

  • Simulator/include/IbInputSimulator/SendTypes

Simulator/include/IbInputSimulator/SendTypes/Razer.hpp

Lines changed: 90 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#pragma once
2+
#include <ntddkbd.h>
3+
#include <ntddmou.h>
24
#include "base.hpp"
35
#include "usb.hpp"
46

@@ -43,43 +45,49 @@ namespace Send::Type::Internal {
4345
Mouse = 2
4446
} type;
4547
union {
46-
struct {
47-
uint32_t absolute_coord;
48-
struct {
49-
bool LButtonDown : 1;
50-
bool LButtonUp : 1;
51-
bool RButtonDown : 1;
52-
bool RButtonUp : 1;
53-
bool MButtonDown : 1;
54-
bool MButtonUp : 1;
55-
bool XButton1Down : 1;
56-
bool XButton1Up : 1;
57-
bool XButton2Down : 1;
58-
bool XButton2Up : 1;
59-
bool Wheel : 1;
60-
bool HWheel : 1;
61-
uint8_t unk : 4;
62-
private:
63-
void assert_size() {
64-
static_assert(sizeof(*this) == 2);
65-
}
66-
} btn;
67-
int16_t movement;
68-
uint32_t unk1;
69-
int32_t x;
70-
int32_t y;
71-
uint32_t unk2;
72-
} mi;
73-
struct {
74-
uint16_t unk1;
75-
int16_t key;
76-
uint16_t action;
77-
uint16_t unk2;
78-
uint32_t unk3;
79-
uint32_t unk4;
80-
uint32_t unk5;
81-
uint32_t unk6;
82-
} ki;
48+
//struct {
49+
// uint32_t absolute_coord;
50+
// struct {
51+
// bool LButtonDown : 1;
52+
// bool LButtonUp : 1;
53+
// bool RButtonDown : 1;
54+
// bool RButtonUp : 1;
55+
// bool MButtonDown : 1;
56+
// bool MButtonUp : 1;
57+
// bool XButton1Down : 1;
58+
// bool XButton1Up : 1;
59+
// bool XButton2Down : 1;
60+
// bool XButton2Up : 1;
61+
// bool Wheel : 1;
62+
// bool HWheel : 1;
63+
// uint8_t unk : 4;
64+
// private:
65+
// void assert_size() {
66+
// static_assert(sizeof(*this) == 2);
67+
// }
68+
// } btn;
69+
// int16_t movement;
70+
// uint32_t unk1;
71+
// int32_t x;
72+
// int32_t y;
73+
// uint32_t unk2;
74+
//} mi;
75+
76+
MOUSE_INPUT_DATA mi;
77+
78+
//struct {
79+
// uint16_t unk1;
80+
// int16_t key;
81+
// uint16_t action;
82+
// uint16_t unk2;
83+
// uint32_t unk3;
84+
// uint32_t unk4;
85+
// uint32_t unk5;
86+
// uint32_t unk6;
87+
//} ki;
88+
89+
/// The high byte of MakeCode has no effect, extended keys are supported by Flags
90+
KEYBOARD_INPUT_DATA ki;
8391
};
8492
private:
8593
void assert_size() {
@@ -93,40 +101,48 @@ namespace Send::Type::Internal {
93101
if (mi.dwFlags & MOUSEEVENTF_MOVE) {
94102
POINT move{ mi.dx, mi.dy };
95103
if (mi.dwFlags & MOUSEEVENTF_ABSOLUTE) {
96-
control.mi.absolute_coord = 0x10000;
104+
control.mi.Flags = MOUSE_MOVE_ABSOLUTE;
97105
}
98-
control.mi.x = mi.dx;
99-
control.mi.y = mi.dy;
106+
control.mi.LastX = mi.dx;
107+
control.mi.LastY = mi.dy;
100108
}
101109

102-
#define CODE_GENERATE(down, up, member) \
103-
control.mi.btn.##member##Down = mi.dwFlags & down; \
104-
control.mi.btn.##member##Up = mi.dwFlags & up;
110+
if (mi.dwFlags & MOUSEEVENTF_LEFTDOWN)
111+
control.mi.ButtonFlags |= MOUSE_LEFT_BUTTON_DOWN;
112+
if (mi.dwFlags & MOUSEEVENTF_LEFTUP)
113+
control.mi.ButtonFlags |= MOUSE_LEFT_BUTTON_UP;
114+
if (mi.dwFlags & MOUSEEVENTF_RIGHTDOWN)
115+
control.mi.ButtonFlags |= MOUSE_RIGHT_BUTTON_DOWN;
116+
if (mi.dwFlags & MOUSEEVENTF_RIGHTUP)
117+
control.mi.ButtonFlags |= MOUSE_RIGHT_BUTTON_UP;
118+
if (mi.dwFlags & MOUSEEVENTF_MIDDLEDOWN)
119+
control.mi.ButtonFlags |= MOUSE_MIDDLE_BUTTON_DOWN;
120+
if (mi.dwFlags & MOUSEEVENTF_MIDDLEUP)
121+
control.mi.ButtonFlags |= MOUSE_MIDDLE_BUTTON_UP;
105122

106-
CODE_GENERATE(MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP, LButton) //#TODO: may be switched?
107-
CODE_GENERATE(MOUSEEVENTF_RIGHTDOWN, MOUSEEVENTF_RIGHTUP, RButton)
108-
CODE_GENERATE(MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_MIDDLEUP, MButton)
109-
#undef CODE_GENERATE
110123
if (mi.dwFlags & MOUSEEVENTF_XDOWN) {
111124
switch (mi.mouseData) {
112-
case XBUTTON1: control.mi.btn.XButton1Down = 1; break;
113-
case XBUTTON2: control.mi.btn.XButton2Down = 1; break;
125+
case XBUTTON1: control.mi.ButtonFlags |= MOUSE_BUTTON_4_DOWN; break;
126+
case XBUTTON2: control.mi.ButtonFlags |= MOUSE_BUTTON_5_DOWN; break;
114127
}
115-
} else if (mi.dwFlags & MOUSEEVENTF_XUP) {
128+
}
129+
if (mi.dwFlags & MOUSEEVENTF_XUP) {
116130
switch (mi.mouseData) {
117-
case XBUTTON1: control.mi.btn.XButton1Up = 1; break;
118-
case XBUTTON2: control.mi.btn.XButton2Up = 1; break;
131+
case XBUTTON1: control.mi.ButtonFlags |= MOUSE_BUTTON_4_UP; break;
132+
case XBUTTON2: control.mi.ButtonFlags |= MOUSE_BUTTON_5_UP; break;
119133
}
120-
} else if (mi.dwFlags & MOUSEEVENTF_WHEEL || mi.dwFlags & MOUSEEVENTF_HWHEEL) {
134+
}
135+
136+
if (mi.dwFlags & MOUSEEVENTF_WHEEL || mi.dwFlags & MOUSEEVENTF_HWHEEL) {
121137
if (mi.dwFlags & MOUSEEVENTF_WHEEL)
122-
control.mi.btn.Wheel = 1;
138+
control.mi.ButtonFlags |= MOUSE_WHEEL;
123139
else
124-
control.mi.btn.HWheel = 1;
125-
control.mi.movement = 120 * std::bit_cast<int32_t>(mi.mouseData); //#TODO
140+
control.mi.ButtonFlags |= MOUSE_HWHEEL;
141+
control.mi.ButtonData = 120 * std::bit_cast<int32_t>(mi.mouseData); //#TODO
126142
}
127143

128144
if constexpr (debug)
129-
DebugOStream() << L"send_mouse_input: " << *(uint16_t*)&control.mi.btn << L", (" << control.mi.x << L", " << control.mi.y << L") " << control.mi.absolute_coord << std::endl;
145+
DebugOStream() << L"send_mouse_input: " << *(uint16_t*)&control.mi.ButtonFlags << L", (" << control.mi.LastX << L", " << control.mi.LastY << L") " << control.mi.Flags << std::endl;
130146

131147
DWORD bytes_returned;
132148
return DeviceIoControl(device, 0x88883020, &control, sizeof control, nullptr, 0, &bytes_returned, nullptr);
@@ -135,7 +151,7 @@ namespace Send::Type::Internal {
135151
bool send_keyboard_input(const KEYBDINPUT& ki) override {
136152
RzControl control{ .type = RzControl::Type::Keyboard };
137153

138-
if ((control.ki.key = keyboard_vk_to_key(ki.wVk)) < 0)
154+
if ((control.ki.MakeCode = keyboard_vk_to_key(ki.wVk)) < 0)
139155
return false;
140156

141157
std::lock_guard lock(keyboard_mutex);
@@ -144,6 +160,10 @@ namespace Send::Type::Internal {
144160
if (is_modifier(ki.wVk))
145161
set_modifier_state(ki.wVk, keydown);
146162

163+
control.ki.Flags = keydown ? KEY_MAKE : KEY_BREAK;
164+
165+
// Extended keys
166+
// TODO: E1
147167
switch (ki.wVk)
148168
{
149169
case VK_SNAPSHOT:
@@ -159,15 +179,14 @@ namespace Send::Type::Internal {
159179
case VK_UP:
160180
case VK_LWIN:
161181
case VK_RWIN:
162-
control.ki.action = keydown ? 2 : 3;
182+
control.ki.Flags |= KEY_E0;
163183
break;
164184
default:
165-
control.ki.action = keydown ? 0 : 1;
166185
break;
167186
}
168187

169188
if constexpr (debug)
170-
DebugOStream() << L"send_keyboard_input: " << control.ki.key << ", " << control.ki.action << std::endl;
189+
DebugOStream() << L"send_keyboard_input: " << control.ki.MakeCode << ", " << control.ki.Flags << std::endl;
171190

172191
DWORD bytes_returned;
173192
return DeviceIoControl(device, 0x88883020, &control, sizeof control, nullptr, 0, &bytes_returned, nullptr);
@@ -179,8 +198,17 @@ namespace Send::Type::Internal {
179198
return keyboard_usage_to_key(Usb::keyboard_vk_to_usage(vk));
180199
}
181200

182-
// RCtrl and RAlt will be treated as left ones.
201+
/// - For extended keys, only the lowest byte is returned.
202+
/// - RCtrl and RAlt will be treated as left ones.
183203
constexpr int16_t keyboard_usage_to_key(uint16_t usage_id) {
204+
// Extracted from kbddef.dat in Razer Synapse
205+
//
206+
// Differences from HidP_TranslateUsagesToI8042ScanCodes() and MapVirtualKey():
207+
// vk | razer | HidP_TranslateUsagesToI8042ScanCodes | MapVirtualKey
208+
// --- | --- | --- | ---
209+
// VK_PAUSE (0x13) | 0x1D | 0x1D | MAPVK_VK_TO_VSC: 0 / MAPVK_VK_TO_VSC_EX: 0x1D
210+
// VK_SNAPSHOT (0x2C) | 0x37 | 0x2A / 0x37 | 0x54
211+
184212
if (usage_id <= 115) {
185213
constexpr uint16_t table[] = { -1, 255, 252, -3, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26, 27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 87, 88, 55, 70, 29, 82, 71, 73, 83, 79, 81, 77, 75, 80, 72, 69, 53, 55, 74, 78, 28, 79, 80, 81, 75, 76, 77, 71, 72, 73, 82, 83, 86, 93, 94, 89, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 118, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, 94, 95, 99, -3, 126, -3, 115, 112, 125, 121, 123, 92, -3, -3, -3, 242, 241, 120, 119, 118 };
186214
return table[usage_id];

0 commit comments

Comments
 (0)