In xlip.lisp -> process-event your logic:
(when (and (x-pending-p dpy) (%x-events-queued dpy 1)) ;; 1 is QueuedAfterReading
(with-foreign-object (next-evt 'x-event)
(%x-peek-event dpy next-evt)
(when (and (eq :key-press
(foreign-enum-keyword 'x-event-name
(foreign-slot-value next-evt 'x-key-event 'type)
:errorp nil))
(eq win (foreign-slot-value next-evt 'x-key-event 'win))
(eq time (foreign-slot-value next-evt 'x-key-event 'time)))
(return-from process-event))))
will drop a valid key release and leave it as pressed resulting in a stuck key. commting this out fixed the issue.
In xlip.lisp -> process-event your logic: (when (and (x-pending-p dpy) (%x-events-queued dpy 1)) ;; 1 is QueuedAfterReading (with-foreign-object (next-evt 'x-event) (%x-peek-event dpy next-evt) (when (and (eq :key-press (foreign-enum-keyword 'x-event-name (foreign-slot-value next-evt 'x-key-event 'type) :errorp nil)) (eq win (foreign-slot-value next-evt 'x-key-event 'win)) (eq time (foreign-slot-value next-evt 'x-key-event 'time))) (return-from process-event)))) will drop a valid key release and leave it as pressed resulting in a stuck key. commting this out fixed the issue.