Commit Graph

805 Commits

Author SHA1 Message Date
Isaac Freund
a374c6ab84
Root: fix leak on view destroy
This leaks memory and possibly an fd currently whenever a view is
destroyed.
2024-04-08 15:02:55 +02:00
Isaac Freund
b0e54c6396
Output: fix possible assertion failure on enable
Currently if we disable an output due to a wlr-output-power-management
protocol request we do not update Output.lock_render_state properly.

This is fine if the output is also re-enabled using the
wlr-output-power-management protocol but causes an assertion failure
if it is re-enabled using wlr-output-management instead.
2024-04-08 13:34:47 +02:00
Isaac Freund
3594fe501e
View: fix assertion failure if focused while destroying
Also clean up this code a bit, it's no longer necessary to split these
one line functions out into separate files as Zig's conditional
compilation support has improved since these functions were originally
written.
2024-04-08 12:54:05 +02:00
Isaac Freund
36d8e90a54
View: always check if current.output is null
This field being nullable at all is code smell. I think what needs to
happen here long term is for a proper separation of "window management
output" and "physical output" as concepts and integration outputs into
the transaction system.

That's a much larger change and I don't want to cause that amount of
code churn just before a release though.
2024-04-03 17:18:54 +02:00
tiosgz
198351794b
Keyboard: ignore multiple presses of a key
I have managed to crash river (because the relevant assertion was wrong)
on this using fcitx5 (5.1.8) and anthy with the following sequence of
key events on a physical keyboard (every line followed by releasing
everything):
    super-; (my shortcut to enable anthy)
    shift-letter (fcitx doesn't release shift on its virtual keyboard)
    escape
    shift (fcitx sends another press event)
The failure to release shift is not the only weirdness happening, but
it's what eventually lead to the assertion failure.
2024-03-26 10:48:28 +01:00
Isaac Freund
12de175e11
command/map: add note about upstream xkbcommon fix 2024-03-24 11:46:07 +01:00
Leon Henrik Plickat
b77b42f0d6
command/focus-view: add -skip-floating 2024-03-22 12:37:18 +01:00
Isaac Freund
6491310e12
layer-shell: crop surfaces to output bounds 2024-03-20 13:23:36 +01:00
Isaac Freund
13b9d23e2f
View: fix potential assertion failure on destroy
If a View is destroyed while part of a transaction we can currently hit
an assertion failure, this commit fixes it.
2024-03-18 22:33:24 +01:00
Leon Henrik Plickat
3473d6c0be
TabletTool: use "pencil" cursor shape
This makes tablet tool cursors visually distinct from pointer cursors by
default. Client may of course continue to set custom cursors for tablet
tools if they have focus.

Also fixes a custom cursor set by a client persisting after the tablet
exits the client's surface until proximity out.
2024-03-18 20:43:59 +01:00
Isaac Freund
f3cd98288a
Root: increase transaction timeout to 100ms
This was dropped from 200ms to 50ms in 4a65af66. However 50ms seems
to be a bit too short in practice. I often hit ugly frame imperfection
do to timeouts when toggling mpv between a small floating window and
fullscreen for example, even on a relatively beefy desktop computer.

This only happens while the video is playing in mpv, not while it is
paused. I believe this is due to mpv ignoring the compositor's hints for
when to render a new frame entirely while playing a video. It instead
renders at the framerate of the video being played, even if the
compositor requests a change in size. This isn't great but seems
unlikely to change [1].

Overall, hitting 100ms timeouts subjectively doesn't feel anywhere near
as sluggish as hitting 200ms timeouts and offers better frame perfection
than 50ms timeouts in at least this one example, there are bound to be
others.

[1]: https://dudemanguy.github.io/blog/posts/2022-06-10-wayland-xorg/wayland-xorg.html
2024-03-17 22:55:43 +01:00
Isaac Freund
3f49ff9631
deps: update zig-wayland for a minor cleanup 2024-03-15 19:10:18 +01:00
Isaac Freund
d64cbd2100
touch: handle cancel event, fix assertion failure
Currently we can hit an assertion failure in the putNoClobber() call in
response to the down event since we fail to handle the cancel event.

This commit fixes that issue.
2024-03-15 19:08:10 +01:00
Isaac Freund
0e7a692831
XdgToplevel: validate move/resize request serial
Currently we only support interactive move/resize with the pointer,
touch and tablet tool support are TODO.

Validate the serial here to ensure we don't start a pointer move/resize
in response to the client attempting to start a move/resize with
touch/tablet tool.

This fixes an assertion failure that the pointer's cursor is not hidden
during move/resize, which is how the issue was discovered. Another win
for assertions :)
2024-03-15 15:24:46 +01:00
Isaac Freund
1b63c463a7
security-context: implement protocol
Sensitive Wayland protocols such as wlr_screencopy and wlr_data_control
(clipboard managment) are now blocked by default inside security
contexts (e.g. flatpak 1.15.6 or later).

