From 1735d5ced8937ff6f853aa8b01fed3140738c744 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 11 Jul 2019 23:39:25 +0200 Subject: [PATCH] ui/input: change Events to return all events at once Single stepping events only makes sense for widgets with complex state, e.g. the text.Editor. For the input.Events source, returning all events in a single Events call is sufficient and more natural for clients. Signed-off-by: Elias Naur --- ui/gesture/gestures.go | 12 ++---------- ui/input/input.go | 2 +- ui/input/queue.go | 10 +++------- ui/text/editor.go | 6 +----- 4 files changed, 7 insertions(+), 23 deletions(-) diff --git a/ui/gesture/gestures.go b/ui/gesture/gestures.go index eb68981e..40cb0eb7 100644 --- a/ui/gesture/gestures.go +++ b/ui/gesture/gestures.go @@ -82,11 +82,7 @@ func (c *Click) Add(ops *ui.Ops) { } func (c *Click) Next(q input.Events) (ClickEvent, bool) { - for { - evt, ok := q.Next(c) - if !ok { - break - } + for _, evt := range q.Events(c) { e, ok := evt.(pointer.Event) if !ok { continue @@ -139,11 +135,7 @@ func (s *Scroll) Scroll(cfg ui.Config, q input.Events, axis Axis) int { return 0 } total := 0 - for { - evt, ok := q.Next(s) - if !ok { - break - } + for _, evt := range q.Events(s) { e, ok := evt.(pointer.Event) if !ok { continue diff --git a/ui/input/input.go b/ui/input/input.go index 80db1d15..2478131d 100644 --- a/ui/input/input.go +++ b/ui/input/input.go @@ -7,7 +7,7 @@ package input // Events maps an event handler key to the events // available to the handler. type Events interface { - Next(k Key) (Event, bool) + Events(k Key) []Event } // Key is the stable identifier for an event handler. For a handler h, the diff --git a/ui/input/queue.go b/ui/input/queue.go index 07629966..568d0c6f 100644 --- a/ui/input/queue.go +++ b/ui/input/queue.go @@ -19,14 +19,10 @@ type Queue struct { type handlerEvents map[Key][]Event -func (q *Queue) Next(k Key) (Event, bool) { +func (q *Queue) Events(k Key) []Event { events := q.handlers[k] - if len(events) == 0 { - return nil, false - } - e := events[0] - q.handlers[k] = events[1:] - return e, true + delete(q.handlers, k) + return events } func (q *Queue) Frame(ops *ui.Ops) { diff --git a/ui/text/editor.go b/ui/text/editor.go index 0e21791e..21906092 100644 --- a/ui/text/editor.go +++ b/ui/text/editor.go @@ -119,11 +119,7 @@ func (e *Editor) Next() (EditorEvent, bool) { if (sdist > 0 && soff >= smax) || (sdist < 0 && soff <= smin) { e.scroller.Stop() } - for { - ke, ok := e.Inputs.Next(e) - if !ok { - break - } + for _, ke := range e.Inputs.Events(e) { e.blinkStart = e.Config.Now() switch ke := ke.(type) { case key.FocusEvent: