river/completions/zsh/_riverctl
Isaac Freund 46f77f30dc
Seat: put all keyboards in a single group
Deprecate and ignore the riverctl commands for creating explicit
keyboard groups.

In my mind, the only reason to have more than one keyboard group is if
different keyboard devices are assigned different keymaps or repeat
rates. River does not currently allow such things to be configured
however.

When river eventually makes it possible to configure different keymaps
and repeat rates per keyboard device, there is no reason we can't 100%
automatically group keyboards based on the keymap/repeat rate.

Exposing this keyboard group abstraction to the user is just bad UX.

Failing to group keyboards automatically also creates confusing/buggy
behavior for the user if the hardware, for example, exposes some of the
the XF86 buttons on a laptop as a separate keyboard device from the main
keyboard. Creating keybindings for these XF86 buttons that use modifiers
doesn't work by default, but there's no reason it shouldn't just work.

Closes: https://codeberg.org/river/river/issues/1138
2025-03-29 15:44:56 +01:00

215 lines
12 KiB
Plaintext

#compdef riverctl
#
# Completion script for riverctl, part of river <https://codeberg.org/river/river>
# This is the list of all riverctl first argument, i.e `riverctl <first_arg>`.
# If a command doesn't need completion for subcommands then you just need
# to add a line to this list.
# Format is '<command-name>:<description>'
_riverctl_commands()
{
local -a riverctl_commands
riverctl_commands=(
# Actions
'close:Close the focused view'
'exit:Exit the compositor, terminating the Wayland session'
'focus-output:Focus the next or previous output'
'focus-view:Focus the next or previous view in the stack'
'move:Move the focused view in the specified direction'
'resize:Resize the focused view along the given axis'
'snap:Snap the focused view to the specified screen edge'
'send-to-output:Send the focused view to the next or the previous output'
'spawn:Run shell_command using /bin/sh -c'
'swap:Swap the focused view with the next/previous visible non-floating view'
'toggle-float:Toggle the floating state of the focused view'
'toggle-fullscreen:Toggle the fullscreen state of the focused view'
'zoom:Bump the focused view to the top of the layout stack'
'default-layout:Set the layout namespace to be used by all outputs by default.'
'output-layout:Set the layout namespace of currently focused output.'
'send-layout-cmd:Send command to the layout generator on the currently focused output with matching namespace'
# Tag management
'set-focused-tags:Show views with tags corresponding to the set bits of tags'
'set-view-tags:Assign the currently focused view the tags corresponding to the set bits of tags'
'toggle-focused-tags:Toggle visibility of views with tags corresponding to the set bits of tags'
'toggle-view-tags:Toggle the tags of the currently focused view'
'spawn-tagmask:Set a tagmask to filter the tags assigned to newly spawned views on the focused output'
'focus-previous-tags:Sets tags to their previous value on the focused output'
'send-to-previous-tags:Assign the currently focused view the previous tags of the focused output'
# Mappings
'declare-mode:Create a new mode'
'enter-mode:Switch to given mode if it exists'
'map:Run command when key is pressed while modifiers are held down and in the specified mode'
'map-pointer:Move or resize views or run command when button and modifiers are held down while in the specified mode'
'map-switch:Run command when river receives a switch event in the specified mode'
'unmap:Remove the mapping defined by the arguments'
'unmap-pointer:Remove the pointer mapping defined by the arguments'
'unmap-switch:Remove the switch mapping defined by the arguments'
# Rules
'rule-add:Apply an action to matching views'
'rule-del:Delete a rule added with rule-add'
'list-rules:Print rules in a given list'
# Configuration
'default-attach-mode:Configure where new views should attach to the view stack'
'output-attach-mode:Configure where new views should attach to the view stack of the currently focuesed output'
'background-color:Set the background color'
'border-color-focused:Set the border color of focused views'
'border-color-unfocused:Set the border color of unfocused views'
'border-color-urgent:Set the border color of urgent views'
'border-width:Set the border width to pixels'
'focus-follows-cursor:Configure the focus behavior when moving cursor'
'hide-cursor:Hide cursor when typing or after inactivity'
'set-repeat:Set the keyboard repeat rate and repeat delay'
'set-cursor-warp:Set the cursor warp mode.'
'xcursor-theme:Set the xcursor theme'
'keyboard-layout:Set the keyboard layout'
'keyboard-layout-file:Set the keyboard layout from a file'
# Input
'input:Configure input devices'
'list-inputs:List all input devices'
'list-input-configs:List all input configurations'
)
_describe -t command 'command' riverctl_commands
}
# This is the function called for the completion. Commands added in the
# riverctl_commands above are generated in the `commands` case, there is
# nothing more to do for this. If a command has a subcommand then a new case
# need to be added in `args`.
# If this is a simple subcommand with simple multi choice, the easier way to
# do it is:
# <command-name>) _alternative 'arguments:args:(<choice1 choice2)' ;;
# If the subcommand also has subcommands then, good luck...
# This is really complex, the easiest example to look at is the `hide-cursor` one.
_riverctl()
{
local state line
_arguments -C \
'1: :->commands' \
'*:: :->args'
case "$state" in
commands) _alternative 'common-commands:common:_riverctl_commands' ;;
args)
case "$line[1]" in
focus-output) _alternative 'arguments:args:(next previous up right down left)' ;;
focus-view) _alternative 'arguments:args:(next previous up down left right)' ;;
keyboard-layout) _arguments '*::optional:(-rules -model -variant -options)' ;;
input)
_arguments '1: :->name' '2: :->commands' ':: :->args'
case "$state" in
name) _alternative "arguments:args:($(riverctl list-inputs | grep -e '^[^[:space:]]'))" ;;
commands)
local -a input_subcommands
input_subcommands=(
'events:Configure whether the input devices events will be used by river'
'accel-profile:Set the pointer acceleration profile'
'pointer-accel:Set the pointer acceleration factor'
'click-method:Set the click method'
'drag:Enable or disable the tap-and-drag functionality'
'drag-lock:Enable or disable the drag lock functionality'
'disable-while-typing:Enable or disable the disable-while-typing functionality'
'disable-while-trackpointing:Enable or disable the disable-while-trackpointing functionality'
'middle-emulation:Enable or disable the middle click emulation functionality'
'natural-scroll:Enable or disable the natural scroll functionality'
'scroll-factor:Set the scroll factor'
'left-handed:Enable or disable the left handed mode'
'tap:Enable or disable the tap functionality'
'tap-button-map:Configure the button mapping for tapping'
'scroll-method:Set the scroll method'
'scroll-button:Set the scroll button'
'scroll-button-lock:Enable or disable the scroll button lock functionality'
'map-to-output:Map to a given output'
)
_describe -t command 'command' input_subcommands
;;
args)
case "$line[2]" in
events) _alternative 'input-cmds:args:(enabled disabled disabled-on-external-mouse)' ;;
accel-profile) _alternative 'input-cmds:args:(none flat adaptive)' ;;
click-method) _alternative 'input-cmds:args:(none button-areas clickfinger)' ;;
drag) _alternative 'input-cmds:args:(enabled disabled)' ;;
drag-lock) _alternative 'input-cmds:args:(enabled disabled)' ;;
disable-while-typing) _alternative 'input-cmds:args:(enabled disabled)' ;;
disable-while-trackpointing) _alternative 'input-cmds:args:(enabled disabled)' ;;
middle-emulation) _alternative 'input-cmds:args:(enabled disabled)' ;;
natural-scroll) _alternative 'input-cmds:args:(enabled disabled)' ;;
left-handed) _alternative 'input-cmds:args:(enabled disabled)' ;;
tap) _alternative 'input-cmds:args:(enabled disabled)' ;;
scroll-button-lock) _alternative 'input-cmds:args:(enabled disabled)' ;;
tap-button-map) _alternative 'input-cmds:args:(left-right-middle left-middle-right)' ;;
scroll-method) _alternative 'input-cmds:args:(none two-finger edge button)' ;;
*) return 0 ;;
esac
;;
esac
;;
move) _alternative 'arguments:args:(up down left right)' ;;
resize) _alternative 'arguments:args:(horizontal vertical)' ;;
snap) _alternative 'arguments:args:(up down left right)' ;;
send-to-output) _arguments \
'1::optional:(-current-tag)' \
'::args:(next previous up right down left)'
;;
swap) _alternative 'arguments:args:(next previous up down left right)' ;;
map) _alternative 'arguments:optional:(-release -repeat -layout)' ;;
unmap) _alternative 'arguments:optional:(-release)' ;;
map-switch | unmap-switch)
_arguments '1: :' '2:args:(lid tablet)' '3:args:->args'
case "$state" in
args)
case "$line[2]" in
lid) _alternative 'arguments:args:(close open)' ;;
tablet) _alternative 'arguments:args:(on off)' ;;
esac
;;
esac
;;
default-attach-mode) _alternative 'arguments:args:(top bottom above below after)' ;;
output-attach-mode) _alternative 'arguments:args:(top bottom above below after)' ;;
focus-follows-cursor) _alternative 'arguments:args:(disabled normal always)' ;;
set-cursor-warp) _alternative 'arguments:args:(disabled on-output-change on-focus-change)' ;;
hide-cursor)
_arguments '1: :->commands' ':: :->args'
case "$state" in
commands)
local -a hide_cursor_subcommands
hide_cursor_subcommands=(
"timeout:Hide cursor if it wasn\'t moved in the last X millisecond, until it is moved again"
'when-typing:Enable or disable whether the cursor should be hidden when pressing any non-modifier key'
)
_describe -t command 'command' hide_cursor_subcommands
;;
args)
case "$line[1]" in
when-typing) _alternative 'hide-cursor-cmds:args:(enabled disabled)' ;;
*) return 0 ;;
esac
;;
esac
;;
rule-add | rule-del)
# This is not perfect as it only complete if there is
# either '-app-id' or '-title'.
# The empty action(2) mean that we need an argument
# but we don't generate anything for it.
# In case of a new rule added in river, we just need
# to add it to the third option between '()',
# i.e (float no-float <new-option>)
_arguments '1: :(-app-id -title)' '2: : ' ':: :(float no-float ssd csd tags output position dimensions fullscreen no-fullscreen)'
;;
list-rules) _alternative 'arguments:args:(float ssd tags output position dimensions fullscreen)' ;;
*) return 0 ;;
esac
;;
esac
}
_riverctl "$@"