aboutsummaryrefslogtreecommitdiff
path: root/src/input/backend_ext.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/backend_ext.rs')
-rw-r--r--src/input/backend_ext.rs51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/input/backend_ext.rs b/src/input/backend_ext.rs
new file mode 100644
index 00000000..99f4a904
--- /dev/null
+++ b/src/input/backend_ext.rs
@@ -0,0 +1,51 @@
+use ::input as libinput;
+use smithay::backend::input;
+use smithay::backend::winit::WinitVirtualDevice;
+use smithay::output::Output;
+
+use crate::niri::State;
+use crate::protocols::virtual_pointer::VirtualPointer;
+
+pub trait NiriInputBackend: input::InputBackend<Device = Self::NiriDevice> {
+ type NiriDevice: NiriInputDevice;
+}
+impl<T: input::InputBackend> NiriInputBackend for T
+where
+ Self::Device: NiriInputDevice,
+{
+ type NiriDevice = Self::Device;
+}
+
+pub trait NiriInputDevice: input::Device {
+ // FIXME: this should maybe be per-event, not per-device,
+ // but it's not clear that this matters in practice?
+ // it might be more obvious once we implement it for libinput
+ fn output(&self, state: &State) -> Option<Output>;
+}
+
+impl NiriInputDevice for libinput::Device {
+ fn output(&self, _state: &State) -> Option<Output> {
+ // FIXME: Allow specifying the output per-device?
+ None
+ }
+}
+
+impl NiriInputDevice for WinitVirtualDevice {
+ fn output(&self, _state: &State) -> Option<Output> {
+ // FIXME: we should be returning the single output that the winit backend creates,
+ // but for now, that will cause issues because the output is normally upside down,
+ // so we apply Transform::Flipped180 to it and that would also cause
+ // the cursor position to be flipped, which is not what we want.
+ //
+ // instead, we just return None and rely on the fact that it has only one output.
+ // doing so causes the cursor to be placed in *global* output coordinates,
+ // which are not flipped, and happen to be what we want.
+ None
+ }
+}
+
+impl NiriInputDevice for VirtualPointer {
+ fn output(&self, _: &State) -> Option<Output> {
+ self.output().cloned()
+ }
+}