Skip to content

Commit 6bdf980

Browse files
authored
Merge pull request #2 from StrateimTech/sidebuttons
Add support for mouse side buttons
2 parents 66ef501 + caa22c5 commit 6bdf980

5 files changed

Lines changed: 40 additions & 16 deletions

File tree

HID-API/HIDRecords.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ public record Mouse : GenericEvent
88
public bool RightButton;
99
public bool MiddleButton;
1010

11+
public bool FourButton;
12+
public bool FiveButton;
13+
1114
public double X;
1215
public double Y;
1316
public int Wheel;

HID-API/Handlers/MouseHandler.cs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ public MouseHandler(HidHandler hidHandler, FileStream mouseFileStream, string st
1717
DeviceStream = mouseFileStream;
1818
new Thread(() =>
1919
{
20-
// Enable Z axis via magic sample rate
21-
mouseFileStream.Write(new byte[] {0xf3, 200, 0xf3, 100, 0xf3, 80});
20+
// https://wiki.osdev.org/PS/2_Mouse
21+
// Enable Z axis & side buttons (four, five) via magic sample rate
22+
mouseFileStream.Write(new byte[] {0xf3, 200, 0xf3, 200, 0xf3, 80});
2223
mouseFileStream.Flush();
23-
24+
2425
var skip = true;
2526
while (Active)
2627
{
@@ -38,12 +39,31 @@ public MouseHandler(HidHandler hidHandler, FileStream mouseFileStream, string st
3839
continue;
3940
}
4041

42+
var fourButton = false;
43+
var fiveButton = false;
44+
int wheel;
45+
4146
MouseLock.EnterReadLock();
4247
try
4348
{
4449
mouseSbyteArray[1] = Mouse.InvertMouseX ? Convert.ToSByte(Convert.ToInt32(mouseSbyteArray[1]) * -1) : mouseSbyteArray[1];
4550
mouseSbyteArray[2] = Mouse.InvertMouseY ? mouseSbyteArray[2] : Convert.ToSByte(Convert.ToInt32(mouseSbyteArray[2]) * -1);
46-
mouseSbyteArray[3] = Mouse.InvertMouseWheel ? mouseSbyteArray[3] : Convert.ToSByte(Convert.ToInt32(mouseSbyteArray[3]) * -1);
51+
52+
// future proofing
53+
if (mouseSbyteArray.Length != 4)
54+
{
55+
mouseSbyteArray[3] = Mouse.InvertMouseWheel ? mouseSbyteArray[3] : Convert.ToSByte(Convert.ToInt32(mouseSbyteArray[3]) * -1);
56+
wheel = Convert.ToInt32(mouseSbyteArray[3]);
57+
}
58+
else
59+
{
60+
fourButton = (mouseSbyteArray[3] & 0x10) > 0;
61+
fiveButton = (mouseSbyteArray[3] & 0x20) > 0;
62+
63+
int z = (mouseSbyteArray[3] & 0xF) > 7 ? (mouseSbyteArray[3] & 0xF) - 16 : (mouseSbyteArray[3] & 0xF);
64+
65+
wheel = Mouse.InvertMouseWheel ? z : z * -1;
66+
}
4767
}
4868
finally
4969
{
@@ -55,10 +75,12 @@ public MouseHandler(HidHandler hidHandler, FileStream mouseFileStream, string st
5575
LeftButton = (mouseSbyteArray[0] & 0x1) > 0,
5676
RightButton = (mouseSbyteArray[0] & 0x2) > 0,
5777
MiddleButton = (mouseSbyteArray[0] & 0x4) > 0,
78+
FourButton = fourButton,
79+
FiveButton = fiveButton,
5880
X = Convert.ToInt32(mouseSbyteArray[1]),
5981
Y = Convert.ToInt32(mouseSbyteArray[2]),
60-
Wheel = Convert.ToInt32(mouseSbyteArray[3])
61-
};
82+
Wheel = wheel
83+
};
6284

6385
MouseLock.EnterWriteLock();
6486
try

HID-API/HidHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ private void WriteMouseReport(Mouse mouse)
146146
{
147147
DataUtils.ToByte(new BitArray(new[]
148148
{
149-
mouse.LeftButton, mouse.RightButton, mouse.MiddleButton,
150-
false, false, false, false, false
149+
mouse.LeftButton, mouse.RightButton, mouse.MiddleButton, mouse.FourButton, mouse.FiveButton,
150+
false, false, false
151151
}))
152152
},
153153
new[] {Convert.ToInt16(mouse.X * mouse.SensitivityMultiplier), Convert.ToInt16(mouse.Y * mouse.SensitivityMultiplier)},

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,14 @@ Parsed output from [eleccelerator](https://eleccelerator.com/usbdescreqparser).
110110
0x85, 0x01, // Report ID (1)
111111
0x05, 0x09, // Usage Page (Button)
112112
0x19, 0x01, // Usage Minimum (0x01)
113-
0x29, 0x03, // Usage Maximum (0x03)
113+
0x29, 0x05, // Usage Maximum (0x05)
114114
0x15, 0x00, // Logical Minimum (0)
115115
0x25, 0x01, // Logical Maximum (1)
116-
0x95, 0x03, // Report Count (3)
116+
0x95, 0x05, // Report Count (5)
117117
0x75, 0x01, // Report Size (1)
118118
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
119119
0x95, 0x01, // Report Count (1)
120-
0x75, 0x05, // Report Size (5)
120+
0x75, 0x03, // Report Size (3)
121121
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
122122
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
123123
0x09, 0x30, // Usage (X)

examples/custom_gadget.sh

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ echo 0x0100 > bcdDevice # v1.0.0
1111
echo 0x0310 > bcdUSB # USB3.1
1212

1313
mkdir -p strings/0x409
14-
echo "D86730BE8888" > strings/0x409/serialnumber
14+
echo "0E6D395D3333" > strings/0x409/serialnumber
1515
echo "Logitech" > strings/0x409/manufacturer
1616
echo "G502 SE HERO Gaming Mouse" > strings/0x409/product
1717

@@ -20,14 +20,13 @@ mkdir -p configs/c.1/strings/0x409
2020
# value * 2mA
2121
echo 750 > configs/c.1/MaxPower
2222

23+
# Add functions here
2324
mkdir -p functions/hid.usb0
2425
echo 0 > functions/hid.usb0/protocol
2526
echo 0 > functions/hid.usb0/subclass
26-
# Maximum possible report length (30m + 19k)
27-
echo 49 > functions/hid.usb0/report_length
27+
echo 133 > functions/hid.usb0/report_length
2828

29-
# Custom report descriptor
30-
echo -ne \\x05\\x01\\x09\\x02\\xA1\\x01\\x09\\x01\\xA1\\x00\\x85\\x01\\x05\\x09\\x19\\x01\\x29\\x03\\x15\\x00\\x25\\x01\\x95\\x03\\x75\\x01\\x81\\x02\\x95\\x01\\x75\\x05\\x81\\x03\\x05\\x01\\x09\\x30\\x09\\x31\\x16\\x01\\x80\\x26\\xFF\\x7F\\x75\\x10\\x95\\x02\\x81\\x06\\x09\\x38\\x15\\x81\\x25\\x7F\\x75\\x08\\x95\\x01\\x81\\x06\\xC0\\xC0\\x05\\x01\\x09\\x06\\xA1\\x01\\x85\\x02\\x05\\x07\\x19\\xe0\\x29\\xe7\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x08\\x81\\x02\\x75\\x08\\x95\\x01\\x81\\x01\\x75\\x01\\x95\\x03\\x05\\x08\\x19\\x01\\x29\\x03\\x91\\x02\\x75\\x01\\x95\\x05\\x91\\x01\\x75\\x08\\x95\\x06\\x15\\x00\\x26\\xff\\x00\\x05\\x07\\x19\\x00\\x2a\\xff\\x00\\x81\\x00\\xC0 > functions/hid.usb0/report_desc
29+
echo -ne \\x05\\x01\\x09\\x02\\xA1\\x01\\x09\\x01\\xA1\\x00\\x85\\x01\\x05\\x09\\x19\\x01\\x29\\x05\\x15\\x00\\x25\\x01\\x95\\x05\\x75\\x01\\x81\\x02\\x95\\x01\\x75\\x03\\x81\\x03\\x05\\x01\\x09\\x30\\x09\\x31\\x16\\x01\\x80\\x26\\xFF\\x7F\\x75\\x10\\x95\\x02\\x81\\x06\\x09\\x38\\x15\\x81\\x25\\x7F\\x75\\x08\\x95\\x01\\x81\\x06\\xC0\\xC0\\x05\\x01\\x09\\x06\\xA1\\x01\\x85\\x02\\x05\\x07\\x19\\xE0\\x29\\xE7\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x08\\x81\\x02\\x75\\x08\\x95\\x01\\x81\\x01\\x75\\x01\\x95\\x03\\x05\\x08\\x19\\x01\\x29\\x03\\x91\\x02\\x75\\x01\\x95\\x05\\x91\\x01\\x75\\x08\\x95\\x06\\x15\\x00\\x26\\xFF\\x00\\x05\\x07\\x19\\x00\\x2A\\xFF\\x00\\x81\\x00\\xC0 > functions/hid.usb0/report_desc
3130

3231
ln -s functions/hid.usb0 configs/c.1/
3332

0 commit comments

Comments
 (0)