Coverage report: /home/ellis/comp/core/ffi/xkb/pkg.lisp

KindCoveredAll%
expression3117 2.6
branch00nil
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;; ffi/xkb/pkg.lisp --- XKBCommon bindings
2
 
3
 ;; We use the X Keyboard Configuration Database for keymaps.
4
 
5
 ;; ref: https://xkbcommon.org/doc/current/
6
 ;; https://www.freedesktop.org/wiki/Software/XKeyboardConfig/
7
 ;; https://www.x.org/releases/X11R7.6/doc/xorg-docs/input/XKB-Config.html
8
 ;; https://people.uleth.ca/~daniel.odonnell/Blog/custom-keyboard-in-linuxx11
9
 
10
 ;;; Code:
11
 (defpackage :xkb
12
   (:use :cl :std :sb-alien)
13
   (:export 
14
    :xkb-context :xkb-keymap
15
    :xkb-keycode :xkb-keysym
16
    :xkb-layout-index :xkb-layout-mask
17
    :xkb-level-index :xkb-mod-index
18
    :xkb-mod-mask :xkb-led-index :xkb-led-mask
19
    :xkb-keysym-flags :xkb-context-flags
20
    :xkb-keysym-get-name :xkb-keysym-from-name :xkb-keysym-to-utf8
21
    :xkb-keysym-to-utf32 :xkb-utf32-to-keysym :xkb-keysym-to-upper
22
    :xkb-keysym-to-lower :xkb-context-new :xkb-context-set-user-data
23
    :xkb-context-get-user-data :xkb-context-include-path-append
24
    :xkb-context-include-path-append-default :xkb-context-include-path-reset-defaults
25
    :xkb-context-include-path-clear :xkb-context-num-include-paths :xkb-context-include-path-get
26
    :load-xkbcommon))
27
 
28
 (in-package :xkb)
29
 
30
 (define-alien-loader xkbcommon "/usr/lib/")
31
 
32
 (define-alien-type xkb-context (struct xkb-context))
33
 (define-alien-type xkb-keymap (struct xkb-keymap))
34
 (define-alien-type xkb-state (struct xkb-state))
35
 (define-alien-type xkb-keycode unsigned-int)
36
 (define-alien-type xkb-keysym unsigned-int)
37
 (define-alien-type xkb-layout-index unsigned-int)
38
 (define-alien-type xkb-layout-mask unsigned-int)
39
 (define-alien-type xkb-level-index unsigned-int)
40
 (define-alien-type xkb-mod-index unsigned-int)
41
 (define-alien-type xkb-mod-mask unsigned-int)
42
 (define-alien-type xkb-led-index unsigned-int)
43
 (define-alien-type xkb-led-mask unsigned-int)
44
 
45
 (define-alien-enum (xkb-keysym-flags unsigned-char)
46
                    :no-flags 0
47
                    :case-insensitive (ash 1 0))
48
 (define-alien-enum (xkb-context-flags unsigned-char)
49
                    :no-flags 0
50
                    :no-default-includes (ash 1 0)
51
                    :no-environment-names (ash 1 1)
52
                    :no-secure-getenv (ash 1 2))
53
 
54
 (define-alien-enum (xkb-keymap-compile-flags unsigned-char)
55
                    :no-flags 0)
56
 
57
 (define-alien-enum (xkb-keymap-format int)
58
                    :text-v1 1)
59
 
60
 (define-alien-type xkb-rule-names
61
     (struct xkb-rule-names
62
             (rules c-string)
63
             (model c-string)
64
             (layout c-string)
65
             (variant c-string)
66
             (options c-string)))
67
 
68
 (defar xkb-keysym-get-name int
69
   (keysym xkb-keysym)
70
   (buffer (* unsigned-char))
71
   (size size-t))
72
 
73
 (defar xkb-keysym-from-name xkb-keysym
74
   (name c-string)
75
   (flags xkb-keysym-flags))
76
 
