Commit Graph

2652 Commits

Author SHA1 Message Date
Elias Naur 24eb1a4fc5 widget: make the InputOp key.Set empty for unfocused Editors
Fixes: https://todo.sr.ht/~eliasnaur/gio/448
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-09-24 08:48:30 -06:00
Inkeliz 90688fdd17 app,io/system: [API] add StageInactive when window is not in focus
Now, Gio will send one system.StageEvent with system.StageInactive when
the window is not active. It is implemented on macOS and Windows.

This change is not fully backward compatible, if your code compares
the Stage (`stage < system.StageRunning`), you need to consider
the new system.StageInactive.

Signed-off-by: inkeliz <inkeliz@inkeliz.com>
2022-09-19 11:07:41 -06:00
Inkeliz b1dba5f27d app: remove gofont.Collection by default
This change removes `gofont.Collection()`, which imports multiples fonts and
increase the binary size.

Fixes: https://todo.sr.ht/~eliasnaur/gio/371
Signed-off-by: Inkeliz <inkeliz@inkeliz.com>
2022-09-16 08:06:05 -06:00
Inkeliz 83cb383523 app,internal/gl: [wasm] fix context lost
Before that change, Gio could crash when the WebGL context was lost
unexpectedly. Now, Gio will properly handle such situation and
recreate the buffers/resources when context is restored and will
wait until context is recovered.

Signed-off-by: Inkeliz <inkeliz@inkeliz.com>
2022-09-15 06:58:27 -06:00
Dominik Honnef e37deed8bb io/router: fix pointer positions of Enter and Leave events for nested areas
Before this change, inverse transformations of pointer positions would
stack up, leading to incorrect positions when an enter or leave event
was delivered to multiple areas.

Signed-off-by: Dominik Honnef <dominik@honnef.co>
2022-09-15 06:41:08 -06:00
Chris Waldon dbf6429026 app,gpu/headless: [linux] make EGL the default backend
This commit switches the priority of EGL and Vulkan so that EGL is always
tried first. This is because our EGL backend performs significantly better
than the Vulkan one, and we want the most performant experience to be the
default.

Our hypothesis is that the EGL backend is benefitting from lots of optimization
within the OpenGL driver that Vulkan drivers expect applications to perform
themselves. Rather than invest a bunch of time optimizing the Vulkan backend
right now, this change lets us focus on other priorities.

Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
2022-09-08 11:41:35 +02:00
Egon Elbre 276b7eefdd go.mod,go.sum: bump dependencies
Bump golang/x/exp/shiny to use the specific module,
instead of using a single all-encompassing module.
This significantly reduces the number of packages in go.sum.

Unfortunately, this requires us to bump the go.mod language
version to 1.18, otherwise using `go mod tidy` and similar
tools will complain about incompatibility with module lookup
in Go 1.16. The code should still compile with 1.17.

Bump github.com/gioui/uax, which gets rid one additional unneeded
dependency and should also reduce the binary size.

Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-08-30 15:01:27 +02:00
Chris Waldon 020eb27ff5 widget: add useful state accessors to scrollbar
This commit adds methods to widget.Scrollbar that enable consuming
code to check if the scroll indicator is processing a drag gesture
or if the scroll track is currently being hovered. These accessors
enable scrollbar style types to have enough information to hide the
scroll indicator when it isn't needed, whereas currently they cannot
differentiate between a scrollbar indicator that is being dragged
but hasn't moved since the last frame and a scrollbar indicator that
is not being dragged.

Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
2022-08-29 15:11:51 +02:00
Elias Naur 911b526dc1 app: [macOS/iOS] remove redundant header include
The redundant include also broke CI.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-08-29 15:06:12 +02:00
Elias Naur 3b2f2efac7 app: [Wayland] maintain fallback decoration height during maximize
Window.decorations.height is supposed to be a constant during the
lifetime of the window, unlike w.decorations.Config.decoHeight that
varies depending on the decorations state (fallback or custom).
This change makes that so, fixing a problem where the fallback
decorations would fail to offset client content after a maximize
or minimize.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-08-19 10:51:53 +02:00
Elias Naur 8425d2a6aa layout: ensure Flex{Alignment: Middle} respects minimum constraint
Before this change, the middle alignment would align according to
the widest child. This change aligns according to the widest child
or minimum constraint, whichever is largest.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-08-16 15:48:46 +02:00
Elias Naur a55065af9c widget: take deleted runes into account when applying Editor.MaxLen
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-08-08 16:15:21 +02:00
Elias Naur 5fc9312f46 widget: report SubmitEvents for IME newlines in submit mode
Before this change, an IME text edit would always have its newlines
replaced with spaces. However, for Editors where Submit is enabled
we want newlines to result in SubmitEvents.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-08-08 15:43:36 +02:00
Elias Naur 96d6fd2791 Revert "io/router: [API] don't emit Enter and Leave events for touch input"
This reverts commit cd0c9dab9f. It turns out
that Enter/Leave is important for cancelling press-then-release-outside
for clickables.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-08-08 14:25:34 +02:00
Inkeliz 65a4366e44 app: [android] fix insets
Previously, the Inset could be report wrongly when the bottom inset
is smaller than the top.