User configuration of the allowlist/blocklist is TODO.
2024-03-15 14:47:43 +01:00
Isaac Freund
e143cdeca9
pointer-gestures: move to input manager
We definitely should not create duplicates of the global for each seat.

Not that we really support multi-seat yet, but someday.
2024-03-15 13:25:02 +01:00
Isaac Freund
451387a4a9
Server: remove all listeners on deinit() 2024-03-14 13:42:14 +01:00
Isaac Freund
388c95d2e9
RuleList: eliminate "self" naming convention 2024-03-14 13:07:58 +01:00
Isaac Freund
8764b82da5
Vector: eliminate "self" naming convention 2024-03-14 13:06:29 +01:00
Isaac Freund
37d9d6e725
Switch: eliminate "self" naming convention 2024-03-14 13:04:41 +01:00
Isaac Freund
0131d4670d
SwitchMapping: eliminate "self" naming convention 2024-03-14 13:02:38 +01:00
Isaac Freund
82a40725f9
Control: eliminate "self" naming convention 2024-03-14 13:01:49 +01:00
Isaac Freund
3077074329
Mode: eliminate "self" naming convention 2024-03-14 13:00:15 +01:00
Isaac Freund
b9dde3c49b
LayoutDemand: eliminate "self" naming convention 2024-03-14 12:59:42 +01:00
Isaac Freund
c3cee0b91f
PointerMapping: eliminate "self" naming convention 2024-03-14 12:58:50 +01:00
Isaac Freund
278865065b
StatusManager: eliminate "self" naming convention 2024-03-14 12:57:23 +01:00
Isaac Freund
1d8bca24ae
SeatStatus: eliminate "self" naming convention 2024-03-14 12:55:54 +01:00
Isaac Freund
4a259d322b
InputConfig: eliminate "self" naming convention 2024-03-14 12:53:09 +01:00
Isaac Freund
b65e4f6b17
idle-inhibit: fix naming, eliminate "self" naming convention
Also add missing copyright headers
2024-03-14 12:51:34 +01:00
Isaac Freund
b0d4610999
LayoutManager: eliminate "self" naming convention 2024-03-14 12:40:26 +01:00
Isaac Freund
b7c53ceda7
Config: eliminate "self" naming convention 2024-03-14 12:40:13 +01:00
Isaac Freund
6c3f851464
Keyboard: eliminate "self" naming convention 2024-03-14 12:35:21 +01:00
Isaac Freund
f02d26c533
InputManager: eliminate "self" naming convention 2024-03-14 12:34:28 +01:00
Isaac Freund
693a2b0dda
XwaylandOverrideRedirect: eliminate "self" naming convention 2024-03-14 12:29:49 +01:00
Isaac Freund
28f30b2571
Mapping: eliminate "self" naming convention 2024-03-14 12:22:15 +01:00
Isaac Freund
904b623b84
XwaylandView: eliminate "self" naming convention 2024-03-14 12:21:21 +01:00
Isaac Freund
0e2cac08df
XdgToplevel: eliminate "self" naming convention 2024-03-14 12:19:36 +01:00
Isaac Freund
2eb2a13284
Cursor: eliminate "self" naming convention 2024-03-14 12:08:24 +01:00
Isaac Freund
99a99b72e7
View: eliminate "self" naming convention 2024-03-14 12:07:27 +01:00
Isaac Freund
d8f041c96f
Output: eliminate "self" naming convention 2024-03-14 12:06:33 +01:00
Isaac Freund
267aa9a9b5
Seat: eliminate "self" naming convention 2024-03-14 12:05:36 +01:00
Isaac Freund
8a9b07ae4b
Root: eliminate "self" naming convention 2024-03-14 12:04:15 +01:00
Isaac Freund
aadb92dc0b
Layout: eliminate "self" naming convention 2024-03-14 12:02:32 +01:00
Isaac Freund
dabf7e9e97
Server: clean up initialization
This ended up uncovering a latent bug in the IdleInhibitorManager
initialization code, not sure how that ever worked.
2024-03-14 11:55:23 +01:00
Leon Henrik Plickat
4e48d68485
View: restore to previous output on reconnect 2024-03-14 11:07:15 +01:00
Isaac Freund
fecfa89a9a
View: fix SSD desync on consecutive timeouts
If multiple consecutive transaction timeouts occur it is possible for
the SSD borders to become temporarily desynchronized with the size of
the rendered surface.

