changeset 685: |
ebe3315b7add |
parent: |
29fe829a7ac3
|
author: |
Richard Westhaver <ellis@rwest.io> |
date: |
Sun, 29 Sep 2024 22:44:52 -0400 |
permissions: |
-rw-r--r-- |
description: |
evdev/kbd fully operational, rustls and blake3 cleanups |
1 ;;; kbd.lisp --- Keyboard-based IO 3 ;; Keyboard-like devices and input 9 ;; - https://www.kernel.org/doc/Documentation/input/event-codes.txt 11 ;; - https://github.com/xkbcommon/libxkbcommon/blob/master/tools/interactive-evdev.c 13 ;; - https://gitlab.freedesktop.org/libevdev/libevdev/-/tree/master/tools 19 (deferror kbd-error () ()) 21 (defstruct keyboard path state compose-state) 23 (defconstant +evdev-offset+ 8) 25 (defconstant +long-bit+ (sb-alien:alien-size sb-alien:unsigned-long)) 27 (defun evdev-bit-p (array bit) 28 "Array elements should be unsigned-long." 29 (let ((idx (/ bit +long-bit+))) 30 ;; the literal 1 here is 1LL in C - there is potential to overflow a 32 (logand (aref array idx) (ash 1 (mod bit +long-bit+))))) 34 (defun new-device-from-path (path) 35 (with-fd (fd path :flags sb-posix:o-rdonly :close nil) 36 (sb-alien:with-alien ((dev (* evdev::libevdev))) 37 (let ((ret (evdev:libevdev-new-from-fd fd (sb-alien:addr dev)))) 39 (sb-unix::strerror (abs ret)) 42 ;; evdev::+ev-cnt+ evdev::+key-cnt+ 43 (defun keyboard-device-p (path) 44 (with-open-file (st path :element-type 'octet) 45 (let ((evbits (make-array evdev::+ev-cnt+)) 46 (keybits (make-array evdev::+key-cnt+))) 47 ;; (sb-posix:ioctl (fd path) 48 (read-sequence evbits st) 49 (read-sequence keybits st) 50 ;; (cons evbits keybits) 51 (loop for i from evdev::+key-reserved+ upto evdev::+key-min-interesting+ 52 if (not (evdev-bit-p keybits i)) 56 (defun make-keyboard-from-dev (dev keymap compose-table)) 58 (defun get-keyboards (keymap compose-table &optional (dir "/dev/input")) 59 (let ((devices (directory dir))) 61 (let ((ret (make-keyboard-from-dev dev keymap compose-table))) 64 ;; (with-open-file (file "/dev/input/event4") 65 ;; (let ((fd (sb-sys:fd-stream-fd file)) 68 ;; (xkb::xkb-consumed-mode :xkb) 70 ;; (let ((dev (new-device-from-path "/dev/input/event4"))) 71 ;; (unless (evdev::libevdev-has-event-code dev evdev::+ev-key+ evdev::+key-scrollup+) 72 ;; (println "probably not a mouse:")) 75 ;; (evdev::libevdev-get-name dev) 76 ;; (evdev::libevdev-get-id-bustype dev) 77 ;; (evdev::libevdev-get-id-vendor dev))) 78 ;; (with-alien ((ev evdev/input:input-event)) 79 ;; (when (evdev::libevdev-has-event-pending dev) 80 ;; (println "has event pending")) 81 ;; (assert (zerop (evdev::libevdev-next-event dev (evdev::libevdev-read-flag :normal) (addr ev)))) 82 ;; (with-alien-slots ((* time) type (code evdev/input::code) (value evdev/input::value)) ev 83 ;; (println (obj/time:unix-to-timestamp (sb-posix::alien-timeval-sec time))) 84 ;; (println (evdev::libevdev-event-type-get-name type)) 85 ;; (println (evdev::libevdev-event-code-get-name type code)) 86 ;; (println (evdev::libevdev-event-value-get-name type code value)))))