Signed-off-by: Inkeliz <inkeliz@inkeliz.com>
2022-08-07 23:26:05 +02:00
Elias Naur 61b2e37691 all: format comments with go fmt ./... using Go 1.19
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-08-06 12:26:03 +02:00
Inkeliz 3e9d4d966c app: [android] use GioView inside FrameLayout
Before that change, on Android, was impossible to overlay GioView with
a custom view. This change adds FrameLayout and renders GioView into
that, allowing to use addView from Android API.

Fixes: https://todo.sr.ht/~eliasnaur/gio/427
Signed-off-by: Inkeliz <inkeliz@inkeliz.com>
2022-08-02 17:04:51 +02:00
Elias Naur dbbae0519e app/permission/wakelock: add package for requesting wake locks
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-08-01 20:15:44 +02:00
Elias Naur 5326ca5fbe all: add support for macOS to flake.nix
The Nix version of the macOS toolchain has difficulties compiling
Objective-C modules; disable modules instead of figuring out why.
It also doesn't include any frameworks automatically; add them explicitly.

While here, move suppression of OpenGL deprecation to a GL-specific
file.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-08-01 01:33:21 +02:00
Elias Naur f7bc744a24 widget: add Editor.Filter for filtering unwanted characters
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-26 15:22:27 +02:00
Elias Naur 0f51cb9084 app: [macOS] don't miss pointer presses
We used to track the pressed pointer buttons through the global function
[NSEvent pressedMouseButtons]. However, it's possible that at the time a pointer
press event is delivered, the pointer button is up again. To ensure a consistent
view of the pointer press state, track it through the buttonNumber property on
delivered events.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-26 11:47:05 +02:00
Inkeliz fc5689ea44 app: [windows] recover focus on click
Previously, Gio doesn't reclaim the focus when they lose that to a
parent window. In such a case, the child window can steal
keyboard focus, and Gio will never recover it.

Now, Gio will recover the focus when clicked.

Signed-off-by: Inkeliz <inkeliz@inkeliz.com>
2022-07-26 07:32:52 +02:00
Elias Naur 26e71011f5 widget: don't let unfocused Clickables swallow key presses
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-25 10:57:22 +02:00
Dominik Honnef b67bef3e0d io/pointer: fix order of Cursor comments
Signed-off-by: Dominik Honnef <dominik@honnef.co>
2022-07-21 10:25:42 +02:00
Dominik Honnef b9416c7c9c f32: fix typo in comment
Signed-off-by: Dominik Honnef <dominik@honnef.co>
2022-07-21 10:07:52 +02:00
Elias Naur 28c206fc78 io/router: try all handlers if a key don't match the focus ancestor tree
When a key.InputOp is focused, a key.Event is matched to it and its ancestors.
If there is no focus, every handler is matched.
This change always matches to every handler, after checking the focus and
its ancestors.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-20 10:37:28 +02:00
Elias Naur 2993ba1838 app: [Wayland] account for fallback decoration height in window sizes
Pass through a fallback window decoration height to the Wayland backend,
so that it can account for it when determining surface size.

Fixes: https://todo.sr.ht/~eliasnaur/gio/435
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-18 23:17:04 +02:00
Elias Naur 63d2353864 app: ensure no window wakeups are in flight when destroying it
When a window is destroyed, it is no longer valid to call its wakeup
method.

Thanks to Jack Mordaunt for identifying the race.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-18 19:02:07 +02:00
psydvl e711cbc004 internal/vk: fix wayland-client linking
Signed-off-by: psydvl <psydvl@fea.st>
2022-07-18 10:44:47 +02:00
Elias Naur c73125e1c3 app: [X11] send DestroyEvent after ViewEvent{}
Matches the other platforms.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-17 14:52:17 +02:00
Chris Waldon 41de0048db widget: implement editor undo/redo
This commit adds a simple linear-history undo/redo mechanism to
widget.Editor bound to Short-(Shift)-Z as well as tests for this
new feature.

Notes on the implementation:

- using a slice to hold the history does mean that we incur
  allocations as the user types, but I hope that the Go slice
  growth heuristic means that the number of times we pay this
  penalty is very small. We also never shrink the slice in this
  implementation, which ensures that undoing work and then making
  additional modifications is very efficient, but could be framed
  as a memory leak.