77
 (defar xkb-keysym-to-utf8 int
78
   (keysym xkb-keysym)
79
   (buffer c-string)
80
   (size size-t))
81
 
82
 (defar xkb-keysym-to-utf32 unsigned-int
83
   (keysym xkb-keysym))
84
 
85
 (defar xkb-utf32-to-keysym xkb-keysym
86
   (ucs unsigned-int))
87
 
88
 (defar xkb-keysym-to-upper xkb-keysym
89
   (ks xkb-keysym))
90
 
91
 (defar xkb-keysym-to-lower xkb-keysym
92
   (ks xkb-keysym))
93
 
94
 (defar xkb-context-new (* xkb-context)
95
   (flags xkb-context-flags))
96
 
97
 (defar xkb-context-set-user-data void
98
   (context (* xkb-context))
99
   (user-data (* t)))
100
 
101
 ;; (defar xkb-context-get-user-data (* t)
102
 ;;   (context (* xkb-context)))
103
 
104
 (defar xkb-context-include-path-append int
105
   (context (* xkb-context))
106
   (path c-string))
107
 
108
 (defar xkb-context-include-path-append-default int
109
   (context (* xkb-context)))
110
 
111
 (defar xkb-context-include-path-reset-defaults int
112
   (context (* xkb-context)))
113
 
114
 (defar xkb-context-include-path-clear void
115
   (context (* xkb-context)))
116
 
117
 (defar xkb-context-num-include-paths unsigned-int
118
   (context (* xkb-context)))
119
 
120
 (defar xkb-context-include-path-get c-string
121
   (context (* xkb-context)))
122
 
123
 ;;; NYI Logging
124
 
125
 ;; https://xkbcommon.org/doc/current/group__logging.html
126
 
127
 (define-alien-enum (xkb-log-level int)
128
                    :critical 10
129
                    :error 20
130
                    :warning 30
131
                    :info 40
132
                    :debug 50)
133
 ;;; Keymap Init
134
 
135
 (defar xkb-keymap-new-from-names (* xkb-keymap)
136
   (context (* xkb-context))
137
   (names (* xkb-rule-names))
138
   (flags xkb-keymap-compile-flags))
139
 
140
 (defar xkb-keymap-new-from-file (* xkb-keymap)
141
   (context (* xkb-context))
142
   (file (* t))
143
   (fmt xkb-keymap-format)
144
   (flags xkb-keymap-compile-flags))
145
 
146
 (defar xkb-keymap-new-from-string (* xkb-keymap)
147
   (context (* xkb-context))
148
   (str c-string)
149
   (fmt xkb-keymap-format)
150
   (flags xkb-keymap-compile-flags))
151
 
152
 (defar xkb-keymap-new-from-buffer (* xkb-keymap)
153
   (context (* xkb-context))
154
   (buffer c-string)
155
   (length size-t)
156
   (fmt xkb-keymap-format)
157
   (flags xkb-keymap-compile-flags))
158
 
159
 ;;; Keymap Components
160
 
161
 (defar xkb-keymap-min-keycode xkb-keycode
162
   (keymap (* xkb-keymap)))
163
 
164
 (defar xkb-keymap-max-keycode xkb-keycode
165
   (keymap (* xkb-keymap)))
166
 
167
 (defar xkb-keymap-key-for-each void
168
   (keymap (* xkb-keymap))
169
   (iter (* t))
170
   (data (* t)))
171
 
172
 (defar xkb-keymap-key-get-name c-string
173
   (keymap (* xkb-keymap))
174
   (key xkb-keycode))
175
 
176
 (defar xkb-keymap-num-mods xkb-mod-index
177
   (keymap (* xkb-keymap)))
178
 
179
 (defar xkb-keymap-mod-get-name c-string
180
   (keymap (* xkb-keymap))
181
   (idx xkb-mod-index))
182
 
183
 (defar xkb-keymap-get-index xkb-mod-index
184
   (keymap (* xkb-keymap))
185
   (name c-string))
