1
1
use memmap2:: MmapOptions ;
2
2
use std:: { env, ffi:: CString , fs:: File , os:: raw:: c_char, os:: unix:: ffi:: OsStringExt , ptr} ;
3
3
4
- use super :: ffi:: { self , xkb_state_component, XKBCOMMON_HANDLE as XKBH } ;
4
+ #[ cfg( feature = "dlopen" ) ]
5
+ use super :: ffi:: XKBCOMMON_HANDLE as XKBH ;
6
+ #[ cfg( not( feature = "dlopen" ) ) ]
7
+ use super :: ffi:: * ;
8
+ use super :: ffi:: { self , xkb_state_component} ;
5
9
use super :: Error ;
6
10
7
11
pub ( crate ) struct KbState {
@@ -65,45 +69,57 @@ impl ModifiersState {
65
69
66
70
fn update_with ( & mut self , state : * mut ffi:: xkb_state ) {
67
71
self . ctrl = unsafe {
68
- ( XKBH . xkb_state_mod_name_is_active ) (
72
+ ffi_dispatch ! (
73
+ XKBH ,
74
+ xkb_state_mod_name_is_active,
69
75
state,
70
76
ffi:: XKB_MOD_NAME_CTRL . as_ptr( ) as * const c_char,
71
- xkb_state_component:: XKB_STATE_MODS_EFFECTIVE ,
77
+ xkb_state_component:: XKB_STATE_MODS_EFFECTIVE
72
78
) > 0
73
79
} ;
74
80
self . alt = unsafe {
75
- ( XKBH . xkb_state_mod_name_is_active ) (
81
+ ffi_dispatch ! (
82
+ XKBH ,
83
+ xkb_state_mod_name_is_active,
76
84
state,
77
85
ffi:: XKB_MOD_NAME_ALT . as_ptr( ) as * const c_char,
78
- xkb_state_component:: XKB_STATE_MODS_EFFECTIVE ,
86
+ xkb_state_component:: XKB_STATE_MODS_EFFECTIVE
79
87
) > 0
80
88
} ;
81
89
self . shift = unsafe {
82
- ( XKBH . xkb_state_mod_name_is_active ) (
90
+ ffi_dispatch ! (
91
+ XKBH ,
92
+ xkb_state_mod_name_is_active,
83
93
state,
84
94
ffi:: XKB_MOD_NAME_SHIFT . as_ptr( ) as * const c_char,
85
- xkb_state_component:: XKB_STATE_MODS_EFFECTIVE ,
95
+ xkb_state_component:: XKB_STATE_MODS_EFFECTIVE
86
96
) > 0
87
97
} ;
88
98
self . caps_lock = unsafe {
89
- ( XKBH . xkb_state_mod_name_is_active ) (
99
+ ffi_dispatch ! (
100
+ XKBH ,
101
+ xkb_state_mod_name_is_active,
90
102
state,
91
103
ffi:: XKB_MOD_NAME_CAPS . as_ptr( ) as * const c_char,
92
- xkb_state_component:: XKB_STATE_MODS_EFFECTIVE ,
104
+ xkb_state_component:: XKB_STATE_MODS_EFFECTIVE
93
105
) > 0
94
106
} ;
95
107
self . logo = unsafe {
96
- ( XKBH . xkb_state_mod_name_is_active ) (
108
+ ffi_dispatch ! (
109
+ XKBH ,
110
+ xkb_state_mod_name_is_active,
97
111
state,
98
112
ffi:: XKB_MOD_NAME_LOGO . as_ptr( ) as * const c_char,
99
- xkb_state_component:: XKB_STATE_MODS_EFFECTIVE ,
113
+ xkb_state_component:: XKB_STATE_MODS_EFFECTIVE
100
114
) > 0
101
115
} ;
102
116
self . num_lock = unsafe {
103
- ( XKBH . xkb_state_mod_name_is_active ) (
117
+ ffi_dispatch ! (
118
+ XKBH ,
119
+ xkb_state_mod_name_is_active,
104
120
state,
105
121
ffi:: XKB_MOD_NAME_NUM . as_ptr( ) as * const c_char,
106
- xkb_state_component:: XKB_STATE_MODS_EFFECTIVE ,
122
+ xkb_state_component:: XKB_STATE_MODS_EFFECTIVE
107
123
) > 0
108
124
} ;
109
125
}
@@ -121,14 +137,16 @@ impl KbState {
121
137
return ;
122
138
}
123
139
let mask = unsafe {
124
- ( XKBH . xkb_state_update_mask ) (
140
+ ffi_dispatch ! (
141
+ XKBH ,
142
+ xkb_state_update_mask,
125
143
self . xkb_state,
126
144
mods_depressed,
127
145
mods_latched,
128
146
mods_locked,
129
147
0 ,
130
148
0 ,
131
- group,
149
+ group
132
150
)
133
151
} ;
134
152
if mask. contains ( xkb_state_component:: XKB_STATE_MODS_EFFECTIVE ) {
@@ -141,27 +159,36 @@ impl KbState {
141
159
if !self . ready ( ) {
142
160
return 0 ;
143
161
}
144
- unsafe { ( XKBH . xkb_state_key_get_one_sym ) ( self . xkb_state , keycode + 8 ) }
162
+ unsafe { ffi_dispatch ! ( XKBH , xkb_state_key_get_one_sym, self . xkb_state, keycode + 8 ) }
145
163
}
146
164
147
165
pub ( crate ) fn get_utf8_raw ( & mut self , keycode : u32 ) -> Option < String > {
148
166
if !self . ready ( ) {
149
167
return None ;
150
168
}
151
169
let size = unsafe {
152
- ( XKBH . xkb_state_key_get_utf8 ) ( self . xkb_state , keycode + 8 , ptr:: null_mut ( ) , 0 )
170
+ ffi_dispatch ! (
171
+ XKBH ,
172
+ xkb_state_key_get_utf8,
173
+ self . xkb_state,
174
+ keycode + 8 ,
175
+ ptr:: null_mut( ) ,
176
+ 0
177
+ )
153
178
} + 1 ;
154
179
if size <= 1 {
155
180
return None ;
156
181
} ;
157
182
let mut buffer = Vec :: with_capacity ( size as usize ) ;
158
183
unsafe {
159
184
buffer. set_len ( size as usize ) ;
160
- ( XKBH . xkb_state_key_get_utf8 ) (
185
+ ffi_dispatch ! (
186
+ XKBH ,
187
+ xkb_state_key_get_utf8,
161
188
self . xkb_state,
162
189
keycode + 8 ,
163
190
buffer. as_mut_ptr( ) as * mut _,
164
- size as usize ,
191
+ size as usize
165
192
) ;
166
193
} ;
167
194
// remove the final `\0`
@@ -174,33 +201,41 @@ impl KbState {
174
201
if !self . ready ( ) || self . xkb_compose_state . is_null ( ) {
175
202
return None ;
176
203
}
177
- Some ( unsafe { ( XKBH . xkb_compose_state_feed ) ( self . xkb_compose_state , keysym) } )
204
+ Some ( unsafe { ffi_dispatch ! ( XKBH , xkb_compose_state_feed, self . xkb_compose_state, keysym) } )
178
205
}
179
206
180
207
pub ( crate ) fn compose_status ( & mut self ) -> Option < ffi:: xkb_compose_status > {
181
208
if !self . ready ( ) || self . xkb_compose_state . is_null ( ) {
182
209
return None ;
183
210
}
184
- Some ( unsafe { ( XKBH . xkb_compose_state_get_status ) ( self . xkb_compose_state ) } )
211
+ Some ( unsafe { ffi_dispatch ! ( XKBH , xkb_compose_state_get_status, self . xkb_compose_state) } )
185
212
}
186
213
187
214
pub ( crate ) fn compose_get_utf8 ( & mut self ) -> Option < String > {
188
215
if !self . ready ( ) || self . xkb_compose_state . is_null ( ) {
189
216
return None ;
190
217
}
191
218
let size = unsafe {
192
- ( XKBH . xkb_compose_state_get_utf8 ) ( self . xkb_compose_state , ptr:: null_mut ( ) , 0 )
219
+ ffi_dispatch ! (
220
+ XKBH ,
221
+ xkb_compose_state_get_utf8,
222
+ self . xkb_compose_state,
223
+ ptr:: null_mut( ) ,
224
+ 0
225
+ )
193
226
} + 1 ;
194
227
if size <= 1 {
195
228
return None ;
196
229
} ;
197
230
let mut buffer = Vec :: with_capacity ( size as usize ) ;
198
231
unsafe {
199
232
buffer. set_len ( size as usize ) ;
200
- ( XKBH . xkb_compose_state_get_utf8 ) (
233
+ ffi_dispatch ! (
234
+ XKBH ,
235
+ xkb_compose_state_get_utf8,
201
236
self . xkb_compose_state,
202
237
buffer. as_mut_ptr( ) as * mut _,
203
- size as usize ,
238
+ size as usize
204
239
) ;
205
240
} ;
206
241
// remove the final `\0`
@@ -210,18 +245,21 @@ impl KbState {
210
245
}
211
246
212
247
pub ( crate ) fn new ( ) -> Result < KbState , Error > {
213
- let xkbh = match ffi:: XKBCOMMON_OPTION . as_ref ( ) {
214
- Some ( h) => h,
215
- None => return Err ( Error :: XKBNotFound ) ,
248
+ #[ cfg( feature = "dlopen" ) ]
249
+ {
250
+ if ffi:: XKBCOMMON_OPTION . as_ref ( ) . is_none ( ) {
251
+ return Err ( Error :: XKBNotFound ) ;
252
+ }
253
+ }
254
+ let context = unsafe {
255
+ ffi_dispatch ! ( XKBH , xkb_context_new, ffi:: xkb_context_flags:: XKB_CONTEXT_NO_FLAGS )
216
256
} ;
217
- let xkb_context =
218
- unsafe { ( xkbh. xkb_context_new ) ( ffi:: xkb_context_flags:: XKB_CONTEXT_NO_FLAGS ) } ;
219
- if xkb_context. is_null ( ) {
257
+ if context. is_null ( ) {
220
258
return Err ( Error :: XKBNotFound ) ;
221
259
}
222
260
223
261
let mut me = KbState {
224
- xkb_context,
262
+ xkb_context : context ,
225
263
xkb_keymap : ptr:: null_mut ( ) ,
226
264
xkb_state : ptr:: null_mut ( ) ,
227
265
xkb_compose_table : ptr:: null_mut ( ) ,
@@ -276,84 +314,92 @@ impl KbState {
276
314
. unwrap_or_else ( || "C" . into ( ) ) ;
277
315
let locale = CString :: new ( locale. into_vec ( ) ) . unwrap ( ) ;
278
316
279
- let compose_table = ( XKBH . xkb_compose_table_new_from_locale ) (
317
+ let compose_table = ffi_dispatch ! (
318
+ XKBH ,
319
+ xkb_compose_table_new_from_locale,
280
320
self . xkb_context,
281
321
locale. as_ptr( ) ,
282
- ffi:: xkb_compose_compile_flags:: XKB_COMPOSE_COMPILE_NO_FLAGS ,
322
+ ffi:: xkb_compose_compile_flags:: XKB_COMPOSE_COMPILE_NO_FLAGS
283
323
) ;
284
324
285
325
if compose_table. is_null ( ) {
286
326
// init of compose table failed, continue without compose
287
327
return ;
288
328
}
289
329
290
- let compose_state = ( XKBH . xkb_compose_state_new ) (
330
+ let compose_state = ffi_dispatch ! (
331
+ XKBH ,
332
+ xkb_compose_state_new,
291
333
compose_table,
292
- ffi:: xkb_compose_state_flags:: XKB_COMPOSE_STATE_NO_FLAGS ,
334
+ ffi:: xkb_compose_state_flags:: XKB_COMPOSE_STATE_NO_FLAGS
293
335
) ;
294
336
295
337
if compose_state. is_null ( ) {
296
338
// init of compose state failed, continue without compose
297
- ( XKBH . xkb_compose_table_unref ) ( compose_table) ;
339
+ ffi_dispatch ! ( XKBH , xkb_compose_table_unref, compose_table) ;
298
340
return ;
299
341
}
300
342
301
343
self . xkb_compose_table = compose_table;
302
344
self . xkb_compose_state = compose_state;
303
345
}
304
346
305
- pub ( crate ) unsafe fn post_init ( & mut self , xkb_keymap : * mut ffi:: xkb_keymap ) {
306
- let xkb_state = ( XKBH . xkb_state_new ) ( xkb_keymap ) ;
307
- self . xkb_keymap = xkb_keymap ;
308
- self . xkb_state = xkb_state ;
309
- self . mods_state . update_with ( xkb_state ) ;
347
+ pub ( crate ) unsafe fn post_init ( & mut self , keymap : * mut ffi:: xkb_keymap ) {
348
+ let state = ffi_dispatch ! ( XKBH , xkb_state_new, keymap ) ;
349
+ self . xkb_keymap = keymap ;
350
+ self . xkb_state = state ;
351
+ self . mods_state . update_with ( state ) ;
310
352
}
311
353
312
354
pub ( crate ) unsafe fn de_init ( & mut self ) {
313
- ( XKBH . xkb_state_unref ) ( self . xkb_state ) ;
355
+ ffi_dispatch ! ( XKBH , xkb_state_unref, self . xkb_state) ;
314
356
self . xkb_state = ptr:: null_mut ( ) ;
315
- ( XKBH . xkb_keymap_unref ) ( self . xkb_keymap ) ;
357
+ ffi_dispatch ! ( XKBH , xkb_keymap_unref, self . xkb_keymap) ;
316
358
self . xkb_keymap = ptr:: null_mut ( ) ;
317
359
}
318
360
319
361
pub ( crate ) unsafe fn init_with_fd ( & mut self , fd : File , size : usize ) {
320
362
let map = MmapOptions :: new ( ) . len ( size) . map ( & fd) . unwrap ( ) ;
321
363
322
- let xkb_keymap = ( XKBH . xkb_keymap_new_from_string ) (
364
+ let keymap = ffi_dispatch ! (
365
+ XKBH ,
366
+ xkb_keymap_new_from_string,
323
367
self . xkb_context,
324
368
map. as_ptr( ) as * const _,
325
369
ffi:: xkb_keymap_format:: XKB_KEYMAP_FORMAT_TEXT_V1 ,
326
- ffi:: xkb_keymap_compile_flags:: XKB_KEYMAP_COMPILE_NO_FLAGS ,
370
+ ffi:: xkb_keymap_compile_flags:: XKB_KEYMAP_COMPILE_NO_FLAGS
327
371
) ;
328
372
329
- if xkb_keymap . is_null ( ) {
373
+ if keymap . is_null ( ) {
330
374
panic ! ( "Received invalid keymap from compositor." ) ;
331
375
}
332
376
333
- self . post_init ( xkb_keymap ) ;
377
+ self . post_init ( keymap ) ;
334
378
}
335
379
336
380
pub ( crate ) unsafe fn init_with_rmlvo (
337
381
& mut self ,
338
382
names : ffi:: xkb_rule_names ,
339
383
) -> Result < ( ) , Error > {
340
- let xkb_keymap = ( XKBH . xkb_keymap_new_from_names ) (
384
+ let keymap = ffi_dispatch ! (
385
+ XKBH ,
386
+ xkb_keymap_new_from_names,
341
387
self . xkb_context,
342
388
& names,
343
- ffi:: xkb_keymap_compile_flags:: XKB_KEYMAP_COMPILE_NO_FLAGS ,
389
+ ffi:: xkb_keymap_compile_flags:: XKB_KEYMAP_COMPILE_NO_FLAGS
344
390
) ;
345
391
346
- if xkb_keymap . is_null ( ) {
392
+ if keymap . is_null ( ) {
347
393
return Err ( Error :: BadNames ) ;
348
394
}
349
395
350
- self . post_init ( xkb_keymap ) ;
396
+ self . post_init ( keymap ) ;
351
397
352
398
Ok ( ( ) )
353
399
}
354
400
355
401
pub ( crate ) unsafe fn key_repeats ( & mut self , xkb_keycode_t : ffi:: xkb_keycode_t ) -> bool {
356
- ( XKBH . xkb_keymap_key_repeats ) ( self . xkb_keymap , xkb_keycode_t) == 1
402
+ ffi_dispatch ! ( XKBH , xkb_keymap_key_repeats, self . xkb_keymap, xkb_keycode_t) == 1
357
403
}
358
404
359
405
#[ inline]
@@ -375,11 +421,11 @@ impl KbState {
375
421
impl Drop for KbState {
376
422
fn drop ( & mut self ) {
377
423
unsafe {
378
- ( XKBH . xkb_compose_state_unref ) ( self . xkb_compose_state ) ;
379
- ( XKBH . xkb_compose_table_unref ) ( self . xkb_compose_table ) ;
380
- ( XKBH . xkb_state_unref ) ( self . xkb_state ) ;
381
- ( XKBH . xkb_keymap_unref ) ( self . xkb_keymap ) ;
382
- ( XKBH . xkb_context_unref ) ( self . xkb_context ) ;
424
+ ffi_dispatch ! ( XKBH , xkb_compose_state_unref, self . xkb_compose_state) ;
425
+ ffi_dispatch ! ( XKBH , xkb_compose_table_unref, self . xkb_compose_table) ;
426
+ ffi_dispatch ! ( XKBH , xkb_state_unref, self . xkb_state) ;
427
+ ffi_dispatch ! ( XKBH , xkb_keymap_unref, self . xkb_keymap) ;
428
+ ffi_dispatch ! ( XKBH , xkb_context_unref, self . xkb_context) ;
383
429
}
384
430
}
385
431
}
0 commit comments