From 887e2b6cbc1e148652f1daeb484f723e9b35a8a5 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sun, 4 Feb 2024 18:50:49 +0100 Subject: [PATCH] input: add support for natural scrolling Closes #69 --- jay-config/src/_private/client.rs | 4 ++++ jay-config/src/_private/ipc.rs | 4 ++++ jay-config/src/input.rs | 7 +++++++ src/backend.rs | 1 + src/backends/metal.rs | 11 +++++++++++ src/backends/metal/monitor.rs | 1 + src/backends/x.rs | 8 ++++++++ src/config/handler.rs | 13 +++++++++++++ src/it/test_backend.rs | 8 ++++++++ src/libinput/device.rs | 13 +++++++++++++ src/libinput/sys.rs | 7 +++++++ 11 files changed, 77 insertions(+) diff --git a/jay-config/src/_private/client.rs b/jay-config/src/_private/client.rs index e303d759..1a952540 100644 --- a/jay-config/src/_private/client.rs +++ b/jay-config/src/_private/client.rs @@ -617,6 +617,10 @@ impl Client { self.send(&ClientMessage::SetTapEnabled { device, enabled }) } + pub fn set_input_natural_scrolling_enabled(&self, device: InputDevice, enabled: bool) { + self.send(&ClientMessage::SetNaturalScrollingEnabled { device, enabled }) + } + pub fn set_input_drag_enabled(&self, device: InputDevice, enabled: bool) { self.send(&ClientMessage::SetDragEnabled { device, enabled }) } diff --git a/jay-config/src/_private/ipc.rs b/jay-config/src/_private/ipc.rs index e5f2def8..fdf7041a 100644 --- a/jay-config/src/_private/ipc.rs +++ b/jay-config/src/_private/ipc.rs @@ -330,6 +330,10 @@ pub enum ClientMessage<'a> { GetWorkspaceCapture { workspace: Workspace, }, + SetNaturalScrollingEnabled { + device: InputDevice, + enabled: bool, + }, } #[derive(Encode, Decode, Debug)] diff --git a/jay-config/src/input.rs b/jay-config/src/input.rs index 103bd228..1eaa2ca2 100644 --- a/jay-config/src/input.rs +++ b/jay-config/src/input.rs @@ -104,6 +104,13 @@ impl InputDevice { pub fn set_drag_lock_enabled(self, enabled: bool) { get!().set_input_drag_lock_enabled(self, enabled); } + + /// Sets whether natural scrolling is enabled for this device. + /// + /// See + pub fn set_natural_scrolling_enabled(self, enabled: bool) { + get!().set_input_natural_scrolling_enabled(self, enabled); + } } /// A seat. diff --git a/src/backend.rs b/src/backend.rs index 6666cedf..7ce76fea 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -119,6 +119,7 @@ pub trait InputDevice { fn set_tap_enabled(&self, enabled: bool); fn set_drag_enabled(&self, enabled: bool); fn set_drag_lock_enabled(&self, enabled: bool); + fn set_natural_scrolling_enabled(&self, enabled: bool); } #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)] diff --git a/src/backends/metal.rs b/src/backends/metal.rs index 58cd22b9..5326355d 100644 --- a/src/backends/metal.rs +++ b/src/backends/metal.rs @@ -296,6 +296,7 @@ struct MetalInputDevice { tap_enabled: Cell>, drag_enabled: Cell>, drag_lock_enabled: Cell>, + natural_scrolling_enabled: Cell>, } #[derive(Clone)] @@ -354,6 +355,9 @@ impl MetalInputDevice { if let Some(enabled) = self.drag_lock_enabled.get() { dev.device().set_drag_lock_enabled(enabled); } + if let Some(enabled) = self.natural_scrolling_enabled.get() { + dev.device().set_natural_scrolling_enabled(enabled); + } } fn pre_pause(&self) { @@ -465,6 +469,13 @@ impl InputDevice for MetalInputDevice { dev.device().set_drag_lock_enabled(enabled); } } + + fn set_natural_scrolling_enabled(&self, enabled: bool) { + self.natural_scrolling_enabled.set(Some(enabled)); + if let Some(dev) = self.inputdev.get() { + dev.device().set_natural_scrolling_enabled(enabled); + } + } } impl MetalInputDevice { diff --git a/src/backends/metal/monitor.rs b/src/backends/metal/monitor.rs index 126ef85d..5c981f98 100644 --- a/src/backends/metal/monitor.rs +++ b/src/backends/metal/monitor.rs @@ -296,6 +296,7 @@ impl MetalBackend { tap_enabled: Default::default(), drag_enabled: Default::default(), drag_lock_enabled: Default::default(), + natural_scrolling_enabled: Default::default(), }); slots[slot] = Some(dev.clone()); self.device_holder diff --git a/src/backends/x.rs b/src/backends/x.rs index db9943ff..074026fb 100644 --- a/src/backends/x.rs +++ b/src/backends/x.rs @@ -1162,6 +1162,10 @@ impl InputDevice for XSeatKeyboard { fn set_drag_lock_enabled(&self, enabled: bool) { let _ = enabled; } + + fn set_natural_scrolling_enabled(&self, enabled: bool) { + let _ = enabled; + } } impl InputDevice for XSeatMouse { @@ -1223,4 +1227,8 @@ impl InputDevice for XSeatMouse { fn set_drag_lock_enabled(&self, enabled: bool) { let _ = enabled; } + + fn set_natural_scrolling_enabled(&self, enabled: bool) { + let _ = enabled; + } } diff --git a/src/config/handler.rs b/src/config/handler.rs index e6e7372b..347ca39c 100644 --- a/src/config/handler.rs +++ b/src/config/handler.rs @@ -512,6 +512,16 @@ impl ConfigProxyHandler { Ok(()) } + fn handle_set_natural_scrolling_enabled( + &self, + device: InputDevice, + enabled: bool, + ) -> Result<(), CphError> { + let dev = self.get_device_handler_data(device)?; + dev.device.set_natural_scrolling_enabled(enabled); + Ok(()) + } + fn handle_set_drag_lock_enabled( &self, device: InputDevice, @@ -1296,6 +1306,9 @@ impl ConfigProxyHandler { ClientMessage::GetWorkspaceCapture { workspace } => self .handle_get_workspace_capture(workspace) .wrn("get_workspace_capture")?, + ClientMessage::SetNaturalScrollingEnabled { device, enabled } => self + .handle_set_natural_scrolling_enabled(device, enabled) + .wrn("set_natural_scrolling_enabled")?, } Ok(()) } diff --git a/src/it/test_backend.rs b/src/it/test_backend.rs index 6d2bfa3b..520e09bf 100644 --- a/src/it/test_backend.rs +++ b/src/it/test_backend.rs @@ -444,6 +444,10 @@ trait TestInputDevice: InputDevice { fn set_drag_lock_enabled(&self, enabled: bool) { let _ = enabled; } + + fn set_natural_scrolling_enabled(&self, enabled: bool) { + let _ = enabled; + } } impl InputDevice for T { @@ -502,4 +506,8 @@ impl InputDevice for T { fn set_drag_lock_enabled(&self, enabled: bool) { ::set_drag_lock_enabled(self, enabled) } + + fn set_natural_scrolling_enabled(&self, enabled: bool) { + ::set_natural_scrolling_enabled(self, enabled) + } } diff --git a/src/libinput/device.rs b/src/libinput/device.rs index b996b39f..5d255247 100644 --- a/src/libinput/device.rs +++ b/src/libinput/device.rs @@ -9,6 +9,8 @@ use { sys::{ libinput_device, libinput_device_config_accel_set_profile, libinput_device_config_accel_set_speed, libinput_device_config_left_handed_set, + libinput_device_config_scroll_get_natural_scroll_enabled, + libinput_device_config_scroll_set_natural_scroll_enabled, libinput_device_config_tap_get_drag_enabled, libinput_device_config_tap_get_drag_lock_enabled, libinput_device_config_tap_get_enabled, libinput_device_config_tap_set_drag_enabled, @@ -146,6 +148,17 @@ impl<'a> LibInputDevice<'a> { _ => false, } } + + pub fn set_natural_scrolling_enabled(&self, enabled: bool) { + unsafe { + libinput_device_config_scroll_set_natural_scroll_enabled(self.dev, enabled as _); + } + } + + #[allow(dead_code)] + pub fn natural_scrolling_enabled(&self) -> bool { + unsafe { libinput_device_config_scroll_get_natural_scroll_enabled(self.dev) != 0 } + } } impl RegisteredDevice { diff --git a/src/libinput/sys.rs b/src/libinput/sys.rs index 151514bb..00f109b8 100644 --- a/src/libinput/sys.rs +++ b/src/libinput/sys.rs @@ -75,6 +75,13 @@ extern "C" { pub fn libinput_device_config_tap_get_drag_lock_enabled( device: *mut libinput_device, ) -> libinput_config_drag_lock_state; + pub fn libinput_device_config_scroll_set_natural_scroll_enabled( + device: *mut libinput_device, + enable: c::c_int, + ) -> libinput_config_status; + pub fn libinput_device_config_scroll_get_natural_scroll_enabled( + device: *mut libinput_device, + ) -> c::c_int; pub fn libinput_event_destroy(event: *mut libinput_event); pub fn libinput_event_get_type(event: *mut libinput_event) -> libinput_event_type;