[comp.emacs] MOUSE-DOUBLE-CLICK.EL

kinstrey@wsqtba.crd.ge.com (M. A. Kinstrey) (01/22/91)

;;; Copyright (C) 1990  General Electric Company.
;;; Written by Michael A. Kinstrey, for the
;;; DICE (DARPA Initiative in Concurrent Engineering) project.
;;;
;;; This file is for use with GNU Emacs 18.55 or later, 
;;; or Epoch, a modified version of GNU Emacs.
;;; Requires Epoch 3.2 or later. 
;;;
;;; This code is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY. No author or distributor accepts
;;; responsibility to anyone for the consequences of using this code
;;; or for whether it serves any particular purpose or works at all,
;;; unless explicitly stated in a written agreement. Refer to the
;;; GNU Emacs General Public License for full details.
;;;
;;; Everyone is granted permission to copy, modify and redistribute
;;; this code, but only under the conditions described in the
;;; GNU Emacs General Public License.
;;; Among other things, the copyright notice and this notice 
;;; must be preserved on all copies.

(cond (running-epoch     (require 'mouse))    ;; epoch mouse-support
      ((string-equal window-system "x")
                         (require 'x-mouse))        ;; xemacs mouse-support
      (t (message "mouse features not installed"))) ;; regular emacs running?

(require 'mouse-double-click-functions) ;; this will load only once

;; DO NOT do a (provide 'mouse-double-click) anymore, because
;; the variables are all local now, so when a 
;; (require 'mouse-double-click) is done, a local set of
;; vars are installed each time

(make-local-variable 'single-mouse-map)
(make-local-variable 'double-mouse-map)
(make-local-variable 'double-clicks-allowed)

(if running-epoch
    (setq double-mouse-map (create-mouse-map mouse::global-map))
  (setq single-mouse-map (copy-keymap mouse-map))
  (setq double-mouse-map (copy-keymap mouse-map)))

(make-local-variable 'current_click_time)
(make-local-variable 'prev_click_time)
(make-local-variable 'prev_click_list)
(make-local-variable 'prev_screen)
(make-local-variable 'double_button_click)
(make-local-variable 'prev_local_mouse_map)

(make-local-variable 'single-mouse-map-before-hooks)
(make-local-variable 'single-mouse-map-after-hooks)
(make-local-variable 'double-mouse-map-before-hooks)
(make-local-variable 'double-mouse-map-after-hooks)
(make-local-variable 'run-hooks-on-mouse-down-event)

;; initialize all variables everytime this file is loaded
(setq double-clicks-allowed t)
(setq current_click_time nil)
(setq prev_click_time nil)
(setq prev_click_list nil)
(setq prev_screen nil)
(setq double_button_click nil)
(setq prev_local_mouse_map nil)
(setq single-mouse-map-before-hooks nil)
(setq single-mouse-map-after-hooks nil)
(setq double-mouse-map-before-hooks nil)
(setq double-mouse-map-after-hooks nil)
(setq run-hooks-on-mouse-down-event nil)

;; ------------------------------------------------------------------
;; ------------ VERSION-SPECIFIC EVENT_HANDLER INSTALLATION ---------
;; ------------------------------------------------------------------

(cond (running-epoch  
              ;; epoch mouse set-up
              (push-event 'button 'mouse::double-click-handler) ;; install epoch event-handler
	      (setq epoch::mouse-events t)) ;; make epoch realize the change
      ((string-equal window-system "x")
              ;; X-mouse set-up
              (define-key mouse-map x-button-left  'x-double-click))) ;; install xemacs event-handler

;; ------------------------------------------------------------------
;; ------------ CALL-BACK FUNCTIONS ---------------------------------
;; ------------------------------------------------------------------

;; two example call-backs
(defun single-click (&optional arg button) 
   (message "single-click function called...")(sleep-for 1))

(defun double-click (&optional arg button) 
   (message "double-click function called...")(sleep-for 1))

;; ------------------------------------------------------------------
;; ----------- CALL-BACK INSTALLATION -------------------------------
;; ------------------------------------------------------------------

;; list of functions to execute before/after actual call-back is executed
(setq single-mouse-map-before-hooks nil)
(setq single-mouse-map-after-hooks  nil)
(setq double-mouse-map-before-hooks nil)
(setq double-mouse-map-after-hooks  nil)
(setq run-hooks-on-mouse-down-event nil) ;; not applicable under Xemacs- can't distinguish up vs. down.

(cond (running-epoch ;; epoch configuration
              (define-mouse double-mouse-map mouse-left mouse-down 'double-click))
      ((string-equal window-system "x") ;; xemacs configuration
              (define-key single-mouse-map x-button-left   'x-mouse-set-point) ;; defaults
	      (define-key single-mouse-map x-button-middle 'x-paste-text)      ;; put into
	      (define-key single-mouse-map x-button-right  'x-cut-text)        ;; single-mouse map
	      (define-key double-mouse-map x-button-left   'double-click)))
-----------------------------------------------------------------------------
kinstrey@wsqtba.crd.ge.com  | Sattinger's Law:
uunet!crdgw1!wsqtba!kinstrey|      It works better if you plug it in.
____________________________|________________________________________________