Support receiving batched mouse events

Mouse events may trigger more than a single events simultaneously.

Fixes #212.
This commit is contained in:
Christian Muehlhaeuser
2022-02-03 04:14:49 +01:00
parent db177f1939
commit 6301f93cb2
5 changed files with 280 additions and 180 deletions

View File

@@ -122,209 +122,268 @@ func TestParseX10MouseEvent(t *testing.T) {
tt := []struct {
name string
buf []byte
expected MouseEvent
expected []MouseEvent
}{
// Position.
{
name: "zero position",
buf: encode(0b0010_0000, 0, 0),
expected: MouseEvent{
X: 0,
Y: 0,
Type: MouseLeft,
expected: []MouseEvent{
{
X: 0,
Y: 0,
Type: MouseLeft,
},
},
},
{
name: "max position",
buf: encode(0b0010_0000, 222, 222), // Because 255 (max int8) - 32 - 1.
expected: MouseEvent{
X: 222,
Y: 222,
Type: MouseLeft,
expected: []MouseEvent{
{
X: 222,
Y: 222,
Type: MouseLeft,
},
},
},
// Simple.
{
name: "left",
buf: encode(0b0000_0000, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseLeft,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseLeft,
},
},
},
{
name: "left in motion",
buf: encode(0b0010_0000, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseLeft,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseLeft,
},
},
},
{
name: "middle",
buf: encode(0b0000_0001, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseMiddle,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseMiddle,
},
},
},
{
name: "middle in motion",
buf: encode(0b0010_0001, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseMiddle,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseMiddle,
},
},
},
{
name: "right",
buf: encode(0b0000_0010, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseRight,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseRight,
},
},
},
{
name: "right in motion",
buf: encode(0b0010_0010, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseRight,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseRight,
},
},
},
{
name: "motion",
buf: encode(0b0010_0011, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseMotion,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseMotion,
},
},
},
{
name: "wheel up",
buf: encode(0b0100_0000, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseWheelUp,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseWheelUp,
},
},
},
{
name: "wheel down",
buf: encode(0b0100_0001, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseWheelDown,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseWheelDown,
},
},
},
{
name: "release",
buf: encode(0b0000_0011, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseRelease,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseRelease,
},
},
},
// Combinations.
{
name: "alt+right",
buf: encode(0b0010_1010, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseRight,
Alt: true,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseRight,
Alt: true,
},
},
},
{
name: "ctrl+right",
buf: encode(0b0011_0010, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseRight,
Ctrl: true,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseRight,
Ctrl: true,
},
},
},
{
name: "ctrl+alt+right",
buf: encode(0b0011_1010, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseRight,
Alt: true,
Ctrl: true,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseRight,
Alt: true,
Ctrl: true,
},
},
},
{
name: "alt+wheel down",
buf: encode(0b0100_1001, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseWheelDown,
Alt: true,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseWheelDown,
Alt: true,
},
},
},
{
name: "ctrl+wheel down",
buf: encode(0b0101_0001, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseWheelDown,
Ctrl: true,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseWheelDown,
Ctrl: true,
},
},
},
{
name: "ctrl+alt+wheel down",
buf: encode(0b0101_1001, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseWheelDown,
Alt: true,
Ctrl: true,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseWheelDown,
Alt: true,
Ctrl: true,
},
},
},
// Unknown.
{
name: "wheel with unknown bit",
buf: encode(0b0100_0010, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseUnknown,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseUnknown,
},
},
},
{
name: "unknown with modifier",
buf: encode(0b0100_1010, 32, 16),
expected: MouseEvent{
X: 32,
Y: 16,
Type: MouseUnknown,
Alt: true,
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseUnknown,
Alt: true,
},
},
},
// Overflow position.
{
name: "overflow position",
buf: encode(0b0010_0000, 250, 223), // Because 255 (max int8) - 32 - 1.
expected: MouseEvent{
X: -6,
Y: -33,
Type: MouseLeft,
expected: []MouseEvent{
{
X: -6,
Y: -33,
Type: MouseLeft,
},
},
},
// Batched events.
{
name: "batched events",
buf: append(encode(0b0010_0000, 32, 16), encode(0b0000_0011, 64, 32)...),
expected: []MouseEvent{
{
X: 32,
Y: 16,
Type: MouseLeft,
},
{
X: 64,
Y: 32,
Type: MouseRelease,
},
},
},
}
@@ -333,18 +392,20 @@ func TestParseX10MouseEvent(t *testing.T) {
tc := tt[i]
t.Run(tc.name, func(t *testing.T) {
actual, err := parseX10MouseEvent(tc.buf)
actual, err := parseX10MouseEvents(tc.buf)
if err != nil {
t.Fatalf("unexpected error: %v",
t.Fatalf("unexpected error for test: %v",
err,
)
}
if tc.expected != actual {
t.Fatalf("expected %#v but got %#v",
tc.expected,
actual,
)
for i := range tc.expected {
if tc.expected[i] != actual[i] {
t.Fatalf("expected %#v but got %#v",
tc.expected[i],
actual[i],
)
}
}
})
}
@@ -377,7 +438,7 @@ func TestParseX10MouseEvent_error(t *testing.T) {
tc := tt[i]
t.Run(tc.name, func(t *testing.T) {
_, err := parseX10MouseEvent(tc.buf)
_, err := parseX10MouseEvents(tc.buf)
if err == nil {
t.Fatalf("expected error but got nil")