mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-03 00:16:15 +00:00
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 1735d5ced8.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -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() {
|
||||
|
||||
+2
-2
@@ -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() {}
|
||||
|
||||
@@ -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
|
||||
|
||||
+1
-1
@@ -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.
|
||||
|
||||
+1
-1
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user