Invalidate is intended to be called as a result of external events,
which might very well be from a different goroutine than the one
driving the window.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
First, vet was upset by two incorrect fmt verbs. One was an extra %x,
when there was just one argument, so remove it. Another was a %p with a
non-pointer. It's a struct, so for now simply use %#v.
Second, staticcheck found some unused or unnecessary bits of code;
remove the obvious ones.
Finally, staticcheck also complained about some error strings which were
capitalized or had periods. Adjust those, which also makes all error
messages more consistent.
Signed-off-by: Daniel Martí <mvdan@mvdan.cc>
Window.Draw is not the right name for a method that does more than
just drawing. Rename to Update instead, and rename the DrawEvent
accordingly for symmetry.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
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>
input.Event is enough if we stretch "input" to mean both input
devices and other events such as profiling events and system
commands.
The pointer and key packages are separate already, so I don't
expanding the meaning is unreasonable.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
It is never a good idea not to draw in response to a DrawEvent, but
let's not hang the program if it doesn't call Window.Draw.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Now that the input router triggers a redraw when a focus event is
added, it is no longer necessary to check for that condition in
Window.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Input events are asynchronous, so add buffered to the event queue
so that a slow client does not stall the native window.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Replace the StageDead stage with DestroyEvent dedicated to ending
the event loop and, for premature window closes, the error.
Drop the error return from NewWindow; any errors in window creation
will appear as an immediate DestroyEvent with its Err field set.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Replace CreateWindow with NewWindow that immediately creates a Window
ready to use.
Drop the Windows channel of windows created by the system. For iOS
and Android where the system creates the windows, let them rendezvous
with the window created in the first NewWindow call.
Android is further changed so that destroying and re-creating the
Java Activity simply reconnects with the original Window.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
And add ProfileOp and ProfileEvent for registering and receiving
profile data.
Remove the Profiling field and Timings method from app.Window.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Redrawing should only be scheduled when some UI state has changed.
Window has no way to know whether a CommandEvent was ignored by
the client, so push the onus to the client to schedule a redraw.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
IsAlive races with the StageDead event: if the client checks IsAlive
after the stage is updated to StageDead but before having received
the StageDead it will exit the event loop, blocking the StageDead
to ever arrive.
Remove IsAlive and let the client rely only on the StageDead to exit
its event loop.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
A Window.Redraw called after the client has completed building a
frame and before Window.Draw resets the redraw flag is effectively
ignored. Move the flag reset earlier to just before the client is
asked to build the frame, to ensure that no state updates are lost.
Tighten and simplify the locking while we're here.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
To avoid passing a queue type for each kind of input (pointer, key),
introduce package input for mapping a handler key to all input events.
Future input sources can be added without changes to programs, and
as an added bonus, event ordering is preserved across input sources.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Instead of allocating and constructing a clip path, store path data
directly in op lists. Use separate op lists for cached text layout
paths.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
To prepare support for cached OpBlock to refer to other Ops lists.
The exposure of OpsReader is alleviated by the removal of the Refs
and Data accessors for Ops.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
The frame callback for macOS comes in from a different thread than
the UI thread. Serialize event handling to maintain the invariant
that only one event is processed at a time.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
I found a convincing use case: stopping asynchronous activities
while paused. A follow up change will rename the stages and add
an example.
This reverts commit f9840b0963.