From 02d1c90501730e2716828538ab38fc9bf07cb310 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sun, 9 Jan 2022 13:07:57 +0100 Subject: [PATCH] autocommit 2022-01-09 13:07:57 CET --- src/backends/xorg/mod.rs | 1 + src/ifs/wl_seat/mod.rs | 2 +- src/ifs/wl_seat/types.rs | 5 ++++- src/ifs/wl_seat/wl_keyboard/mod.rs | 32 +++++++++++++++++++++++++++- src/ifs/wl_seat/wl_keyboard/types.rs | 4 ++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/backends/xorg/mod.rs b/src/backends/xorg/mod.rs index 080b514b..c9beeb4b 100644 --- a/src/backends/xorg/mod.rs +++ b/src/backends/xorg/mod.rs @@ -198,6 +198,7 @@ impl XorgBackend { } state.wheel.periodic(wheel_id, 16_667, slf.clone())?; + // state.wheel.periodic(wheel_id, 1000_000, slf.clone())?; state.el.insert(slf.id, Some(fd), c::EPOLLIN, slf.clone())?; slf.add_output()?; diff --git a/src/ifs/wl_seat/mod.rs b/src/ifs/wl_seat/mod.rs index 4063052c..5a807640 100644 --- a/src/ifs/wl_seat/mod.rs +++ b/src/ifs/wl_seat/mod.rs @@ -313,7 +313,7 @@ impl WlSeatObj { self.client .event(p.keymap( wl_keyboard::XKB_V1, - self.global.layout.clone(), + p.keymap_fd()?, self.global.layout_size, )) .await?; diff --git a/src/ifs/wl_seat/types.rs b/src/ifs/wl_seat/types.rs index df24882e..b62892e6 100644 --- a/src/ifs/wl_seat/types.rs +++ b/src/ifs/wl_seat/types.rs @@ -1,5 +1,5 @@ use crate::client::{ClientError, EventFormatter, RequestParser}; -use crate::ifs::wl_seat::wl_keyboard::WlKeyboardId; +use crate::ifs::wl_seat::wl_keyboard::{WlKeyboardError, WlKeyboardId}; use crate::ifs::wl_seat::wl_pointer::WlPointerId; use crate::ifs::wl_seat::wl_touch::WlTouchId; use crate::ifs::wl_seat::{WlSeatObj, CAPABILITIES, NAME}; @@ -40,9 +40,12 @@ pub enum GetKeyboardError { ParseError(#[source] Box), #[error(transparent)] ClientError(Box), + #[error(transparent)] + WlKeyboardError(Box), } efrom!(GetKeyboardError, ClientError, ClientError); efrom!(GetKeyboardError, ParseError, MsgParserError); +efrom!(GetKeyboardError, WlKeyboardError, WlKeyboardError); #[derive(Debug, Error)] pub enum GetTouchError { diff --git a/src/ifs/wl_seat/wl_keyboard/mod.rs b/src/ifs/wl_seat/wl_keyboard/mod.rs index d1285a32..4d40886e 100644 --- a/src/ifs/wl_seat/wl_keyboard/mod.rs +++ b/src/ifs/wl_seat/wl_keyboard/mod.rs @@ -7,7 +7,7 @@ use crate::object::{Interface, Object, ObjectId}; use crate::utils::buffd::MsgParser; use std::rc::Rc; pub use types::*; -use uapi::OwnedFd; +use uapi::{c, Errno, OwnedFd}; const RELEASE: u32 = 0; @@ -42,6 +42,36 @@ impl WlKeyboard { } } + pub fn needs_dedicated_keymap_fd(&self) -> bool { + self.seat.version < 7 + } + + pub fn keymap_fd(&self) -> Result, WlKeyboardError> { + if !self.needs_dedicated_keymap_fd() { + return Ok(self.seat.global.layout.clone()); + } + let fd = match uapi::memfd_create("shared-keymap", c::MFD_CLOEXEC) { + Ok(fd) => fd, + Err(e) => return Err(WlKeyboardError::KeymapMemfd(e.into())), + }; + let target = self.seat.global.layout_size as c::off_t; + let mut pos = 0; + while pos < target { + let rem = target - pos; + let res = uapi::sendfile( + fd.raw(), + self.seat.global.layout.raw(), + Some(&mut pos), + rem as usize, + ); + match res { + Ok(_) | Err(Errno(c::EINTR)) => { }, + Err(e) => return Err(WlKeyboardError::KeymapCopy(e.into())), + } + } + Ok(Rc::new(fd)) + } + pub fn keymap(self: &Rc, format: u32, fd: Rc, size: u32) -> DynEventFormatter { Box::new(Keymap { obj: self.clone(), diff --git a/src/ifs/wl_seat/wl_keyboard/types.rs b/src/ifs/wl_seat/wl_keyboard/types.rs index 44198cfa..648742d7 100644 --- a/src/ifs/wl_seat/wl_keyboard/types.rs +++ b/src/ifs/wl_seat/wl_keyboard/types.rs @@ -17,6 +17,10 @@ pub enum WlKeyboardError { ClientError(Box), #[error("Could not process a `release` request")] ReleaseError(#[from] ReleaseError), + #[error("Could not create a keymap memfd")] + KeymapMemfd(#[source] std::io::Error), + #[error("Could not copy the keymap")] + KeymapCopy(#[source] std::io::Error), } efrom!(WlKeyboardError, ClientError, ClientError);