Implement river-input-management-v1 and river-libinput-config-v1
Right now, the support is still incomplete (no way to set config) but we get the devices and set them up and handle current/support events for the river_libinput_device_v1 devices.
This commit is contained in:
parent
ec7474c9af
commit
72c1f33c28
11 changed files with 1523 additions and 22 deletions
|
|
@ -22,18 +22,22 @@ pub fn build(b: *std.Build) void {
|
|||
const xkbcommon = b.dependency("xkbcommon", .{}).module("xkbcommon");
|
||||
const zigimg = b.dependency("zigimg", .{}).module("zigimg");
|
||||
|
||||
scanner.addCustomProtocol(b.path("protocol/river-input-management-v1.xml"));
|
||||
scanner.addCustomProtocol(b.path("protocol/river-libinput-config-v1.xml"));
|
||||
scanner.addCustomProtocol(b.path("protocol/river-layer-shell-v1.xml"));
|
||||
scanner.addCustomProtocol(b.path("protocol/river-window-management-v1.xml"));
|
||||
scanner.addCustomProtocol(b.path("protocol/river-xkb-bindings-v1.xml"));
|
||||
scanner.addCustomProtocol(b.path("protocol/river-layer-shell-v1.xml"));
|
||||
scanner.addSystemProtocol("stable/xdg-shell/xdg-shell.xml"); // dep of wlr-layer-shell-unstable-v1
|
||||
scanner.addCustomProtocol(b.path("protocol/wlr-layer-shell-unstable-v1.xml"));
|
||||
|
||||
scanner.generate("wl_compositor", 4);
|
||||
scanner.generate("wl_shm", 1);
|
||||
scanner.generate("wl_output", 4);
|
||||
scanner.generate("river_input_manager_v1", 1);
|
||||
scanner.generate("river_libinput_config_v1", 1);
|
||||
scanner.generate("river_layer_shell_v1", 1);
|
||||
scanner.generate("river_window_manager_v1", 3);
|
||||
scanner.generate("river_xkb_bindings_v1", 2);
|
||||
scanner.generate("river_layer_shell_v1", 1);
|
||||
scanner.generate("zwlr_layer_shell_v1", 3);
|
||||
|
||||
const options = b.addOptions();
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
.{
|
||||
.name = .beansprout,
|
||||
|
||||
.version = "0.0.0",
|
||||
.version = "0.0.1",
|
||||
|
||||
.fingerprint = 0x145dac71c283d187, // Changing this has security and trust implications.
|
||||
|
||||
|
|
@ -9,8 +9,8 @@
|
|||
|
||||
.dependencies = .{
|
||||
.wayland = .{
|
||||
.url = "https://codeberg.org/ifreund/zig-wayland/archive/v0.4.0.tar.gz",
|
||||
.hash = "wayland-0.4.0-lQa1khbMAQAsLS2eBR7M5lofyEGPIbu2iFDmoz8lPC27",
|
||||
.url = "https://codeberg.org/ifreund/zig-wayland/archive/e57368ecbda85d564362779b253b744260a4b053.tar.gz",
|
||||
.hash = "wayland-0.5.0-dev-lQa1kv_ZAQCZfnVZMocokZ78QJbH6NaM5RUC9ODQPhx5",
|
||||
},
|
||||
.xkbcommon = .{
|
||||
.url = "https://codeberg.org/ifreund/zig-xkbcommon/archive/6786ca619bb442c3f523b5bb894e6a1e48d7e897.tar.gz",
|
||||
|
|
|
|||
240
protocol/river-input-management-v1.xml
Normal file
240
protocol/river-input-management-v1.xml
Normal file
|
|
@ -0,0 +1,240 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="river_input_management_v1">
|
||||
<copyright>
|
||||
SPDX-FileCopyrightText: © 2025 Isaac Freund
|
||||
SPDX-License-Identifier: MIT
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<description summary="configure input devices">
|
||||
This protocol supports creating/destroying seats, assigning input devices to
|
||||
seats, and configuring input devices (e.g. setting keyboard repeat rate).
|
||||
|
||||
The key words "must", "must not", "required", "shall", "shall not",
|
||||
"should", "should not", "recommended", "may", and "optional" in this
|
||||
document are to be interpreted as described in IETF RFC 2119.
|
||||
|
||||
Warning! The protocol described in this file is currently in the testing
|
||||
phase. Backward compatible changes may be added together with the
|
||||
corresponding interface version bump. Backward incompatible changes can only
|
||||
be done by creating a new major version of the extension.
|
||||
</description>
|
||||
|
||||
<interface name="river_input_manager_v1" version="1">
|
||||
<description summary="input manager global interface">
|
||||
Input manager global interface.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="invalid_destroy" value="0"/>
|
||||
</enum>
|
||||
|
||||
<request name="stop">
|
||||
<description summary="stop sending events">
|
||||
This request indicates that the client no longer wishes to receive
|
||||
events on this object.
|
||||
|
||||
The Wayland protocol is asynchronous, which means the server may send
|
||||
further events until the stop request is processed. The client must wait
|
||||
for a river_input_manager_v1.finished event before destroying this
|
||||
object.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="finished">
|
||||
<description summary="the server has finished with the input manager">
|
||||
This event indicates that the server will send no further events on this
|
||||
object. The client should destroy the object. See
|
||||
river_input_manager_v1.destroy for more information.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the river_input_manager_v1 object">
|
||||
This request should be called after the finished event has been received
|
||||
to complete destruction of the object.
|
||||
|
||||
It is a protocol error to make this request before the finished event
|
||||
has been received.
|
||||
|
||||
If a client wishes to destroy this object it should send a
|
||||
river_input_manager_v1.stop request and wait for a
|
||||
river_input_manager_v1.finished event. Once the finished event is
|
||||
received it is safe to destroy this object and any other objects created
|
||||
through this interface.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="create_seat">
|
||||
<description summary="create a new seat">
|
||||
Create a new seat with the given name. Has no effect if a seat with the
|
||||
given name already exists.
|
||||
|
||||
The default seat with name "default" always exists and does not need to
|
||||
be explicitly created.
|
||||
</description>
|
||||
<arg name="name" type="string"/>
|
||||
</request>
|
||||
|
||||
<request name="destroy_seat">
|
||||
<description summary="destroy a seat">
|
||||
Destroy the seat with the given name. Has no effect if a seat with the
|
||||
given name does not exist.
|
||||
|
||||
The default seat with name "default" cannot be destroyed and attempting
|
||||
to destroy it will have no effect.
|
||||
|
||||
Any input devices assigned to the destroyed seat at the time of
|
||||
destruction are assigned to the default seat.
|
||||
</description>
|
||||
<arg name="name" type="string"/>
|
||||
</request>
|
||||
|
||||
<event name="input_device">
|
||||
<description summary="new input device">
|
||||
A new input device has been created.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="river_input_device_v1"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="river_input_device_v1" version="1">
|
||||
<description summary="an input device">
|
||||
An input device represents a physical keyboard, mouse, touchscreen, or
|
||||
drawing tablet tool. It is assigned to exactly one seat at a time.
|
||||
By default, all input devices are assigned to the default seat.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="invalid_repeat_info" value="0"/>
|
||||
<entry name="invalid_scroll_factor" value="1"/>
|
||||
<entry name="invalid_map_to_rectangle" value="2"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the input device object">
|
||||
This request indicates that the client will no longer use the input
|
||||
device object and that it may be safely destroyed.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="removed">
|
||||
<description summary="the input device is removed">
|
||||
This event indicates that the input device has been removed.
|
||||
|
||||
The server will send no further events on this object and ignore any
|
||||
request (other than river_input_device_v1.destroy) made after this event is
|
||||
sent. The client should destroy this object with the
|
||||
river_input_device_v1.destroy request to free up resources.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<enum name="type">
|
||||
<entry name="keyboard" value="0"/>
|
||||
<entry name="pointer" value="1"/>
|
||||
<entry name="touch" value="2"/>
|
||||
<entry name="tablet" value="3"/>
|
||||
</enum>
|
||||
|
||||
<event name="type">
|
||||
<description summary="the type of the input device">
|
||||
The type of the input device. This event is sent once when the
|
||||
river_input_device_v1 object is created. The device type cannot
|
||||
change during the lifetime of the object.
|
||||
</description>
|
||||
<arg name="type" type="uint" enum="type"/>
|
||||
</event>
|
||||
|
||||
<event name="name">
|
||||
<description summary="the name of the input device">
|
||||
The name of the input device. This event is sent once when the
|
||||
river_input_device_v1 object is created. The device name cannot
|
||||
change during the lifetime of the object.
|
||||
</description>
|
||||
<arg name="name" type="string"/>
|
||||
</event>
|
||||
|
||||
<request name="assign_to_seat">
|
||||
<description summary="assign the input device to a seat">
|
||||
Assign the input device to a seat. All input devices not explicitly
|
||||
assigned to a seat are considered assigned to the default seat.
|
||||
|
||||
Has no effect if a seat with the given name does not exist.
|
||||
</description>
|
||||
<arg name="name" type="string" summary="name of the seat"/>
|
||||
</request>
|
||||
|
||||
<request name="set_repeat_info">
|
||||
<description summary="set keyboard repeat rate and delay">
|
||||
Set repeat rate and delay for a keyboard input device. Has no effect if
|
||||
the device is not a keyboard.
|
||||
|
||||
Negative values for either rate or delay are illegal. A rate of zero
|
||||
will disable any repeating (regardless of the value of delay).
|
||||
</description>
|
||||
<arg name="rate" type="int" summary="rate in key repeats per second"/>
|
||||
<arg name="delay" type="int" summary="delay in milliseconds"/>
|
||||
</request>
|
||||
|
||||
<request name="set_scroll_factor">
|
||||
<description summary="set scroll factor">
|
||||
Set the scroll factor for a pointer input device. Has no effect if the
|
||||
device is not a pointer.
|
||||
|
||||
For example, a factor of 0.5 will make scrolling twice as slow while a
|
||||
factor of 3.0 will make scrolling 3 times as fast.
|
||||
|
||||
Negative values for either rate or delay are illegal. A rate of zero
|
||||
will disable any repeating (regardless of the value of delay).
|
||||
</description>
|
||||
<arg name="factor" type="fixed"/>
|
||||
</request>
|
||||
|
||||
<request name="map_to_output">
|
||||
<description summary="map input device to the given output">
|
||||
Map the input device to the given output. Has no effect if the device is
|
||||
not a pointer, touch, or tablet device.
|
||||
|
||||
If mapped to both an output and a rectangle, the rectangle has priority.
|
||||
|
||||
Passing null clears an existing mapping.
|
||||
</description>
|
||||
<arg name="output" type="object" interface="wl_output" allow-null="true"/>
|
||||
</request>
|
||||
|
||||
<request name="map_to_rectangle">
|
||||
<description summary="map input device to the given rectangle">
|
||||
Map the input device to the given rectangle in the global compositor
|
||||
coordinate space. Has no effect if the device is not a pointer, touch,
|
||||
or tablet device.
|
||||
|
||||
If mapped to both an output and a rectangle, the rectangle has priority.
|
||||
|
||||
Width and height must be greater than or equal to 0.
|
||||
|
||||
Passing 0 for width or height clears an existing mapping.
|
||||
</description>
|
||||
<arg name="x" type="int"/>
|
||||
<arg name="y" type="int"/>
|
||||
<arg name="width" type="int"/>
|
||||
<arg name="height" type="int"/>
|
||||
</request>
|
||||
</interface>
|
||||
</protocol>
|
||||
892
protocol/river-libinput-config-v1.xml
Normal file
892
protocol/river-libinput-config-v1.xml
Normal file
|
|
@ -0,0 +1,892 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="river_libinput_config_v1">
|
||||
<copyright>
|
||||
SPDX-FileCopyrightText: © 2025 Isaac Freund
|
||||
SPDX-License-Identifier: MIT
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<description summary="configure libinput devices">
|
||||
This protocol exposes libinput device configuration APIs. The libinput
|
||||
documentation should be referred to for detailed information on libinput's
|
||||
behavior.
|
||||
|
||||
This protocol is designed so that (hopefully) any backwards compatible
|
||||
change to libinput's API can be matched with a backwards compatible change
|
||||
to this protocol.
|
||||
|
||||
Note: the libinput API uses floating point types (float and double in C)
|
||||
which are not (yet?) natively supported by the Wayland protocol. However,
|
||||
the Wayland protocol does support sending arbitrary bytes through the array
|
||||
argument type. This protocol uses e.g. type="array" summary="double" to
|
||||
indicate a native-endian IEEE-754 64-bit double value.
|
||||
|
||||
The key words "must", "must not", "required", "shall", "shall not",
|
||||
"should", "should not", "recommended", "may", and "optional" in this
|
||||
document are to be interpreted as described in IETF RFC 2119.
|
||||
|
||||
Warning! The protocol described in this file is currently in the testing
|
||||
phase. Backward compatible changes may be added together with the
|
||||
corresponding interface version bump. Backward incompatible changes can only
|
||||
be done by creating a new major version of the extension.
|
||||
</description>
|
||||
|
||||
<interface name="river_libinput_config_v1" version="1">
|
||||
<description summary="libinput config global interface">
|
||||
Global interface for configuring libinput devices. This global should
|
||||
only be advertised if river_input_manager_v1 is advertised as well.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="invalid_arg" value="0"
|
||||
summary="invalid enum value or similar"/>
|
||||
<entry name="invalid_destroy" value="1"/>
|
||||
</enum>
|
||||
|
||||
<request name="stop">
|
||||
<description summary="stop sending events">
|
||||
This request indicates that the client no longer wishes to receive
|
||||
events on this object.
|
||||
|
||||
The Wayland protocol is asynchronous, which means the server may send
|
||||
further events until the stop request is processed. The client must wait
|
||||
for a river_libinput_config_v1.finished event before destroying this
|
||||
object.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="finished">
|
||||
<description summary="the server has finished with the object">
|
||||
This event indicates that the server will send no further events on this
|
||||
object. The client should destroy the object. See
|
||||
river_libinput_config_v1.destroy for more information.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the river_libinput_config_v1 object">
|
||||
This request should be called after the finished event has been received
|
||||
to complete destruction of the object.
|
||||
|
||||
It is a protocol error to make this request before the finished event
|
||||
has been received.
|
||||
|
||||
If a client wishes to destroy this object it should send a
|
||||
river_libinput_config_v1.stop request and wait for a
|
||||
river_libinput_config_v1.finished event. Once the finished event is
|
||||
received it is safe to destroy this object and any other objects created
|
||||
through this interface.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="libinput_device">
|
||||
<description summary="new libinput device">
|
||||
A new libinput device has been created. Not every river_input_device_v1
|
||||
is necessarily a libinput device as well.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="river_libinput_device_v1"/>
|
||||
</event>
|
||||
|
||||
<request name="create_accel_config">
|
||||
<description summary="create a acceleration config">
|
||||
Create a acceleration config which can be applied
|
||||
with river_libinput_device_v1.apply_accel_config.
|
||||
</description>
|
||||
<arg name="id" type="new_id"
|
||||
interface="river_libinput_accel_config_v1"/>
|
||||
<arg name="profile" type="uint"
|
||||
enum="river_libinput_device_v1.accel_profile"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="river_libinput_device_v1" version="1">
|
||||
<description summary="a libinput device">
|
||||
In general, *_support events will be sent exactly once directly after the
|
||||
river_libinput_device_v1 is created. *_default events will be sent after
|
||||
*_support events if the config option is supported, and *_current events
|
||||
willl be sent after the *_default events and again whenever the config
|
||||
option is changed.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="invalid_arg" value="0"
|
||||
summary="invalid enum value or similar"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the libinput device object">
|
||||
This request indicates that the client will no longer use the input
|
||||
device object and that it may be safely destroyed.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="removed">
|
||||
<description summary="the libinput device is removed">
|
||||
This event indicates that the libinput device has been removed.
|
||||
|
||||
The server will send no further events on this object and ignore any
|
||||
request (other than river_libinput_device_v1.destroy) made after this
|
||||
event is sent. The client should destroy this object with the
|
||||
river_libinput_device_v1.destroy request to free up resources.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<event name="input_device">
|
||||
<description summary="corresponding river input device">
|
||||
The river_input_device_v1 corresponding to this libinput device.
|
||||
This event will always be the first event sent on the
|
||||
river_libinput_device_v1 object, and it will be sent exactly once.
|
||||
</description>
|
||||
<arg name="device" type="object" interface="river_input_device_v1"/>
|
||||
</event>
|
||||
|
||||
<enum name="send_events_modes" bitfield="true">
|
||||
<entry name="enabled" value="0"/>
|
||||
<entry name="disabled" value="1"/>
|
||||
<entry name="disabled_on_external_mouse" value="2"/>
|
||||
</enum>
|
||||
|
||||
<event name="send_events_support">
|
||||
<description summary="supported send events modes">
|
||||
Supported send events modes.
|
||||
</description>
|
||||
<arg name="modes" type="uint" enum="send_events_modes"/>
|
||||
</event>
|
||||
|
||||
<event name="send_events_default">
|
||||
<description summary="default send events mode">
|
||||
Default send events mode.
|
||||
</description>
|
||||
<arg name="mode" type="uint" enum="send_events_modes"/>
|
||||
</event>
|
||||
|
||||
<event name="send_events_current">
|
||||
<description summary="current send events mode">
|
||||
Current send events mode.
|
||||
</description>
|
||||
<arg name="mode" type="uint" enum="send_events_modes"/>
|
||||
</event>
|
||||
|
||||
<request name="set_send_events">
|
||||
<description summary="set send events mode">
|
||||
Set the send events mode for the device.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="mode" type="uint" enum="send_events_modes"/>
|
||||
</request>
|
||||
|
||||
<enum name="tap_state">
|
||||
<entry name="disabled" value="0"/>
|
||||
<entry name="enabled" value="1"/>
|
||||
</enum>
|
||||
|
||||
<event name="tap_support">
|
||||
<description summary="tap-to-click/drag support">
|
||||
The number of fingers supported for tap-to-click/drag.
|
||||
If finger_count is 0, tap-to-click and drag are unsupported.
|
||||
</description>
|
||||
<arg name="finger_count" type="int"/>
|
||||
</event>
|
||||
|
||||
<event name="tap_default">
|
||||
<description summary="default tap-to-click state">
|
||||
Default tap-to-click state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="tap_state"/>
|
||||
</event>
|
||||
|
||||
<event name="tap_current">
|
||||
<description summary="current tap-to-click state">
|
||||
Current tap-to-click state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="tap_state"/>
|
||||
</event>
|
||||
|
||||
<request name="set_tap">
|
||||
<description summary="enable/disable tap-to-click">
|
||||
Configure tap-to-click on this device, with a default mapping of
|
||||
1, 2, 3 finger tap mapping to left, right, middle click, respectively.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="state" type="uint" enum="tap_state"/>
|
||||
</request>
|
||||
|
||||
<enum name="tap_button_map">
|
||||
<entry name="lrm" value="0"
|
||||
summary="1/2/3 finger tap maps to left/right/middle"/>
|
||||
<entry name="lmr" value="1"
|
||||
summary="1/2/3 finger tap maps to left/middle/right"/>
|
||||
</enum>
|
||||
|
||||
<event name="tap_button_map_default">
|
||||
<description summary="default tap-to-click button map">
|
||||
Default tap-to-click button map.
|
||||
</description>
|
||||
<arg name="button_map" type="uint" enum="tap_button_map"/>
|
||||
</event>
|
||||
|
||||
<event name="tap_button_map_current">
|
||||
<description summary="current tap-to-click button map">
|
||||
Current tap-to-click button map.
|
||||
</description>
|
||||
<arg name="button_map" type="uint" enum="tap_button_map"/>
|
||||
</event>
|
||||
|
||||
<request name="set_tap_button_map">
|
||||
<description summary="set tap-to-click button map">
|
||||
Set the finger number to button number mapping for tap-to-click. The
|
||||
default mapping on most devices is to have a 1, 2 and 3 finger tap to
|
||||
map to the left, right and middle button, respectively.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="button_map" type="uint" enum="tap_button_map"/>
|
||||
</request>
|
||||
|
||||
<enum name="drag_state">
|
||||
<entry name="disabled" value="0"/>
|
||||
<entry name="enabled" value="1"/>
|
||||
</enum>
|
||||
|
||||
<event name="drag_default">
|
||||
<description summary="default tap-and-drag state">
|
||||
Default tap-and-drag state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="drag_state"/>
|
||||
</event>
|
||||
|
||||
<event name="drag_current">
|
||||
<description summary="current tap-and-drag state">
|
||||
Current tap-and-drag state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="drag_state"/>
|
||||
</event>
|
||||
|
||||
<request name="set_drag">
|
||||
<description summary="set tap-and-drag state">
|
||||
Configure tap-and-drag functionality on the device.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="state" type="uint" enum="drag_state"/>
|
||||
</request>
|
||||
|
||||
<enum name="drag_lock_state">
|
||||
<entry name="disabled" value="0"/>
|
||||
<entry name="enabled_timeout" value="1"/>
|
||||
<entry name="enabled_sticky" value="2"/>
|
||||
</enum>
|
||||
|
||||
<event name="drag_lock_default">
|
||||
<description summary="default drag lock state">
|
||||
Default drag lock state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="drag_lock_state"/>
|
||||
</event>
|
||||
|
||||
<event name="drag_lock_current">
|
||||
<description summary="current drag lock state">
|
||||
Current drag lock state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="drag_lock_state"/>
|
||||
</event>
|
||||
|
||||
<request name="set_drag_lock">
|
||||
<description summary="set drag lock state">
|
||||
Configure drag-lock during tapping on this device. When enabled, a
|
||||
finger may be lifted and put back on the touchpad and the drag process
|
||||
continues. A timeout for lifting the finger is optional. When disabled,
|
||||
lifting the finger during a tap-and-drag will immediately stop the drag.
|
||||
See the libinput documentation for more details.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="state" type="uint" enum="drag_lock_state"/>
|
||||
</request>
|
||||
|
||||
<event name="three_finger_drag_support">
|
||||
<description summary="three finger drag support">
|
||||
The number of fingers supported for three/four finger drag.
|
||||
If finger_count is less than 3, three finger drag is unsupported.
|
||||
</description>
|
||||
<arg name="finger_count" type="int"/>
|
||||
</event>
|
||||
|
||||
<enum name="three_finger_drag_state">
|
||||
<entry name="disabled" value="0"/>
|
||||
<entry name="enabled_3fg" value="1"/>
|
||||
<entry name="enabled_4fg" value="2"/>
|
||||
</enum>
|
||||
|
||||
<event name="three_finger_drag_default">
|
||||
<description summary="default three finger drag state">
|
||||
Default three finger drag state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="three_finger_drag_state"/>
|
||||
</event>
|
||||
|
||||
<event name="three_finger_drag_current">
|
||||
<description summary="current three finger drag state">
|
||||
Current three finger drag state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="three_finger_drag_state"/>
|
||||
</event>
|
||||
|
||||
<request name="set_three_finger_drag">
|
||||
<description summary="set three finger drag state">
|
||||
Configure three finger drag functionality for the device.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="state" type="uint" enum="three_finger_drag_state"/>
|
||||
</request>
|
||||
|
||||
<event name="calibration_matrix_support">
|
||||
<description summary="support for a calibration matrix">
|
||||
A calibration matrix is supported if the supported argument is non-zero.
|
||||
</description>
|
||||
<arg name="supported" type="int" summary="boolean"/>
|
||||
</event>
|
||||
|
||||
<event name="calibration_matrix_default">
|
||||
<description summary="default calibration matrix">
|
||||
Default calibration matrix.
|
||||
</description>
|
||||
<arg name="matrix" type="array" summary="array of 6 floats"/>
|
||||
</event>
|
||||
|
||||
<event name="calibration_matrix_current">
|
||||
<description summary="current calibration matrix">
|
||||
Current calibration matrix.
|
||||
</description>
|
||||
<arg name="matrix" type="array" summary="array of 6 floats"/>
|
||||
</event>
|
||||
|
||||
<request name="set_calibration_matrix">
|
||||
<description summary="set calibration matrix">
|
||||
Set calibration matrix.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="matrix" type="array" summary="array of 6 floats"/>
|
||||
</request>
|
||||
|
||||
<enum name="accel_profile">
|
||||
<entry name="none" value="0"/>
|
||||
<entry name="flat" value="1"/>
|
||||
<entry name="adaptive" value="2"/>
|
||||
<entry name="custom" value="4"/>
|
||||
</enum>
|
||||
|
||||
<enum name="accel_profiles" bitfield="true">
|
||||
<entry name="none" value="0"/>
|
||||
<entry name="flat" value="1"/>
|
||||
<entry name="adaptive" value="2"/>
|
||||
<entry name="custom" value="4"/>
|
||||
</enum>
|
||||
|
||||
<event name="accel_profiles_support">
|
||||
<description summary="supported acceleration profiles">
|
||||
Supported acceleration profiles.
|
||||
</description>
|
||||
<arg name="profiles" type="uint" enum="accel_profiles"/>
|
||||
</event>
|
||||
|
||||
<event name="accel_profile_default">
|
||||
<description summary="default acceleration profile">
|
||||
Default acceleration profile.
|
||||
</description>
|
||||
<arg name="profile" type="uint" enum="accel_profile"/>
|
||||
</event>
|
||||
|
||||
<event name="accel_profile_current">
|
||||
<description summary="current send events mode">
|
||||
Current acceleration profile.
|
||||
</description>
|
||||
<arg name="profile" type="uint" enum="accel_profile"/>
|
||||
</event>
|
||||
|
||||
<request name="set_accel_profile">
|
||||
<description summary="set send events mode">
|
||||
Set the acceleration profile.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="profile" type="uint" enum="accel_profile"/>
|
||||
</request>
|
||||
|
||||
<event name="accel_speed_default">
|
||||
<description summary="default acceleration speed">
|
||||
Default acceleration speed.
|
||||
</description>
|
||||
<arg name="speed" type="array" summary="double"/>
|
||||
</event>
|
||||
|
||||
<event name="accel_speed_current">
|
||||
<description summary="current acceleration speed">
|
||||
Current acceleration speed.
|
||||
</description>
|
||||
<arg name="speed" type="array" summary="double"/>
|
||||
</event>
|
||||
|
||||
<request name="set_accel_speed">
|
||||
<description summary="set acceleration speed">
|
||||
Set the acceleration speed within a range of [-1, 1], where 0 is
|
||||
the default acceleration for this device, -1 is the slowest acceleration
|
||||
and 1 is the maximum acceleration available on this device.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="speed" type="array" summary="double"/>
|
||||
</request>
|
||||
|
||||
<request name="apply_accel_config">
|
||||
<description summary="apply acceleration config">
|
||||
Apply a pointer accleration config.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="config" type="object" interface="river_libinput_accel_config_v1"/>
|
||||
</request>
|
||||
|
||||
<event name="natural_scroll_support">
|
||||
<description summary="support for natural scroll">
|
||||
Natural scroll is supported if the supported argument is non-zero.
|
||||
</description>
|
||||
<arg name="supported" type="int" summary="boolean"/>
|
||||
</event>
|
||||
|
||||
<enum name="natural_scroll_state">
|
||||
<entry name="disabled" value="0"/>
|
||||
<entry name="enabled" value="1"/>
|
||||
</enum>
|
||||
|
||||
<event name="natural_scroll_default">
|
||||
<description summary="default natural scroll">
|
||||
Default natural scroll.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="natural_scroll_state"/>
|
||||
</event>
|
||||
|
||||
<event name="natural_scroll_current">
|
||||
<description summary="current natural scroll state">
|
||||
Current natural scroll.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="natural_scroll_state"/>
|
||||
</event>
|
||||
|
||||
<request name="set_natural_scroll">
|
||||
<description summary="set natural scroll state">
|
||||
Set natural scroll state.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="state" type="uint" enum="natural_scroll_state"/>
|
||||
</request>
|
||||
|
||||
<event name="left_handed_support">
|
||||
<description summary="support for left-handed mode">
|
||||
Left-handed mode is supported if the supported argument is non-zero.
|
||||
</description>
|
||||
<arg name="supported" type="int" summary="boolean"/>
|
||||
</event>
|
||||
|
||||
<enum name="left_handed_state">
|
||||
<entry name="disabled" value="0"/>
|
||||
<entry name="enabled" value="1"/>
|
||||
</enum>
|
||||
|
||||
<event name="left_handed_default">
|
||||
<description summary="default left-handed mode">
|
||||
Default left-handed mode.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="left_handed_state"/>
|
||||
</event>
|
||||
|
||||
<event name="left_handed_current">
|
||||
<description summary="current left-handed mode state">
|
||||
Current left-handed mode.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="left_handed_state"/>
|
||||
</event>
|
||||
|
||||
<request name="set_left_handed">
|
||||
<description summary="set left-handed mode state">
|
||||
Set left-handed mode state.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="state" type="uint" enum="left_handed_state"/>
|
||||
</request>
|
||||
|
||||
<enum name="click_method">
|
||||
<entry name="none" value="0"/>
|
||||
<entry name="button_areas" value="1"/>
|
||||
<entry name="clickfinger" value="2"/>
|
||||
</enum>
|
||||
|
||||
<enum name="click_methods" bitfield="true">
|
||||
<entry name="none" value="0"/>
|
||||
<entry name="button_areas" value="1"/>
|
||||
<entry name="clickfinger" value="2"/>
|
||||
</enum>
|
||||
|
||||
<event name="click_method_support">
|
||||
<description summary="supported click methods">
|
||||
The click methods suppported by the device.
|
||||
</description>
|
||||
<arg name="methods" type="uint" enum="click_methods"/>
|
||||
</event>
|
||||
|
||||
<event name="click_method_default">
|
||||
<description summary="default click method">
|
||||
Default click method.
|
||||
</description>
|
||||
<arg name="method" type="uint" enum="click_method"/>
|
||||
</event>
|
||||
|
||||
<event name="click_method_current">
|
||||
<description summary="current click method">
|
||||
Current click method.
|
||||
</description>
|
||||
<arg name="method" type="uint" enum="click_method"/>
|
||||
</event>
|
||||
|
||||
<request name="set_click_method">
|
||||
<description summary="set click method">
|
||||
Set click method.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="method" type="uint" enum="click_method"/>
|
||||
</request>
|
||||
|
||||
<enum name="clickfinger_button_map">
|
||||
<entry name="lrm" value="0"/>
|
||||
<entry name="lmr" value="1"/>
|
||||
</enum>
|
||||
|
||||
<event name="clickfinger_button_map_default">
|
||||
<description summary="default clickfinger button map">
|
||||
Default clickfinger button map.
|
||||
Supported if click_methods.clickfinger is supported.
|
||||
</description>
|
||||
<arg name="button_map" type="uint" enum="clickfinger_button_map"/>
|
||||
</event>
|
||||
|
||||
<event name="clickfinger_button_map_current">
|
||||
<description summary="current clickfinger button map">
|
||||
Current clickfinger button map.
|
||||
Supported if click_methods.clickfinger is supported.
|
||||
</description>
|
||||
<arg name="button_map" type="uint" enum="clickfinger_button_map"/>
|
||||
</event>
|
||||
|
||||
<request name="set_clickfinger_button_map">
|
||||
<description summary="set clickfinger button map">
|
||||
Set clickfinger button map.
|
||||
Supported if click_methods.clickfinger is supported.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="button_map" type="uint" enum="clickfinger_button_map"/>
|
||||
</request>
|
||||
|
||||
<event name="middle_emulation_support">
|
||||
<description summary="support for middle mouse button emulation">
|
||||
Middle mouse button emulation is supported if the supported argument is
|
||||
non-zero.
|
||||
</description>
|
||||
<arg name="supported" type="int" summary="boolean"/>
|
||||
</event>
|
||||
|
||||
<enum name="middle_emulation_state">
|
||||
<entry name="disabled" value="0"/>
|
||||
<entry name="enabled" value="1"/>
|
||||
</enum>
|
||||
|
||||
<event name="middle_emulation_default">
|
||||
<description summary="default middle mouse button emulation">
|
||||
Default middle mouse button emulation.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="middle_emulation_state"/>
|
||||
</event>
|
||||
|
||||
<event name="middle_emulation_current">
|
||||
<description summary="current middle mouse button emulation state">
|
||||
Current middle mouse button emulation.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="middle_emulation_state"/>
|
||||
</event>
|
||||
|
||||
<request name="set_middle_emulation">
|
||||
<description summary="set middle mouse button emulation state">
|
||||
Set middle mouse button emulation state.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="state" type="uint" enum="middle_emulation_state"/>
|
||||
</request>
|
||||
|
||||
<enum name="scroll_method">
|
||||
<entry name="no_scroll" value="0"/>
|
||||
<entry name="two_finger" value="1"/>
|
||||
<entry name="edge" value="2"/>
|
||||
<entry name="on_button_down" value="4"/>
|
||||
</enum>
|
||||
|
||||
<enum name="scroll_methods" bitfield="true">
|
||||
<entry name="no_scroll" value="0"/>
|
||||
<entry name="two_finger" value="1"/>
|
||||
<entry name="edge" value="2"/>
|
||||
<entry name="on_button_down" value="4"/>
|
||||
</enum>
|
||||
|
||||
<event name="scroll_method_support">
|
||||
<description summary="supported scroll methods">
|
||||
The scroll methods suppported by the device.
|
||||
</description>
|
||||
<arg name="methods" type="uint" enum="scroll_methods"/>
|
||||
</event>
|
||||
|
||||
<event name="scroll_method_default">
|
||||
<description summary="default scroll method">
|
||||
Default scroll method.
|
||||
</description>
|
||||
<arg name="method" type="uint" enum="scroll_method"/>
|
||||
</event>
|
||||
|
||||
<event name="scroll_method_current">
|
||||
<description summary="current scroll method">
|
||||
Current scroll method.
|
||||
</description>
|
||||
<arg name="method" type="uint" enum="scroll_method"/>
|
||||
</event>
|
||||
|
||||
<request name="set_scroll_method">
|
||||
<description summary="set scroll method">
|
||||
Set scroll method.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="method" type="uint" enum="scroll_method"/>
|
||||
</request>
|
||||
|
||||
<event name="scroll_button_default">
|
||||
<description summary="default scroll button">
|
||||
Default scroll button.
|
||||
Supported if scroll_methods.on_button_down is supported.
|
||||
</description>
|
||||
<arg name="button" type="uint"/>
|
||||
</event>
|
||||
|
||||
<event name="scroll_button_current">
|
||||
<description summary="current scroll button">
|
||||
Current scroll button.
|
||||
Supported if scroll_methods.on_button_down is supported.
|
||||
</description>
|
||||
<arg name="button" type="uint"/>
|
||||
</event>
|
||||
|
||||
<request name="set_scroll_button">
|
||||
<description summary="set scroll button">
|
||||
Set scroll button.
|
||||
Supported if scroll_methods.on_button_down is supported.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="button" type="uint"/>
|
||||
</request>
|
||||
|
||||
<enum name="scroll_button_lock_state">
|
||||
<entry name="disabled" value="0"/>
|
||||
<entry name="enabled" value="1"/>
|
||||
</enum>
|
||||
|
||||
<event name="scroll_button_lock_default">
|
||||
<description summary="default scroll button lock state">
|
||||
Default scroll button lock state.
|
||||
Supported if scroll_methods.on_button_down is supported.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="scroll_button_lock_state"/>
|
||||
</event>
|
||||
|
||||
<event name="scroll_button_lock_current">
|
||||
<description summary="current scroll button lock state">
|
||||
Current scroll button lock state.
|
||||
Supported if scroll_methods.on_button_down is supported.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="scroll_button_lock_state"/>
|
||||
</event>
|
||||
|
||||
<request name="set_scroll_button_lock">
|
||||
<description summary="set scroll button lock state">
|
||||
Set scroll button lock state.
|
||||
Supported if scroll_methods.on_button_down is supported.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="state" type="uint" enum="scroll_button_lock_state"/>
|
||||
</request>
|
||||
|
||||
<event name="dwt_support">
|
||||
<description summary="support for disable-while-typing">
|
||||
Disable-while-typing is supported if the supported argument is
|
||||
non-zero.
|
||||
</description>
|
||||
<arg name="supported" type="int" summary="boolean"/>
|
||||
</event>
|
||||
|
||||
<enum name="dwt_state">
|
||||
<entry name="disabled" value="0"/>
|
||||
<entry name="enabled" value="1"/>
|
||||
</enum>
|
||||
|
||||
<event name="dwt_default">
|
||||
<description summary="default disable-while-typing state">
|
||||
Default disable-while-typing state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="dwt_state"/>
|
||||
</event>
|
||||
|
||||
<event name="dwt_current">
|
||||
<description summary="current disable-while-typing state">
|
||||
Current disable-while-typing state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="dwt_state"/>
|
||||
</event>
|
||||
|
||||
<request name="set_dwt">
|
||||
<description summary="set disable-while-typing state">
|
||||
Set disable-while-typing state.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="state" type="uint" enum="dwt_state"/>
|
||||
</request>
|
||||
|
||||
<event name="dwtp_support">
|
||||
<description summary="support for disable-while-trackpointing">
|
||||
Disable-while-trackpointing is supported if the supported argument is
|
||||
non-zero.
|
||||
</description>
|
||||
<arg name="supported" type="int" summary="boolean"/>
|
||||
</event>
|
||||
|
||||
<enum name="dwtp_state">
|
||||
<entry name="disabled" value="0"/>
|
||||
<entry name="enabled" value="1"/>
|
||||
</enum>
|
||||
|
||||
<event name="dwtp_default">
|
||||
<description summary="default disable-while-trackpointing state">
|
||||
Default disable-while-trackpointing state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="dwtp_state"/>
|
||||
</event>
|
||||
|
||||
<event name="dwtp_current">
|
||||
<description summary="current disable-while-trackpointing state">
|
||||
Current disable-while-trackpointing state.
|
||||
</description>
|
||||
<arg name="state" type="uint" enum="dwtp_state"/>
|
||||
</event>
|
||||
|
||||
<request name="set_dwtp">
|
||||
<description summary="set disable-while-trackpointing state">
|
||||
Set disable-while-trackpointing state.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="state" type="uint" enum="dwtp_state"/>
|
||||
</request>
|
||||
|
||||
<event name="rotation_support">
|
||||
<description summary="support for rotation">
|
||||
Rotation is supported if the supported argument is non-zero.
|
||||
</description>
|
||||
<arg name="supported" type="int" summary="boolean"/>
|
||||
</event>
|
||||
|
||||
<event name="rotation_default">
|
||||
<description summary="default rotation angle">
|
||||
Default rotation angle.
|
||||
</description>
|
||||
<arg name="angle" type="uint"/>
|
||||
</event>
|
||||
|
||||
<event name="rotation_current">
|
||||
<description summary="current rotation angle">
|
||||
Current rotation angle.
|
||||
</description>
|
||||
<arg name="angle" type="uint"/>
|
||||
</event>
|
||||
|
||||
<request name="set_rotation">
|
||||
<description summary="set rotation angle">
|
||||
Set rotation angle in degrees clockwise off the logical neutral
|
||||
position. Angle must be in the range [0-360).
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="angle" type="uint"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="river_libinput_accel_config_v1" version="1">
|
||||
<description summary="acceleration config">
|
||||
The result returned by libinput on setting configuration for a device.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="invalid_arg" value="0"
|
||||
summary="invalid enum value or similar"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the accel object">
|
||||
This request indicates that the client will no longer use the accel
|
||||
config object and that it may be safely destroyed.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="accel_type">
|
||||
<entry name="fallback" value="0"/>
|
||||
<entry name="motion" value="1"/>
|
||||
<entry name="scroll" value="2"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_points">
|
||||
<description summary="define custom acceleration function">
|
||||
Defines the acceleration function for a given movement type
|
||||
in an acceleration configuration with custom accel profile.
|
||||
</description>
|
||||
<arg name="result" type="new_id" interface="river_libinput_result_v1"/>
|
||||
<arg name="type" type="uint" enum="accel_type"/>
|
||||
<arg name="step" type="array" summary="double"/>
|
||||
<arg name="points" type="array" summary="array of doubles"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="river_libinput_result_v1" version="1">
|
||||
<description summary="config application result">
|
||||
The result returned by libinput on setting configuration for a device.
|
||||
</description>
|
||||
|
||||
<event name="success" type="destructor">
|
||||
<description summary="config success">
|
||||
The configuration was successfully applied to the device.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<event name="unsupported" type="destructor">
|
||||
<description summary="config unsupported">
|
||||
The configuration is unsupported by the device and was ignored.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<event name="invalid" type="destructor">
|
||||
<description summary="config invalid">
|
||||
The configuration is invalid and was ignored.
|
||||
</description>
|
||||
</event>
|
||||
</interface>
|
||||
</protocol>
|
||||
|
|
@ -192,7 +192,7 @@ fn load(config: *Config, reader: *Io.Reader) !void {
|
|||
continue;
|
||||
}
|
||||
|
||||
const path_str = utils.stripQuotes(node.arg(&parser, 0) orelse unreachable);
|
||||
const path_str = utils.stripQuotes(node.arg(&parser, 0).?);
|
||||
config.wallpaper_image_path = expandTilde(path_str) catch {
|
||||
logWarnInvalidNodeArg(name, path_str);
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2026 Ben Buhse <me@benbuhse.email>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
//
|
||||
//
|
||||
|
||||
/// Context to pass Wayland info around.
|
||||
const Context = @This();
|
||||
|
|
@ -19,6 +17,7 @@ wl_outputs: *std.AutoHashMapUnmanaged(u32, *wl.Output),
|
|||
zwlr_layer_shell_v1: *zwlr.LayerShellV1,
|
||||
|
||||
// Wayland globals that we have special structs for
|
||||
im: *InputManager,
|
||||
wm: *WindowManager,
|
||||
xkb_bindings: *XkbBindings,
|
||||
|
||||
|
|
@ -48,6 +47,8 @@ pub const Options = struct {
|
|||
wl_shm: *wl.Shm,
|
||||
wl_outputs: *std.AutoHashMapUnmanaged(u32, *wl.Output),
|
||||
|
||||
river_input_manager_v1: *river.InputManagerV1,
|
||||
river_libinput_config_v1: *river.LibinputConfigV1,
|
||||
river_layer_shell_v1: *river.LayerShellV1, // TODO
|
||||
river_window_manager_v1: *river.WindowManagerV1,
|
||||
river_xkb_bindings_v1: *river.XkbBindingsV1,
|
||||
|
|
@ -69,6 +70,7 @@ pub fn create(options: Options) !*Context {
|
|||
.wl_outputs = options.wl_outputs,
|
||||
.zwlr_layer_shell_v1 = options.zwlr_layer_shell_v1,
|
||||
.wallpaper_image = loadWallpaperImage(options.config),
|
||||
.im = try InputManager.create(context, options.river_input_manager_v1, options.river_libinput_config_v1),
|
||||
.wm = try WindowManager.create(context, options.river_window_manager_v1),
|
||||
.xkb_bindings = try XkbBindings.create(context, options.river_xkb_bindings_v1),
|
||||
.config = options.config,
|
||||
|
|
@ -156,8 +158,9 @@ const wl = wayland.client.wl;
|
|||
const zwlr = wayland.client.zwlr;
|
||||
|
||||
const utils = @import("utils.zig");
|
||||
const Config = @import("Config.zig");
|
||||
const BufferPool = @import("BufferPool.zig");
|
||||
const Config = @import("Config.zig");
|
||||
const InputManager = @import("InputManager.zig");
|
||||
const WallpaperImage = @import("WallpaperImage.zig");
|
||||
const WindowManager = @import("WindowManager.zig");
|
||||
const XkbBindings = @import("XkbBindings.zig");
|
||||
|
|
|
|||
76
src/InputDevice.zig
Normal file
76
src/InputDevice.zig
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
// SPDX-FileCopyrightText: 2026 Ben Buhse <me@benbuhse.email>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
const InputDevice = @This();
|
||||
|
||||
river_input_device_v1: *river.InputDeviceV1,
|
||||
|
||||
/// The LibinputDevice that corresponds to this same InputDevice.
|
||||
/// This comes later (and from a separate river protocol) and
|
||||
/// not all InputDevices are necessarily LibinputDevices, too,
|
||||
/// so it's optional.
|
||||
libinput_device: ?*LibinputDevice = null,
|
||||
|
||||
type: ?Type = null,
|
||||
name: ?[]const u8 = null,
|
||||
|
||||
link: wl.list.Link,
|
||||
|
||||
pub fn create(river_input_device_v1: *river.InputDeviceV1) !*InputDevice {
|
||||
const input_device = try utils.allocator.create(InputDevice);
|
||||
errdefer input_device.destroy();
|
||||
|
||||
input_device.* = .{
|
||||
.river_input_device_v1 = river_input_device_v1,
|
||||
.link = undefined, // handled by the wl.List
|
||||
};
|
||||
|
||||
input_device.river_input_device_v1.setListener(
|
||||
*InputDevice,
|
||||
riverInputDeviceV1Listener,
|
||||
input_device,
|
||||
);
|
||||
|
||||
return input_device;
|
||||
}
|
||||
|
||||
pub fn destroy(input_device: *InputDevice) void {
|
||||
input_device.link.remove();
|
||||
utils.allocator.destroy(input_device);
|
||||
}
|
||||
|
||||
fn riverInputDeviceV1Listener(river_input_device_v1: *river.InputDeviceV1, event: river.InputDeviceV1.Event, input_device: *InputDevice) void {
|
||||
assert(input_device.river_input_device_v1 == river_input_device_v1);
|
||||
switch (event) {
|
||||
.removed => {
|
||||
river_input_device_v1.destroy();
|
||||
input_device.destroy();
|
||||
},
|
||||
.type => |ev| {
|
||||
// This event is only sent once when the object is created
|
||||
assert(input_device.type == null);
|
||||
input_device.type = ev.type;
|
||||
},
|
||||
.name => |ev| {
|
||||
// This event is only sent once when the object is created
|
||||
assert(input_device.name == null);
|
||||
input_device.name = mem.span(ev.name);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
const std = @import("std");
|
||||
const assert = std.debug.assert;
|
||||
const mem = std.mem;
|
||||
|
||||
const wayland = @import("wayland");
|
||||
const wl = wayland.client.wl;
|
||||
const river = wayland.client.river;
|
||||
const Type = river.InputDeviceV1.Type;
|
||||
|
||||
const utils = @import("utils.zig");
|
||||
const Context = @import("Context.zig");
|
||||
const LibinputDevice = @import("LibinputDevice.zig");
|
||||
|
||||
const log = std.log.scoped(.InputDevice);
|
||||
87
src/InputManager.zig
Normal file
87
src/InputManager.zig
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
// SPDX-FileCopyrightText: 2026 Ben Buhse <me@benbuhse.email>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
const InputManager = @This();
|
||||
|
||||
context: *Context,
|
||||
|
||||
river_input_manager_v1: *river.InputManagerV1,
|
||||
river_libinput_config_v1: *river.LibinputConfigV1,
|
||||
|
||||
/// All input devices that we've been advertised
|
||||
input_devices: wl.list.Head(InputDevice, .link),
|
||||
/// All libinput devices that we've been advertised
|
||||
/// Not necessarily the same length as input_devices
|
||||
libinput_devices: wl.list.Head(LibinputDevice, .link),
|
||||
|
||||
pub fn create(context: *Context, river_input_manager_v1: *river.InputManagerV1, river_libinput_config_v1: *river.LibinputConfigV1) !*InputManager {
|
||||
log.debug("Creating new InputManager", .{});
|
||||
const im = try utils.allocator.create(InputManager);
|
||||
errdefer im.destroy();
|
||||
|
||||
im.* = .{
|
||||
.context = context,
|
||||
.river_input_manager_v1 = river_input_manager_v1,
|
||||
.river_libinput_config_v1 = river_libinput_config_v1,
|
||||
.input_devices = undefined, // we will initialize these shortly
|
||||
.libinput_devices = undefined,
|
||||
};
|
||||
|
||||
im.input_devices.init();
|
||||
im.libinput_devices.init();
|
||||
|
||||
im.river_input_manager_v1.setListener(*InputManager, inputManagerV1Listener, im);
|
||||
im.river_libinput_config_v1.setListener(*InputManager, libinputConfigV1Listener, im);
|
||||
|
||||
return im;
|
||||
}
|
||||
|
||||
pub fn destroy(im: *InputManager) void {
|
||||
utils.allocator.destroy(im);
|
||||
}
|
||||
|
||||
pub fn inputManagerV1Listener(river_input_manager_v1: *river.InputManagerV1, event: river.InputManagerV1.Event, im: *InputManager) void {
|
||||
assert(im.river_input_manager_v1 == river_input_manager_v1);
|
||||
switch (event) {
|
||||
.input_device => |ev| {
|
||||
const input_device = InputDevice.create(ev.id) catch @panic("Out of memory");
|
||||
im.input_devices.append(input_device);
|
||||
},
|
||||
.finished => {
|
||||
// TODO: Should call destroy on the river_input_manager_v1 and on this device,
|
||||
// but might need to make the globals optional so that we know when we can destroy this
|
||||
// object.
|
||||
log.debug("unhandled event: finished", .{});
|
||||
},
|
||||
}
|
||||
}
|
||||
pub fn libinputConfigV1Listener(river_libinput_config_v1: *river.LibinputConfigV1, event: river.LibinputConfigV1.Event, im: *InputManager) void {
|
||||
assert(im.river_libinput_config_v1 == river_libinput_config_v1);
|
||||
switch (event) {
|
||||
.libinput_device => |ev| {
|
||||
const libinput_device = LibinputDevice.create(im.context, ev.id) catch @panic("Out of memory");
|
||||
im.libinput_devices.append(libinput_device);
|
||||
},
|
||||
.finished => {
|
||||
// TODO: Should call destroy on the river_libinput_config_v1 and on this device,
|
||||
// but might need to make the globals optional so that we know when we can destroy this
|
||||
// object.
|
||||
log.debug("unhandled event: finished", .{});
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
const std = @import("std");
|
||||
const assert = std.debug.assert;
|
||||
|
||||
const wayland = @import("wayland");
|
||||
const wl = wayland.client.wl;
|
||||
const river = wayland.client.river;
|
||||
|
||||
const utils = @import("utils.zig");
|
||||
const Context = @import("Context.zig");
|
||||
const InputDevice = @import("InputDevice.zig");
|
||||
const LibinputDevice = @import("LibinputDevice.zig");
|
||||
|
||||
const log = std.log.scoped(.InputManager);
|
||||
184
src/LibinputDevice.zig
Normal file
184
src/LibinputDevice.zig
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
// SPDX-FileCopyrightText: 2026 Ben Buhse <me@benbuhse.email>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
const LibinputDevice = @This();
|
||||
|
||||
context: *Context,
|
||||
|
||||
river_libinput_device_v1: *river.LibinputDeviceV1,
|
||||
|
||||
send_events_support: SendEventsModes = .{},
|
||||
send_events_current: ?SendEventsModes = null,
|
||||
|
||||
/// The number of fingers supported for tap-to-click/drag.
|
||||
/// If finger_count is 0, tap-to-click and drag are unsupported.
|
||||
tap_support: u31 = 0,
|
||||
tap_current: ?TapState = null,
|
||||
|
||||
tap_button_map_current: ?TapButtonMap = null,
|
||||
|
||||
drag_current: ?DragState = null,
|
||||
|
||||
drag_lock_current: ?DragLockState = null,
|
||||
|
||||
/// The number of fingers supported for three/four finger drag.
|
||||
/// If finger_count is less than 3, three finger drag is unsupported.
|
||||
three_finger_drag_support: u31 = 0,
|
||||
three_finger_drag_current: ?ThreeFingerDragState = null,
|
||||
|
||||
/// A calibration matrix is supported if the supported argument is non-zero.
|
||||
calibration_matrix_support: bool = false,
|
||||
calibration_matrix_current: ?[]f32 = null,
|
||||
|
||||
accel_profiles_support: ?AccelProfiles = null,
|
||||
accel_profile_current: ?AccelProfile = null,
|
||||
|
||||
accel_speed_current: ?f64 = null,
|
||||
|
||||
natural_scroll_support: bool = false,
|
||||
natural_scroll_current: ?NaturalScrollState = null,
|
||||
|
||||
left_handed_support: bool = false,
|
||||
left_handed_current: ?LeftHandedState = null,
|
||||
|
||||
click_method_support: ?ClickMethods = null,
|
||||
click_method_current: ?ClickMethod = null,
|
||||
|
||||
clickfinger_button_map_current: ?ClickfingerButtonMap = null,
|
||||
|
||||
middle_emulation_support: bool = false,
|
||||
middle_emulation_current: ?MiddleEmulationState = null,
|
||||
|
||||
scroll_method_support: ?ScrollMethods = null,
|
||||
scroll_method_current: ?ScrollMethod = null,
|
||||
/// Supported if scroll_methods.on_button_down is supported.
|
||||
scroll_button_current: ?u32 = null,
|
||||
/// Supported if scroll_methods.on_button_down is supported.
|
||||
scroll_button_lock_current: ?ScrollButtonLockState = null,
|
||||
|
||||
dwt_support: bool = false,
|
||||
dwt_current: ?DwtState = null,
|
||||
|
||||
dwtp_support: bool = false,
|
||||
dwtp_current: ?DwtpState = null,
|
||||
|
||||
rotation_support: bool = false,
|
||||
rotation_current: ?u32 = null,
|
||||
|
||||
link: wl.list.Link,
|
||||
|
||||
pub fn create(context: *Context, river_libinput_device_v1: *river.LibinputDeviceV1) !*LibinputDevice {
|
||||
const libinput_device = try utils.allocator.create(LibinputDevice);
|
||||
errdefer libinput_device.destroy();
|
||||
|
||||
libinput_device.* = .{
|
||||
.context = context,
|
||||
.river_libinput_device_v1 = river_libinput_device_v1,
|
||||
.link = undefined, // handled by the wl.List
|
||||
};
|
||||
|
||||
libinput_device.river_libinput_device_v1.setListener(
|
||||
*LibinputDevice,
|
||||
riverLibinputDeviceV1Listener,
|
||||
libinput_device,
|
||||
);
|
||||
|
||||
return libinput_device;
|
||||
}
|
||||
|
||||
pub fn destroy(input_device: *LibinputDevice) void {
|
||||
input_device.link.remove();
|
||||
utils.allocator.destroy(input_device);
|
||||
}
|
||||
|
||||
fn riverLibinputDeviceV1Listener(river_libinput_device_v1: *river.LibinputDeviceV1, event: river.LibinputDeviceV1.Event, libinput_device: *LibinputDevice) void {
|
||||
assert(libinput_device.river_libinput_device_v1 == river_libinput_device_v1);
|
||||
const im = libinput_device.context.im;
|
||||
switch (event) {
|
||||
.removed => {
|
||||
river_libinput_device_v1.destroy();
|
||||
libinput_device.destroy();
|
||||
},
|
||||
.input_device => |ev| {
|
||||
const river_input_device_v1 = ev.device.?;
|
||||
var it = im.input_devices.iterator(.forward);
|
||||
while (it.next()) |input_device| {
|
||||
if (input_device.river_input_device_v1 == river_input_device_v1) {
|
||||
// This event is only sent once when the object is created
|
||||
assert(input_device.libinput_device == null);
|
||||
input_device.libinput_device = libinput_device;
|
||||
log.info("input dev {} is associated to libinput {}", .{ river_libinput_device_v1.getId(), river_input_device_v1.getId() });
|
||||
}
|
||||
}
|
||||
},
|
||||
.send_events_support => |ev| libinput_device.send_events_support = ev.modes,
|
||||
.send_events_current => |ev| libinput_device.send_events_current = ev.mode,
|
||||
.tap_support => |ev| libinput_device.tap_support = @intCast(ev.finger_count),
|
||||
.tap_current => |ev| libinput_device.tap_current = ev.state,
|
||||
.tap_button_map_current => |ev| libinput_device.tap_button_map_current = ev.button_map,
|
||||
.drag_current => |ev| libinput_device.drag_current = ev.state,
|
||||
.drag_lock_current => |ev| libinput_device.drag_lock_current = ev.state,
|
||||
.three_finger_drag_support => |ev| libinput_device.three_finger_drag_support = @intCast(ev.finger_count),
|
||||
.three_finger_drag_current => |ev| libinput_device.three_finger_drag_current = ev.state,
|
||||
.calibration_matrix_support => |ev| libinput_device.calibration_matrix_support = ev.supported != 0,
|
||||
.calibration_matrix_current => |ev| libinput_device.calibration_matrix_current = ev.matrix.slice(f32),
|
||||
.accel_profiles_support => |ev| libinput_device.accel_profiles_support = ev.profiles,
|
||||
.accel_profile_current => |ev| libinput_device.accel_profile_current = ev.profile,
|
||||
.accel_speed_current => |ev| libinput_device.accel_speed_current = ev.speed.slice(f64)[0],
|
||||
.natural_scroll_support => |ev| libinput_device.natural_scroll_support = ev.supported != 0,
|
||||
.natural_scroll_current => |ev| libinput_device.natural_scroll_current = ev.state,
|
||||
.left_handed_support => |ev| libinput_device.left_handed_support = ev.supported != 0,
|
||||
.left_handed_current => |ev| libinput_device.left_handed_current = ev.state,
|
||||
.click_method_support => |ev| libinput_device.click_method_support = ev.methods,
|
||||
.click_method_current => |ev| libinput_device.click_method_current = ev.method,
|
||||
.clickfinger_button_map_current => |ev| libinput_device.clickfinger_button_map_current = ev.button_map,
|
||||
.middle_emulation_support => |ev| libinput_device.middle_emulation_support = ev.supported != 0,
|
||||
.middle_emulation_current => |ev| libinput_device.middle_emulation_current = ev.state,
|
||||
.scroll_method_support => |ev| libinput_device.scroll_method_support = ev.methods,
|
||||
.scroll_method_current => |ev| libinput_device.scroll_method_current = ev.method,
|
||||
.scroll_button_current => |ev| libinput_device.scroll_button_current = ev.button,
|
||||
.scroll_button_lock_current => |ev| libinput_device.scroll_button_lock_current = ev.state,
|
||||
.dwt_support => |ev| libinput_device.dwt_support = ev.supported != 0,
|
||||
.dwt_current => |ev| libinput_device.dwt_current = ev.state,
|
||||
.dwtp_support => |ev| libinput_device.dwtp_support = ev.supported != 0,
|
||||
.dwtp_current => |ev| libinput_device.dwtp_current = ev.state,
|
||||
.rotation_support => |ev| libinput_device.rotation_support = ev.supported != 0,
|
||||
.rotation_current => |ev| libinput_device.rotation_current = ev.angle,
|
||||
else => |ev| {
|
||||
// We don't keep track of any default states right now
|
||||
log.debug("unhandled event: {s}", .{@tagName(ev)});
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
const std = @import("std");
|
||||
const assert = std.debug.assert;
|
||||
|
||||
const wayland = @import("wayland");
|
||||
const wl = wayland.client.wl;
|
||||
const river = wayland.client.river;
|
||||
const AccelProfile = river.LibinputDeviceV1.AccelProfile;
|
||||
const AccelProfiles = river.LibinputDeviceV1.AccelProfiles;
|
||||
const ClickfingerButtonMap = river.LibinputDeviceV1.ClickfingerButtonMap;
|
||||
const ClickMethod = river.LibinputDeviceV1.ClickMethod;
|
||||
const ClickMethods = river.LibinputDeviceV1.ClickMethods;
|
||||
const DragLockState = river.LibinputDeviceV1.DragLockState;
|
||||
const DragState = river.LibinputDeviceV1.DragState;
|
||||
const DwtState = river.LibinputDeviceV1.DwtState;
|
||||
const DwtpState = river.LibinputDeviceV1.DwtpState;
|
||||
const LeftHandedState = river.LibinputDeviceV1.LeftHandedState;
|
||||
const MiddleEmulationState = river.LibinputDeviceV1.MiddleEmulationState;
|
||||
const NaturalScrollState = river.LibinputDeviceV1.NaturalScrollState;
|
||||
const ScrollButtonLockState = river.LibinputDeviceV1.ScrollButtonLockState;
|
||||
const ScrollMethod = river.LibinputDeviceV1.ScrollMethod;
|
||||
const ScrollMethods = river.LibinputDeviceV1.ScrollMethods;
|
||||
const SendEventsModes = river.LibinputDeviceV1.SendEventsModes;
|
||||
const TapButtonMap = river.LibinputDeviceV1.TapButtonMap;
|
||||
const TapState = river.LibinputDeviceV1.TapState;
|
||||
const ThreeFingerDragState = river.LibinputDeviceV1.ThreeFingerDragState;
|
||||
|
||||
const utils = @import("utils.zig");
|
||||
const Context = @import("Context.zig");
|
||||
|
||||
const log = std.log.scoped(.InputDevice);
|
||||
|
|
@ -90,31 +90,31 @@ pub fn destroy(output: *Output) void {
|
|||
/// Get the next window in the list that shares at least one tag
|
||||
/// with the output, wrapping to first if at end.
|
||||
pub fn nextWindow(output: *Output, current: *Window) ?*Window {
|
||||
var link = current.link.next orelse unreachable;
|
||||
var link = current.link.next.?;
|
||||
// Walk forward, wrapping at sentinel, until we find a visible window or return to current
|
||||
while (true) {
|
||||
// If this is the sentinel, wrap to the beginning
|
||||
if (link == &output.windows.link) {
|
||||
link = link.next orelse unreachable;
|
||||
link = link.next.?;
|
||||
}
|
||||
const window: *Window = @fieldParentPtr("link", link);
|
||||
if (window.tags & output.tags != 0 or window == current) return window;
|
||||
link = link.next orelse unreachable;
|
||||
link = link.next.?;
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the previous window in the list that shares at least one tag
|
||||
/// with the output, wrapping to the last if at beginning
|
||||
pub fn prevWindow(output: *Output, current: *Window) ?*Window {
|
||||
var link = current.link.prev orelse unreachable;
|
||||
var link = current.link.prev.?;
|
||||
while (true) {
|
||||
// If this is the sentinel, wrap to the end
|
||||
if (link == &output.windows.link) {
|
||||
link = link.prev orelse unreachable;
|
||||
link = link.prev.?;
|
||||
}
|
||||
const window: *Window = @fieldParentPtr("link", link);
|
||||
if (window.tags & output.tags != 0 or window == current) return window;
|
||||
link = link.prev orelse unreachable;
|
||||
link = link.prev.?;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -171,7 +171,7 @@ fn riverOutputListener(river_output_v1: *river.OutputV1, event: river.OutputV1.E
|
|||
},
|
||||
.wl_output => |ev| {
|
||||
// It's guaranteed for the wl_output global to advertised before this event happens
|
||||
output.wl_output = output.context.wl_outputs.get(ev.name) orelse unreachable;
|
||||
output.wl_output = output.context.wl_outputs.get(ev.name).?;
|
||||
output.wl_output.?.setListener(*Output, wlOutputListener, output);
|
||||
|
||||
// The wl_output's initial events (mode, scale, name, done) were likely
|
||||
|
|
|
|||
27
src/main.zig
27
src/main.zig
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
/// Wayland globals that we need to bind listen in alphabetical order
|
||||
const Globals = struct {
|
||||
river_input_manager_v1: ?*river.InputManagerV1 = null,
|
||||
river_libinput_config_v1: ?*river.LibinputConfigV1 = null,
|
||||
river_layer_shell_v1: ?*river.LayerShellV1 = null,
|
||||
river_window_manager_v1: ?*river.WindowManagerV1 = null,
|
||||
river_xkb_bindings_v1: ?*river.XkbBindingsV1 = null,
|
||||
|
|
@ -30,6 +32,8 @@ const usage: []const u8 =
|
|||
\\ -version Print the version number and exit.
|
||||
\\ -log-level <level> Set the log level to error, warning, info, or debug.
|
||||
\\
|
||||
\\ Config belongs under $XDG_CONFIG_DIR or $HOME/.config at beansprout/config.kdl
|
||||
\\
|
||||
;
|
||||
|
||||
pub fn main() !void {
|
||||
|
|
@ -100,6 +104,8 @@ pub fn main() !void {
|
|||
// We can theoretically start with zero wl_outputs; don't panic if it's empty.
|
||||
const wl_outputs = &globals.wl_outputs;
|
||||
|
||||
const river_input_manager_v1 = globals.river_input_manager_v1 orelse utils.interfaceNotAdvertised(river.InputManagerV1);
|
||||
const river_libinput_config_v1 = globals.river_libinput_config_v1 orelse utils.interfaceNotAdvertised(river.LibinputConfigV1);
|
||||
const river_layer_shell_v1 = globals.river_layer_shell_v1 orelse utils.interfaceNotAdvertised(river.LayerShellV1);
|
||||
const river_window_manager_v1 = globals.river_window_manager_v1 orelse utils.interfaceNotAdvertised(river.WindowManagerV1);
|
||||
const river_xkb_bindings_v1 = globals.river_xkb_bindings_v1 orelse utils.interfaceNotAdvertised(river.XkbBindingsV1);
|
||||
|
|
@ -114,6 +120,8 @@ pub fn main() !void {
|
|||
.wl_outputs = wl_outputs,
|
||||
.wl_registry = wl_registry,
|
||||
.wl_shm = wl_shm,
|
||||
.river_input_manager_v1 = river_input_manager_v1,
|
||||
.river_libinput_config_v1 = river_libinput_config_v1,
|
||||
.river_layer_shell_v1 = river_layer_shell_v1,
|
||||
.river_window_manager_v1 = river_window_manager_v1,
|
||||
.river_xkb_bindings_v1 = river_xkb_bindings_v1,
|
||||
|
|
@ -155,6 +163,14 @@ fn registryListener(registry: *wl.Registry, event: wl.Registry.Event, globals: *
|
|||
globals.wl_shm = registry.bind(ev.name, wl.Shm, 1) catch |e| {
|
||||
fatal("Failed to bind to wl_shm: {any}", .{@errorName(e)});
|
||||
};
|
||||
} else if (mem.orderZ(u8, ev.interface, river.InputManagerV1.interface.name) == .eq) {
|
||||
globals.river_input_manager_v1 = registry.bind(ev.name, river.InputManagerV1, 1) catch |e| {
|
||||
fatal("Failed to bind to river_input_manager_v1: {any}", .{@errorName(e)});
|
||||
};
|
||||
} else if (mem.orderZ(u8, ev.interface, river.LibinputConfigV1.interface.name) == .eq) {
|
||||
globals.river_libinput_config_v1 = registry.bind(ev.name, river.LibinputConfigV1, 1) catch |e| {
|
||||
fatal("Failed to bind to river_libinput_config_v1: {any}", .{@errorName(e)});
|
||||
};
|
||||
} else if (mem.orderZ(u8, ev.interface, river.LayerShellV1.interface.name) == .eq) {
|
||||
globals.river_layer_shell_v1 = registry.bind(ev.name, river.LayerShellV1, 1) catch |e| {
|
||||
fatal("Failed to bind to river_layer_shell_v1: {any}", .{@errorName(e)});
|
||||
|
|
@ -174,7 +190,6 @@ fn registryListener(registry: *wl.Registry, event: wl.Registry.Event, globals: *
|
|||
};
|
||||
}
|
||||
},
|
||||
// We don't need .global_remove
|
||||
.global_remove => |ev| {
|
||||
// The only remove we care about is for wl_outputs
|
||||
if (!globals.wl_outputs.remove(ev.name)) {
|
||||
|
|
@ -198,11 +213,11 @@ var runtime_log_level: std.log.Level = switch (builtin.mode) {
|
|||
.ReleaseSafe, .ReleaseFast, .ReleaseSmall => .info,
|
||||
};
|
||||
|
||||
pub const std_options: std.Options = .{
|
||||
// Tell std.log to leave all log level filtering to us.
|
||||
.log_level = .debug,
|
||||
.logFn = logFn,
|
||||
};
|
||||
// pub const std_options: std.Options = .{
|
||||
// // Tell std.log to leave all log level filtering to us.
|
||||
// .log_level = .debug,
|
||||
// .logFn = logFn,
|
||||
// };
|
||||
|
||||
pub fn logFn(
|
||||
comptime level: std.log.Level,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue