From 73b1e642098cc91ee9c8028365c1990982b6fe78 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 1 Aug 2019 18:56:49 +0200 Subject: [PATCH] ui/input: change Queue to return Events one at a time By returning all events, widgets that might return early from its event loop might throw away subsequent events. Instead of requiring those widgets to store the event list, convert input.Queue to step through the available events one at a time. Functional revert of 1735d5ced8937ff6f853aa8b01fed3140738c744. Signed-off-by: Elias Naur --- ui/app/internal/input/router.go | 14 +++++++++----- ui/app/window.go | 4 ++-- ui/gesture/gestures.go | 4 ++-- ui/input/input.go | 2 +- ui/text/editor.go | 2 +- 5 files changed, 15 insertions(+), 11 deletions(-) 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: