luv

Workshop wiki

key.lisp

ghostty/key.lisp

system luv/ghostty · 9 definitions · on GitHub

in-package#:luv.ghostty
defclasskey-encoder
pointer:initarg:pointer:readerkey-encoder-pointer
event-pointer:initarg:event-pointer:readerkey-encoder-event-pointer
:documentation

An explicitly owned reusable libghostty-vt keyboard encoder and event.

defunkey-encoder-open-p
encoder
not
cffi:null-pointer-p
key-encoder-pointerencoder
defunmake-key-encoder

Create an owned Ghostty key encoder using its default allocator.

cffi:with-foreign-objects
encoder-output:pointer
event-output:pointer
setf
cffi:mem-refencoder-output:pointer
cffi:null-pointer
cffi:mem-refevent-output:pointer
cffi:null-pointer
check-result
%key-encoder-new
cffi:null-pointer
encoder-output
'make-key-encoder
let
encoder
cffi:mem-refencoder-output:pointer
handler-case
progn
check-result
%key-event-new
cffi:null-pointer
event-output
'make-key-encoder
make-instance'key-encoder:pointerencoder:event-pointer
cffi:mem-refevent-output:pointer
error
condition
%key-encoder-freeencoder
errorcondition
defunclose-key-encoder
encoder

Release encoder and its reusable event. Repeated calls are harmless.

when
%key-event-free
key-encoder-event-pointerencoder
%key-encoder-free
key-encoder-pointerencoder
setf
slot-valueencoder'event-pointer
cffi:null-pointer
slot-valueencoder'pointer
cffi:null-pointer
encoder
defunmodifier-bits
modifiers
loopformodifierinmodifiersforbits=
ecasemodifier
:shift#x001
:control#x002
:alt:meta
#x004
:super#x008
:caps-lock#x010
:num-lock#x020
:shift-right#x041
:control-right#x082
:alt-right:meta-right
#x104
:super-right#x208
forresult=bitsthen
logiorresultbits
finally
return
orresult0
defuncopy-foreign-octets
pointerlength
let
bytes
make-arraylength:element-type'
unsigned-byte8
dotimes
indexlengthbytes
setf
arefbytesindex
cffi:mem-arefpointer:uint8index
defunencode-prepared-key-event
encoderevent
cffi:with-foreign-object
length:size
cffi:with-foreign-object
buffer:uint8128
setf
cffi:mem-reflength:size
0
let
result
%key-encoder-encode
key-encoder-pointerencoder
eventbuffer128length
caseresult
:success
copy-foreign-octetsbuffer
cffi:mem-reflength:size
:out-of-space
let*
capacity
cffi:mem-reflength:size
large-buffer
cffi:foreign-alloc:uint8:countcapacity
unwind-protect
progn
setf
cffi:mem-reflength:size
0
check-result
%key-encoder-encode
key-encoder-pointerencoder
eventlarge-buffercapacitylength
'encode-key-event
copy-foreign-octetslarge-buffer
cffi:mem-reflength:size
cffi:foreign-freelarge-buffer
defunencode-key-event
encoderterminalactionkey&keymodifiersconsumed-modifierstextunshifted-codepointcomposing-p

Encode one physical key fact using terminal's current keyboard modes.

action is :PRESS, :repeat, or :RELEASE. key is a Ghostty/W3C physical key keyword. modifiers use :SHIFT, :CONTROL, :ALT (or :META), and :SUPER. text is layout-produced printable text; unshifted-codepoint is its base codepoint.

unless
error"The libghostty-vt key encoder ~S is closed."encoder
check-typetext
ornullstring
%key-encoder-setopt-from-terminal
key-encoder-pointerencoder
terminal-pointerterminal
let
event
key-encoder-event-pointerencoder
%key-event-set-actioneventaction
%key-event-set-keyeventkey
%key-event-set-modsevent
modifier-bitsmodifiers
%key-event-set-consumed-modsevent
modifier-bitsconsumed-modifiers
%key-event-set-composingeventcomposing-p
%key-event-set-unshifted-codepointevent
orunshifted-codepoint0
iftext
cffi:with-foreign-string
pointerlength
text:encoding:utf-8

WITH-FOREIGN-STRING reports storage including its trailing NUL; Ghostty takes an explicit byte count and must not see that byte.

%key-event-set-utf8eventpointer
unwind-protect
%key-event-set-utf8event
cffi:null-pointer
0
progn
%key-event-set-utf8event
cffi:null-pointer
0