@@ -10,36 +10,38 @@ use wayland_protocols_misc::zwp_virtual_keyboard_v1::server::zwp_virtual_keyboar
1010 self , ZwpVirtualKeyboardV1 ,
1111} ;
1212use wayland_server:: {
13- backend:: ClientId ,
14- protocol:: wl_keyboard:: { KeyState , KeymapFormat } ,
15- Client , DataInit , Dispatch , DisplayHandle , Resource ,
13+ backend:: ClientId , protocol:: wl_keyboard:: KeymapFormat , Client , DataInit , Dispatch , DisplayHandle ,
14+ Resource ,
1615} ;
1716use xkbcommon:: xkb;
1817
19- use crate :: input:: keyboard:: { KeyboardTarget , KeymapFile , ModifiersState } ;
18+ use crate :: input:: keyboard:: { KeyboardTarget , ModifiersState } ;
19+ use crate :: wayland:: input_method:: InputMethodSeat ;
2020use crate :: {
2121 input:: { Seat , SeatHandler } ,
2222 utils:: SERIAL_COUNTER ,
2323 wayland:: seat:: { keyboard:: for_each_focused_kbds, WaylandFocus } ,
2424} ;
2525
26- use super :: VirtualKeyboardManagerState ;
26+ use crate :: backend:: input:: KeyState ;
27+
28+ use super :: { VirtualKeyboardHandler , VirtualKeyboardManagerState } ;
2729
2830#[ derive( Debug , Default ) ]
2931pub ( crate ) struct VirtualKeyboard {
3032 state : Option < VirtualKeyboardState > ,
3133}
3234
3335struct VirtualKeyboardState {
34- keymap : KeymapFile ,
36+ keymap : xkb :: Keymap ,
3537 mods : ModifiersState ,
3638 state : xkb:: State ,
3739}
3840
3941impl fmt:: Debug for VirtualKeyboardState {
4042 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
4143 f. debug_struct ( "VirtualKeyboardState" )
42- . field ( "keymap" , & self . keymap )
44+ . field ( "keymap" , & self . keymap . get_as_string ( xkb :: KEYMAP_FORMAT_USE_ORIGINAL ) )
4345 . field ( "mods" , & self . mods )
4446 . field ( "state" , & self . state . get_raw_ptr ( ) )
4547 . finish ( )
@@ -75,21 +77,35 @@ impl<D> Dispatch<ZwpVirtualKeyboardV1, VirtualKeyboardUserData<D>, D> for Virtua
7577where
7678 D : Dispatch < ZwpVirtualKeyboardV1 , VirtualKeyboardUserData < D > > ,
7779 D : SeatHandler + ' static ,
80+ D : VirtualKeyboardHandler ,
7881 <D as SeatHandler >:: KeyboardFocus : WaylandFocus ,
7982{
8083 fn request (
8184 user_data : & mut D ,
82- _client : & Client ,
85+ client : & Client ,
8386 virtual_keyboard : & ZwpVirtualKeyboardV1 ,
8487 request : zwp_virtual_keyboard_v1:: Request ,
8588 data : & VirtualKeyboardUserData < D > ,
8689 _dh : & DisplayHandle ,
8790 _data_init : & mut DataInit < ' _ , D > ,
8891 ) {
92+ let ime_keyboard_grabbed = data
93+ . seat
94+ . input_method ( )
95+ . inner
96+ . lock ( )
97+ . unwrap ( )
98+ . keyboard_grab
99+ . inner
100+ . lock ( )
101+ . unwrap ( )
102+ . grab
103+ . clone ( ) ;
89104 match request {
90105 zwp_virtual_keyboard_v1:: Request :: Keymap { format, fd, size } => {
91106 update_keymap ( data, format, fd, size as usize ) ;
92107 }
108+
93109 zwp_virtual_keyboard_v1:: Request :: Key { time, key, state } => {
94110 // Ensure keymap was initialized.
95111 let mut virtual_data = data. handle . inner . lock ( ) . unwrap ( ) ;
@@ -100,25 +116,41 @@ where
100116 return ;
101117 }
102118 } ;
103-
104119 // Ensure virtual keyboard's keymap is active.
105120 let keyboard_handle = data. seat . get_keyboard ( ) . unwrap ( ) ;
106- let mut internal = keyboard_handle. arc . internal . lock ( ) . unwrap ( ) ;
107- let focus = internal. focus . as_mut ( ) . map ( |( focus, _) | focus) ;
108- keyboard_handle. send_keymap ( user_data, & focus, & vk_state. keymap , vk_state. mods ) ;
109-
110- if let Some ( wl_surface) = focus. and_then ( |f| f. wl_surface ( ) ) {
111- for_each_focused_kbds ( & data. seat , & wl_surface, |kbd| {
112- // This should be wl_keyboard::KeyState, but the protocol does not state
113- // the parameter is an enum.
114- let key_state = if state == 1 {
115- KeyState :: Pressed
116- } else {
117- KeyState :: Released
118- } ;
119-
120- kbd. key ( SERIAL_COUNTER . next_serial ( ) . 0 , time, key, key_state) ;
121- } ) ;
121+
122+ if ime_keyboard_grabbed. is_some ( )
123+ && ime_keyboard_grabbed. unwrap ( ) . client ( ) . unwrap ( ) == * client
124+ {
125+ use wayland_server:: protocol:: wl_keyboard:: KeyState ;
126+ let mut internal = keyboard_handle. arc . internal . lock ( ) . unwrap ( ) ;
127+ let focus = internal. focus . as_mut ( ) . map ( |( focus, _) | focus) ;
128+ keyboard_handle. change_keymap ( user_data, & focus, & vk_state. keymap , vk_state. mods ) ;
129+ if let Some ( wl_surface) = focus. and_then ( |f| f. wl_surface ( ) ) {
130+ for_each_focused_kbds ( & data. seat , & wl_surface, |kbd| {
131+ // This should be wl_keyboard::KeyState, but the protocol does not state
132+ // the parameter is an enum.
133+ let key_state = if state == 1 {
134+ KeyState :: Pressed
135+ } else {
136+ KeyState :: Released
137+ } ;
138+
139+ kbd. key ( SERIAL_COUNTER . next_serial ( ) . 0 , time, key, key_state) ;
140+ } ) ;
141+ }
142+ } else {
143+ {
144+ let mut internal = keyboard_handle. arc . internal . lock ( ) . unwrap ( ) ;
145+ let focus = internal. focus . as_mut ( ) . map ( |( focus, _) | focus) ;
146+ keyboard_handle. change_keymap ( user_data, & focus, & vk_state. keymap , vk_state. mods ) ;
147+ }
148+ let key_state = if state == 1 {
149+ KeyState :: Pressed
150+ } else {
151+ KeyState :: Released
152+ } ;
153+ user_data. on_keyboard_event ( ( key + 8 ) . into ( ) , key_state, time, keyboard_handle) ;
122154 }
123155 }
124156 zwp_virtual_keyboard_v1:: Request :: Modifiers {
@@ -145,17 +177,27 @@ where
145177
146178 // Ensure virtual keyboard's keymap is active.
147179 let keyboard_handle = data. seat . get_keyboard ( ) . unwrap ( ) ;
148- let mut internal = keyboard_handle . arc . internal . lock ( ) . unwrap ( ) ;
149- let focus = internal . focus . as_mut ( ) . map ( | ( focus , _ ) | focus ) ;
150- let keymap_changed =
151- keyboard_handle . send_keymap ( user_data , & focus , & state . keymap , state . mods ) ;
152-
153- // Report modifiers change to all keyboards.
154- if !keymap_changed {
155- if let Some ( focus ) = focus {
156- focus . modifiers ( & data . seat , user_data , state . mods , SERIAL_COUNTER . next_serial ( ) ) ;
180+ {
181+ let mut internal = keyboard_handle . arc . internal . lock ( ) . unwrap ( ) ;
182+ let focus = internal . focus . as_mut ( ) . map ( | ( focus , _ ) | focus ) ;
183+ let keymap_changed =
184+ keyboard_handle . change_keymap ( user_data , & focus , & state . keymap , state . mods ) ;
185+ if !keymap_changed {
186+ if let Some ( focus ) = focus {
187+ focus. modifiers ( & data . seat , user_data , state . mods , SERIAL_COUNTER . next_serial ( ) ) ;
188+ }
157189 }
158190 }
191+ if !ime_keyboard_grabbed. is_some ( )
192+ || !( ime_keyboard_grabbed. unwrap ( ) . client ( ) . unwrap ( ) == * client)
193+ {
194+ user_data. on_keyboard_modifiers (
195+ mods_depressed,
196+ mods_latched,
197+ mods_locked,
198+ keyboard_handle,
199+ ) ;
200+ }
159201 }
160202 zwp_virtual_keyboard_v1:: Request :: Destroy => {
161203 // Nothing to do
@@ -213,7 +255,7 @@ where
213255 let mods = inner. state . take ( ) . map ( |state| state. mods ) . unwrap_or_default ( ) ;
214256 inner. state = Some ( VirtualKeyboardState {
215257 mods,
216- keymap : KeymapFile :: new ( & new_keymap) ,
258+ keymap : new_keymap. clone ( ) ,
217259 state : xkb:: State :: new ( & new_keymap) ,
218260 } ) ;
219261}
0 commit comments