
(provide (quote mouse))

(provide (quote multi-click))

(require (quote mini-cl))

(require (quote zone))

(require (quote selection))

(defvar mouse::selection-atom nil "\
Property to use for cut/paste - defaults to PRIMARY")

(defvar mouse::down-buffer nil "\
Buffer where the mouse last was pressed")

(defvar mouse::down-number-offset 0 "\
Where the mouse last was pressed (window, mode, minibuf).")

(defvar mouse::event-data nil "\
Raw data value mouse::handler was called with (press/release x y button mod-state).")

(defvar mouse::x 0 "\
X screen position of mouse, in pixels.")

(defvar mouse::y 0 "\
Y screen position of mouse, in pixels.")

(defvar mouse::last-spot nil "\
Mouse data value of last event (point buffer window screen).")

(defvar mouse::clicks 0 "\
Number of times mouse was pressed and released in the same place.")

(defconst mouse::interval 200 "\
The number of milliseconds allowed between multi-clicks
   - interval is clocked between down-click and previous up-click")

(defvar mouse::time-stamp 0 "\
The millisecond time of last upclick")

(epoch-add-setup-hook (quote mouse::init))

(defun mouse::init nil (byte-code "!\"" [mouse::selection-atom intern-atom "PRIMARY" push-selection mouse-clear] 4))

(defconst mouse::button-size 16)

(defconst mouse::table-size (* 3 3 mouse::button-size))

(defvar mouse::global-map (make-vector mouse::table-size nil))

(defvar mouse::local-map nil)

(make-variable-buffer-local (quote mouse::local-map))

(defvar shift-mod-mask 1 "\
Mask for Shift modifier down")

(defvar shift-lock-mod-mask 2 "\
Mask for Shift Lock modifier down")

(defvar control-mod-mask 4 "\
Mask for Control modifier down")

(defvar meta-mod-mask 8 "\
Mask for Meta (mod1) modifier down")

(defvar keyboard-mod-mask (+ shift-mod-mask control-mod-mask meta-mod-mask) "\
Mask for any of the keyboard modifiers")

(defvar mouse1-mask 256 "\
Mask for mouse button 1 down")

(defvar mouse2-mask 512 "\
Mask for mouse button 2 down")

(defvar mouse3-mask 1024 "\
Mask for mouse button 3 down")

(defvar mouse4-mask 2048 "\
Mask for mouse button 4 down")

(defvar mouse5-mask 4096 "\
Mask for mouse button 5 down")

(defvar mouse-any-mask (logior mouse1-mask mouse2-mask mouse3-mask mouse4-mask mouse5-mask) "\
Mask for any of the mouse buttons")

(defconst mouse-window 1)

(defconst mouse-left 1)

(defconst mouse-middle 2)

(defconst mouse-right 3)

(defconst mouse-mode 4)

(defconst mouse-mode-left 4)

(defconst mouse-mode-middle 5)

(defconst mouse-mode-right 6)

(defconst mouse-minibuf 7)

(defconst mouse-minibuf-left 7)

(defconst mouse-minibuf-middle 8)

(defconst mouse-minibuf-right 9)

(defconst mouse-down 0)

(defconst mouse-up 1)

(defconst mouse-shift 2)

(defconst mouse-shift-up (+ mouse-shift mouse-up))

(defconst mouse-control 4)

(defconst mouse-control-up (+ mouse-control mouse-up))

(defconst mouse-control-shift (+ mouse-shift mouse-control))

(defconst mouse-control-shift-up (+ mouse-control-shift mouse-up))

(defconst mouse-meta 8)

(defconst mouse-meta-up (+ mouse-meta mouse-up))

(defconst mouse-meta-shift (+ mouse-shift mouse-meta))

(defconst mouse-meta-shift-up (+ mouse-meta-shift mouse-up))

(defconst mouse-meta-control (+ mouse-meta mouse-control))

(defconst mouse-meta-control-up (+ mouse-meta-control mouse-up))

(defconst mouse-meta-control-shift (+ mouse-shift mouse-control mouse-meta))

(defconst mouse-meta-control-shift-up (+ mouse-meta-control-shift mouse-up))

(defun mouse::verify-arguments (button modstate) (byte-code "	W	 
V? Â !W Y?& Â) !" [button mouse-left mouse-minibuf-right nil modstate mouse::button-size error "Button specifier out of range" 0 "Button modifier out of range"] 3))

(defun mouse::handler (type value scr) (byte-code "	8	8	8	8	8#% 8	1 T 8 =?  UG T @?S T 

Ub Ɖ	@ HZW T ) H		8	8
S\\
  \"\"  \"\"  \"\"  S\"% 
?\"	\"  ! H$\"H!
,	
9
!C!!?KƂ]!#!\"#$+%." [number value edge modstate index epoch::event-handler-abort nil arg scr buffer number-offset mouse::down-buffer mouse::down-number-offset mouse-minibuf mouse-mode elapsed epoch::event mouse::time-stamp mouse::interval mouse::clicks mouse::event-data mouse::x mouse::y mouse-down mouse-up shift-mod-mask mouse-shift control-mod-mask mouse-control meta-mod-mask mouse-meta mouse::button-size map handler mouse::global-map this-command last-command mouse::last-spot 3 0 4 epoch::coords-to-point 1 2 minibuffer-window minibuffer-depth + /= logand * symbol-buffer-value mouse::local-map vectorp functionp funcall] 18))

(defmacro mouse::index (button modstate) (byte-code "	D
EE" [modstate button mouse::button-size + * 1-] 5))

(defun copy-mouse-map (from to) (byte-code "??
  
\"
W) HI\\ )" [to nil mouse::table-size i from make-vector 0 1] 6))

(defun create-mouse-map (&optional source-map) (byte-code "! \" 
\"" [source-map nil mouse::table-size vectorp copy-mouse-map make-vector] 5))

(defun local-set-mouse (button modstate function) (byte-code "	\"
?? Â !
	S\"\\I" [button modstate mouse::local-map nil mouse::global-map function mouse::verify-arguments create-mouse-map * 16] 7))

(defun global-set-mouse (button modstate function) "\
Set the global mouse map to have BUTTON with MODIFIER call FUNCTION" (byte-code "	\"
	S\"\\I" [button modstate mouse::global-map function mouse::verify-arguments * 16] 6))

(defun define-mouse (map button modstate function) "\
Set an entry in the MAP for BUTTON and MODIFIER to FUNCTION" (byte-code "!??  !
S\"\\I" [map nil modstate button function vectorp error "Map must be a vector" * 16] 7))

(defun use-local-mouse-map (map &optional buffer) "\
Use MAP as the local mouse map in BUFFER (current buffer if omitted" (byte-code " !??  !
!% 
q)( " [map nil buffer mouse::local-map vectorp error "Invalid mouse map" bufferp] 5))

(defun kill-local-mouse-map (&optional buffer) "\
Remove the local mouse map for the optional BUFFER (if nil, current buffer)" (byte-code "! q!) !" [buffer bufferp kill-local-variable mouse::local-map] 4))

(defun mouse::set-point (arg) "\
Select Epoch window mouse is on, and move point to mouse position." (byte-code "8!8 8!@ @d^b" [arg select-screen 3 2 select-window] 4))

(defvar mouse::set-point-clears-cut-buffer nil "\
*T if setting point with left mouse button clears cut buffer; NIL otherwise.")

(defun mouse::copy-zone (zone &optional kill) "\
Copy the text in the ZONE to the appropriate selection atom and to X cut-buffer" (byte-code "! !d^!d^!	?  ω
?) ω!> q	
\")A ҉!!\"BB	
\" ! qz 	
\" 	
\"ɉ), 
 !B\"B" [zone beg end buf text mouse::selection-atom epoch::selection-alist kill this-command nil mouse::set-point-clears-cut-buffer zonep epoch::zone-start epoch::zone-end epoch::zone-buffer 1 bufferp buffer-substring "" epoch::store-cut-buffer epoch::acquire-selection delete-if (lambda (x) (byte-code "	@\"" [mouse::selection-atom x equal] 3)) /= delete-region copy-region-as-kill (lambda (x) (byte-code "	@\"" [mouse::selection-atom x equal] 3))] 18))

(defun mouse::paste-cut-buffer (arg) "\
Retrieve text from appropriate selection, or X cut-buffer if none" (byte-code "	8 !? < q 	@d^b#;/ GV7 c:  c)))" [buff arg nil text mouse::selection-atom 1 bufferp undo-boundary epoch::convert-selection "STRING" "PROPERTY" 0 get-cut-buffer] 6))

(push-event (quote button) (quote mouse::handler))

(setq epoch::mouse-events t)
