
(require (quote cl))

(require (quote epoch-util))

(provide (quote event))

(defvar event::functions nil "\
List of event/handler")

(setq epoch::event-handler-abort t)

(defun install-event (event) (byte-code "Ã	\"?… ÂB	B‰‡" [event event::functions nil assq] 3))

(defun remove-event (event) (byte-code "ÁÂ\"‰‡" [event::functions delete-if (lambda (x) (byte-code "Â	@\"‡" [event x equal] 3))] 3))

(defun push-event (event handler) (byte-code "Å	
\":?ƒ Ã‚ ÆAB\")‡" [elist event event::functions nil handler assq setcdr] 5))

(defun pop-event (event) (byte-code "Ä	
\":?ƒ Ã‚ Å!ÆÇ!\"ˆ)‡" [elist event event::functions nil assq cadr setcdr cddr] 7))

(defun ignore-event (event) (byte-code "ÂÁ\"‡" [event t push-event] 3))

(defun resume-event (event) (byte-code "Ã	!… Ä!?ƒ Â‚ Å	\")‡" [h event nil pop-event functionp push-event] 5))

(defun event::handler nil (byte-code "	ÉH	ÊH	ËHÌÍ\"!… Î!?ƒ\" Æ‚+ ÏŽÐ
$),ˆ	‰‡" [event::type epoch::event event::screen event::value callback event::functions nil epoch::event-handler *last-event* 0 2 1 cadr assq functionp ((byte-code "??ƒ
 Á‚ Ã‰ˆÄ
!‡" [epoch::event-handler nil event::type event::handler ignore-event] 2)) funcall] 8))

(setq epoch::event-handler (quote event::handler))

(defvar *event-status-buffer* nil "\
Buffer for displaying event status")

(defun event-handler-name (event-stack) (byte-code "Ä	… Å	@!?… 	A‰ˆÆ\\‰ˆ‚ ˆ	@
?ƒ) Ç‚> 
9ƒ4 È
!‚> 
<ƒ= É‚> ÊB))‡" [depth event-stack handler t 0 functionp 1 "-None-" symbol-name "+Anonymous+" "? Unknown ?"] 4))

(defun update-event-status-buffer nil (byte-code "?†	 È!??ƒ Á‚ ÉÊ!‰ˆŠqˆÁ‰ˆË ˆÌ ˆÍÎÏÐÑ\"Ò#ˆÓÔÕ#ˆÓÖ×#ˆÓØÙ#ˆÚÛ\"ˆÁÁ)ˆÍÜÝ!Þ#ˆßÁ!ˆÇ‰)‡" [*event-status-buffer* nil buffer-read-only motion::style event::functions ev epoch::event-handler t buffer-name get-buffer-create " *Event Status*" erase-buffer epoch::clear-zones insert "State  " flush-left "Event" 20 "Handler
" epoch::add-zone 1 6 8 14 28 35 mapcar (lambda (ev) (byte-code "Æ	!Ç	AGÈ	A!	A?ƒ É‰‚F Ê!ƒ4 ËWƒ+ Ì‚/ ÍÎ\"‰‚F AËWƒ? Ï‚D ÍÐA\"‰ˆÑÒ
Ó\"ÒÔ	@!Õ\"@Ö$,‡" [handler ev state depth handler-state t cadr nil event-handler-name "U" functionp 2 "H" format "H %2d" "I" "I %2d" insert flush-left 7 symbol-name 20 "
"] 13)) "
Event dispatcher: " prin1-to-string "
" set-buffer-modified-p] 15))

(defun display-event-status nil (interactive) (byte-code "ÁˆÂ ˆÃ!‡" [*event-status-buffer* nil update-event-status-buffer display-buffer] 3))

(install-event (quote map))

(install-event (quote resize))

(install-event (quote move))

(install-event (quote client-message))

(install-event (quote focus))

(install-event (quote property-change))

(install-event (quote button))

(install-event (quote motion))

(defvar on-event::do-list (list (quote (map)) (quote (unmap)) (quote (move)) (quote (resize))) "\
Alist of event, screen/action lists")

(defun on-event::handler (type value screen) "\
Handle events that have one-shot actions. Types are controlled by the
variable on-event::do-list, which is an alist of event types, with the
value an alist of screens and actions." (byte-code "Ê=… 	?… Ë‰ˆÃÌ\"ÌA\"A?ƒ- Ã‚^ ÍÎÏA\"\"ˆÐ!?ƒB Ã‚^ Ê=†K Ë=ƒW Ñ\"‚^ Ñ	#,‡" [type value epoch::event-handler-abort nil the-list on-event::do-list info screen action t map unmap assq setcdr delete-if (lambda (x) (byte-code "Â	@\"‡" [screen x equal] 3)) functionp funcall] 10))

(push-event (quote map) (quote on-event::handler))

(push-event (quote move) (quote on-event::handler))

(push-event (quote resize) (quote on-event::handler))

(push-event (quote focus) (function (lambda (type new-focus-state scr) (and new-focus-state (select-screen scr)))))

(defun on-map-do (screen action) "\
On the next map event for SCREEN, call ACTION (a function of 1 argument,
the screen)" (byte-code "ÄÅ	\"ÆÇ
!BAB\")‡" [mlist on-event::do-list screen action assq map setcdr get-screen] 6))

(defun on-unmap-do (screen action) "\
On the next unmap event for SCREEN, call ACTION (a function of 1 argument,
the screen)" (byte-code "ÄÅ	\"ÆÇ
!BAB\")‡" [mlist on-event::do-list screen action assq unmap setcdr get-screen] 6))