This is especially noticeable during interactive resize of mpv.

For details on cause/fix, see the new comment in the code.
2024-03-13 15:57:01 +01:00
Isaac Freund
b0dc5f7294
View: improve transaction timeout handling
This fixes a possible assertion failure in Cursor.updateState() when
trying to start move/resize of a xdg toplevel with the timed_out or
timed_out_acked configure_state.

This also generally improves the UX of transaction timeouts as all
state except for the size change is now applied immediately.
2024-03-13 12:28:08 +01:00
Isaac Freund
c474be1537
build: require wlroots version 0.17.2
This fixes a crash that users have hit fairly often in the wild using
Xwayland and allows us to remove an ugly workaround for another issue.
2024-03-11 19:14:37 +01:00
Isaac Freund
49a779b24d
tablet-v2: implement tablet tool support
There is not any pointer emulation for tablet tool input. This means
that only clients implementing the tablet-v2 protocol will be able to
process tablet tool input.

Tablet pad support is TODO
2024-03-11 15:05:42 +01:00
Isaac Freund
ac655593f3
View: remove faulty assertion
This assertion does not consider that a view may be visible on an output
despite no view on that output having focus due to a differnt output
currently having focus.

I don't see any clean way to fix the assert, so just remove it.
2024-03-09 13:47:36 +01:00
Isaac Freund
4a65af667e
Root: reduce transaction timeout to 50ms
The current value of 200ms is too long and makes river feel very slow
when it it hit due to an application being very slow/frozen.

The new timeout of 50ms seems to be rarely hit in practice even on
slower hardware such as my old Thinkpad x220. When it is hit the system
feels much more responsive than when the 200ms timeout is hitdespite the
guilty application window potentially being visible in the wrong
location/size a bit longer.
2024-03-08 12:21:02 +01:00
Isaac Freund
f803ca6274
View: clean up attach-mode code, add assert 2024-03-08 11:56:34 +01:00
Peter Kaplan
26210b2be5
View: Add attachRelative function
This is used for the above/below attach-modes introduced in d71bebc.

Also remove redundant focusedIndex function in Output.PendingState.
2024-03-08 11:56:34 +01:00
Peter Kaplan
d71bebc032
command/attach-modes: above and below options 2024-03-05 17:53:16 +01:00
Isaac Freund
60f4cafad0
river: only expose xwayland_shell_v1 to Xwayland
This is a private protocol only intended for the Xwayland client.
2024-03-02 17:37:04 +01:00
Isaac Freund
0eacde7d01
deps: update to latest zig-wayland and zig-wlroots 2024-03-02 17:36:47 +01:00
Isaac Freund
12e6833f31
linux-dmabuf: disable per-surface feedback
It seems like the wlr_scene implementation of sending per-surface
feedback is a bit too spammy and can lead to resource exhaustion in
clients in at least some reported cases.
2024-02-27 17:10:27 +01:00
Isaac Freund
0605ce507e
Root: fix auto-layout output coordinates
Outputs using the wlr_output_layout auto-layout feature may have their
coordinates update any time an output is added/removed to the layout or
the position of another output in the layout is set.