186
 
187
 (defar xkb-keymap-num-layouts xkb-layout-index
188
   (keymap (* xkb-keymap)))
189
 
190
 (defar xkb-keymap-layout-get-name c-string
191
   (keymap (* xkb-keymap))
192
   (idx xkb-layout-index))
193
 
194
 (defar xkb-keymap-layout-get-index xkb-layout-index
195
   (keymap (* xkb-keymap))
196
   (name c-string))
197
 
198
 (defar xkb-keymap-num-leds xkb-led-index
199
   (keymap (* xkb-keymap)))
200
 
201
 (defar xkb-keymap-led-get-name c-string
202
   (keymap (* xkb-keymap))
203
   (idx xkb-led-index))
204
 
205
 (defar xkb-keymap-led-get-index xkb-led-index
206
   (keymap (* xkb-keymap))
207
   (name c-string))
208
 
209
 (defar xkb-keymap-num-levels-for-key xkb-level-index
210
   (keymap (* xkb-keymap))
211
   (key xkb-keycode)
212
   (layout xkb-layout-index))
213
 
214
 (defar xkb-keymap-key-get-mods-for-level size-t
215
   (keymap (* xkb-keymap))
216
   (key xkb-keycode)
217
   (layout xkb-layout-index)
218
   (level xkb-level-index)
219
   (masks-out (* xkb-mod-mask))
220
   (masks-size size-t))
221
 
222
 (defar xkb-keymap-key-get-syms-by-level int
223
   (keymap (* xkb-keymap))
224
   (key xkb-keycode)
225
   (layout xkb-layout-index)
226
   (level xkb-level-index)
227
   (syms-out (* (* xkb-keysym))))
228
 
229
 (defar xkb-keymap-key-repeats int
230
   (keymap (* xkb-keymap))
231
   (key xkb-keycode))
232
 
233
 ;;; Keyboard State
234
 (defar xkb-state-new (* xkb-state) (keymap (* xkb-keymap)))
235
 (defar xkb-state-ref (* xkb-state) (state (* xkb-state)))
236
 (defar xkb-state-unref void (state (* xkb-state)))
237
 (defar xkb-state-get-keymap (* xkb-keymap) (state (* xkb-state)))
238
 
239
 (define-alien-enum (xkb-key-direction unsigned-char)
240
                    :up 0
241
                    :down 1)
242
 
243
 (define-alien-enum (xkb-state-component int)
244
                    :mods-depressed (ash 1 0)
245
                    :mods-latched (ash 1 1)
246
                    :mods-locked (ash 1 2)
247
                    :mods-effective (ash 1 3)
248
                    :layout-depressed (ash 1 4)
249
                    :layout-latched (ash 1 5)
250
                    :layout-locked (ash 1 6)
251
                    :layout-effective (ash 1 7)
252
                    :leds (ash 1 8))
253
 
254
 (defar xkb-state-update-key xkb-state-component
255
   (state (* xkb-state))
256
   (key xkb-keycode)
257
   (direction xkb-key-direction))
258
 
259
 (defar xkb-state-update-mask xkb-state-component
260
   (state (* xkb-state))
261
   (depressed-mods xkb-mod-mask)
262
   (latched-mods xkb-mod-mask)
263
   (locked-mods xkb-mod-mask)
264
   (depressed-layout xkb-mod-mask)
265
   (latched-layout xkb-mod-mask)
266
   (locked-layout xkb-mod-mask))
267
 
268
 (defar xkb-state-key-get-syms int
269
   (state (* xkb-state))
270
   (key xkb-keycode)
271
   (syms-out (* (* xkb-keysym))))
272
 
273
 (defar xkb-state-key-get-utf8 int
274
   (state (* xkb-state))
275
   (key xkb-keycode)
276
   (buffer (* unsigned-char))
277
   (size size-t))
278
 
