cl-libinput

2022-07-08

Common Lisp wrapper for libinput

Upstream URL

github.com/malcolmstill/cl-libinput

Author

Malcolm Still <malcolm.still@gmail.com>

License

BSD 3-Clause
README

cl-libinput

libinput is a library for handling input devices in Wayland compositors. cl-libinput is a Common Lisp interface to the library.

Status

cl-libinput is being developed primarily in support of ulubis and is therefor feature incomplete. Pull requests adding more of the API are more than welcome.

Requiremnts

cl-libinput (obiously) requires libinput. It is likely that libinput already exists on your Linux installation if it is recent.

Installation

CL-USER> (ql:quickload :cl-libinput)

Example

(in-package :libinput)

(defun handle-event-context (context event)
  (when (not (null-pointer-p event))
    (let ((type (event-get-type event)))
      (cond
	((= type keyboard-key) (progn
				 (format t "fd: ~A~%" (get-fd context))
				 (handle-keyboard event)))
	((= type pointer-motion) (handle-pointer-motion event))
	((= type pointer-button) (progn
				   (format t "fd: ~A~%" (get-fd context))
				   (handle-pointer-button event)))))
    (event-destroy event)))

(defun handle-keyboard (event)
  (let* ((keyboard-event (event-get-keyboard-event event))
	 (state (event-keyboard-get-key-state keyboard-event))
	 (key (event-keyboard-get-key keyboard-event)))
    (format t "Key: ~A, state: ~A~%" key state)))

(defun handle-pointer-motion (event)
  (let* ((pointer-event (event-get-pointer-event event))
	 (dx (event-pointer-get-dx pointer-event))
	 (dy (event-pointer-get-dy pointer-event)))
    ;;(format t "dx: ~A, dy: ~A~%" dx dy)
    ))

(defun handle-pointer-button (event)
  (let* ((pointer-event (event-get-pointer-event event))
	 (state (event-pointer-get-button-state pointer-event))
	 (button (event-pointer-get-button pointer-event)))
    (format t "Button: ~A, state: ~A~%" button state)))

(defun event-loop (context)
  (dispatch context)
  (let ((event (get-event context)))
    (loop :while (not (null-pointer-p event))
       :do (progn
	     (handle-event-context context event)
	     (setf event (get-event context))))))

(defun test (&rest paths)
  (let* ((interface (make-libinput-interface))
	 (context (path-create-context interface (null-pointer)))
	 (fd (get-fd context)))
    (mapcar (lambda (path)
	      (path-add-device context path))
	    paths)
    (nix:with-pollfds (pollfds
		       (pollfd fd nix:pollin))
      (loop :with ret = (nix:poll pollfds 1 -1)
	 :do (when ret
	       (event-loop context))))))

Dependencies (2)

  • cffi
  • osicat

Dependents (0)

    • GitHub
    • Quicklisp