all: clean up code, upgrade to modern Go

Signed-off-by: ddkwork
This commit is contained in:
Admin
2025-05-05 23:27:04 +08:00
committed by Elias Naur
parent 86668e8b45
commit f73287be87
58 changed files with 413 additions and 241 deletions
+1 -1
View File
@@ -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 {
+3 -4
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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{})
}
})
+1 -1
View File
@@ -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)
+1 -2
View File
@@ -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 {