pub struct Keyboard { /* private fields */ }Expand description
Virtual keyboard that injects keystrokes via uinput.
Implementations§
Source§impl Keyboard
impl Keyboard
Sourcepub fn new(key_delay: Duration) -> Result<Self>
pub fn new(key_delay: Duration) -> Result<Self>
Create a new virtual keyboard with auto-detected layout and clipboard.
This is the most ergonomic constructor: it picks up the active XKB layout from the compositor (Hyprland / Sway / env vars), picks the right clipboard backend for the current display server, and builds the uinput device.
key_delay is the inter-event delay. Raise it for TUIs that drop
characters in raw mode (e.g. Node/Ink-based apps like Claude Code).
Requires write access to /dev/uinput.
For full control over keymap/clipboard, see
Keyboard::with_components; to force a specific XKB layout, see
Keyboard::with_layout.
Sourcepub fn new_prewarm(key_delay: Duration) -> Result<Self>
pub fn new_prewarm(key_delay: Duration) -> Result<Self>
Like Keyboard::new, but uses a longer post-creation settle
delay suited for the first virtual keyboard created in a
process. Call this from a startup prewarm so X11 has time to
process MappingNotify and attach the new device’s keymap before
any character is typed.
Subsequent recreates (e.g. on error recovery) should keep using
Keyboard::new, which uses a shorter settle so the user’s
typing path is not stalled by 1s on every recovery.
Sourcepub fn with_layout(
layout: &str,
variant: Option<&str>,
key_delay: Duration,
) -> Result<Self>
pub fn with_layout( layout: &str, variant: Option<&str>, key_delay: Duration, ) -> Result<Self>
Create a virtual keyboard for a specific XKB layout (and optional variant), with the auto-detected clipboard backend.
Useful when the application already knows the user’s layout and wants to skip the compositor probe (e.g. it’s stored in a config file).
Sourcepub fn with_components(
keymap: XkbKeymap,
clipboard: Box<dyn ClipboardBackend>,
key_delay: Duration,
) -> Result<Self>
pub fn with_components( keymap: XkbKeymap, clipboard: Box<dyn ClipboardBackend>, key_delay: Duration, ) -> Result<Self>
Create a virtual keyboard from explicit components (keymap + clipboard backend).
Use this when you need to inject a custom XkbKeymap (e.g. for
tests) or a non-default clipboard backend
(crate::NoopClipboard / crate::WaylandClipboard /
crate::X11Clipboard).
Requires write access to /dev/uinput (user must be in the input
group or have the appropriate udev rule installed).
key_delay is the inter-event delay. Raise it for TUIs that drop
characters in raw mode (e.g. Node/Ink-based apps like Claude Code).
pub fn set_key_delay(&mut self, key_delay: Duration)
Sourcepub fn type_text(&mut self, text: &str) -> Result<()>
pub fn type_text(&mut self, text: &str) -> Result<()>
Type text by injecting keystrokes through the virtual device.
Characters found in the keymap are typed via direct key events (with Shift/AltGr modifiers as needed, including dead-key sequences). Characters not found in the keymap are accumulated and pasted as a batch via the clipboard (Ctrl+V), with clipboard save/restore so the user’s clipboard is not permanently overwritten.
Sourcepub fn send_combo(&mut self, keys: &[Key]) -> Result<()>
pub fn send_combo(&mut self, keys: &[Key]) -> Result<()>
Press all keys in keys, then release them in reverse order.
Each press and release is separated by self.key_delay.
Trait Implementations§
Source§impl KeyInjector for Keyboard
impl KeyInjector for Keyboard
Source§fn type_text(&mut self, text: &str) -> Result<()>
fn type_text(&mut self, text: &str) -> Result<()>
text by injecting the corresponding keystrokes.Source§fn send_combo(&mut self, keys: &[Key]) -> Result<()>
fn send_combo(&mut self, keys: &[Key]) -> Result<()>
keys, then release them in reverse order.Source§fn set_key_delay(&mut self, delay: Duration)
fn set_key_delay(&mut self, delay: Duration)
Auto Trait Implementations§
impl !RefUnwindSafe for Keyboard
impl !UnwindSafe for Keyboard
impl Freeze for Keyboard
impl Send for Keyboard
impl Sync for Keyboard
impl Unpin for Keyboard
impl UnsafeUnpin for Keyboard
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.