river 0.3.0 This one's been in the pipeline for quite a while, it's been over a year since 0.2.0 was released and river has seen significant improvements since then. The past few months I've done my best to fix as many bugs as possible but a non-bugfix release always entails new code reaching a lot of people with diverse setups. If you find a bug in river please [open an issue](https://codeberg.org/river/river/issues/new/choose). Here's a summary of the important changes since river 0.2. New features: - Better rendering performance due to the [new wlroots rendering API](https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3631) and [gles2 renderer improvements](https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4135). - Finely-grained damage tracking leveraging the wlroots scene graph API. - Interactive resize of windows with the cursor from all edges/corners. - Basic tablet input support - Only the tablet-v2 protocol is is supported, no pointer emulation is done. - Drawing with a tablet tool works in inkscape, libreoffice, etc. - Tablet pad input devices are not yet supported, tracking issue: https://codeberg.org/river/river/issues/1021 - Rules system to apply settings to windows with a matching app-id/title. See `rule-add` in the `riverctl(1)` man page. The following rule types are added in this release: - float/no-float - ssd/csd - fullscreen/no-fullscreen - tags - output - position - dimensions - New `-current-tags` flag for `send-to-output` - New `-no-xwayland` flag for starting river with xwayland disabled even if built with support. - New `above`, `below` and `after <N>` attach modes plus the ability to configure attach mode per output with the new `output-attach-mode` riverctl command. - New `-skip-floating` flag for `focus-view` - New `scroll-factor` input configuration option - The `input-method-v2` and `text-input-v3` protocols are supported, with the exception of input-method popups. - The `presentation-time` protocol is supported. - The `fractional-scale-v1` protocol is supported. - The `cursor-shape-v1` protocol is supported. - The `xdg-shell` protocol version 5 is supported, up from version 2. Breaking changes compared to 0.2: - River now honors the client-side vs server-side decoration wishes of clients by default instead of attempting to force server-side decorations everywhere. To approximate the old behavior the command `riverctl rule-add ssd` may be used. - The `float-filter-add` and `csd-filter-add` riverctl commands have been removed, use `rule-add` instead and see the `riverctl(1)` man page for documentation. - The `attach-mode` riverctl command is deprecated and currently aliased to the new `default-attach-mode` command. The alias may be removed in the future. - Rendering order has changed slightly and and is now based off of focus order instead of window management stack order. - Pointer constraints have been reimplemented and the new implementation does less automatic warping of the cursor. Packaging changes: - wlroots 0.17.2 is required. - The official upstream river repository has moved to https://codeberg.org/river/river Community: - River has adopted a [Code of Conduct](https://codeberg.org/river/river/src/branch/master/CODE_OF_CONDUCT.md) Thank you to everyone who has contributed code and bug reports to river! River would not be where it is today without you. Thanks as well to everyone who has donated to me in support of river's development, your support means a lot to me. If my work on river adds value to your life and you'd like to support me financially you can find donation information [here](https://isaacfreund.com/donate/). Full changelog: Alexander Courtis (1): wlr-output-management: apply adaptive sync state Doclic (2): river: make RuleList return deleted items river: add outputs rule Hugo Machet (9): ci: Use meson setup command View: fix pointer comparison in notifyTitle() completions: Rewrite zsh completions/zsh: Fix incomplete input names river: add -no-xwayland cli flag InputConfig: Implement disable while trackpointing example/init: Replace light with brightnessctl completions: Add missing completions mailmap: map Hugo's old emails to new one Isaac Freund (250): build: bump version to 0.3.0-dev rivertile: fix code to disallow 0 main count session-lock: wait for present before locking session-lock: fix assertion failure due to race session-lock: fix assertion failure on abnormal client behavior render: fix rounding for fractional scaling deps: update to Zig 0.10 flags: further cleanup after Zig 0.10 deps: update zig-wayland to fix build on aarch64 Seat: rework Xwayland Override Redirect focus command/layout: fix a memory leak session-lock: properly handle disabled outputs idle-inhibit: fix use-after-free wlr-output-management: leverage new wlroots APIs session-lock: fix assertion failure on hot-plug while locked wlr-output-management: fix bug due to zig miscompilation docs: fix typos in riverctl man page docs: remove repology badge from readme Seat: guard setFocusRaw() usage while locked deps: update to latest zig-wayland/zig-wlroots deps: update to latest zig-wayland/zig-wlroots Keyboard: fix keyboard-layout mapping crash pointer-constraints: remove protocol render: remove damage tracking wlr-foreign-toplevel-management: remove protocol render: use wlr_scene to render views Cursor: remove surfaceAt() session-lock: use the scene graph Output: use separate scene trees for layers View: implement borders with scene graph Xwayland: create scene tree View: remove dead code LayerSurface: render using the scene graph XdgPopup: reimplement using the scene graph xdg-shell: implement version 5 DragIcon: render using the scene graph Xwayland: render using the scene graph View: use saved surface trees for transactions river: rework core data structures & transactions OutputStatus: rework implementation LayerSurface: fix use-after-free on destroy river: fix various fullscreen related bugs csd-filter-add/remove: add missing applyPending() Root: centralize focus(null) calls in applyPending() Output: inline renderOutput function session-lock: fix race with multiple outputs Root: fix more fullscreen bugs View: move borders state to State struct View: clamp to output on exiting float/fullscreen Root: fix use of view.current before update Output: fix background of transformed outputs View: only send configures through transactions View: fix frame perfection on unmap river: render floating views above the layout View: handle destroy during inflight layout demand Xwayland: fix has_fixed_size heuristic for floating XdgToplevel: fix size_changed check on commit Root: keep all fullscreen views the correct size Xwayland: hide override redirect windows if locked deps: update zig-wlroots to fix Xwayland crash Cursor: allow resizing from all edges xdg-shell: honor client move/resize requests View: rework configure abstraction Cursor: store offset and warp cursor during move river: fix a few leaks river: clean up some uneeded TODOs SceneNodeData: allow access from wlr_surfaces Server: remove headless backend presentation-time: support protocol Cursor: use pending position to warp during move Seat: use the grab aware API to clear focus pointer-constraints: implement protocol Xwayland: only raise views if activated wlr-foreign-toplevel-management: implement protocol river: improve comments on pending/inflight/current Seat: fix potential assertion failure layer-shell: apply exclusive zones in separate pass Xwayland: eliminate unneeded user data usage XdgToplevel: clean up wlr_surface data on destroy river-status: only send layout name if changed example/init: Fix confusing comments xdg-shell: determine tiled state by float state View: add `none` impl tag for better safety checks xdg-decoration: clean up implementation river: add rules system docs: fix typo in riverctl man page example/init: update for rules system doc: fix typo in riverctl man page Output: reinitialize output_status, cleanup Root: remove incorrect assertions in addOutput() Root: separate fallback list to handle 0 outputs Cursor: fix warp on output change with no views XdgToplevel: ensure view dimensions match geometry Cursor: lock to current geometry during move/resize Cursor: apply x/y change during resize on commit build: work around zig 0.10.0 bug to fix CI LayerSurface: handle focus when switching outputs LayerSurface: fix surfaces on multiple outputs at once session-lock: fix assertion failures and clean up XdgToplevel: store scene node in wlr_surface data river-layout: Remove incorrect assertion build: update to Zig 0.11.0 View: clean up after Zig update Cursor: use total delta for resize calculation docs: explain unknown info in output identifiers docs: update PACKAGING.md for Zig 0.11 DragIcon: set position on creation rivertile: eliminate an @intCast() Cursor: use inflight_mode as needed in updateState() XdgToplevel: tweak fullscreen state policy pointer-constraints: fix assertion failure rules: rename "tag" action to "tags" xdg-toplevel: ignore redundant move/resize requests river: remove dead code View: handle map while no outputs are available Cursor: clamp cursor movement to resize bounds Cursor: fix high polling rate resize regression session-lock: fix pointer focus handling on map build: update to wlroots 0.17 SceneNodeData: fix fromNode() Output: fix regression of initial mode logic Root: fix faulty assertion, cleanup Output: fix initial commit for wayland backend ci: fix arch and alpine build: fix comment on scanner.generate() versions deps: update to lastest zig-wlroots gamma-control: track wlroots 0.17 changes output-management: fix output config application output-management: work around wlroots crash build: require at least wlroots 0.17.1 TextInput: remove pending_focused_surface TextInput: handle multiple text inputs correctly TextInput/InputRelay: style nits TextInput: fix consecutive enable requests Keyboard: clarify keypress routing logic XdgToplevel: fix frame perfection on unmap river: drop support for wl_drm linux-dmabuf: send better per-surface feedback xdg-activation: fix race with transaction system Cursor: clean up cursor theme loading Keyboard: delete some uneeded code Output: fix possible crash on destroy river: re-add wl_drm support for now Keyboard: fix mapping XF86ScreenSaver Seat: fix potential crash in handleMapping() Root: remove unneeded fallback.inflight lists Root: fix stack order on restore from 0 outputs river: log version during startup Keyboard: check translated keysyms for mappings Keyboard: don't send enter before keymap event river: fix -log-level filtering Root: use Output.PendingState for fallback attach-mode: code/documentation style tweaks xdg-toplevel: handle destroy before xdg-decoration command/zoom: always warp cursor if configured View: clip scene tree to output XdgToplevel: handle configure timeout gracefully View: don't clip off CSD shadow and the like Keyboard: style/naming nits and comment tweaks Keyboard: ignore >32 simultaneous key presses command/input: cleanup memory manangement a bit command/map: remove references to locked mods Root: trival code cleanup in deactivateOutput() InputConfig: simplify libinput API usage XdgToplevel: handle timed out state in configure() Root: fix crash on output disable Root: fix crash on deinit() rules: fix assertion failure XdgToplevel: work around buggy clients InputConfig: code style cleanups output-management: fix output destroy handling Root: fix auto-layout output coordinates linux-dmabuf: disable per-surface feedback deps: update to latest zig-wayland and zig-wlroots river: only expose xwayland_shell_v1 to Xwayland mailmap: map Isaac's old email to the new one build: enable frame pointers in release safe View: clean up attach-mode code, add assert Root: reduce transaction timeout to 50ms View: remove faulty assertion tablet-v2: implement tablet tool support build: require wlroots version 0.17.2 deps: switch to codeberg upstreams, update View: improve transaction timeout handling View: fix SSD desync on consecutive timeouts Server: clean up initialization Layout: eliminate "self" naming convention Root: eliminate "self" naming convention Seat: eliminate "self" naming convention Output: eliminate "self" naming convention View: eliminate "self" naming convention Cursor: eliminate "self" naming convention XdgToplevel: eliminate "self" naming convention XwaylandView: eliminate "self" naming convention Mapping: eliminate "self" naming convention XwaylandOverrideRedirect: eliminate "self" naming convention InputManager: eliminate "self" naming convention Keyboard: eliminate "self" naming convention Config: eliminate "self" naming convention LayoutManager: eliminate "self" naming convention idle-inhibit: fix naming, eliminate "self" naming convention InputConfig: eliminate "self" naming convention SeatStatus: eliminate "self" naming convention StatusManager: eliminate "self" naming convention PointerMapping: eliminate "self" naming convention LayoutDemand: eliminate "self" naming convention Mode: eliminate "self" naming convention Control: eliminate "self" naming convention SwitchMapping: eliminate "self" naming convention Switch: eliminate "self" naming convention Vector: eliminate "self" naming convention RuleList: eliminate "self" naming convention Server: remove all listeners on deinit() pointer-gestures: move to input manager security-context: implement protocol XdgToplevel: validate move/resize request serial touch: handle cancel event, fix assertion failure deps: update zig-wayland for a minor cleanup Root: increase transaction timeout to 100ms View: fix potential assertion failure on destroy layer-shell: crop surfaces to output bounds docs: migrate to codeberg command/map: add note about upstream xkbcommon fix codeberg: add bug report issue template codeberg: maybe fix issue template codeberg: maybe fix issue template take 2 docs: update wiki url docs: update release urls for codeberg migration logo: add an official river logo docs: update README stability disclaimer docs: fix typo in previous commit ci: migrate to codeberg View: always check if current.output is null logo: use adaptive color/no background for readme View: fix assertion failure if focused while destroying Output: fix possible assertion failure on enable Root: fix leak on view destroy View: add more assertions around destruction river: raise the file descriptor limit docs: add Code of Conduct docs: fix broken link in coc docs: fix another broken link in the coc logo: make readme logo bigger on small displays docs: redefine Code of Conduct scope docs: update URL in man pages layer-surface: close if exclusive zones too large input: minor fixes and cleanups for scroll-factor docs: freshen up readme with text from website docs: remove website url at top of readme build: bump version to 0.3.0 István Donkó (2): keyboard: add the ability to load layout from file input: add scroll-factor configuration Leon Henrik Plickat (16): completions: add keyboard-layout riverctl: Add error messages for failed connections river: allow settings child type of RuleList river: change order of colums in list-rules command river: add tags rule river: fix crash when trying to add tag rule without tag argument river: focus-view and swap by spatial direction river: fix spatial direction focusing / swapping Keyboard: Add new keyboards to groups if matched keyboard-groups: use globber for identifier matching refactor input configuration river: fix names of input config settings command/input: support globs View: restore to previous output on reconnect TabletTool: use "pencil" cursor shape command/focus-view: add -skip-floating LordMZTE (2): river: clear up docs on -c parameter command/input: add map-to-output MaxVerevkin (4): render: premultiply alpha for user-provided colors river: Implement fractional_scale_v1 Cursor: actually set xcursor_name river: Implement cursor_shape_v1 Orfeas (1): attach-mode: implement after <N> Pablo Ovelleiro Corral (1): command/send-to-output: add -current-tags flag Peter Kaplan (3): command/attach-modes: above and below options completions/zsh: Update attach-modes View: Add attachRelative function Sage Hane (1): editorconfig: fix typo Väinö Mäkelä (1): XdgToplevel: keep wlroots updated on view sizes Wouter van Heijst (1): Cursor: Focus follows cursor focuses empty outputs Yutaro Ohno (1): README: update required wlroots version to 0.17.2 Zakariyya Von Forslun (2): Seat: keep parent Xwayland view of a focused OR surface activated Cursor: fix incorrect lock manager state assertion alex (1): river: fix bug in snap down / right polykernel (2): river: add position and dimensions rules river: add fullscreen rule praschke (5): river: Implement input_method and text_input input-method: setKeyboard already sends modifiers input-method: send text-input enter event after all leave events input-method: check that the input method is active when committing input-method: address nits tiosgz (19): Server: remove debug leftover river: update some comments Root: rename field outputs to active_outputs Root: make 'fallback output empty' assertion stricter Root: migrate {all,active}_outputs to wl.list Root: fix inflight_layout_demands counting Cursor: keep focus_follows_cursor_target updated riverctl: rule-{add,del}: reorder parameters completions/fish: partial overhaul completions/bash: complete input devices, fix typos editorconfig: reflect state of bash completion riverctl(1): add a section on terminology Keyboard: fix key handling/eating logic Keyboard: eat key before running mapping KeycodeSet: move to Keyboard.zig Keyboard: rework key processing semantic deps: update zig-wlroots Keyboard: don't crash when coming from a different tty Keyboard: ignore multiple presses of a key