;;; -*- Mode: LISP; Syntax: Common-lisp; Package: (XTEST (XLIB LISP)); Base: 10; Lowercase: Yes -*- (in-package :xtest :use '(:xlib :lisp)) (defstruct event key ; Event key display ; Display event was reported to ;; The following are from the CLX event code state time event-window root drawable window child parent root-x root-y x y width height border-width override-redirect-p same-screen-p configure-p hint-p kind mode keymap focus-p count major minor above-sibling place atom selection requestor target property colormap new-p installed-p format type data send-event-p ) (defun process-input (display &optional timeout) "Process one event" (declare (type display display) ; The display (from initialize-clue) (type (or null number) timeout) ; optional timeout in seconds (values (or null character))) ; Returns NIL only if timeout exceeded (let ((event (make-event))) (setf (event-display event) display) (macrolet ((set-event (&rest parameters) `(progn ,@(mapcar #'(lambda (parm) `(setf (,(intern (concatenate 'string (string 'event-) (string parm))) event) ,parm)) parameters))) (dispatch (contact) `(dispatch-event event event-key send-event-p ,contact))) (let ((result (xlib:event-case (display :timeout timeout :force-output-p t) ((:key-press :key-release :button-press :button-release) (code time root window child root-x root-y x y state same-screen-p event-key send-event-p) (set-event code time root window child root-x root-y x y state same-screen-p) (dispatch window)) (:motion-notify (hint-p time root window child root-x root-y x y state same-screen-p event-key send-event-p) (set-event hint-p time root window child root-x root-y x y state same-screen-p) (dispatch window)) ((:enter-notify :leave-notify) (kind time root window child root-x root-y x y state mode focus-p same-screen-p event-key send-event-p) (set-event kind time root window child root-x root-y x y state mode focus-p same-screen-p) (dispatch window)) ((:focus-in :focus-out) (kind window mode event-key send-event-p) (set-event kind window mode) (dispatch window)) (:keymap-notify (window keymap event-key send-event-p) (set-event window keymap) (dispatch window)) (:exposure (window x y width height count event-key send-event-p) (set-event window x y width height count) (dispatch window)) (:graphics-exposure (drawable x y width height count major minor event-key send-event-p) (set-event drawable x y width height count major minor) (dispatch drawable)) (:no-exposure (drawable major minor event-key send-event-p) (set-event drawable major minor) (dispatch drawable)) (:visibility-notify (window state event-key send-event-p) (set-event window state) (dispatch window)) (:create-notify (parent window x y width height border-width override-redirect-p event-key send-event-p) (set-event parent window x y width height border-width override-redirect-p) (dispatch parent)) (:destroy-notify (event-window window event-key send-event-p) (set-event event-window window) (dispatch event-window)) (:unmap-notify (event-window window configure-p event-key send-event-p) (set-event event-window window configure-p) (dispatch event-window)) (:map-notify (event-window window override-redirect-p event-key send-event-p) (set-event event-window window override-redirect-p) (dispatch event-window)) (:map-request (parent window event-key send-event-p) (set-event parent window) (dispatch parent)) (:reparent-notify (event-window window parent x y override-redirect-p event-key send-event-p) (set-event event-window window parent x y override-redirect-p) (dispatch event-window)) (:configure-notify (event-window window above-sibling x y width height border-width override-redirect-p event-key send-event-p) (set-event event-window window above-sibling x y width height border-width override-redirect-p) (dispatch event-window)) (:configure-request (parent window above-sibling x y width height border-width event-key send-event-p) (set-event parent window above-sibling x y width height border-width) (dispatch parent)) (:gravity-notify (event-window window x y event-key send-event-p) (set-event event-window window x y) (dispatch event-window)) (:resize-request (window width height event-key send-event-p) (set-event window width height) (dispatch window)) (:circulate-notify (event-window window parent place event-key send-event-p) (set-event event-window window parent place) (dispatch event-window)) (:circulate-request (parent window place event-key send-event-p) (set-event parent window place) (dispatch parent)) (:property-notify (window atom time state event-key send-event-p) (set-event window atom time state) (dispatch window)) (:selection-clear (time window selection event-key send-event-p) (set-event time window selection) (dispatch window)) (:selection-request (time window requestor selection target property event-key send-event-p) (set-event time window requestor selection target property) (dispatch window)) (:selection-notify (time window selection target property event-key send-event-p) (set-event time window selection target property) (dispatch window)) (:colormap-notify (window colormap new-p installed-p event-key send-event-p) (set-event window colormap new-p installed-p) (dispatch window)) (:client-message (format window type data event-key send-event-p) (set-event format window type data) (dispatch window)) (:mapping-notify (request start count) (mapping-notify display request start count)) ;; Special case ))) (and result t))))) (defun event-case-test (display) ;; Tests universality of display, event-key, event-code, send-event-p and event-window (event-case (display) ((key-press key-release button-press button-release motion-notify enter-notify leave-notify focus-in focus-out keymap-notify exposure graphics-exposure no-exposure visibility-notify create-notify destroy-notify unmap-notify map-notify map-request reparent-notify configure-notify gravity-notify resize-request configure-request circulate-notify circulate-request property-notify selection-clear selection-request selection-notify colormap-notify client-message) (display event-key event-code send-event-p event-window) (print (list display event-key event-code send-event-p event-window))) (mapping-notify ;; mapping-notify doesn't have event-window (display event-key event-code send-event-p) (print (list display event-key event-code send-event-p))) ))