- this implementation creates a new history element every time
  we call replace(). This means that, on desktop, it's essentially
  one per rune of input. Users likely want to be able to undo larger
  units of change, so a future improvement could be to coalesce
  changes so long as the selection doesn't change between them.
- I think it's possible to store only one of the Apply/Reverse
  change contents in the history slice, but it's significantly
  more complicated. To implement this, you'd need to add a field
  indicating if the modification represented a forward or backward
  change, and then rewrite the modification's content as you performed
  undo/redo operations.For the time being, I'm not sure it's worth
  this complexity.
- Future work could introduce a limit to the number of history
  entries stored. If we did this, we should also change the
  data structure for storing history. Enforcing such a limit
  using a simple slice like this would be extremely inefficient.
  Perhaps a ring buffer or a linked list would make more sense?
- Applications will likely want to be able to manipulate undo
  history in the future. We may wish to export undo() and redo()
  from the editor. Applications will also likely want a mechanism
  to save the undo history to disk and restore it (implementing
  persistent undo). I'm not sure what the most suitable API for
  that is yet, so I decided not to try to tackle it yet.

Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
2022-07-17 14:45:59 +02:00
Elias Naur 1d9ab65313 widget: add Editor.MaxLen for limiting the content length og Editor
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-13 18:45:02 +02:00
Elias Naur 48e9cdaffd widget: emit only one ChangeEvent per Editor.Layout
ChangeEvent contains no information, so emitting multiple instances
per layout is pointless.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-13 18:13:59 +02:00
Elias Naur 53da73de35 widget: ensure that Border.Layout dimensions fully contains the border
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-10 14:59:50 +02:00
Elias Naur 162250392b layout: respect minimum constraint size in Flex.Layout
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-08 09:18:13 +02:00
Egon Elbre b4acc239cd widget: fix Enum with Return
The input op started listening to Return, however the check
was looking for Enter.

Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-07-07 09:36:43 +02:00
Egon Elbre 0777afb85f gpu: avoid bounds checks in decode
Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-07-07 09:36:26 +02:00
Elias Naur 0057e871d0 io/router: search all key handlers when there is no focus
Fixes: https://todo.sr.ht/~eliasnaur/gio/434
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-02 20:51:26 +02:00
Egon Elbre 6bf5d4dc2d gpu: optimize resourceCache
By keeping all the information in a single map, we avoid multiple
lookups and can switch between frames more easily.

Before ~35us, after ~20us for adding 50 new+old and switching
the frame.

Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-07-02 20:12:41 +02:00
Egon Elbre f8f68a4e9f internal/ops: optimize Decode
Using clean struct creation creates a lot of temporary variables in
assembly. Inline the assignments, which generates less code.

Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-07-02 20:12:41 +02:00
Egon Elbre 17f604fb50 internal/ops: use single table for OpType
Size and NumRefs are always used together, so consolidate info to
a single table to avoid two separate lookups.

Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-07-02 20:12:35 +02:00
Egon Elbre e7dd180447 internal/ops: avoid some bounds checks in decode
Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-07-02 20:11:16 +02:00
Egon Elbre f8efc9c2a6 internal/ops: use lookup table for NumRefs
Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-07-02 20:11:16 +02:00
Egon Elbre d3d2c51717 internal/ops: avoid bounds check in OpType.Size()
Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-07-02 20:06:44 +02:00
Egon Elbre 9de13e37e9 f32: add Affine2D.Split
splitTransform func was creating multiple copies of f32.Affine2D
due to not having access to the internal and passing around non-pointer.

This makes splitTransform from ~8ns to .Split ~2ns.

It seems that the non-pointer receiver was ~0.6ns slower in this case.

Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-07-02 07:04:47 +02:00
Egon Elbre 3670f70c01 internal/f32color: optimize LinearFromSRGB
Previously each call was ~100ns, the new implementation is ~1ns.

Signed-off-by: Egon Elbre <egonelbre@gmail.com>
2022-07-02 06:57:54 +02:00
Elias Naur 2adf4efcbd app: [Wayland] shrink reize gesture area
As reported by Chris Waldon, the resize area is big enough to make
it hard or impossible to grab and drag any scroll bars.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-01 11:16:28 +02:00
Elias Naur 2957d007a2 app: [Wayland] only start resize gesture on pointer down
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-01 11:15:19 +02:00
Elias Naur cab1184818 app: [Wayland] don't process resize gestures when decorated
Signed-off-by: Elias Naur <mail@eliasnaur.com>
2022-07-01 08:02:23 +02:00
Chris Waldon a5f8aa35e1 app: [Wayland] scale pointer hotspot coordinates
This commit updates the way that we change cursors so that the
hotspot of the cursor is properly set to surface-local coordinates.
The previous raw hotspot coordinates are relative to the cursor
image buffer data, and do not take the buffer's scaling factor
into account.

Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
2022-07-01 07:55:37 +02:00