(defun on-resize-do (screen action) "\
On the next resize event for SCREEN, call ACTION (a function of 2 arguments,
screen and event value)" (byte-code "ÄÅ	\"ÆÇ
!BAB\")‡" [rlist on-event::do-list screen action assq resize setcdr get-screen] 6))

(defun on-move-do (screen action) "\
On the next move event for SCREEN, call ACTION (a function of 2 arguments,
screen and event value)" (byte-code "ÄÅ	\"ÆÇ
!BAB\")‡" [mlist on-event::do-list screen action assq move setcdr get-screen] 6))

(defvar epoch::events-pending nil "\
List of events pending while waiting for some specific event")

(defvar epoch::wait-event nil "\
Event type epoch is waiting for")

(defvar epoch::wait-function nil "\
Function to call when desired event occurs")

(defvar epoch::old-handler nil "\
Original event handler")

(defun epoch::dispatch-events-pending nil (byte-code "ÄÅ\"ˆÂÂ)ˆÂ‰ˆÂ‰‡" [epoch::events-pending s nil epoch::wait-event mapcar (lambda (s) (byte-code "	ÈH	ÉH	ÊHËÌ\"!… Í!?ƒ\" Æ‚+ ÎŽÏ
$),‡" [event::type epoch::event event::screen event::value callback event::functions nil epoch::event-handler 0 2 1 cadr assq functionp ((byte-code "??ƒ
 Á‚ Ã‰ˆÄ
!‡" [epoch::event-handler nil event::type event::handler ignore-event] 2)) funcall] 8))] 3))

(defun epoch::wait-handler nil (byte-code "	ÈH	ÉH	ÊH=ƒ$ ËŽÌ!…  Í
$)‚- Î	B!‰+‡" [event::type epoch::event event::screen event::value epoch::wait-event epoch::wait-function nil epoch::events-pending 0 2 1 ((byte-code "Á‰ˆÂ ‡" [epoch::wait-event nil epoch::dispatch-events-pending] 2)) functionp funcall reverse] 6))

(defun epoch::wait-for-event (event-type function) "\
Wait for EVENT, calling FUNCTION as handler when it occurs, then return." (byte-code "	‰ˆ‰ˆ‰ˆÆ‰ˆ
… Ç ˆÈÉ!ˆ‚ ˆ‰‡" [epoch::old-handler epoch::event-handler epoch::wait-event event-type epoch::wait-function function epoch::wait-handler epoch::dispatch-events sit-for 1] 4))
