53 Commits

Author SHA1 Message Date
Isaac Freund
933701d7f9
build: update to zig 0.14.0 2025-03-07 12:44:28 +01:00
Isaac Freund
312465e0cb
build: update to Zig 0.12
(cherry picked from commit 033cad47bf63f2914865c19fc10b4dc991007515)
2024-05-20 12:07:52 +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
6c3f851464
Keyboard: eliminate "self" naming convention 2024-03-14 12:35:21 +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
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
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
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
Leon Henrik Plickat
dd9933b6a1
keyboard-groups: use globber for identifier matching 2024-01-07 12:37:03 -06:00
Isaac Freund
393bfb42b9
Keyboard: delete some uneeded code 2024-01-05 12:31:55 -06:00
Leon Henrik Plickat
c86f460135
Keyboard: Add new keyboards to groups if matched
Previously new keyboards would not be added to already existing
keyboard groups on (re-)connect. Only during the creation of
the groups themselves were devices added to them. This meant
that only keyboards connected during startup - before the init
is executed - would work with groups in a typical river session.
2024-01-04 11:00:16 -06:00
Isaac Freund
be4dbe3fe7
Keyboard: clarify keypress routing logic 2024-01-01 23:02:55 -06:00
praschke
2abab1e9c7
river: Implement input_method and text_input 2024-01-01 23:02:54 -06:00
Isaac Freund
7ee6c79b6b
build: update to wlroots 0.17 2023-12-01 17:29:05 +01:00
Isaac Freund
2e586c7061
build: update to Zig 0.11.0 2023-10-16 16:27:03 +02:00
Isaac Freund
06cb76f937
Keyboard: fix keyboard-layout mapping crash 2023-02-28 14:40:10 +01:00
Isaac Freund
6a028639b8
Config: use a single xkb keymap for all keyboards
This is nice simplification and allows us to abort startup if the
default xkb configuration (perhaps influenced by XKB_DEFAULT_*
environment variables) is invalid.
2022-12-30 23:20:02 +01:00
Leon Henrik Plickat
ad1dbb1180
river: add keyboard-layout command
This allows switching river's keyboard layout at runtime.
2022-12-28 20:20:36 +01:00
Isaac Freund
489a49735a
river: update to wlroots 0.16 2022-11-13 16:16:07 +01:00
Isaac Freund
e35c147cd5
river: refactor keyboard groups implementation
This reduces the impact of keyboard groups on the Keyboard.zig
implementation and otherwise improves consistency with patterns used
elsewhere in rivers code.

There are also two small changes to the riverctl interface:

- keyboard-group-add-keyboard is renamed to keyboard-group-add
- keyboard-group-remove is added to support removing keyboards from a
group.
2022-09-18 15:53:45 +02:00
Leon Henrik Plickat
01f49bbbc1 river: add keyboard groups 2022-09-12 04:12:21 +02:00
Isaac Freund
5cce49095a
Seat: refactor InputDevice handling
- The lifetimes of the Keyboard and Switch structs are now directly
tied to the corresponding InputDevice, which has become a field of
those structs.

- Seat capabilities are now properly updated on removing a keyboard.

These changes align with input device refactoring in upstream wlroots
which will make updating to easier 0.16.0.
2022-06-21 16:25:37 +02:00
tiosgz
1e3b8ed161 Seat: avoid leaking eaten keys to client on focus
Until now, Seat.setFocusRaw sent all pressed keys to the client,
including ones that should be eaten. (Try e.g. changing focus to a
nested wlroots compositor with a terminal open to easily see it.)

However, only filtering out the eaten keys is not enough; they were
eaten only once all mappings had been executed. Therefore, the original
function had to be split into one looking up mappings and another
executing them.
2022-05-29 23:12:21 +02:00
tiosgz
6d6646febe Keyboard: eat key release event for mappings
Until now, only the event (press/release) for which a mapping was
present got eaten, and the other was passed to the client. From this
commit, a press mapping eats both events and a release mapping eats
nothing (and a press+release combo eats both).

This fixes behavior of some clients that do not make a difference
between press and release (e.g. Firefox with a fullscreen video
exiting fullscreen even on an Esc release event).
2022-05-29 23:12:21 +02:00
Peter Kaplan
44aaee3a51 command/map: layout-pinned mappings
e.g. `riverctl map -layout 0 normal Super Y spawn foot`

When this mapping is checked against a pressed key, layout 0 will be used to translate the pressed key instead of the currently active layout.

