Commit Graph

57 Commits

Author SHA1 Message Date
Daniel Martí 2542c55e9d all: fix some issues spotted by static analysis
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>
2019-08-25 22:41:05 +01:00
Elias Naur 6a7e38eb32 ui/app: go fmt
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-08-21 14:59:35 +02:00
Elias Naur bff8b64e5a ui/app: replace WindowOptions with WindowOption
Thanks to Larry Clapp for noticing the opportunity for improvement.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-08-21 10:31:16 +02:00
Elias Naur 7bc18c0139 ui/app: more documentation
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-08-09 22:27:33 +02:00
Elias Naur 657c40e4bb ui/app: support 0 for window width and height
The zero value means that the client don't care and a sensible
default is chosen.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-08-09 22:01:25 +02:00
Elias Naur 87f8fd4152 ui/app: update documentation
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-08-09 21:17:33 +02:00
Elias Naur 4e005f2bfa ui/app: rename DrawEvent to UpdateEvent and Window.Draw to Window.Update
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>
2019-08-07 20:35:37 +02:00
Elias Naur 73b1e64209 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>
2019-08-01 18:56:49 +02:00
Elias Naur cb312c8d32 ui/app: drop Event
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>
2019-08-01 15:27:14 +02:00
Elias Naur a0d1d93ccf ui/app: (linux) don't deadlock when failing to create window
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-25 17:27:10 -07:00
Elias Naur 1ee8c08f3b ui/app: make the default window title "Gio", not "Gio program"
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-21 22:02:30 +02:00
Elias Naur dd081c78b9 ui/app: make DrawEvent optional
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>
2019-07-21 21:58:54 +02:00
Elias Naur cb59594b5b Revert "ui/app: make window event queue buffered"
Breaks the ack mechanism of sending a dummy ack event to ensure
the previous event has been processed.

This reverts commit 7582b835bc.
2019-07-21 15:36:02 +02:00
Elias Naur 9e0e4af8c6 ui/app,ui/key: move TextInputState from key to internal package
Clients have no need for the TextInputState type.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-21 13:12:24 +02:00
Elias Naur b46bad09bd ui/app: remove redundant redraw check
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>
2019-07-21 12:53:28 +02:00
Elias Naur 7582b835bc ui/app: make window event queue buffered
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>
2019-07-21 12:43:42 +02:00
Elias Naur 0b6e6c58dd ui/app: return a concrete Queue from Window.Queue
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-20 14:20:59 +02:00
Elias Naur d9d8df989d ui/app: rename Window.Redraw to Invalidate to match ui.InvalidateOp
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-18 18:45:46 +02:00
Elias Naur 09b5752659 ui/app: use the delayed redraw timer directly in the Window run loop
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-14 21:58:44 +02:00
Elias Naur 07622a295c ui/app: replace locking with channels in Window implementation
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-14 21:58:43 +02:00
Elias Naur 587b88d346 ui/app: don't draw or handle events if window is dead
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-14 19:33:31 +02:00
Elias Naur 6e97d65af1 ui/app: delete Window.Size method
Clients should use the size from DrawEvent instead.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-14 13:08:34 +02:00
Elias Naur 4cde5d57d7 ui/app: remove two redundant assignments
StagePaused is the zero value now that StateDead is gone.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-13 13:14:30 +02:00
Elias Naur 59e92e8233 ui/app: introduce DestroyEvent for ending the event loop
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>
2019-07-13 13:09:51 +02:00
Elias Naur a3b9c7818f ui/app: create windows directly
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>
2019-07-12 20:47:29 +02:00
Elias Naur 2296393471 ui/system: move package ui/input/system
Just like the pointer and key packages.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-12 15:54:41 +02:00
Elias Naur 86533ae683 ui/input/system: introduce package for system events
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>
2019-07-12 15:31:29 +02:00
Elias Naur 032e9a380e ui/app,ui/internal/input: move InvalidateOp summary to Router
In preparation for extracting more op types in Router.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-12 15:11:20 +02:00
Elias Naur 25a20af284 ui/app: only schedule a redraw when events are available
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-12 14:37:30 +02:00
Elias Naur 326f78c341 ui/app: don't implicitly redraw for each CommandEvent
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>
2019-07-12 14:05:18 +02:00
Elias Naur 46850653ef ui/app: unexport Window.SetTextInput
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-12 13:58:27 +02:00
Elias Naur cbdda4e9c5 ui/input: move Router and input queues to internal package
Now that only app.Window needs the Router, make it unavailable for
clients.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-12 13:51:00 +02:00
Elias Naur 0d924a1950 ui/app: add input queue to Window
I see no point in forcing the client to manage input events. Let's
put it on Window for now.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-12 13:39:56 +02:00
Elias Naur b8eca39277 ui/app: comment fix
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-12 13:32:16 +02:00
Elias Naur 3a6fda129a ui: shorten OpReader.Decode for loops
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-12 11:44:50 +02:00
Elias Naur b494b3c8c0 ui/app: remove IsAlive
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>
2019-07-08 15:46:48 +02:00
Elias Naur 31418eefbe ui/key: rename TextInputClosed to TextInputClose
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-07-07 15:52:09 +02:00
Elias Naur 30a558d10d ui/app: fix race condition between Window.Redraw and Draw
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>
2019-07-04 16:31:48 +02:00
Elias Naur 0b6dd4efd9 ui: change events to have "Event" suffixed, not prefixed
Match the Go error naming convention (FooError).

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-06-21 17:14:16 +02:00
Elias Naur 7aa7bb3be4 ui: rename ops to have Op suffixed, not prefixed
Match Go's FooError name pattern.

While we're here, rename RedrawOp to InvalidateOp.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-06-21 17:01:45 +02:00
Elias Naur a35118d522 ui: add package input for merged input
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>
2019-06-08 10:58:57 +02:00
Elias Naur 1e38eec0ab ui: build paths as ops
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>
2019-06-02 22:18:04 +02:00
Elias Naur 0d2cffe196 ui: let OpsReader keep track of references
Instead of exposing the entire reference slice, return the relevant
references from Next.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-06-02 19:17:53 +02:00
Elias Naur 5966aab77e ui: move ops reader to ui package
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>
2019-06-02 19:17:53 +02:00
Elias Naur bc481ea784 ui/app: serialize event handling
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>
2019-05-21 15:56:56 +02:00
Elias Naur a6fc2b6d45 ui/app: round total and cpu times
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-05-13 21:41:28 +02:00
Elias Naur 07a5a6547e ui/app: add CPU draw timings
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-05-12 17:51:15 +02:00
Elias Naur e2a1f07b84 ui/app: rename StageVisible and StageInvisible
StageRunning and StagePaused better reflect their use.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-05-12 14:59:07 +02:00
Elias Naur 4441a3e13e Revert "ui/app,apps: unexport ChangeStage and Stage"
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.
2019-05-12 14:47:38 +02:00
Elias Naur f9840b0963 ui/app,apps: unexport ChangeStage and Stage
I'm not convinced the API is right. For exmaple, an event that
notifies a program when to save its state is both smaller and
might be sufficient.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-05-11 13:50:18 +02:00