router.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881
  1. // SPDX-License-Identifier: Unlicense OR MIT
  2. package input
  3. import (
  4. "image"
  5. "io"
  6. "strings"
  7. "time"
  8. "gioui.org/f32"
  9. f32internal "gioui.org/internal/f32"
  10. "gioui.org/internal/ops"
  11. "gioui.org/io/clipboard"
  12. "gioui.org/io/event"
  13. "gioui.org/io/key"
  14. "gioui.org/io/pointer"
  15. "gioui.org/io/semantic"
  16. "gioui.org/io/system"
  17. "gioui.org/io/transfer"
  18. "gioui.org/op"
  19. )
  20. // Router tracks the [io/event.Tag] identifiers of user interface widgets
  21. // and routes events to them. [Source] is its interface exposed to widgets.
  22. type Router struct {
  23. savedTrans []f32.Affine2D
  24. transStack []f32.Affine2D
  25. handlers map[event.Tag]*handler
  26. pointer struct {
  27. queue pointerQueue
  28. collector pointerCollector
  29. }
  30. key struct {
  31. queue keyQueue
  32. // The following fields have the same purpose as the fields in
  33. // type handler, but for key.Events.
  34. filter keyFilter
  35. nextFilter keyFilter
  36. scratchFilter keyFilter
  37. }
  38. cqueue clipboardQueue
  39. // states is the list of pending state changes resulting from
  40. // incoming events. The first element, if present, contains the state
  41. // and events for the current frame.
  42. changes []stateChange
  43. reader ops.Reader
  44. // InvalidateCmd summary.
  45. wakeup bool
  46. wakeupTime time.Time
  47. // Changes queued for next call to Frame.
  48. commands []Command
  49. // transfers is the pending transfer.DataEvent.Open functions.
  50. transfers []io.ReadCloser
  51. // deferring is set if command execution and event delivery is deferred
  52. // to the next frame.
  53. deferring bool
  54. // scratchFilters is for garbage-free construction of ephemeral filters.
  55. scratchFilters []taggedFilter
  56. }
  57. // Source implements the interface between a Router and user interface widgets.
  58. // The zero-value Source is disabled.
  59. type Source struct {
  60. r *Router
  61. }
  62. // Command represents a request such as moving the focus, or initiating a clipboard read.
  63. // Commands are queued by calling [Source.Queue].
  64. type Command interface {
  65. ImplementsCommand()
  66. }
  67. // SemanticNode represents a node in the tree describing the components
  68. // contained in a frame.
  69. type SemanticNode struct {
  70. ID SemanticID
  71. ParentID SemanticID
  72. Children []SemanticNode
  73. Desc SemanticDesc
  74. areaIdx int
  75. }
  76. // SemanticDesc provides a semantic description of a UI component.
  77. type SemanticDesc struct {
  78. Class semantic.ClassOp
  79. Description string
  80. Label string
  81. Selected bool
  82. Disabled bool
  83. Gestures SemanticGestures
  84. Bounds image.Rectangle
  85. }
  86. // SemanticGestures is a bit-set of supported gestures.
  87. type SemanticGestures int
  88. const (
  89. ClickGesture SemanticGestures = 1 << iota
  90. ScrollGesture
  91. )
  92. // SemanticID uniquely identifies a SemanticDescription.
  93. //
  94. // By convention, the zero value denotes the non-existent ID.
  95. type SemanticID uint
  96. // SystemEvent is a marker for events that have platform specific
  97. // side-effects. SystemEvents are never matched by catch-all filters.
  98. type SystemEvent struct {
  99. Event event.Event
  100. }
  101. // handler contains the per-handler state tracked by a [Router].
  102. type handler struct {
  103. // active tracks whether the handler was active in the current
  104. // frame. Router deletes state belonging to inactive handlers during Frame.
  105. active bool
  106. pointer pointerHandler
  107. key keyHandler
  108. // filter the handler has asked for through event handling
  109. // in the previous frame. It is used for routing events in the
  110. // current frame.
  111. filter filter
  112. // prevFilter is the filter being built in the current frame.
  113. nextFilter filter
  114. // processedFilter is the filters that have exhausted available events.
  115. processedFilter filter
  116. }
  117. // filter is the union of a set of [io/event.Filters].
  118. type filter struct {
  119. pointer pointerFilter
  120. focusable bool
  121. }
  122. // taggedFilter is a filter for a particular tag.
  123. type taggedFilter struct {
  124. tag event.Tag
  125. filter filter
  126. }
  127. // stateChange represents the new state and outgoing events
  128. // resulting from an incoming event.
  129. type stateChange struct {
  130. // event, if set, is the trigger for the change.
  131. event event.Event
  132. state inputState
  133. events []taggedEvent
  134. }
  135. // inputState represent a immutable snapshot of the state required
  136. // to route events.
  137. type inputState struct {
  138. clipboardState
  139. keyState
  140. pointerState
  141. }
  142. // taggedEvent represents an event and its target handler.
  143. type taggedEvent struct {
  144. event event.Event
  145. tag event.Tag
  146. }
  147. // Source returns a Source backed by this Router.
  148. func (q *Router) Source() Source {
  149. return Source{r: q}
  150. }
  151. // Execute a command.
  152. func (s Source) Execute(c Command) {
  153. if !s.enabled() {
  154. return
  155. }
  156. s.r.execute(c)
  157. }
  158. // enabled reports whether the source is enabled. Only enabled
  159. // Sources deliver events and respond to commands.
  160. func (s Source) enabled() bool {
  161. return s.r != nil
  162. }
  163. // Focused reports whether tag is focused, according to the most recent
  164. // [key.FocusEvent] delivered.
  165. func (s Source) Focused(tag event.Tag) bool {
  166. if !s.enabled() {
  167. return false
  168. }
  169. return s.r.state().keyState.focus == tag
  170. }
  171. // Event returns the next event that matches at least one of filters.
  172. func (s Source) Event(filters ...event.Filter) (event.Event, bool) {
  173. if !s.enabled() {
  174. return nil, false
  175. }
  176. return s.r.Event(filters...)
  177. }
  178. func (q *Router) Event(filters ...event.Filter) (event.Event, bool) {
  179. // Merge filters into scratch filters.
  180. q.scratchFilters = q.scratchFilters[:0]
  181. q.key.scratchFilter = q.key.scratchFilter[:0]
  182. for _, f := range filters {
  183. var t event.Tag
  184. switch f := f.(type) {
  185. case key.Filter:
  186. q.key.scratchFilter = append(q.key.scratchFilter, f)
  187. continue
  188. case transfer.SourceFilter:
  189. t = f.Target
  190. case transfer.TargetFilter:
  191. t = f.Target
  192. case key.FocusFilter:
  193. t = f.Target
  194. case pointer.Filter:
  195. t = f.Target
  196. }
  197. if t == nil {
  198. continue
  199. }
  200. var filter *filter
  201. for i := range q.scratchFilters {
  202. s := &q.scratchFilters[i]
  203. if s.tag == t {
  204. filter = &s.filter
  205. break
  206. }
  207. }
  208. if filter == nil {
  209. n := len(q.scratchFilters)
  210. if n < cap(q.scratchFilters) {
  211. // Re-use previously allocated filter.
  212. q.scratchFilters = q.scratchFilters[:n+1]
  213. tf := &q.scratchFilters[n]
  214. tf.tag = t
  215. filter = &tf.filter
  216. filter.Reset()
  217. } else {
  218. q.scratchFilters = append(q.scratchFilters, taggedFilter{tag: t})
  219. filter = &q.scratchFilters[n].filter
  220. }
  221. }
  222. filter.Add(f)
  223. }
  224. for _, tf := range q.scratchFilters {
  225. h := q.stateFor(tf.tag)
  226. h.filter.Merge(tf.filter)
  227. h.nextFilter.Merge(tf.filter)
  228. }
  229. q.key.filter = append(q.key.filter, q.key.scratchFilter...)
  230. q.key.nextFilter = append(q.key.nextFilter, q.key.scratchFilter...)
  231. // Deliver reset event, if any.
  232. for _, f := range filters {
  233. switch f := f.(type) {
  234. case key.FocusFilter:
  235. if f.Target == nil {
  236. break
  237. }
  238. h := q.stateFor(f.Target)
  239. if reset, ok := h.key.ResetEvent(); ok {
  240. return reset, true
  241. }
  242. case pointer.Filter:
  243. if f.Target == nil {
  244. break
  245. }
  246. h := q.stateFor(f.Target)
  247. if reset, ok := h.pointer.ResetEvent(); ok && h.filter.pointer.Matches(reset) {
  248. return reset, true
  249. }
  250. }
  251. }
  252. for i := range q.changes {
  253. if q.deferring && i > 0 {
  254. break
  255. }
  256. change := &q.changes[i]
  257. for j, evt := range change.events {
  258. match := false
  259. switch e := evt.event.(type) {
  260. case key.Event:
  261. match = q.key.scratchFilter.Matches(change.state.keyState.focus, e, false)
  262. default:
  263. for _, tf := range q.scratchFilters {
  264. if evt.tag == tf.tag && tf.filter.Matches(evt.event) {
  265. match = true
  266. break
  267. }
  268. }
  269. }
  270. if match {
  271. change.events = append(change.events[:j], change.events[j+1:]...)
  272. // Fast forward state to last matched.
  273. q.collapseState(i)
  274. return evt.event, true
  275. }
  276. }
  277. }
  278. for _, tf := range q.scratchFilters {
  279. h := q.stateFor(tf.tag)
  280. h.processedFilter.Merge(tf.filter)
  281. }
  282. return nil, false
  283. }
  284. // collapseState in the interval [1;idx] into q.changes[0].
  285. func (q *Router) collapseState(idx int) {
  286. if idx == 0 {
  287. return
  288. }
  289. first := &q.changes[0]
  290. first.state = q.changes[idx].state
  291. for _, ch := range q.changes[1 : idx+1] {
  292. first.events = append(first.events, ch.events...)
  293. }
  294. q.changes = append(q.changes[:1], q.changes[idx+1:]...)
  295. }
  296. // Frame completes the current frame and starts a new with the
  297. // handlers from the frame argument. Remaining events are discarded,
  298. // unless they were deferred by a command.
  299. func (q *Router) Frame(frame *op.Ops) {
  300. var remaining []event.Event
  301. if n := len(q.changes); n > 0 {
  302. if q.deferring {
  303. // Collect events for replay.
  304. for _, ch := range q.changes[1:] {
  305. remaining = append(remaining, ch.event)
  306. }
  307. q.changes = append(q.changes[:0], stateChange{state: q.changes[0].state})
  308. } else {
  309. // Collapse state.
  310. state := q.changes[n-1].state
  311. q.changes = append(q.changes[:0], stateChange{state: state})
  312. }
  313. }
  314. for _, rc := range q.transfers {
  315. if rc != nil {
  316. rc.Close()
  317. }
  318. }
  319. q.transfers = nil
  320. q.deferring = false
  321. for _, h := range q.handlers {
  322. h.filter, h.nextFilter = h.nextFilter, h.filter
  323. h.nextFilter.Reset()
  324. h.processedFilter.Reset()
  325. h.pointer.Reset()
  326. h.key.Reset()
  327. }
  328. q.key.filter, q.key.nextFilter = q.key.nextFilter, q.key.filter
  329. q.key.nextFilter = q.key.nextFilter[:0]
  330. var ops *ops.Ops
  331. if frame != nil {
  332. ops = &frame.Internal
  333. }
  334. q.reader.Reset(ops)
  335. q.collect()
  336. for k, h := range q.handlers {
  337. if !h.active {
  338. delete(q.handlers, k)
  339. } else {
  340. h.active = false
  341. }
  342. }
  343. q.executeCommands()
  344. q.Queue(remaining...)
  345. st := q.lastState()
  346. pst, evts := q.pointer.queue.Frame(q.handlers, st.pointerState)
  347. st.pointerState = pst
  348. st.keyState = q.key.queue.Frame(q.handlers, q.lastState().keyState)
  349. q.changeState(nil, st, evts)
  350. // Collapse state and events.
  351. q.collapseState(len(q.changes) - 1)
  352. }
  353. // Queue events to be routed.
  354. func (q *Router) Queue(events ...event.Event) {
  355. for _, e := range events {
  356. se, system := e.(SystemEvent)
  357. if system {
  358. e = se.Event
  359. }
  360. q.processEvent(e, system)
  361. }
  362. }
  363. func (f *filter) Add(flt event.Filter) {
  364. switch flt := flt.(type) {
  365. case key.FocusFilter:
  366. f.focusable = true
  367. case pointer.Filter:
  368. f.pointer.Add(flt)
  369. case transfer.SourceFilter, transfer.TargetFilter:
  370. f.pointer.Add(flt)
  371. }
  372. }
  373. // Merge f2 into f.
  374. func (f *filter) Merge(f2 filter) {
  375. f.focusable = f.focusable || f2.focusable
  376. f.pointer.Merge(f2.pointer)
  377. }
  378. func (f *filter) Matches(e event.Event) bool {
  379. switch e.(type) {
  380. case key.FocusEvent, key.SnippetEvent, key.EditEvent, key.SelectionEvent:
  381. return f.focusable
  382. default:
  383. return f.pointer.Matches(e)
  384. }
  385. }
  386. func (f *filter) Reset() {
  387. *f = filter{
  388. pointer: pointerFilter{
  389. sourceMimes: f.pointer.sourceMimes[:0],
  390. targetMimes: f.pointer.targetMimes[:0],
  391. },
  392. }
  393. }
  394. func (q *Router) processEvent(e event.Event, system bool) {
  395. state := q.lastState()
  396. switch e := e.(type) {
  397. case pointer.Event:
  398. pstate, evts := q.pointer.queue.Push(q.handlers, state.pointerState, e)
  399. state.pointerState = pstate
  400. q.changeState(e, state, evts)
  401. case key.Event:
  402. var evts []taggedEvent
  403. if q.key.filter.Matches(state.keyState.focus, e, system) {
  404. evts = append(evts, taggedEvent{event: e})
  405. }
  406. q.changeState(e, state, evts)
  407. case key.SnippetEvent:
  408. // Expand existing, overlapping snippet.
  409. if r := state.content.Snippet.Range; rangeOverlaps(r, key.Range(e)) {
  410. if e.Start > r.Start {
  411. e.Start = r.Start
  412. }
  413. if e.End < r.End {
  414. e.End = r.End
  415. }
  416. }
  417. var evts []taggedEvent
  418. if f := state.focus; f != nil {
  419. evts = append(evts, taggedEvent{tag: f, event: e})
  420. }
  421. q.changeState(e, state, evts)
  422. case key.EditEvent, key.FocusEvent, key.SelectionEvent:
  423. var evts []taggedEvent
  424. if f := state.focus; f != nil {
  425. evts = append(evts, taggedEvent{tag: f, event: e})
  426. }
  427. q.changeState(e, state, evts)
  428. case transfer.DataEvent:
  429. cstate, evts := q.cqueue.Push(state.clipboardState, e)
  430. state.clipboardState = cstate
  431. q.changeState(e, state, evts)
  432. default:
  433. panic("unknown event type")
  434. }
  435. }
  436. func (q *Router) execute(c Command) {
  437. // The command can be executed immediately if event delivery is not frozen, and
  438. // no event receiver has completed their event handling.
  439. if !q.deferring {
  440. ch := q.executeCommand(c)
  441. immediate := true
  442. for _, e := range ch.events {
  443. h, ok := q.handlers[e.tag]
  444. immediate = immediate && (!ok || !h.processedFilter.Matches(e.event))
  445. }
  446. if immediate {
  447. // Hold on to the remaining events for state replay.
  448. var evts []event.Event
  449. for _, ch := range q.changes {
  450. if ch.event != nil {
  451. evts = append(evts, ch.event)
  452. }
  453. }
  454. if len(q.changes) > 1 {
  455. q.changes = q.changes[:1]
  456. }
  457. q.changeState(nil, ch.state, ch.events)
  458. q.Queue(evts...)
  459. return
  460. }
  461. }
  462. q.deferring = true
  463. q.commands = append(q.commands, c)
  464. }
  465. func (q *Router) state() inputState {
  466. if len(q.changes) > 0 {
  467. return q.changes[0].state
  468. }
  469. return inputState{}
  470. }
  471. func (q *Router) lastState() inputState {
  472. if n := len(q.changes); n > 0 {
  473. return q.changes[n-1].state
  474. }
  475. return inputState{}
  476. }
  477. func (q *Router) executeCommands() {
  478. for _, c := range q.commands {
  479. ch := q.executeCommand(c)
  480. q.changeState(nil, ch.state, ch.events)
  481. }
  482. q.commands = nil
  483. }
  484. // executeCommand the command and return the resulting state change along with the
  485. // tag the state change depended on, if any.
  486. func (q *Router) executeCommand(c Command) stateChange {
  487. state := q.state()
  488. var evts []taggedEvent
  489. switch req := c.(type) {
  490. case key.SelectionCmd:
  491. state.keyState = q.key.queue.setSelection(state.keyState, req)
  492. case key.FocusCmd:
  493. state.keyState, evts = q.key.queue.Focus(q.handlers, state.keyState, req.Tag)
  494. case key.SoftKeyboardCmd:
  495. state.keyState = state.keyState.softKeyboard(req.Show)
  496. case key.SnippetCmd:
  497. state.keyState = q.key.queue.setSnippet(state.keyState, req)
  498. case transfer.OfferCmd:
  499. state.pointerState, evts = q.pointer.queue.offerData(q.handlers, state.pointerState, req)
  500. case clipboard.WriteCmd:
  501. q.cqueue.ProcessWriteClipboard(req)
  502. case clipboard.ReadCmd:
  503. state.clipboardState = q.cqueue.ProcessReadClipboard(state.clipboardState, req.Tag)
  504. case pointer.GrabCmd:
  505. state.pointerState, evts = q.pointer.queue.grab(state.pointerState, req)
  506. case op.InvalidateCmd:
  507. if !q.wakeup || req.At.Before(q.wakeupTime) {
  508. q.wakeup = true
  509. q.wakeupTime = req.At
  510. }
  511. }
  512. return stateChange{state: state, events: evts}
  513. }
  514. func (q *Router) changeState(e event.Event, state inputState, evts []taggedEvent) {
  515. // Wrap pointer.DataEvent.Open functions to detect them not being called.
  516. for i := range evts {
  517. e := &evts[i]
  518. if de, ok := e.event.(transfer.DataEvent); ok {
  519. transferIdx := len(q.transfers)
  520. data := de.Open()
  521. q.transfers = append(q.transfers, data)
  522. de.Open = func() io.ReadCloser {
  523. q.transfers[transferIdx] = nil
  524. return data
  525. }
  526. e.event = de
  527. }
  528. }
  529. // Initialize the first change to contain the current state
  530. // and events that are bound for the current frame.
  531. if len(q.changes) == 0 {
  532. q.changes = append(q.changes, stateChange{})
  533. }
  534. if e != nil && len(evts) > 0 {
  535. // An event triggered events bound for user receivers. Add a state change to be
  536. // able to redo the change in case of a command execution.
  537. q.changes = append(q.changes, stateChange{event: e, state: state, events: evts})
  538. } else {
  539. // Otherwise, merge with previous change.
  540. prev := &q.changes[len(q.changes)-1]
  541. prev.state = state
  542. prev.events = append(prev.events, evts...)
  543. }
  544. }
  545. func rangeOverlaps(r1, r2 key.Range) bool {
  546. r1 = rangeNorm(r1)
  547. r2 = rangeNorm(r2)
  548. return r1.Start <= r2.Start && r2.Start < r1.End ||
  549. r1.Start <= r2.End && r2.End < r1.End
  550. }
  551. func rangeNorm(r key.Range) key.Range {
  552. if r.End < r.Start {
  553. r.End, r.Start = r.Start, r.End
  554. }
  555. return r
  556. }
  557. func (q *Router) MoveFocus(dir key.FocusDirection) {
  558. state := q.lastState()
  559. kstate, evts := q.key.queue.MoveFocus(q.handlers, state.keyState, dir)
  560. state.keyState = kstate
  561. q.changeState(nil, state, evts)
  562. }
  563. // RevealFocus scrolls the current focus (if any) into viewport
  564. // if there are scrollable parent handlers.
  565. func (q *Router) RevealFocus(viewport image.Rectangle) {
  566. state := q.lastState()
  567. focus := state.focus
  568. if focus == nil {
  569. return
  570. }
  571. kh := &q.handlers[focus].key
  572. bounds := q.key.queue.BoundsFor(kh)
  573. area := q.key.queue.AreaFor(kh)
  574. viewport = q.pointer.queue.ClipFor(area, viewport)
  575. topleft := bounds.Min.Sub(viewport.Min)
  576. topleft = max(topleft, bounds.Max.Sub(viewport.Max))
  577. topleft = min(image.Pt(0, 0), topleft)
  578. bottomright := bounds.Max.Sub(viewport.Max)
  579. bottomright = min(bottomright, bounds.Min.Sub(viewport.Min))
  580. bottomright = max(image.Pt(0, 0), bottomright)
  581. s := topleft
  582. if s.X == 0 {
  583. s.X = bottomright.X
  584. }
  585. if s.Y == 0 {
  586. s.Y = bottomright.Y
  587. }
  588. q.ScrollFocus(s)
  589. }
  590. // ScrollFocus scrolls the focused widget, if any, by dist.
  591. func (q *Router) ScrollFocus(dist image.Point) {
  592. state := q.lastState()
  593. focus := state.focus
  594. if focus == nil {
  595. return
  596. }
  597. kh := &q.handlers[focus].key
  598. area := q.key.queue.AreaFor(kh)
  599. q.changeState(nil, q.lastState(), q.pointer.queue.Deliver(q.handlers, area, pointer.Event{
  600. Kind: pointer.Scroll,
  601. Source: pointer.Touch,
  602. Scroll: f32internal.FPt(dist),
  603. }))
  604. }
  605. func max(p1, p2 image.Point) image.Point {
  606. m := p1
  607. if p2.X > m.X {
  608. m.X = p2.X
  609. }
  610. if p2.Y > m.Y {
  611. m.Y = p2.Y
  612. }
  613. return m
  614. }
  615. func min(p1, p2 image.Point) image.Point {
  616. m := p1
  617. if p2.X < m.X {
  618. m.X = p2.X
  619. }
  620. if p2.Y < m.Y {
  621. m.Y = p2.Y
  622. }
  623. return m
  624. }
  625. func (q *Router) ActionAt(p f32.Point) (system.Action, bool) {
  626. return q.pointer.queue.ActionAt(p)
  627. }
  628. func (q *Router) ClickFocus() {
  629. focus := q.lastState().focus
  630. if focus == nil {
  631. return
  632. }
  633. kh := &q.handlers[focus].key
  634. bounds := q.key.queue.BoundsFor(kh)
  635. center := bounds.Max.Add(bounds.Min).Div(2)
  636. e := pointer.Event{
  637. Position: f32.Pt(float32(center.X), float32(center.Y)),
  638. Source: pointer.Touch,
  639. }
  640. area := q.key.queue.AreaFor(kh)
  641. e.Kind = pointer.Press
  642. state := q.lastState()
  643. q.changeState(nil, state, q.pointer.queue.Deliver(q.handlers, area, e))
  644. e.Kind = pointer.Release
  645. q.changeState(nil, state, q.pointer.queue.Deliver(q.handlers, area, e))
  646. }
  647. // TextInputState returns the input state from the most recent
  648. // call to Frame.
  649. func (q *Router) TextInputState() TextInputState {
  650. state := q.state()
  651. kstate, s := state.InputState()
  652. state.keyState = kstate
  653. q.changeState(nil, state, nil)
  654. return s
  655. }
  656. // TextInputHint returns the input mode from the most recent key.InputOp.
  657. func (q *Router) TextInputHint() (key.InputHint, bool) {
  658. return q.key.queue.InputHint(q.handlers, q.state().keyState)
  659. }
  660. // WriteClipboard returns the most recent content to be copied
  661. // to the clipboard, if any.
  662. func (q *Router) WriteClipboard() (mime string, content []byte, ok bool) {
  663. return q.cqueue.WriteClipboard()
  664. }
  665. // ClipboardRequested reports if any new handler is waiting
  666. // to read the clipboard.
  667. func (q *Router) ClipboardRequested() bool {
  668. return q.cqueue.ClipboardRequested(q.lastState().clipboardState)
  669. }
  670. // Cursor returns the last cursor set.
  671. func (q *Router) Cursor() pointer.Cursor {
  672. return q.state().cursor
  673. }
  674. // SemanticAt returns the first semantic description under pos, if any.
  675. func (q *Router) SemanticAt(pos f32.Point) (SemanticID, bool) {
  676. return q.pointer.queue.SemanticAt(pos)
  677. }
  678. // AppendSemantics appends the semantic tree to nodes, and returns the result.
  679. // The root node is the first added.
  680. func (q *Router) AppendSemantics(nodes []SemanticNode) []SemanticNode {
  681. q.pointer.collector.q = &q.pointer.queue
  682. q.pointer.collector.ensureRoot()
  683. return q.pointer.queue.AppendSemantics(nodes)
  684. }
  685. // EditorState returns the editor state for the focused handler, or the
  686. // zero value if there is none.
  687. func (q *Router) EditorState() EditorState {
  688. return q.key.queue.editorState(q.handlers, q.state().keyState)
  689. }
  690. func (q *Router) stateFor(tag event.Tag) *handler {
  691. if tag == nil {
  692. panic("internal error: nil tag")
  693. }
  694. s, ok := q.handlers[tag]
  695. if !ok {
  696. s = new(handler)
  697. if q.handlers == nil {
  698. q.handlers = make(map[event.Tag]*handler)
  699. }
  700. q.handlers[tag] = s
  701. }
  702. s.active = true
  703. return s
  704. }
  705. func (q *Router) collect() {
  706. q.transStack = q.transStack[:0]
  707. pc := &q.pointer.collector
  708. pc.q = &q.pointer.queue
  709. pc.Reset()
  710. kq := &q.key.queue
  711. q.key.queue.Reset()
  712. var t f32.Affine2D
  713. for encOp, ok := q.reader.Decode(); ok; encOp, ok = q.reader.Decode() {
  714. switch ops.OpType(encOp.Data[0]) {
  715. case ops.TypeSave:
  716. id := ops.DecodeSave(encOp.Data)
  717. if extra := id - len(q.savedTrans) + 1; extra > 0 {
  718. q.savedTrans = append(q.savedTrans, make([]f32.Affine2D, extra)...)
  719. }
  720. q.savedTrans[id] = t
  721. case ops.TypeLoad:
  722. id := ops.DecodeLoad(encOp.Data)
  723. t = q.savedTrans[id]
  724. pc.resetState()
  725. pc.setTrans(t)
  726. case ops.TypeClip:
  727. var op ops.ClipOp
  728. op.Decode(encOp.Data)
  729. pc.clip(op)
  730. case ops.TypePopClip:
  731. pc.popArea()
  732. case ops.TypeTransform:
  733. t2, push := ops.DecodeTransform(encOp.Data)
  734. if push {
  735. q.transStack = append(q.transStack, t)
  736. }
  737. t = t.Mul(t2)
  738. pc.setTrans(t)
  739. case ops.TypePopTransform:
  740. n := len(q.transStack)
  741. t = q.transStack[n-1]
  742. q.transStack = q.transStack[:n-1]
  743. pc.setTrans(t)
  744. case ops.TypeInput:
  745. tag := encOp.Refs[0].(event.Tag)
  746. s := q.stateFor(tag)
  747. pc.inputOp(tag, &s.pointer)
  748. a := pc.currentArea()
  749. b := pc.currentAreaBounds()
  750. if s.filter.focusable {
  751. kq.inputOp(tag, &s.key, t, a, b)
  752. }
  753. // Pointer ops.
  754. case ops.TypePass:
  755. pc.pass()
  756. case ops.TypePopPass:
  757. pc.popPass()
  758. case ops.TypeCursor:
  759. name := pointer.Cursor(encOp.Data[1])
  760. pc.cursor(name)
  761. case ops.TypeActionInput:
  762. act := system.Action(encOp.Data[1])
  763. pc.actionInputOp(act)
  764. case ops.TypeKeyInputHint:
  765. op := key.InputHintOp{
  766. Tag: encOp.Refs[0].(event.Tag),
  767. Hint: key.InputHint(encOp.Data[1]),
  768. }
  769. s := q.stateFor(op.Tag)
  770. s.key.inputHint(op.Hint)
  771. // Semantic ops.
  772. case ops.TypeSemanticLabel:
  773. lbl := *encOp.Refs[0].(*string)
  774. pc.semanticLabel(lbl)
  775. case ops.TypeSemanticDesc:
  776. desc := *encOp.Refs[0].(*string)
  777. pc.semanticDesc(desc)
  778. case ops.TypeSemanticClass:
  779. class := semantic.ClassOp(encOp.Data[1])
  780. pc.semanticClass(class)
  781. case ops.TypeSemanticSelected:
  782. if encOp.Data[1] != 0 {
  783. pc.semanticSelected(true)
  784. } else {
  785. pc.semanticSelected(false)
  786. }
  787. case ops.TypeSemanticEnabled:
  788. if encOp.Data[1] != 0 {
  789. pc.semanticEnabled(true)
  790. } else {
  791. pc.semanticEnabled(false)
  792. }
  793. }
  794. }
  795. }
  796. // WakeupTime returns the most recent time for doing another frame,
  797. // as determined from the last call to Frame.
  798. func (q *Router) WakeupTime() (time.Time, bool) {
  799. t, w := q.wakeupTime, q.wakeup
  800. q.wakeup = false
  801. // Pending events always trigger wakeups.
  802. if len(q.changes) > 1 || len(q.changes) == 1 && len(q.changes[0].events) > 0 {
  803. t, w = time.Time{}, true
  804. }
  805. return t, w
  806. }
  807. func (s SemanticGestures) String() string {
  808. var gestures []string
  809. if s&ClickGesture != 0 {
  810. gestures = append(gestures, "Click")
  811. }
  812. return strings.Join(gestures, ",")
  813. }
  814. func (SystemEvent) ImplementsEvent() {}