Commit graph

80 commits

Author SHA1 Message Date
Daniel Eklöf
304f8d6982
wayland: output_mode: update PPI
Since we now use the width/height values from output_mode(), we also
need to update the PPI here.
2020-02-15 21:31:23 +01:00
Daniel Eklöf
291410bd71
wayland: debug: make sure state_str is properly NULL terminated 2020-02-15 19:30:59 +01:00
Daniel Eklöf
027696e9c6
wayland: calculate DPI from physical size, not logical size
xdg_output_handle_logical_size() reports _logical_ output size. That
is, it is scaled by the output's scale factor.

We want the _actual_ DPI. The _real_ output size is reported by
output_mode(), so use that instead.
2020-02-15 19:06:28 +01:00
Daniel Eklöf
ffcb09dd75
wayland: break out scale/resize updating to a new function
And call this function once from output_done(), rather than from each
output_*() callback.
2020-02-15 19:05:33 +01:00
Daniel Eklöf
5956faac01
term/wayland: use MONOTONIC timers 2020-01-10 21:33:40 +01:00
Daniel Eklöf
4e335422b8
wayland; fixup 2020-01-10 19:23:32 +01:00
Daniel Eklöf
7ce2cca49a
wayland: just to be sure, check return value of wl_display_read_events() 2020-01-10 19:23:08 +01:00
Daniel Eklöf
832e6f1370
wayland: make wayland socket non-blocking 2020-01-10 19:22:59 +01:00
Daniel Eklöf
ae82939158
wayland: wayl_flush: re-initialize fd array before each poll 2020-01-04 23:36:32 +01:00
Daniel Eklöf
11d381f0c3
wayland: add comment 2020-01-04 23:33:50 +01:00
Daniel Eklöf
d243a836ce
wayland: only call wl_display_prepare_read() if we read any events
That is, only call it if we have POLLIN. If not, then we never read
any events and we still hold the read lock and thus we shouldn't try
to acquire it again.
2020-01-04 23:32:00 +01:00
Daniel Eklöf
4cbd894803
wayland: use a low priority FDM hook to flush the wayland socket
This way, we don't have to manually insert flushes in code paths that
may execute outside of a wl_display_dispatch_pending().

(Those that execute inside a wl_display_dispatch_pending() are subject
to the flush performed at the end of the normal wayland FDM handler).
2020-01-04 23:27:59 +01:00
Daniel Eklöf
5ec447697c
render: throttle xcursor updates
With a bad behaving client (e.g. 'less' with mouse support enabled),
we can end up with a *lot* of xcursor updates (so much, that we
flooded the wayland socket before we implemented a blocking
wayl_flush()).

Since there's little point in updating the cursor more than once per
frame interval, use frame callbacks to throttle the updates.

This works more or lesslike normal terminal refreshes:

render_xcursor_set() stores the last terminal (window) that had (and
updated) the cursor.

The renderer's FDM hook checks if we have such a pending terminal set,
and if so, tries to refresh the cursor.

This is done by first checking if we're already waiting for a callback
from a previous cursor update, and if so we do nothing; the callback
will update the cursor for the next frame. If we're *not* already
waiting for a callback, we update the cursor immediately.
2020-01-04 22:58:32 +01:00
Daniel Eklöf
abc36d8f09
wayland: wl_display_flush() never blocks
Since it doesn't block, we need to detect EAGAIN failures and ensure
we actually flush everything.

If we don't, we sooner or later end up in a wayland client library
call that aborts due to the socket buffer being full.

Ideally, we'd simply enable POLLOUT in the FDM. However, we cannot
write *anything* to the wayland socket until we've actually managed to
send everything. This means enabling POLLOUT in the FDM wont work
since we may (*will*) end up trying to write more data to it before
we've flushed it.

So, add a wrapper function, wayl_flush(), that acts as a blocking
variant of wl_display_flush(), by detecting EAGAIN failiures and
calling poll() itself, on the wayland socket only, until all data has
been sent.
2020-01-04 21:10:08 +01:00
Daniel Eklöf
1178a7763b
wayland: window: optimize: set opaque region
When background alpha is 1.0 (0xffff), i.e. completely opaque, tell
the compositor this, via wl_surface_set_opaque_region().