River currently doesn't keep the scene node coordinates of such outputs
in sync with their position in the output layout, which leads to bugs
with e.g. the cursor not working properly for such outputs.
2024-02-25 14:37:34 +01:00
Isaac Freund
60b06a6741
output-management: fix output destroy handling
Currently we update output-management clients based on changes in the
wlr_output_layout struct. However, this is obviously wrong on closer
inspection due to the fact that not all outputs are tracked by the
wlr_output_layout at all times. I think this aproach was originally
cargo-culted from some other output-management implementation and it
needs to go.

Luckily, the solution is quite simple since the only way to configure
outputs using river is through the wlr-output-management protocol. This
means we need to send a new configuration to the output-management
client in 3 cases:

1. An output is created
2. An output is destroyed
3. A wlr-output-management config from a client is applied
2024-02-25 13:42:58 +01:00
Isaac Freund
f2b6893b00
InputConfig: code style cleanups 2024-02-23 12:22:42 +01:00
LordMZTE
0cb7c49cc3
command/input: add map-to-output 2024-02-23 12:22:42 +01:00
Isaac Freund
95da9b5875
XdgToplevel: work around buggy clients
Unfortunately, clients in the wild sometimes get the
configure/ack_configure/commit sequence wrong, committing the configured
surface with a size different than the one they ack'd only to later in
separate commit adpat the surface size to that requested by the
compositor.

Improve river's handling of such buggy clients to keep river's ssd
borders and internal state consistent with whatever the clients actually
commit regardless of the correctness of the clients. Log a shame message
for such clients to make me feel better about working around their bugs.
2024-02-22 10:24:36 +01:00
Isaac Freund
9b2d99fa79
rules: fix assertion failure
If a view that is currently being destroyed is matched by a newly added
rule river crashes due to an assertion failure.

Fix this and add another assertion to make this precondition more
visible to the users of RuleList.match().
2024-02-21 13:37:39 +01:00
Isaac Freund
53c09be846
Root: fix crash on deinit() 2024-02-20 23:14:12 +01:00
Isaac Freund
a04c18819b
Root: fix crash on output disable
If there is a transaction inflight when an output is disabled then we
must call View.commitTransaction() for any views evacuated from the
disabled output to ensure transaction state remains consistent.

Root.commitTransaction() will not call View.commitTransaction()
for these evacuated views as their output is no longer around.
2024-02-20 23:14:12 +01:00
Isaac Freund
fa5a1e5da0
XdgToplevel: handle timed out state in configure()
If a new transaction is started that calls configure() on an xdg
toplevel with a timed_out/timed_out_acked configure_state we currently
leave the configure_state untouched if no new configure is needed.

This can cause an assertion failure in View.commitTransaction() if the
xdg toplevel still hasn't acked/committed by the time the new
transaction completes.

To fix this, update the configure_state as necessary.
2024-02-20 23:14:12 +01:00
Isaac Freund
46323b4a5b
InputConfig: simplify libinput API usage
All of these API calls checking if the device supports a given option
and checking if the value would be changed are effectively useless.

A quick peek inside the libinput source code shows us that all of these
"setter" functions validate their arguments and return an error if they
are invalid.

