diff --git a/internal/ops/ops.go b/internal/ops/ops.go index 91deb819..755293aa 100644 --- a/internal/ops/ops.go +++ b/internal/ops/ops.go @@ -109,7 +109,7 @@ const ( TypePopAreaLen = 1 TypePassLen = 1 TypePopPassLen = 1 - TypePointerInputLen = 1 + 1 + 1 + 2*4 + 2*4 + TypePointerInputLen = 1 + 1 + 1*2 + 2*4 + 2*4 TypeClipboardReadLen = 1 TypeClipboardWriteLen = 1 TypeKeyInputLen = 1 + 1 diff --git a/io/pointer/pointer.go b/io/pointer/pointer.go index de862bb0..b74abc7f 100644 --- a/io/pointer/pointer.go +++ b/io/pointer/pointer.go @@ -93,7 +93,7 @@ type InputOp struct { type ID uint16 // Type of an Event. -type Type uint8 +type Type uint // Priority of an Event. type Priority uint8 @@ -251,17 +251,20 @@ func (op InputOp) Add(o *op.Ops) { if b := op.ScrollBounds; b.Min.X > 0 || b.Max.X < 0 || b.Min.Y > 0 || b.Max.Y < 0 { panic(fmt.Errorf("invalid scroll range value %v", b)) } + if op.Types>>16 > 0 { + panic(fmt.Errorf("value in Types overflows uint16")) + } data := ops.Write1(&o.Internal, ops.TypePointerInputLen, op.Tag) data[0] = byte(ops.TypePointerInput) if op.Grab { data[1] = 1 } - data[2] = byte(op.Types) bo := binary.LittleEndian - bo.PutUint32(data[3:], uint32(op.ScrollBounds.Min.X)) - bo.PutUint32(data[7:], uint32(op.ScrollBounds.Min.Y)) - bo.PutUint32(data[11:], uint32(op.ScrollBounds.Max.X)) - bo.PutUint32(data[15:], uint32(op.ScrollBounds.Max.Y)) + bo.PutUint16(data[2:], uint16(op.Types)) + bo.PutUint32(data[4:], uint32(op.ScrollBounds.Min.X)) + bo.PutUint32(data[8:], uint32(op.ScrollBounds.Min.Y)) + bo.PutUint32(data[12:], uint32(op.ScrollBounds.Max.X)) + bo.PutUint32(data[16:], uint32(op.ScrollBounds.Max.Y)) } func (t Type) String() string { diff --git a/io/router/pointer.go b/io/router/pointer.go index 24da6482..6ef4a20c 100644 --- a/io/router/pointer.go +++ b/io/router/pointer.go @@ -147,10 +147,11 @@ func (q *pointerQueue) collectHandlers(r *ops.Reader, events *handlerEvents) { state.t = q.transStack[n-1] q.transStack = q.transStack[:n-1] case ops.TypePointerInput: + bo := binary.LittleEndian op := pointer.InputOp{ Tag: encOp.Refs[0].(event.Tag), Grab: encOp.Data[1] != 0, - Types: pointer.Type(encOp.Data[2]), + Types: pointer.Type(bo.Uint16(encOp.Data[2:])), } area := -1 if i := state.node; i != -1 { @@ -175,15 +176,14 @@ func (q *pointerQueue) collectHandlers(r *ops.Reader, events *handlerEvents) { h.area = area h.wantsGrab = h.wantsGrab || op.Grab h.types = h.types | op.Types - bo := binary.LittleEndian.Uint32 h.scrollRange = image.Rectangle{ Min: image.Point{ - X: int(int32(bo(encOp.Data[3:]))), - Y: int(int32(bo(encOp.Data[7:]))), + X: int(int32(bo.Uint32(encOp.Data[4:]))), + Y: int(int32(bo.Uint32(encOp.Data[8:]))), }, Max: image.Point{ - X: int(int32(bo(encOp.Data[11:]))), - Y: int(int32(bo(encOp.Data[15:]))), + X: int(int32(bo.Uint32(encOp.Data[12:]))), + Y: int(int32(bo.Uint32(encOp.Data[16:]))), }, } case ops.TypeCursor: