;;; -*- mode: lisp; syntax: common-lisp; package: existenz-client; coding: utf-8-unix; -*- (in-package #:existenz-client) ;; cat /dev/input/event6 |hexdump (define-enum linux-input-event-type (u16) ev-syn #x00 ev-key #x01 ev-rel #x02 ev-abs #x03 ev-msc #x04 ev-sw #x05 ev-led #x11 ev-snd #x12 ev-rep #x14 ev-ff #x15 ev-pwr #x16 ev-ff-status #x17 ev-max #x1f) (define-enum linux-input-event-syn (u16) syn-report 0 syn-config 1 syn-mt-report 2) (define-enum linux-input-event-button (u16) btn-mouse #x110 btn-left #x110 btn-right #x111 btn-middle #x112 btn-joystick #x120 btn-trigger #x120 btn-thumb #x121 btn-thumb2 #x122 btn-top #x123 btn-top2 #x124 btn-pinkie #x125 btn-gamepad #x130 btn-a #x130 btn-b #x131 btn-c #x132 btn-x #x133 btn-y #x134 btn-z #x135) (define-enum linux-input-event-rel (u16) rel-x #x00 rel-y #x01 rel-z #x02 rel-rx #x03 rel-ry #x04 rel-rz #x05 rel-hwheel #x06 rel-dial #x07 rel-wheel #x08 rel-misc #x09) (define-binary-struct linux-input-event () (tv-sec 0 :binary-type s64) (tv-usec 0 :binary-type s64) (type 0 :binary-type linux-input-event-type) (code 0 :binary-type u16) (value 0 :binary-type s32)) (defun read-input-event (pathname) (with-open-file (stream pathname :element-type '(unsigned-byte 8)) (loop (when (listen stream) (let ((event (read-binary 'linux-input-event stream))) (when (eq (linux-input-event-type event) 'ev-key) (setf (linux-input-event-code event) (enum-symbolic-value 'linux-input-event-button (linux-input-event-code event))) (logv event))))))) (logv 'idle) (let ((mouse-rel-x 0) (mouse-rel-y 0)) (iolib:set-io-handler event-base (sb-sys:fd-stream-fd mouse) :read (lambda (fd event exception) (let ((event (read-binary 'linux-input-event mouse))) (when (eq (linux-input-event-type event) 'ev-key) (setf (linux-input-event-code event) (enum-symbolic-value 'linux-input-event-button (linux-input-event-code event)))) (when (eq (linux-input-event-type event) 'ev-rel) (setf (linux-input-event-code event) (enum-symbolic-value 'linux-input-event-rel (linux-input-event-code event))) (case (linux-input-event-code event) (rel-x (incf mouse-rel-x (linux-input-event-value event))) (rel-y (incf mouse-rel-y (linux-input-event-value event)))))))) (iolib:event-dispatch event-base :timeout 0.01) (iolib:remove-fd-handlers event-base (sb-sys:fd-stream-fd mouse)) (setf rotate-y (* (- mouse-rel-x) (to-radian 0.5))) (setf rotate-x (* (- mouse-rel-y) (to-radian 0.5))))