1 ;;; -*- mode: lisp; syntax: common-lisp; package: existenz-client; coding: utf-8-unix; -*-
3 (in-package #:existenz-client)
5 ;; cat /dev/input/event6 |hexdump
7 (define-enum linux-input-event-type (u16)
22 (define-enum linux-input-event-syn (u16)
27 (define-enum linux-input-event-button (u16)
49 (define-enum linux-input-event-rel (u16)
61 (define-binary-struct linux-input-event ()
62 (tv-sec 0 :binary-type s64)
63 (tv-usec 0 :binary-type s64)
64 (type 0 :binary-type linux-input-event-type)
65 (code 0 :binary-type u16)
66 (value 0 :binary-type s32))
68 (defun read-input-event (pathname)
69 (with-open-file (stream pathname :element-type '(unsigned-byte 8))
72 (let ((event (read-binary 'linux-input-event stream)))
73 (when (eq (linux-input-event-type event) 'ev-key)
74 (setf (linux-input-event-code event)
75 (enum-symbolic-value 'linux-input-event-button
76 (linux-input-event-code event)))
82 (iolib:set-io-handler event-base (sb-sys:fd-stream-fd mouse) :read
83 (lambda (fd event exception)
84 (let ((event (read-binary 'linux-input-event mouse)))
85 (when (eq (linux-input-event-type event) 'ev-key)
86 (setf (linux-input-event-code event)
87 (enum-symbolic-value 'linux-input-event-button
88 (linux-input-event-code event))))
89 (when (eq (linux-input-event-type event) 'ev-rel)
90 (setf (linux-input-event-code event)
91 (enum-symbolic-value 'linux-input-event-rel
92 (linux-input-event-code event)))
93 (case (linux-input-event-code event)
94 (rel-x (incf mouse-rel-x (linux-input-event-value event)))
95 (rel-y (incf mouse-rel-y (linux-input-event-value event))))))))
96 (iolib:event-dispatch event-base :timeout 0.01)
97 (iolib:remove-fd-handlers event-base (sb-sys:fd-stream-fd mouse))
98 (setf rotate-y (* (- mouse-rel-x) (to-radian 0.5)))
99 (setf rotate-x (* (- mouse-rel-y) (to-radian 0.5))))