Elias Naur bdd6b32711 ui/app/internal/input: schedule an extra frame after event delivery
A program might choose to process events that affect UI state already laid out.
For example, a button click might switch to a completely different UI page, but
the click might be processed during the drawing of the current page.

Avoiding that require either processing events very early during layout or
adding InvalidateOps whenever events are handled late.

Early event processing is awkward and InvalidateOps are easy to forget and
their absence masked by any other cause of redraw.

This change adds an implicit InvalidateOp for each frame where events have been
delivered to the program, allowing late event handling without use of
InvalidateOps.

In the worst case we waste a frame, increasing power use. I hope that future
optimizations will detect and discard the duplicate frame before it reaches
the GPU.

A similar situation applies to the delayed delivery of Editor events, but
since Editor.Layout flushes remaining events, extra InvalidateOps are not
required. Add a comment.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2019-09-26 18:58:25 +02:00
2019-09-26 18:43:21 +02:00
2019-03-31 10:47:22 +02:00
2019-03-31 10:47:22 +02:00

Gio

Gio implements portable immediate mode GUI programs in Go. Gio programs run on all the major platforms: iOS/tvOS, Android, Linux (Wayland), macOS, Windows and browsers (Webassembly/WebGL).

Gio includes an efficient vector renderer based on the Pathfinder project (https://github.com/pcwalton/pathfinder). Text and other shapes are rendered using only their outlines without baking them into texture images, to support efficient animations, transformed drawing and pixel resolution independence.

GoDoc

Installation

Gio is designed to work with very few dependencies. It depends only on the platform libraries for window management, input and GPU drawing.

Running Gio programs

With Go 1.13 or newer,

$ export GO111MODULE=on
$ go run gioui.org/apps/hello

should display a simple message in a window.

The command

$ go run gioui.org/apps/gophers

runs a simple (nonsense) demo that displays Go contributors fetched from GitHub.

If you run into quota issues, supply a Github token with the -token flag:

$ go run gioui.org/apps/gophers -token <github token>

Running on mobiles

For Android, iOS, tvOS the gogio tool can build and package a Gio program for you.

To build an Android .apk file from the gophers example:

$ go run gioui.org/cmd/gogio -target android gioui.org/apps/gophers

The apk can be installed to a running emulator or attached device with adb:

$ adb install gophers.apk

The gogio tool passes command line arguments to os.Args at runtime:

$ go run gioui.org/cmd/gogio -target android gioui.org/apps/gophers -token <github token>

The -appid flag specifies the iOS bundle id or Android package id. The flag is required for creating signed .ipa files for iOS and tvOS devices, because the bundle id must match an id previously provisioned in Xcode. For example,

$ go run gioui.org/cmd/gogio -target ios -appid <bundle-id> gioui.org/apps/gophers

Use the Window->Devices and Simulators option in Xcode to install the ipa file to the device. If you have ideviceinstaller installed, you can install the app from the command line:

$ ideviceinstaller -i gophers.ipa

If you just want to run a program on the iOS simulator, use the -o flag to specify a .app directory:

$ go run gioui.org/cmd/gogio -o gophers.app -target ios gioui.org/apps/gophers

Install the app to a running simulator with simctl:

$ xcrun simctl install booted gophers.app

Webassembly/WebGL

To run a Gio program in a compatible browser, the gogio tool can output a directory ready to serve. With the goxec tool you don't even need a web server:

$ go run gioui.org/cmd/gogio -target js gioui.org/apps/gophers
$ go get github.com/shurcooL/goexec
$ goexec 'http.ListenAndServe(":8080", http.FileServer(http.Dir("gophers")))'

Open http://localhost:8080 in a browser to run the program.

Integration with existing projects

See the integration guide for details on using Gio with existing projects.

Programs using Gio

  • Scatter, an implementation of the Signal protocol over email.

Resources

Issues

File bugs and TODOs through the issue tracker or send an email to ~eliasnaur/gio@todo.sr.ht. For general discussion, use the mailing list: ~eliasnaur/gio@lists.sr.ht.

Contributing

Post discussion and patches to the mailing list. No Sourcehut account is required and you can post without being subscribed.

See the contribution guide for more details.

License

Dual-licensed under UNLICENSE or the MIT.

Donations

Bitcoin donations are gladly accepted to bc1q8xw95urett00f4xs3v66p2l6xp2mfk5erpe5ug. Donations will go toward hosting expenses and for supporting the author's full time work on Gio.

S
Description
No description provided
Readme Multiple Licenses 6.3 MiB
Languages
Go 89.6%
C 7%
Java 1.7%
Objective-C 1.6%