1 /*! Managing the events belonging to virtual-keyboard interface. */ 2 3 use ::keyboard::{ Modifiers, PressType }; 4 use ::submission::Timestamp; 5 6 /// Standard xkb keycode 7 type KeyCode = u32; 8 9 /// Gathers stuff defined in C or called by C 10 pub mod c { 11 use std::ffi::CStr; 12 use std::os::raw::{ c_char, c_void }; 13 14 #[repr(transparent)] 15 #[derive(Clone, Copy)] 16 pub struct ZwpVirtualKeyboardV1(*const c_void); 17 18 #[repr(C)] 19 pub struct KeyMap { 20 fd: u32, 21 fd_len: usize, 22 } 23 24 impl KeyMap { from_cstr(s: &CStr) -> KeyMap25 pub fn from_cstr(s: &CStr) -> KeyMap { 26 unsafe { 27 squeek_key_map_from_str(s.as_ptr()) 28 } 29 } 30 } 31 32 impl Drop for KeyMap { drop(&mut self)33 fn drop(&mut self) { 34 unsafe { 35 close(self.fd as u32); 36 } 37 } 38 } 39 40 extern "C" { 41 // From libc, to let KeyMap get deallocated. close(fd: u32)42 fn close(fd: u32); 43 eek_virtual_keyboard_v1_key( virtual_keyboard: ZwpVirtualKeyboardV1, timestamp: u32, keycode: u32, press: u32, )44 pub fn eek_virtual_keyboard_v1_key( 45 virtual_keyboard: ZwpVirtualKeyboardV1, 46 timestamp: u32, 47 keycode: u32, 48 press: u32, 49 ); 50 eek_virtual_keyboard_update_keymap( virtual_keyboard: ZwpVirtualKeyboardV1, keymap: *const KeyMap, )51 pub fn eek_virtual_keyboard_update_keymap( 52 virtual_keyboard: ZwpVirtualKeyboardV1, 53 keymap: *const KeyMap, 54 ); 55 eek_virtual_keyboard_set_modifiers( virtual_keyboard: ZwpVirtualKeyboardV1, modifiers: u32, )56 pub fn eek_virtual_keyboard_set_modifiers( 57 virtual_keyboard: ZwpVirtualKeyboardV1, 58 modifiers: u32, 59 ); 60 squeek_key_map_from_str(keymap_str: *const c_char) -> KeyMap61 pub fn squeek_key_map_from_str(keymap_str: *const c_char) -> KeyMap; 62 } 63 } 64 65 /// Layout-independent backend. TODO: Have one instance per program or seat 66 pub struct VirtualKeyboard(pub c::ZwpVirtualKeyboardV1); 67 68 impl VirtualKeyboard { 69 // TODO: error out if keymap not set switch( &self, keycode: KeyCode, action: PressType, timestamp: Timestamp, )70 pub fn switch( 71 &self, 72 keycode: KeyCode, 73 action: PressType, 74 timestamp: Timestamp, 75 ) { 76 let keycode = keycode - 8; 77 unsafe { 78 c::eek_virtual_keyboard_v1_key( 79 self.0, timestamp.0, keycode, action.clone() as u32 80 ); 81 } 82 } 83 set_modifiers_state(&self, modifiers: Modifiers)84 pub fn set_modifiers_state(&self, modifiers: Modifiers) { 85 let modifiers = modifiers.bits() as u32; 86 unsafe { 87 c::eek_virtual_keyboard_set_modifiers(self.0, modifiers); 88 } 89 } 90 update_keymap(&self, keymap: &c::KeyMap)91 pub fn update_keymap(&self, keymap: &c::KeyMap) { 92 unsafe { 93 c::eek_virtual_keyboard_update_keymap( 94 self.0, 95 keymap as *const c::KeyMap, 96 ); 97 } 98 } 99 } 100