The number denotes to an index of the layouts set with
`XKB_DEFAULT_LAYOUT`.
2022-04-27 18:31:08 +02:00
Duncan Overbruck
0b8758a422
Cursor: Add a hide-cursor command
From the riverctl.1 man page:

*hide-cursor* *timeout* _timeout_
    Hide the cursor if it wasn't moved in the last _timeout_
    milliseconds until it is moved again.
    The default value is 0, which disables automatically hiding the
    cursor. Show the cursor again on any movement.

*hide-cursor* *when-typing* *enabled*|*disabled*
    Hide the cursor when pressing any non-modifier key. Show the cursor
    again on any movement.
2022-04-14 13:37:31 +02:00
Isaac Freund
79d7775a3d
code: relicense to GPL-3.0-only
I don't need anyone's permission to make this change since
GPL-3.0-or-later is one-way compatible with GPL-3.0-only.
2022-01-31 19:33:22 +01:00
Isaac Freund
c1d985ac29
build: update to zig version 0.9.0 2021-12-24 05:28:14 +00:00
Keith Hubbard
2bdf9e20a5
command: support repeating keyboard mappings
Repeating mappings are created using the -repeat option to the map
command:

    % riverctl map normal $mod+Mod1 K -repeat move up 10

- repeating is only supported for key press (not -release) mappings
- unlike -release, -repeat does not create distinct mappings: mapping a
  key with -repeat will replace an existing bare mapping and vice-versa

Resolves #306
2021-08-15 14:49:11 +02:00
Isaac Freund
ece465b7ed
river: remove InputManager.server
The server is now global so this is no longer needed.
2021-05-13 14:53:08 +02:00
foxfromabyss
98d51f6d24 Use std.log instead of log.zig 2021-02-08 18:35:11 +01:00
Isaac Freund
cc08be2dee
code: clean up listener initialization 2020-12-31 15:35:35 +01:00
Isaac Freund
1732c69442
keyboard: set repeat_info to config values on creation 2020-12-26 19:17:24 +01:00
Isaac Freund
20d804cdb5 code: switch to custom wlroots/libwayland bindings
This is a big step up over @cImport() for ergonomics and type safety.
Nearly all void pointer casts have been eliminated!
2020-12-13 22:53:33 +01:00
Isaac Freund
807d4a4212
keyboard: handle destruction 2020-11-29 21:05:27 +01:00
Isaac Freund
f80992e329
meta: make copyright headers more maintainable
- list all files as copyright "The River Developers"
- add an AUTHORS file to acknowledge contributors
2020-11-11 20:33:43 +01:00
Marten Ringwelski
1bd6f6bed1 code: Remove most of the hack around @cImport and flexible arrays 2020-10-30 15:23:52 +01:00
Isaac Freund
3e4743e9a2
Revert "Remove checking translated keysyms"
This reverts commit 744e6b3052a44ba9478e40050dddd77db3cc7529.

This broke VT switching and likely other keysyms which don't have
a "raw" equivalent.
2020-10-21 15:24:11 +02:00
Leon Henrik Plickat
744e6b3052 Remove checking translated keysyms
Raw keysyms are enough to handle all possible keybinds
2020-10-18 16:36:11 +02:00
Marten Ringwelski
52cd871151 Implement map -release 2020-09-15 15:58:54 +02:00
Isaac Freund
989e7aaeda
config: implement map-pointer command
This command takes a mode, modifiers, button/event name, and pointer
action as arguments. It stores these in the config data structure.

The currently available pointer actions are move-view and resize-view,
which replace the previously hard-coded functionality.

Closing the hovered view with middle click has temorarily been removed
until it is decided if we wish to make this another special pointer
action or perhaps allow running any arbitrary command (which would of
course include close).
2020-08-24 18:57:43 +02:00
Isaac Freund
c7c1934b70
Keyboard: clean up initialization 2020-08-21 21:06:59 +02:00
Isaac Freund
7de2edb623
seat: implement kde idle protocol 2020-08-13 12:22:32 +02:00
Isaac Freund
0ebb5ccc17
code: update to wlroots 0.11.0 2020-07-16 21:20:43 +02:00
Leon Henrik Plickat
d292e61cfd cursor: implement moving views 2020-07-07 19:06:52 +02:00
Isaac Freund
79bb0accac
code: improve error handling consistency 2020-06-26 00:59:31 +02:00