Since we don't do anything with the information of whether or not a
config option has been changed or if a config option is even supported
for a given device, all these apply() functions can be simplified to a
single libinput function call.
2024-02-20 11:31:06 +01:00
Hugo Machet
1d40e5a9ab
InputConfig: Implement disable while trackpointing 2024-02-20 00:21:15 +01:00
Isaac Freund
bf7b9d15dd
Root: trival code cleanup in deactivateOutput() 2024-02-19 23:21:08 +01:00
Isaac Freund
b34e1c6ebd
command/map: remove references to locked mods
These have never created functional mappings as far as I'm aware.
2024-02-19 18:23:17 +01:00
LordMZTE
6692656c00
river: clear up docs on -c parameter
This makes the --help message clearly mention that the default init
executable is overidden.
2024-02-19 18:19:06 +01:00
Isaac Freund
a7b174ccf4
command/input: cleanup memory manangement a bit 2024-02-19 18:07:56 +01:00
Leon Henrik Plickat
931b6268e7
command/input: support globs 2024-02-19 18:07:45 +01:00
Hugo Machet
7f1f9152f2
river: add -no-xwayland cli flag
Add a cli flag to disable xwayland at runtime even if river has been
built with xwayland support.
2024-02-19 17:27:25 +01:00
Isaac Freund
ec9a1b4303
Keyboard: ignore >32 simultaneous key presses
wlroots implements this behavior with its key press tracking but
continues to forward the events to the compositor. Matching the wlroots
behavior here seems like the best way to avoid strange edge cases and
this is unlikely to ever be an annoying limit in practice.

Also take this oppurtunity to finally refactor away the hasMapping()
function in a way that doesn't sacrifice correctness even when hitting
this 32 key press limit.
2024-02-19 11:40:58 +01:00
tiosgz
e1970e4d52 Keyboard: don't crash when coming from a different tty
It didn't occur to me that this is a completely valid case when a key
release event is received even though there was no press event known
to river.

(I've also just had this same crash on something else, but i don't
understand what the cause could be.)
2024-02-19 08:54:40 +00:00
Isaac Freund
d1bb27038b
Keyboard: style/naming nits and comment tweaks
This commit includes no functional changes
2024-02-18 17:29:56 +01:00
tiosgz
93c2a2fd08 deps: update zig-wlroots
Simplifies wlr_seat.keyboardNotifyEnter() signature.
2024-02-18 16:08:51 +00:00
tiosgz
bd52c155ef Keyboard: rework key processing semantic
The old eat/pass-on point of view was good when there was only the
focused client to send the key to. But where does the input method
stand? Instead, we now want to know where the key goes, treating river
and clients all equally.

Thanks to ifreund for pointing me to std.BoundedArray which simplifies
some of the logic.
2024-02-18 15:31:53 +00:00
tiosgz
a1ce53a998 KeycodeSet: move to Keyboard.zig
The file was too short and did't make much sense on its own; actually,
it's quite clearly part of the Keyboard logic.
2024-02-18 07:33:29 +00:00
Isaac Freund
2bdbe414e8
View: don't clip off CSD shadow and the like
Instead just clip to the output dimensions as originally intended.
2024-02-15 11:59:38 +01:00
Leon Henrik Plickat
653b5c6660 river: fix names of input config settings 2024-02-15 11:41:43 +01:00
Leon Henrik Plickat
0cae415a93 refactor input configuration 2024-02-14 14:54:36 +01:00
Isaac Freund
a531311ac6
XdgToplevel: handle configure timeout gracefully
Currently configure timeouts hit the "client is buggy and initiated size
change while tiled or fullscreen" code path even if the client is not in
fact buggy. This causes state to get out of sync between river and the
client, and is highly visible as the borders drawn by river no longer
align with the buffer dimensions committed by the client.

This commit fixes this by tracking acks/commits in response to
configures even after a timeout and properly integrating them with the
transaction system.
2024-02-13 14:50:58 +01:00
Isaac Freund
f0b0606e9f
View: clip scene tree to output
There are some cases in which a view can end up with a size/position
that places some part of it outside its output. For example, a window
with a large minimum size in a tiled layout that is placed near the
right or bottom edge of the output may extend past the output bounds.

The problem with this is that part of the view outside the output bounds
may be rendered on another output where it does not belong in a multi-
monitor setup.

