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