@@ -10,20 +10,22 @@ 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
18
use crate :: input:: keyboard:: { KeyboardTarget , KeymapFile , 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 {
@@ -75,11 +77,12 @@ 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 > ,
@@ -100,25 +103,56 @@ where
100
103
return ;
101
104
}
102
105
} ;
103
-
104
106
// Ensure virtual keyboard's keymap is active.
105
107
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
- } ) ;
108
+
109
+ let ime_keyboard_grabbed = data
110
+ . seat
111
+ . input_method ( )
112
+ . inner
113
+ . lock ( )
114
+ . unwrap ( )
115
+ . keyboard_grab
116
+ . inner
117
+ . lock ( )
118
+ . unwrap ( )
119
+ . grab
120
+ . clone ( ) ;
121
+ if ime_keyboard_grabbed. is_some ( )
122
+ && ime_keyboard_grabbed. unwrap ( ) . client ( ) . unwrap ( ) == * client
123
+ {
124
+ use wayland_server:: protocol:: wl_keyboard:: KeyState ;
125
+ let mut internal = keyboard_handle. arc . internal . lock ( ) . unwrap ( ) ;
126
+ let focus = internal. focus . as_mut ( ) . map ( |( focus, _) | focus) ;
127
+ keyboard_handle. send_keymap ( user_data, & focus, & vk_state. keymap , vk_state. mods ) ;
128
+ keyboard_handle
129
+ . set_keymap_from_string ( user_data, vk_state. keymap . keymap_string ( ) )
130
+ . unwrap ( ) ;
131
+ if let Some ( wl_surface) = focus. and_then ( |f| f. wl_surface ( ) ) {
132
+ for_each_focused_kbds ( & data. seat , & wl_surface, |kbd| {
133
+ // This should be wl_keyboard::KeyState, but the protocol does not state
134
+ // the parameter is an enum.
135
+ let key_state = if state == 1 {
136
+ KeyState :: Pressed
137
+ } else {
138
+ KeyState :: Released
139
+ } ;
140
+
141
+ kbd. key ( SERIAL_COUNTER . next_serial ( ) . 0 , time, key, key_state) ;
142
+ } ) ;
143
+ }
144
+ } else {
145
+ {
146
+ let mut internal = keyboard_handle. arc . internal . lock ( ) . unwrap ( ) ;
147
+ let focus = internal. focus . as_mut ( ) . map ( |( focus, _) | focus) ;
148
+ keyboard_handle. send_keymap ( user_data, & focus, & vk_state. keymap , vk_state. mods ) ;
149
+ }
150
+ let key_state = if state == 1 {
151
+ KeyState :: Pressed
152
+ } else {
153
+ KeyState :: Released
154
+ } ;
155
+ user_data. on_keyboard_event ( ( key + 8 ) . into ( ) , key_state, time, keyboard_handle) ;
122
156
}
123
157
}
124
158
zwp_virtual_keyboard_v1:: Request :: Modifiers {
0 commit comments