This allows it to optimize drawing of surfaces _behind_ our window.
2020-01-03 21:53:38 +01:00
Daniel Eklöf
0ea0323d0f
wayland: don't use wl_display_dispatch()
wl_display_dispatch() calls poll(), which is unnecessary since we
already know the FD is readable.

Use the more lower level wl_display_read_events() +
wl_display_dispatch_pending().

These require wl_display_prepare_read() to have been called.

The idea is to call wl_display_prepare_read() **before** calling
poll().

Thus, we do this more or less last in wayl_init(), and at the **end**
of the FDM handler.

However, having taking this lock also means we no longer can call
wl_display_roundtrip() directly (it will hang).

So, add a wrapper, wayl_roundtrip(), that cancels the read intent,
does the roundtrip, and then re-acquires the read intent.
2020-01-03 21:02:12 +01:00
Daniel Eklöf
a291999f2c
wayland: flush after commit new pointer surface 2020-01-03 19:04:42 +01:00
Daniel Eklöf
c118ed9252
wayland: configure: resize before changing visual focus
This hopefully fixes and issue where the visual focus in/out caused a
render refresh with the *old* size.

This caused the occasional flicker at startup, or when resizing the
window.

By placing the resize call before the visual focus in/out, we ensure
the refresh uses the new size.

This is a temporary workaround. The correct solution is to ensure we
only call refresh() once.
2020-01-03 18:58:26 +01:00
Daniel Eklöf
f7362d381b
render: refresh: ensure window has been configured 2020-01-03 18:55:13 +01:00
Daniel Eklöf
d07fd7de39
render: remove 'refresh' from render_resize() 2020-01-03 13:56:10 +01:00
Daniel Eklöf
46c434d3f1
wayland: window: apply all configure changes after acking the event 2020-01-03 13:54:44 +01:00
Daniel Eklöf
765fe13aff
wayland: remove wayl_terminal_from_xdg_{surface,toplevel} 2020-01-03 13:46:37 +01:00
Daniel Eklöf
b0fbc064dd
wayland: window: pass window pointer to xdg toplevel callbacks 2020-01-03 13:46:15 +01:00
Daniel Eklöf
ea002ad571
wayland: window: pass window pointer to xdg-surface-listener callbacks 2020-01-03 13:41:35 +01:00
Daniel Eklöf
9372fb4166
wayland: window: pass window pointer to wl-surface callbacks 2020-01-03 13:40:37 +01:00
Daniel Eklöf
9a0238bb52
wayland: window now keeps pointer to owning terminal, not wayland 2020-01-03 13:37:03 +01:00
Daniel Eklöf
74aa604904
render: render_resize(): don't do anything if width or height is 0 2020-01-03 12:54:03 +01:00
Daniel Eklöf
11892e8d23
wayland: fix release build 2020-01-03 12:52:18 +01:00
Daniel Eklöf
8494cc808f
wayland: debug log state changes in xdg-toplevel-configure 2020-01-03 12:49:04 +01:00
Daniel Eklöf
c94da979fb
wayland: xdg-surface-configure: refresh terminal
Any changes done in any of the configure events are ignored before
we've ack:ed the configure event.

In particular, this means the resize done in xdg-toplevel-configure
isn't displayed until the next time we call render_refresh().

Unless we do something ourselves, this can take quite some time, since
we're basically need the slave to write something.

So, in xdg-surface-configure, *after* having ack:ed the configure
event, call render_refresh() to make the changes done in
xdg-toplevel-configure visible as soon as possible.
2020-01-03 12:48:54 +01:00
Daniel Eklöf
26c16a9a47
wayland: render_resize() now takes a 'refresh' argument 2020-01-03 12:45:16 +01:00
Daniel Eklöf
aa9e87ffb0
wayland: term_visual_focus_{in,out} handles already being focused/defocused 2020-01-03 11:20:13 +01:00
Daniel Eklöf
304355d8ed
wayland: xdg-toplevel-configure: no need to detect early configure events
We can now lookup terminal instances at all times, making it
unnecessary to detect "early" configure events.