279
 (defar xkb-state-key-get-utf32 int
280
   (state (* xkb-state))
281
   (key xkb-keycode))
282
 
283
 (defar xkb-state-key-get-one-sym xkb-keysym
284
   (state (* xkb-state))
285
   (key xkb-keycode))
286
 
287
 (defar xkb-state-key-get-layout xkb-layout-index
288
   (state (* xkb-state))
289
   (key xkb-keycode))
290
 
291
 (defar xkb-state-key-get-level xkb-level-index
292
   (state (* xkb-state))
293
   (key xkb-keycode)
294
   (layout xkb-layout-index))
295
 
296
 (define-alien-enum (xkb-state-match int)
297
                    :any (ash 1 0)
298
                    :all (ash 1 1)
299
                    :non-exclusive (ash 1 16))
300
 
301
 (defar xkb-state-serialize-mods xkb-mod-mask
302
   (state (* xkb-state))
303
   (components xkb-state-component))
304
 
305
 (defar xkb-state-serialize-layout xkb-layout-index
306
   (state (* xkb-state))
307
   (components xkb-state-component))
308
 
309
 (defar xkb-state-mod-name-is-active int
310
   (state (* xkb-state))
311
   (name (* unsigned-char))
312
   (type xkb-state-component))
313
 
314
 (defar xkb-state-mod-names-are-active int
315
   (state (* xkb-state))
316
   (type xkb-state-component)
317
   (match xkb-state-match)
318
   #+nil ...)
319
 
320
 (defar xkb-state-mod-index-is-active int
321
   (state (* xkb-state))
322
   (idx xkb-mod-index)
323
   (type xkb-state-component))
324
 
325
 (defar xkb-state-mod-indices-are-active int
326
   (state (* xkb-state))
327
   (type xkb-state-component)
328
   (match xkb-state-match)
329
   #+nil ...)
330
 
331
 (define-alien-enum (xkb-consumed-mode int)
332
                    :xkb 0
333
                    :gtk 1)
334
 
335
 (defar xkb-state-key-get-consumed-mods2 xkb-mod-mask
336
   (state (* xkb-state))
337
   (key xkb-keycode)
338
   (mode xkb-consumed-mode))
339
 
340
 (defar xkb-state-key-get-consumed-mods xkb-mod-mask
341
   (state (* xkb-state))
342
   (key xkb-keycode))
343
 
344
 (defar xkb-state-mod-index-is-consumed2 int
345
   (state (* xkb-state))
346
   (key xkb-keycode)
347
   (idx xkb-mod-index)
348
   (mode xkb-consumed-mode))
349
 
350
 (defar xkb-state-mod-index-is-consumed int
351
   (state (* xkb-state))
352
   (key xkb-keycode)
353
   (idx xkb-mod-index))
354
 
355
 (defar xkb-state-mode-mask-remove-consumed xkb-mod-mask
356
   (state (* xkb-state))
357
   (key xkb-keycode)
358
   (mask xkb-mod-mask))
359
 
360
 (defar xkb-state-layout-name-is-active int
361
   (state (* xkb-state))
362
   (name (* unsigned-char))
363
   (type xkb-state-component))
364
 
365
 (defar xkb-state-layout-index-is-active int
366
   (state (* xkb-state))
367
   (idx xkb-layout-index)
368
   (type xkb-state-component))
369
 
370
 (defar xkb-state-led-name-is-active int
371
   (state (* xkb-state))
372
   (name (* unsigned-char)))
373
 
374
 (defar xkb-state-led-index-is-active int
375
   (state (* xkb-state))
376
   (idx xkb-led-index))
377
 
378
 ;;; xkbcommon-compose.h
379
 (define-alien-type xkb-compose-table (struct xkb-compose-table))
380
 
381
 (define-alien-type xkb-compose-state (struct xkb-compose-state))
382
 
383
 (define-alien-enum (xkb-compose-compile-flags unsigned-char)
384
                    :no-flags 0)
385
 
386
 (define-alien-enum (xkb-compose-format unsigned-char)
387
                    :text-v1 1)
388
 
389
 (defar xkb-compose-table-new-from-locale (* xkb-compose-table)
390
   (context (* xkb-context))
391
   (locale (* unsigned-char))
392
   (flags xkb-compose-compile-flags))
393
 
394
 (defar xkb-compose-table-new-from-file (* xkb-compose-table)
395
   (file (* t)) ;;FILE
396
   (locale (* unsigned-char))
397
   (format xkb-compose-format)
398
   (flags xkb-compose-compile-flags))
399
 
400
 (defar xkb-compose-table-new-from-buffer (* xkb-compose-table)
401
   (context (* xkb-context))
402
   (buffer (* unsigned-char))
403
   (length size-t)
404
   (locale (* unsigned-char))
405
   (format xkb-compose-format)
406
   (flags xkb-compose-compile-flags))
407
 
408
 (defar xkb-compose-table-ref (* xkb-compose-table)
409
   (table (* xkb-compose-table)))
410
 
411
 (defar xkb-compose-table-unref void
412
   (table (* xkb-compose-table)))
413
 
414
 (define-alien-type xkb-compose-table-entry (struct xkb-compose-table-entry))
415
 
416
 (defar xkb-compose-table-entry-sequence (* xkb-keysym)
417
   (entry (* xkb-compose-table-entry))
418
   (sequence-length (* size-t)))
419
 
420
 (defar xkb-compose-table-entry-keysym xkb-keysym
421
   (entry (* xkb-compose-table-entry)))
422
 
423
 (defar xkb-compose-table-entry-utf8 (* unsigned-char)
424
   (entry (* xkb-compose-table-entry)))
425
 
426
 (define-alien-type xkb-compose-table-iterator (struct xkb-compose-table-iterator))
427
 
428
 (defar xkb-compose-table-iterator-new (* xkb-compose-table-iterator)
429
   (table (* xkb-compose-table)))
430
 
431
 (defar xkb-compose-table-iterator-free void
432
   (iter (* xkb-compose-table-iterator)))
433
 
434
 (defar xkb-compose-table-iterator-next (* xkb-compose-table-entry)
435
   (iter (* xkb-compose-table-iterator)))
436
 
437
 (define-alien-enum (xkb-compose-state-flags int)
438
                    :no-flags 0)
439
 
440
 (defar xkb-compose-state-new (* xkb-compose-state)
441
   (table (* xkb-compose-table))
442
   (flags xkb-compose-state-flags))
443
 
444
 (defar xkb-compose-state-ref (* xkb-compose-state)
445
   (state (* xkb-compose-state)))
446
 
447
 (defar xkb-compose-state-unref void
448
   (state (* xkb-compose-state)))
449
 
450
 (defar xkb-compose-state-get-compose-table (* xkb-compose-table)
451
   (state (* xkb-compose-state)))
452
 
453
 (define-alien-enum (xkb-compose-status unsigned-char)
454
                    :nothing 0
455
                    :composing 1
456
                    :composed 2
457
                    :cancelled 3)
458
 
459
 (define-alien-enum (xkb-compose-feed-result unsigned-char)
460
                    :ignored 0
461
                    :accepted 1)
462
 
463
 (defar xkb-compose-state-feed xkb-compose-feed-result
464
   (state (* xkb-compose-state))
465
   (keysym xkb-keysym))
466
 
467
 (defar xkb-compose-state-reset void
468
   (state (* xkb-compose-state)))
469
 
470
 (defar xkb-compose-state-get-status xkb-compose-status
471
   (state (* xkb-compose-state)))
472
 
473
 (defar xkb-compose-state-get-utf8 int
474
   (state (* xkb-compose-state))
475
   (buffer (* unsigned-char))
476
   (size size-t))
477
 
478
 (defar xkb-compose-state-get-one-sym xkb-keysym
479
   (state (* xkb-compose-state)))