diff --git a/ui/app/internal/input/router.go b/ui/app/internal/input/router.go index 56ea881b..912ad20e 100644 --- a/ui/app/internal/input/router.go +++ b/ui/app/internal/input/router.go @@ -36,8 +36,8 @@ type handlerEvents struct { updated bool } -func (q *Router) Events(k input.Key) []input.Event { - return q.handlers.For(k) +func (q *Router) Next(k input.Key) (input.Event, bool) { + return q.handlers.Next(k) } func (q *Router) Frame(ops *ui.Ops) { @@ -125,10 +125,14 @@ func (h *handlerEvents) Updated() bool { return u } -func (h *handlerEvents) For(k input.Key) []input.Event { +func (h *handlerEvents) Next(k input.Key) (input.Event, bool) { events := h.handlers[k] - delete(h.handlers, k) - return events + if len(events) == 0 { + return nil, false + } + e := events[0] + h.handlers[k] = events[1:] + return e, true } func (h *handlerEvents) Clear() { diff --git a/ui/app/window.go b/ui/app/window.go index 115ca7f2..f15833d4 100644 --- a/ui/app/window.go +++ b/ui/app/window.go @@ -307,8 +307,8 @@ func (w *Window) run(opts *WindowOptions) { } } -func (q *Queue) Events(k input.Key) []input.Event { - return q.q.Events(k) +func (q *Queue) Next(k input.Key) (input.Event, bool) { + return q.q.Next(k) } func (_ driverEvent) ImplementsEvent() {} diff --git a/ui/gesture/gestures.go b/ui/gesture/gestures.go index 19587429..627d8fd0 100644 --- a/ui/gesture/gestures.go +++ b/ui/gesture/gestures.go @@ -83,7 +83,7 @@ func (c *Click) Add(ops *ui.Ops) { func (c *Click) Events(q input.Queue) []ClickEvent { var events []ClickEvent - for _, evt := range q.Events(c) { + for evt, ok := q.Next(c); ok; evt, ok = q.Next(c) { e, ok := evt.(pointer.Event) if !ok { continue @@ -136,7 +136,7 @@ func (s *Scroll) Scroll(cfg ui.Config, q input.Queue, axis Axis) int { return 0 } total := 0 - for _, evt := range q.Events(s) { + for evt, ok := q.Next(s); ok; evt, ok = q.Next(s) { e, ok := evt.(pointer.Event) if !ok { continue diff --git a/ui/input/input.go b/ui/input/input.go index d1bd6b3f..b4db4302 100644 --- a/ui/input/input.go +++ b/ui/input/input.go @@ -7,7 +7,7 @@ package input // Queue maps an event handler key to the events // available to the handler. type Queue interface { - Events(k Key) []Event + Next(k Key) (Event, bool) } // Key is the stable identifier for an event handler. diff --git a/ui/text/editor.go b/ui/text/editor.go index 327abfb7..aadb1e8a 100644 --- a/ui/text/editor.go +++ b/ui/text/editor.go @@ -113,7 +113,7 @@ func (e *Editor) Next(cfg ui.Config, queue input.Queue) (EditorEvent, bool) { if (sdist > 0 && soff >= smax) || (sdist < 0 && soff <= smin) { e.scroller.Stop() } - for _, ke := range queue.Events(e) { + for ke, ok := queue.Next(e); ok; ke, ok = queue.Next(e) { e.blinkStart = cfg.Now() switch ke := ke.(type) { case key.FocusEvent: