@@ -28,7 +28,7 @@ pub struct WlVirtualProvider {
2828 virtual_pointer : ZwlrVirtualPointerV1 ,
2929 desktop_extent : Vec2 ,
3030 desktop_origin : Vec2 ,
31- _file : std:: fs:: File ,
31+ keymap_file : Option < std:: fs:: File > ,
3232
3333 virtual_keyboard : ZwpVirtualKeyboardV1 ,
3434 keyboard_mods_state : u8 ,
@@ -101,6 +101,14 @@ impl HidProvider for WlVirtualProvider {
101101 self . virtual_pointer . frame ( ) ;
102102 }
103103
104+ fn set_desktop_extent ( & mut self , extent : Vec2 ) {
105+ self . desktop_extent = extent;
106+ }
107+
108+ fn set_desktop_origin ( & mut self , origin : Vec2 ) {
109+ self . desktop_origin = origin;
110+ }
111+
104112 fn set_modifiers ( & mut self , mods : u8 ) {
105113 const LOCKED : u8 = CAPS_LOCK | NUM_LOCK ;
106114
@@ -109,7 +117,8 @@ impl HidProvider for WlVirtualProvider {
109117 if changed & bit != 0 {
110118 let down = mods & bit != 0 ;
111119 if let Some ( kc) = Self :: modifier_keycode ( bit) {
112- self . virtual_keyboard . key ( Self :: now_ms ( ) , kc - 8 , down as u32 ) ;
120+ self . virtual_keyboard
121+ . key ( Self :: now_ms ( ) , kc - 8 , down as u32 ) ;
113122 }
114123 }
115124 }
@@ -138,12 +147,25 @@ impl HidProvider for WlVirtualProvider {
138147 self . _connection . flush ( ) . unwrap ( ) ;
139148 }
140149
141- fn set_desktop_extent ( & mut self , extent : Vec2 ) {
142- self . desktop_extent = extent ;
143- }
150+ fn set_keymap ( & mut self , keymap : & XkbKeymap ) {
151+ # [ cfg ( debug_assertions ) ]
152+ log :: trace! ( "Keyboard keymap: {:?}" , keymap . inner . layouts ( ) . next ( ) . unwrap_or ( "Unknown" ) ) ;
144153
145- fn set_desktop_origin ( & mut self , origin : Vec2 ) {
146- self . desktop_origin = origin;
154+ let mut bytes = keymap
155+ . inner
156+ . get_as_string ( KEYMAP_FORMAT_TEXT_V1 )
157+ . into_bytes ( ) ;
158+ bytes. push ( 0 ) ;
159+ let fd = memfd_create ( "virtual-keyboard-keymap" , MemfdFlags :: CLOEXEC )
160+ . expect ( "Failed to create memfd" ) ;
161+
162+ let mut file = std:: fs:: File :: from ( fd) ;
163+ file. write_all ( & bytes) . expect ( "failed to write the keymap" ) ;
164+
165+ self . virtual_keyboard
166+ . keymap ( KeymapFormat :: XkbV1 as u32 , file. as_fd ( ) , bytes. len ( ) as u32 ) ;
167+ self . queue . roundtrip ( & mut self . state ) . unwrap ( ) ;
168+ self . keymap_file . replace ( file) ;
147169 }
148170
149171 fn commit ( & mut self ) {
@@ -153,10 +175,10 @@ impl HidProvider for WlVirtualProvider {
153175
154176impl WlVirtualProvider {
155177 pub fn try_new ( ) -> anyhow:: Result < Self > {
156- let mut state = KbState ;
178+ let state = KbState ;
157179
158180 let connection = wayland_client:: Connection :: connect_to_env ( ) ?;
159- let ( globals, mut queue) = registry_queue_init :: < KbState > ( & connection) ?;
181+ let ( globals, queue) = registry_queue_init :: < KbState > ( & connection) ?;
160182 let qh = queue. handle ( ) ;
161183 let seat: WlSeat = globals
162184 . bind ( & qh, 4 ..=9 , ( ) )
@@ -174,8 +196,28 @@ impl WlVirtualProvider {
174196
175197 let virtual_keyboard = keyboard_manager. create_virtual_keyboard ( & seat, & qh, ( ) ) ;
176198
199+ let mut result = Self {
200+ keymap_file : None ,
201+ _connection : connection,
202+ queue,
203+ state,
204+ virtual_pointer,
205+ virtual_keyboard,
206+ desktop_extent : Vec2 :: ZERO ,
207+ desktop_origin : Vec2 :: ZERO ,
208+ keyboard_mods_state : 0 ,
209+ } ;
210+
211+ result. set_keymap ( & XkbKeymap {
212+ inner : Self :: default_keymap ( ) ,
213+ } ) ;
214+
215+ Ok ( result)
216+ }
217+
218+ fn default_keymap ( ) -> Keymap {
177219 let xkb_context = Context :: new ( CONTEXT_NO_FLAGS ) ;
178- let xkb_keymap = Keymap :: new_from_names (
220+ Keymap :: new_from_names (
179221 & xkb_context,
180222 "" ,
181223 "" ,
@@ -184,30 +226,7 @@ impl WlVirtualProvider {
184226 None ,
185227 KEYMAP_COMPILE_NO_FLAGS ,
186228 )
187- . expect ( "Failed to compile XKB keymap" ) ;
188-
189- let mut bytes = xkb_keymap. get_as_string ( KEYMAP_FORMAT_TEXT_V1 ) . into_bytes ( ) ;
190- bytes. push ( 0 ) ;
191- let fd = memfd_create ( "virtual-keyboard-keymap" , MemfdFlags :: CLOEXEC )
192- . expect ( "Failed to create memfd" ) ;
193-
194- let mut file = std:: fs:: File :: from ( fd) ;
195- file. write_all ( & bytes) . expect ( "failed to write the keymap" ) ;
196-
197- virtual_keyboard. keymap ( KeymapFormat :: XkbV1 as u32 , file. as_fd ( ) , bytes. len ( ) as u32 ) ;
198- queue. roundtrip ( & mut state) ?;
199-
200- Ok ( Self {
201- _file : file,
202- _connection : connection,
203- queue,
204- state,
205- virtual_pointer,
206- virtual_keyboard,
207- desktop_extent : Vec2 :: ZERO ,
208- desktop_origin : Vec2 :: ZERO ,
209- keyboard_mods_state : 0 ,
210- } )
229+ . expect ( "Failed to compile XKB keymap" )
211230 }
212231
213232 fn modifier_keycode ( bit : u8 ) -> Option < u32 > {
0 commit comments