To fix this, clip the surfaces of the view and the borders to the output
bounds.
2024-02-10 14:17:29 +01:00
Isaac Freund
93b8bbc2fd
command/zoom: always warp cursor if configured
Focus may not actually change here so seat.focus() may not automatically
warp the cursor.  Nevertheless, a cursor warp seems to be what users
expect with `set-cursor-warp on-focus` configured, especially in
combination with focus-follows-cursor.
2024-02-10 12:00:14 +01:00
Isaac Freund
026c832ba1
xdg-toplevel: handle destroy before xdg-decoration 2024-02-06 12:59:09 +01:00
tiosgz
4685f6906d
Keyboard: eat key before running mapping
To see why this is needed, compare the following flows:
  - user: press key 'j' with Super already pressed
  - Keyboard: handle mapping, focusing next view
  - Seat: send wl_keyboard.enter with keys Super and 'j'
  - Keyboard: eat key 'j'
versus:
  - user: press key 'j' with Super already pressed
  - Keyboard: eat key 'j'
  - Keyboard: handle mapping, focusing next view
  - Seat: send wl_keyboard.enter with key Super.

The necessity of this was already mentioned in 1e3b8ed1; however,
without a comment in code, it was removed in 393bfb42 as superfluous.
Hopefully, the newly added comment will prevent such mistakes in the
future.

Fixes https://github.com/riverwm/river/issues/978
2024-02-05 12:33:09 +01:00
tiosgz
66f1881a72 Keyboard: fix key handling/eating logic
As noticed by leon-p, last refactorings made river send a release event
to the client even if the press event has been eaten. In addition, the
introduction of input method support means that we need to remember
*why* we've eaten the key.

Also make KeycodeSet more strict: i am not aware of any case when a
keyboard could have the same key pressed twice (specifically, keyboard
groups have this handled in wlroots), so make the behavior follow a
smaller set of possible scenarios.
2024-02-01 13:52:59 +00:00
Isaac Freund
69a51cadb4
attach-mode: code/documentation style tweaks 2024-01-13 12:36:20 -06:00
Orfeas
6a71fc65b0
attach-mode: implement after <N> 2024-01-13 12:29:09 -06:00
Isaac Freund
6e9bd83e1d
Root: use Output.PendingState for fallback
Using the same type for these has the potential to simplify some future
code.
2024-01-12 16:49:04 -06:00
Isaac Freund
62dbe34bda
river: fix -log-level filtering
This has been broken since the Zig 0.11.0 upgrade it seems.
2024-01-11 17:10:26 -06:00
Isaac Freund
c9838c31b6
Keyboard: don't send enter before keymap event
It's unclear if this is technically a violation of the protocol or not,
but it makes little sense to do this and many clients in the wild crash
if wl_keyboard.enter is sent before wl_keyboard.keymap.
2024-01-11 16:55:02 -06:00
Isaac Freund
ec8f57e704
Keyboard: check translated keysyms for mappings
If our current approch without xkbcommon translation does not match any
mapping on a key event attempt to match the translated keysym as well.

This makes e.g. the keypad number keys (e.g. KP_1) work intuitively as
they may require translation with numlock active.

The reason we stopped doing this in I7c02ebcbc was due to layout where
e.g. Super+Shift+Space is translated as Space with the Shift modifier
consumed, thereby conflicting with a separate mapping for Super+Space.
This should not be a issue anymore though as we now only run a maximum
of one mapping per key event and we attemt to match mappings without
xkbcommon translation before attempting with translation.
2024-01-11 15:06:33 -06:00
Isaac Freund
f6c434c7a7
river: log version during startup 2024-01-10 17:32:35 -06:00
Isaac Freund
cc1f988e56
Root: fix stack order on restore from 0 outputs 2024-01-09 13:11:16 -06:00
Isaac Freund
c38e7e2d87
Root: remove unneeded fallback.inflight lists 2024-01-09 13:03:55 -06:00
Isaac Freund
5947f04408
Seat: fix potential crash in handleMapping()
I haven't actually managed to reproduce a crash here yet but I feel much
more comfortable about this code with this change.
2024-01-07 16:55:10 -06:00
Leon Henrik Plickat
dd9933b6a1
keyboard-groups: use globber for identifier matching 2024-01-07 12:37:03 -06:00