changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > core / lisp/ffi/xkb/pkg.lisp

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