forked from joejulian/gio
all: clean up code, upgrade to modern Go
Signed-off-by: ddkwork
This commit is contained in:
+1
-1
@@ -10,7 +10,7 @@ import (
|
||||
|
||||
// Tag is the stable identifier for an event handler.
|
||||
// For a handler h, the tag is typically &h.
|
||||
type Tag interface{}
|
||||
type Tag any
|
||||
|
||||
// Event is the marker interface for events.
|
||||
type Event interface {
|
||||
|
||||
@@ -4,6 +4,7 @@ package input
|
||||
|
||||
import (
|
||||
"io"
|
||||
"slices"
|
||||
|
||||
"gioui.org/io/clipboard"
|
||||
"gioui.org/io/event"
|
||||
@@ -60,10 +61,8 @@ func (q *clipboardQueue) ProcessWriteClipboard(req clipboard.WriteCmd) {
|
||||
}
|
||||
|
||||
func (q *clipboardQueue) ProcessReadClipboard(state clipboardState, tag event.Tag) clipboardState {
|
||||
for _, k := range state.receivers {
|
||||
if k == tag {
|
||||
return state
|
||||
}
|
||||
if slices.Contains(state.receivers, tag) {
|
||||
return state
|
||||
}
|
||||
n := len(state.receivers)
|
||||
state.receivers = append(state.receivers[:n:n], tag)
|
||||
|
||||
@@ -52,7 +52,7 @@ func TestQueueProcessReadClipboard(t *testing.T) {
|
||||
assertClipboardReadCmd(t, r, 1)
|
||||
ops.Reset()
|
||||
|
||||
for i := 0; i < 3; i++ {
|
||||
for range 3 {
|
||||
// No ReadCmd
|
||||
// One receiver must still wait for response
|
||||
|
||||
|
||||
+3
-4
@@ -4,6 +4,7 @@ package input
|
||||
|
||||
import (
|
||||
"image"
|
||||
"slices"
|
||||
"sort"
|
||||
|
||||
"gioui.org/f32"
|
||||
@@ -304,10 +305,8 @@ func (s keyState) softKeyboard(show bool) keyState {
|
||||
}
|
||||
|
||||
func (k *keyFilter) Add(f key.Filter) {
|
||||
for _, f2 := range *k {
|
||||
if f == f2 {
|
||||
return
|
||||
}
|
||||
if slices.Contains(*k, f) {
|
||||
return
|
||||
}
|
||||
*k = append(*k, f)
|
||||
}
|
||||
|
||||
+19
-36
@@ -5,6 +5,7 @@ package input
|
||||
import (
|
||||
"image"
|
||||
"io"
|
||||
"slices"
|
||||
|
||||
"gioui.org/f32"
|
||||
f32internal "gioui.org/internal/f32"
|
||||
@@ -258,13 +259,7 @@ func (q *pointerQueue) grab(state pointerState, req pointer.GrabCmd) (pointerSta
|
||||
continue
|
||||
}
|
||||
// Verify that the grabber is among the handlers.
|
||||
found := false
|
||||
for _, tag := range p.handlers {
|
||||
if tag == req.Tag {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
found := slices.Contains(p.handlers, req.Tag)
|
||||
if !found {
|
||||
continue
|
||||
}
|
||||
@@ -293,17 +288,13 @@ func (c *pointerCollector) inputOp(tag event.Tag, state *pointerHandler) {
|
||||
func (p *pointerFilter) Add(f event.Filter) {
|
||||
switch f := f.(type) {
|
||||
case transfer.SourceFilter:
|
||||
for _, m := range p.sourceMimes {
|
||||
if m == f.Type {
|
||||
return
|
||||
}
|
||||
if slices.Contains(p.sourceMimes, f.Type) {
|
||||
return
|
||||
}
|
||||
p.sourceMimes = append(p.sourceMimes, f.Type)
|
||||
case transfer.TargetFilter:
|
||||
for _, m := range p.targetMimes {
|
||||
if m == f.Type {
|
||||
return
|
||||
}
|
||||
if slices.Contains(p.targetMimes, f.Type) {
|
||||
return
|
||||
}
|
||||
p.targetMimes = append(p.targetMimes, f.Type)
|
||||
case pointer.Filter:
|
||||
@@ -320,16 +311,12 @@ func (p *pointerFilter) Matches(e event.Event) bool {
|
||||
case transfer.CancelEvent, transfer.InitiateEvent:
|
||||
return len(p.sourceMimes) > 0 || len(p.targetMimes) > 0
|
||||
case transfer.RequestEvent:
|
||||
for _, t := range p.sourceMimes {
|
||||
if t == e.Type {
|
||||
return true
|
||||
}
|
||||
if slices.Contains(p.sourceMimes, e.Type) {
|
||||
return true
|
||||
}
|
||||
case transfer.DataEvent:
|
||||
for _, t := range p.targetMimes {
|
||||
if t == e.Type {
|
||||
return true
|
||||
}
|
||||
if slices.Contains(p.targetMimes, e.Type) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
@@ -424,7 +411,7 @@ func (q *pointerQueue) offerData(handlers map[event.Tag]*handler, state pointerS
|
||||
},
|
||||
}})
|
||||
}
|
||||
state.pointers = append([]pointerInfo{}, state.pointers...)
|
||||
state.pointers = slices.Clone(state.pointers)
|
||||
state.pointers[i], evts = q.deliverTransferCancelEvent(handlers, p, evts)
|
||||
break
|
||||
}
|
||||
@@ -616,7 +603,7 @@ func (q *pointerQueue) reset() {
|
||||
for k, ids := range q.semantic.contentIDs {
|
||||
for i := len(ids) - 1; i >= 0; i-- {
|
||||
if !ids[i].used {
|
||||
ids = append(ids[:i], ids[i+1:]...)
|
||||
ids = slices.Delete(ids, i, i+1)
|
||||
} else {
|
||||
ids[i].used = false
|
||||
}
|
||||
@@ -647,7 +634,7 @@ func (q *pointerQueue) Frame(handlers map[event.Tag]*handler, state pointerState
|
||||
changed := false
|
||||
p, evts, state.cursor, changed = q.deliverEnterLeaveEvents(handlers, state.cursor, p, evts, p.last)
|
||||
if changed {
|
||||
state.pointers = append([]pointerInfo{}, state.pointers...)
|
||||
state.pointers = slices.Clone(state.pointers)
|
||||
state.pointers[i] = p
|
||||
}
|
||||
}
|
||||
@@ -783,9 +770,9 @@ func (q *pointerQueue) Push(handlers map[event.Tag]*handler, state pointerState,
|
||||
|
||||
if !p.pressed && len(p.entered) == 0 {
|
||||
// No longer need to track pointer.
|
||||
state.pointers = append(state.pointers[:pidx:pidx], state.pointers[pidx+1:]...)
|
||||
state.pointers = slices.Concat(state.pointers[:pidx:pidx], state.pointers[pidx+1:])
|
||||
} else {
|
||||
state.pointers = append([]pointerInfo{}, state.pointers...)
|
||||
state.pointers = slices.Clone(state.pointers)
|
||||
state.pointers[pidx] = p
|
||||
}
|
||||
return state, evts
|
||||
@@ -975,10 +962,8 @@ func searchTag(tags []event.Tag, tag event.Tag) (int, bool) {
|
||||
|
||||
// addHandler adds tag to the slice if not present.
|
||||
func addHandler(tags []event.Tag, tag event.Tag) []event.Tag {
|
||||
for _, t := range tags {
|
||||
if t == tag {
|
||||
return tags
|
||||
}
|
||||
if slices.Contains(tags, tag) {
|
||||
return tags
|
||||
}
|
||||
return append(tags, tag)
|
||||
}
|
||||
@@ -986,10 +971,8 @@ func addHandler(tags []event.Tag, tag event.Tag) []event.Tag {
|
||||
// firstMimeMatch returns the first type match between src and tgt.
|
||||
func firstMimeMatch(src, tgt *pointerFilter) (first string, matched bool) {
|
||||
for _, m1 := range tgt.targetMimes {
|
||||
for _, m2 := range src.sourceMimes {
|
||||
if m1 == m2 {
|
||||
return m1, true
|
||||
}
|
||||
if slices.Contains(src.sourceMimes, m1) {
|
||||
return m1, true
|
||||
}
|
||||
}
|
||||
return "", false
|
||||
|
||||
+18
-10
@@ -711,26 +711,31 @@ func TestCursor(t *testing.T) {
|
||||
cursors []pointer.Cursor
|
||||
want pointer.Cursor
|
||||
}{
|
||||
{label: "no movement",
|
||||
{
|
||||
label: "no movement",
|
||||
cursors: []pointer.Cursor{pointer.CursorPointer},
|
||||
want: pointer.CursorDefault,
|
||||
},
|
||||
{label: "move inside",
|
||||
{
|
||||
label: "move inside",
|
||||
cursors: []pointer.Cursor{pointer.CursorPointer},
|
||||
events: _at(50, 50),
|
||||
want: pointer.CursorPointer,
|
||||
},
|
||||
{label: "move outside",
|
||||
{
|
||||
label: "move outside",
|
||||
cursors: []pointer.Cursor{pointer.CursorPointer},
|
||||
events: _at(200, 200),
|
||||
want: pointer.CursorDefault,
|
||||
},
|
||||
{label: "move back inside",
|
||||
{
|
||||
label: "move back inside",
|
||||
cursors: []pointer.Cursor{pointer.CursorPointer},
|
||||
events: _at(50, 50),
|
||||
want: pointer.CursorPointer,
|
||||
},
|
||||
{label: "send key events while inside",
|
||||
{
|
||||
label: "send key events while inside",
|
||||
cursors: []pointer.Cursor{pointer.CursorPointer},
|
||||
events: []event.Event{
|
||||
key.Event{Name: "A", State: key.Press},
|
||||
@@ -738,7 +743,8 @@ func TestCursor(t *testing.T) {
|
||||
},
|
||||
want: pointer.CursorPointer,
|
||||
},
|
||||
{label: "send key events while outside",
|
||||
{
|
||||
label: "send key events while outside",
|
||||
cursors: []pointer.Cursor{pointer.CursorPointer},
|
||||
events: append(
|
||||
_at(200, 200),
|
||||
@@ -747,7 +753,8 @@ func TestCursor(t *testing.T) {
|
||||
),
|
||||
want: pointer.CursorDefault,
|
||||
},
|
||||
{label: "add new input on top while inside",
|
||||
{
|
||||
label: "add new input on top while inside",
|
||||
cursors: []pointer.Cursor{pointer.CursorPointer, pointer.CursorCrosshair},
|
||||
events: append(
|
||||
_at(50, 50),
|
||||
@@ -758,7 +765,8 @@ func TestCursor(t *testing.T) {
|
||||
),
|
||||
want: pointer.CursorCrosshair,
|
||||
},
|
||||
{label: "remove input on top while inside",
|
||||
{
|
||||
label: "remove input on top while inside",
|
||||
cursors: []pointer.Cursor{pointer.CursorPointer},
|
||||
events: append(
|
||||
_at(50, 50),
|
||||
@@ -1289,7 +1297,7 @@ func BenchmarkRouterAdd(b *testing.B) {
|
||||
handlerCount := i
|
||||
b.Run(fmt.Sprintf("%d-handlers", i), func(b *testing.B) {
|
||||
handlers := make([]event.Tag, handlerCount)
|
||||
for i := 0; i < handlerCount; i++ {
|
||||
for i := range handlerCount {
|
||||
h := new(int)
|
||||
*h = i
|
||||
handlers[i] = h
|
||||
@@ -1311,7 +1319,7 @@ func BenchmarkRouterAdd(b *testing.B) {
|
||||
r.Frame(&ops)
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
for b.Loop() {
|
||||
r.Queue(
|
||||
pointer.Event{
|
||||
Kind: pointer.Move,
|
||||
|
||||
+2
-1
@@ -5,6 +5,7 @@ package input
|
||||
import (
|
||||
"image"
|
||||
"io"
|
||||
"slices"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -302,7 +303,7 @@ func (q *Router) Event(filters ...event.Filter) (event.Event, bool) {
|
||||
}
|
||||
}
|
||||
if match {
|
||||
change.events = append(change.events[:j], change.events[j+1:]...)
|
||||
change.events = slices.Delete(change.events, j, j+1)
|
||||
// Fast forward state to last matched.
|
||||
q.collapseState(i)
|
||||
return evt.event, true
|
||||
|
||||
@@ -15,7 +15,7 @@ func TestNoFilterAllocs(t *testing.T) {
|
||||
s := r.Source()
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
for b.Loop() {
|
||||
s.Event(pointer.Filter{})
|
||||
}
|
||||
})
|
||||
|
||||
@@ -125,7 +125,7 @@ func verifyTree(t *testing.T, parent SemanticID, n SemanticNode) {
|
||||
}
|
||||
|
||||
func printTree(indent int, n SemanticNode) {
|
||||
for i := 0; i < indent; i++ {
|
||||
for range indent {
|
||||
fmt.Print("\t")
|
||||
}
|
||||
fmt.Printf("%d: %+v\n", n.ID, n.Desc)
|
||||
|
||||
@@ -43,8 +43,7 @@ type Event struct {
|
||||
|
||||
// PassOp sets the pass-through mode. InputOps added while the pass-through
|
||||
// mode is set don't block events to siblings.
|
||||
type PassOp struct {
|
||||
}
|
||||
type PassOp struct{}
|
||||
|
||||
// PassStack represents a PassOp on the pass stack.
|
||||
type PassStack struct {
|
||||
|
||||
Reference in New Issue
Block a user