Note that we still need to prevent a resize from happening when
width/height is 0.
2020-01-03 11:18:43 +01:00
Daniel Eklöf
913c684844
term: term_init() calls wl_display_roundtrip()
Instead of having `wayl_win_init()` call
`wl_display_roundtrip()` (which it itself doesn't need), call it from
`term_init()`.

This allows us to add ourselves (the new terminal instance) to the
terminal list in the wayland backend, before triggering the wayland
events caused by `wayl_win_init()`.

This is turn allows the wayland backend to find/lookup the new
terminal when those events occur..
2020-01-03 11:16:06 +01:00
Daniel Eklöf
0e40e1c711
wayland: xdg-top-level-configure: call term_visual_focus_{in,out} 2020-01-02 19:37:01 +01:00
Daniel Eklöf
2192d95fa9
wayland: xdg-toplevel-configure: check for stateless configure calls
Ignore configure calls without state, instead of checking for
width/height == 0.
2020-01-02 17:38:50 +01:00
Daniel Eklöf
4a9f359a6a
wayland: ignore early configure calls
At this point, not everything has been setup and we crash when trying
to convert the surface pointer to a terminal pointer.
2020-01-02 17:25:41 +01:00
Daniel Eklöf
eb1ea2d80d
term: add visually focused attribute to terminal struct 2020-01-02 16:06:35 +01:00
Daniel Eklöf
4ecb0ecf4d
wayland: rename focused/moused to kbd_focus/mouse_focus 2020-01-02 15:58:52 +01:00
Daniel Eklöf
403af22061
wayland: warn when presentation timings have been requested but is not supported 2020-01-01 16:09:16 +01:00
Daniel Eklöf
b100a82c2a
wayland: only bind to 'presentation' interface if -p,--presentation-timings 2019-12-31 16:12:48 +01:00
Daniel Eklöf
7fe081600a
wayland: remove empty line 2019-12-31 16:07:05 +01:00
Daniel Eklöf
d8761f31a2
wayland: make zxdg_output_v1_listener struct const 2019-12-31 15:43:15 +01:00
Daniel Eklöf
5a07419096
wayland: optionally use the presentation time protocol to measure input lag
This adds a flag, -p,--presentation-timings, that enables input lag
measuring using the presentation time Wayland protocol.

When enabled, we store a timestamp when we *send* a key to the
slave. Then, when we commit a frame for rendering to the compositor,
we request presentation feedback. We also store a timestamp for when
the frame was committed.

The 'presented' callback then looks at the input and commit
timestamps, and compares it with the presented timestamp.

The delay is logged at INFO when the delay was less than one frame
interval, at WARN when it was one frame interval, and at ERR when it
was two or more frame intervals.

We also update statistic counters that we log when foot is shut down.
2019-12-31 15:39:40 +01:00
Daniel Eklöf
db1d913ba8
wayland: include more output (monitor) details in the log output 2019-12-05 19:35:34 +01:00
Daniel Eklöf
b5780e735e
Add missing includes 2019-12-01 19:22:45 +01:00
Daniel Eklöf
a87b39f6eb
wayland: track current xcursor, and don't update if same
We may have many windows open, which tries to update/change the
xcursor at various points.

Track which cursor is currently loaded, regardless of which window it
was set by. If someone tries to load that very same xcursor again,
simply skip it.

One example is when we've moused over a window that does *not* have
keyboard focus, and then the user clicks, or by some other mean gives
that window keyboard focus. In many cases it will then try to set the
same cursor again (most of the times, the cursor is the same
regardless of keyboard focus, but not always).
2019-11-30 12:09:57 +01:00
Daniel Eklöf
c8724fe656
wayland: terminal_from_surface: recognize scrollback search surfaces
This fixes an assertion when hovering over the input field for
scrollback searches.
2019-11-29 22:10:28 +01:00
Daniel Eklöf
304ee33fd6
wayland: always flush after dispatching messages
This means we don't have to e.g. roundtrip when setting the cursor.
2019-11-29 22:09:56 +01:00
Daniel Eklöf
0dd37f0a36
terminal: use the 'text' xcursor pointer whenever selection is possible 2019-11-28 19:35:47 +01:00