event.scm 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. ;; Thread-safe event reading *****************************************
  2. (define debug-msg
  3. (lambda messages
  4. (for-each (lambda (msg)
  5. (display msg (current-error-port)))
  6. messages)
  7. (newline)))
  8. (define (print-event event)
  9. (let ((type (any-event-type event)))
  10. (cond
  11. ((eq? (event-type expose) type)
  12. (debug-msg "WAIT:expose event"))
  13. ((eq? (event-type no-expose) type)
  14. (debug-msg "WAIT:no-expose event"))
  15. ((eq? (event-type motion-notify) type)
  16. (debug-msg "WAIT:motion event" (cons (motion-event-x event) (motion-event-y event))))
  17. ((eq? (event-type button-press) type)
  18. (debug-msg "WAIT:mouse event"))
  19. ((eq? (event-type button-release) type)
  20. (debug-msg "WAIT:mouse event"))
  21. ((eq? (event-type key-press) type)
  22. (debug-msg "WAIT:keyboard press event" (lookup-string event)))
  23. ((eq? (event-type key-release) type)
  24. (debug-msg "WAIT:keyboard release event" (lookup-string event)))
  25. (else
  26. (debug-msg "WAIT:some unknown event: " (any-event-type event))))))
  27. ;; wait-event blocks the current thread until an event is available,
  28. ;; and then it returns this new event.
  29. (import-lambda-definition-2 scx-get-x-event-list (display) "scx_Get_X_Events")
  30. (define *xlib-event-uid* (new-external-event-uid (lookup-imported-binding "xlib-event")))
  31. (define wait-event
  32. (let ((event-list '()))
  33. (lambda (display)
  34. (let loop()
  35. (if (null? event-list)
  36. (let ((condvar (make-condvar)))
  37. (register-condvar-for-external-event! *xlib-event-uid* condvar)
  38. (wait-for-external-event condvar)
  39. (set! event-list (scx-get-x-event-list display))
  40. (loop))))
  41. (let ((event (car event-list)))
  42. (set! event-list (cdr event-list))
  43. event))))
  44. ;; How to find out if there are events available *********************
  45. (define-enumerated-type queued-mode :queued-mode
  46. queued-mode? queued-modes queued-mode-name queued-mode-index
  47. (already after-reading after-flush))
  48. (define-exported-binding "scx-queued-mode" :queued-mode)
  49. (import-xlib-function events-queued (display mode)
  50. "scx_Events_Queued")
  51. ;; events-pending is identical to events-queued with after-flush
  52. ;; mode.
  53. (import-xlib-function events-pending (display)
  54. "scx_Events_Pending")
  55. ;; Other event reading ***********************************************
  56. (import-xlib-function next-event (display)
  57. "scx_Next_Event")
  58. (import-xlib-function peek-event (display)
  59. "scx_Peek_Event")
  60. ;; returns a list of (time . (x . y)) elements
  61. (import-xlib-function get-motion-events (display window from to)
  62. "scx_Get_Motion_Events")
  63. ;; Sending events ****************************************************
  64. (import-xlib-function send-event (display window propagate mask event)
  65. "scx_Send_Event")