feat(seat): pointer event serial
- commit
- 4cefc9a1aa1c83323095c60db84a404e0e212b6b
- author
- brice · · 2026-10-09 03:33 UTC
- parent
- 2df0761
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
2 files · +5 -4
M seat.go +3 -2
| @@ -90,6 +90,7 @@ type PointerEvent struct { | |||
| 90 | 90 | Pressed bool // PointerButton | |
| 91 | 91 | Axis uint32 // PointerAxis, PointerAxisStop: AxisVertical or AxisHorizontal | |
| 92 | 92 | Value120 int32 // PointerAxis: wheel value in 1/120 notches | |
| 93 | + | Serial uint32 // PointerEnter, PointerButton: the event serial (popup grabs, activation) | |
| 93 | 94 | } | |
| 94 | 95 | ||
| 95 | 96 | // KeyEvent is one key press, repeat or release. | |
| @@ -510,7 +511,7 @@ func (s *Seat) applyPointer(ev *event, h Handler) { | |||
| 510 | 511 | s.ptrSurf = sf.id | |
| 511 | 512 | s.px, s.py = fixed(ev.a), fixed(ev.b) | |
| 512 | 513 | s.enterSerial, s.shape = ev.serial, 0 // the compositor forgets the cursor on leave | |
| 513 | - | pe.Kind = PointerEnter | |
| 514 | + | pe.Kind, pe.Serial = PointerEnter, ev.serial | |
| 514 | 515 | case evPtrLeave: | |
| 515 | 516 | if sf := s.c.surfaceByObject(ev.global); s.ptrSurf == 0 || sf == nil || sf.id != s.ptrSurf { | |
| 516 | 517 | return | |
| @@ -531,7 +532,7 @@ func (s *Seat) applyPointer(ev *event, h Handler) { | |||
| 531 | 532 | s.px, s.py = fixed(ev.a), fixed(ev.b) | |
| 532 | 533 | pe.Kind = PointerMotion | |
| 533 | 534 | case evPtrButton: | |
| 534 | - | pe.Kind, pe.Button, pe.Pressed = PointerButton, ev.flags, ev.a == 1 | |
| 535 | + | pe.Kind, pe.Button, pe.Pressed, pe.Serial = PointerButton, ev.flags, ev.a == 1, ev.serial | |
| 535 | 536 | case evPtrAxis: | |
| 536 | 537 | pe.Kind, pe.Axis = PointerAxis, ev.flags | |
| 537 | 538 | if ev.flags == AxisVertical { | |
| @@ -90,6 +90,7 @@ type PointerEvent struct { | |||||
| 90 | Pressed bool // PointerButton | 90 | Pressed bool // PointerButton | ||
| 91 | Axis uint32 // PointerAxis, PointerAxisStop: AxisVertical or AxisHorizontal | 91 | Axis uint32 // PointerAxis, PointerAxisStop: AxisVertical or AxisHorizontal | ||
| 92 | Value120 int32 // PointerAxis: wheel value in 1/120 notches | 92 | Value120 int32 // PointerAxis: wheel value in 1/120 notches | ||
| 93 | + | Serial uint32 // PointerEnter, PointerButton: the event serial (popup grabs, activation) | |||
| 93 | } | 94 | } | ||
| 94 | 95 | ||||
| 95 | // KeyEvent is one key press, repeat or release. | 96 | // KeyEvent is one key press, repeat or release. | ||
| @@ -510,7 +511,7 @@ func (s *Seat) applyPointer(ev *event, h Handler) { | |||||
| 510 | s.ptrSurf = sf.id | 511 | s.ptrSurf = sf.id | ||
| 511 | s.px, s.py = fixed(ev.a), fixed(ev.b) | 512 | s.px, s.py = fixed(ev.a), fixed(ev.b) | ||
| 512 | s.enterSerial, s.shape = ev.serial, 0 // the compositor forgets the cursor on leave | 513 | s.enterSerial, s.shape = ev.serial, 0 // the compositor forgets the cursor on leave | ||
| 513 | - | pe.Kind = PointerEnter | 514 | + | pe.Kind, pe.Serial = PointerEnter, ev.serial |
| 514 | case evPtrLeave: | 515 | case evPtrLeave: | ||
| 515 | if sf := s.c.surfaceByObject(ev.global); s.ptrSurf == 0 || sf == nil || sf.id != s.ptrSurf { | 516 | if sf := s.c.surfaceByObject(ev.global); s.ptrSurf == 0 || sf == nil || sf.id != s.ptrSurf { | ||
| 516 | return | 517 | return | ||
| @@ -531,7 +532,7 @@ func (s *Seat) applyPointer(ev *event, h Handler) { | |||||
| 531 | s.px, s.py = fixed(ev.a), fixed(ev.b) | 532 | s.px, s.py = fixed(ev.a), fixed(ev.b) | ||
| 532 | pe.Kind = PointerMotion | 533 | pe.Kind = PointerMotion | ||
| 533 | case evPtrButton: | 534 | case evPtrButton: | ||
| 534 | - | pe.Kind, pe.Button, pe.Pressed = PointerButton, ev.flags, ev.a == 1 | 535 | + | pe.Kind, pe.Button, pe.Pressed, pe.Serial = PointerButton, ev.flags, ev.a == 1, ev.serial |
| 535 | case evPtrAxis: | 536 | case evPtrAxis: | ||
| 536 | pe.Kind, pe.Axis = PointerAxis, ev.flags | 537 | pe.Kind, pe.Axis = PointerAxis, ev.flags | ||
| 537 | if ev.flags == AxisVertical { | 538 | if ev.flags == AxisVertical { | ||
M seat_wire_test.go +2 -2
| @@ -157,9 +157,9 @@ func TestSeatPointerEvents(t *testing.T) { | |||
| 157 | 157 | ||
| 158 | 158 | require.Len(t, got, 7) | |
| 159 | 159 | id := s.ID() | |
| 160 | - | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerEnter, X: 10.5, Y: 20.25}, got[0]) | |
| 160 | + | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerEnter, X: 10.5, Y: 20.25, Serial: 77}, got[0]) | |
| 161 | 161 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerMotion, X: 11, Y: 21}, got[1]) | |
| 162 | - | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerButton, X: 11, Y: 21, Button: 0x110, Pressed: true}, got[2]) | |
| 162 | + | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerButton, X: 11, Y: 21, Button: 0x110, Pressed: true, Serial: 78}, got[2]) | |
| 163 | 163 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerAxis, X: 11, Y: 21, Axis: 0, DY: 15}, got[3]) | |
| 164 | 164 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerAxis, X: 11, Y: 21, Axis: 1, Value120: -120}, got[4]) | |
| 165 | 165 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerAxisStop, X: 11, Y: 21}, got[5]) | |
| @@ -157,9 +157,9 @@ func TestSeatPointerEvents(t *testing.T) { | |||||
| 157 | 157 | ||||
| 158 | require.Len(t, got, 7) | 158 | require.Len(t, got, 7) | ||
| 159 | id := s.ID() | 159 | id := s.ID() | ||
| 160 | - | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerEnter, X: 10.5, Y: 20.25}, got[0]) | 160 | + | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerEnter, X: 10.5, Y: 20.25, Serial: 77}, got[0]) |
| 161 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerMotion, X: 11, Y: 21}, got[1]) | 161 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerMotion, X: 11, Y: 21}, got[1]) | ||
| 162 | - | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerButton, X: 11, Y: 21, Button: 0x110, Pressed: true}, got[2]) | 162 | + | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerButton, X: 11, Y: 21, Button: 0x110, Pressed: true, Serial: 78}, got[2]) |
| 163 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerAxis, X: 11, Y: 21, Axis: 0, DY: 15}, got[3]) | 163 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerAxis, X: 11, Y: 21, Axis: 0, DY: 15}, got[3]) | ||
| 164 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerAxis, X: 11, Y: 21, Axis: 1, Value120: -120}, got[4]) | 164 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerAxis, X: 11, Y: 21, Axis: 1, Value120: -120}, got[4]) | ||
| 165 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerAxisStop, X: 11, Y: 21}, got[5]) | 165 | require.Equal(t, neferclient.PointerEvent{Surface: id, Kind: neferclient.PointerAxisStop, X: 11, Y: 21}, got[5]) | ||