@@ -10,36 +10,38 @@ use wayland_protocols_misc::zwp_virtual_keyboard_v1::server::zwp_virtual_keyboar
10
10
self , ZwpVirtualKeyboardV1 ,
11
11
} ;
12
12
use 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 ,
16
15
} ;
17
16
use xkbcommon:: xkb;
18
17
19
- use crate :: input:: keyboard:: { KeyboardTarget , KeymapFile , ModifiersState } ;
18
+ use crate :: input:: keyboard:: { KeyboardTarget , ModifiersState } ;
19
+ use crate :: wayland:: input_method:: InputMethodSeat ;
20
20
use crate :: {
21
21
input:: { Seat , SeatHandler } ,
22
22
utils:: SERIAL_COUNTER ,
23
23
wayland:: seat:: { keyboard:: for_each_focused_kbds, WaylandFocus } ,
24
24
} ;
25
25
26
- use super :: VirtualKeyboardManagerState ;
26
+ use crate :: backend:: input:: KeyState ;
27
+
28
+ use super :: { VirtualKeyboardHandler , VirtualKeyboardManagerState } ;
27
29
28
30
#[ derive( Debug , Default ) ]
29
31
pub ( crate ) struct VirtualKeyboard {
30
32
state : Option < VirtualKeyboardState > ,
31
33
}
32
34
33
35
struct VirtualKeyboardState {
34
- keymap : KeymapFile ,
36
+ keymap : xkb :: Keymap ,
35
37
mods : ModifiersState ,
36
38
state : xkb:: State ,
37
39
}
38
40
39
41
impl fmt:: Debug for VirtualKeyboardState {
40
42
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
41
43
f. debug_struct ( "VirtualKeyboardState" )
42
- . field ( "keymap" , & self . keymap )
44
+ . field ( "keymap" , & self . keymap . get_as_string ( xkb :: KEYMAP_FORMAT_USE_ORIGINAL ) )
43
45
. field ( "mods" , & self . mods )
44
46
. field ( "state" , & self . state . get_raw_ptr ( ) )
45
47
. finish ( )
@@ -75,21 +77,35 @@ impl<D> Dispatch<ZwpVirtualKeyboardV1, VirtualKeyboardUserData<D>, D> for Virtua
75
77
where
76
78
D : Dispatch < ZwpVirtualKeyboardV1 , VirtualKeyboardUserData < D > > ,
77
79
D : SeatHandler + ' static ,
80
+ D : VirtualKeyboardHandler ,
78
81
<D as SeatHandler >:: KeyboardFocus : WaylandFocus ,
79
82
{
80
83
fn request (
81
84
user_data : & mut D ,
82
- _client : & Client ,
85
+ client : & Client ,
83
86
virtual_keyboard : & ZwpVirtualKeyboardV1 ,
84
87
request : zwp_virtual_keyboard_v1:: Request ,
85
88
data : & VirtualKeyboardUserData < D > ,
86
89
_dh : & DisplayHandle ,
87
90
_data_init : & mut DataInit < ' _ , D > ,
88
91
) {
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 ( ) ;
89
104
match request {
90
105
zwp_virtual_keyboard_v1:: Request :: Keymap { format, fd, size } => {
91
106
update_keymap ( data, format, fd, size as usize ) ;
92
107
}
108
+
93
109
zwp_virtual_keyboard_v1:: Request :: Key { time, key, state } => {
94
110
// Ensure keymap was initialized.
95
111
let mut virtual_data = data. handle . inner . lock ( ) . unwrap ( ) ;
@@ -100,25 +116,41 @@ where
100
116
return ;
101
117
}
102
118
} ;
103
-
104
119
// Ensure virtual keyboard's keymap is active.
105
120
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) ;
122
154
}
123
155
}
124
156
zwp_virtual_keyboard_v1:: Request :: Modifiers {
@@ -145,17 +177,27 @@ where
145
177
146
178
// Ensure virtual keyboard's keymap is active.
147
179
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
+ }
157
189
}
158
190
}
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
+ }
159
201
}
160
202
zwp_virtual_keyboard_v1:: Request :: Destroy => {
161
203
// Nothing to do
@@ -213,7 +255,7 @@ where
213
255
let mods = inner. state . take ( ) . map ( |state| state. mods ) . unwrap_or_default ( ) ;
214
256
inner. state = Some ( VirtualKeyboardState {
215
257
mods,
216
- keymap : KeymapFile :: new ( & new_keymap) ,
258
+ keymap : new_keymap. clone ( ) ,
217
259
state : xkb:: State :: new ( & new_keymap) ,
218
260
} ) ;
219
261
}
0 commit comments