home *** CD-ROM | disk | FTP | other *** search
/ Education Sampler 1992 [NeXTSTEP] / Education_1992_Sampler.iso / NeXT / GnuSource / emacs-15.0.3 / lisp / sup-mouse.el < prev    next >
Lisp/Scheme  |  1990-07-19  |  6KB  |  209 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                         ;;
  3. ;;    File:     sup-mouse.el                             ;;
  4. ;;    Author:   Wolfgang Rupprecht                         ;;
  5. ;;    Created:  Fri Nov 21 19:22:22 1986                     ;;
  6. ;;    Contents: supdup mouse support for lisp machines             ;;
  7. ;;                                         ;;
  8. ;;     (from code originally written by John Robinson@bbn for the bitgraph)  ;;
  9. ;;                                         ;;
  10. ;;    $Log$                                     ;;
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12.  
  13. ;; GNU Emacs code for lambda/supdup mouse
  14. ;; Copyright (C) Free Software Foundation 1985, 1986
  15.  
  16. ;; This file is part of GNU Emacs.
  17.  
  18. ;; GNU Emacs is distributed in the hope that it will be useful,
  19. ;; but WITHOUT ANY WARRANTY.  No author or distributor
  20. ;; accepts responsibility to anyone for the consequences of using it
  21. ;; or for whether it serves any particular purpose or works at all,
  22. ;; unless he says so in writing.  Refer to the GNU Emacs General Public
  23. ;; License for full details.
  24.  
  25. ;; Everyone is granted permission to copy, modify and redistribute
  26. ;; GNU Emacs, but only under the conditions described in the
  27. ;; GNU Emacs General Public License.   A copy of this license is
  28. ;; supposed to have been given to you along with GNU Emacs so you
  29. ;; can know your rights and responsibilities.  It should be in a
  30. ;; file named COPYING.  Among other things, the copyright notice
  31. ;; and this notice must be preserved on all copies.
  32.  
  33. ;;;  User customization option:
  34.  
  35. (defvar sup-mouse-fast-select-window nil
  36.   "*Non-nil for mouse hits to select new window, then execute; else just select.")
  37.  
  38. (defconst mouse-left 0)
  39. (defconst mouse-center 1)
  40. (defconst mouse-right 2)
  41.  
  42. (defconst mouse-2left 4)
  43. (defconst mouse-2center 5)
  44. (defconst mouse-2right 6)
  45.  
  46. (defconst mouse-3left 8)
  47. (defconst mouse-3center 9)
  48. (defconst mouse-3right 10)
  49.  
  50. ;;;  Defuns:
  51.  
  52. (defun sup-mouse-report ()
  53.   "This function is called directly by the mouse, it parses and
  54. executes the mouse commands.
  55.  
  56.  L move point          *  |---- These apply for mouse click in a window.
  57. 2L delete word            |
  58. 3L copy word          | If sup-mouse-fast-select-window is nil,
  59.  C move point and yank *  | just selects that window.
  60. 2C yank pop          |
  61.  R set mark            *  |
  62. 2R delete region      |
  63. 3R copy region          |
  64.  
  65. on modeline            on \"scroll bar\"    in minibuffer
  66.  L scroll-up            line to top        execute-extended-command
  67.  C proportional goto-char   line to middle    mouse-help
  68.  R scroll-down            line to bottom    eval-expression"
  69.   
  70.   (interactive)
  71.   (let*
  72. ;; expect a string of <esc>:<buttons>;<x-pos>;<y-pos>c
  73.       ((buttons (sup-get-tty-num ?\;))
  74.        (x (sup-get-tty-num ?\;))
  75.        (y (sup-get-tty-num ?c))
  76.        (window (sup-pos-to-window x y))
  77.        (edges (window-edges window))
  78.        (old-window (selected-window))
  79.        (in-minibuf-p (eq y (1- (screen-height))))
  80.        (same-window-p (and (not in-minibuf-p) (eq window old-window)))
  81.        (in-modeline-p (eq y (1- (nth 3 edges))))
  82.        (in-scrollbar-p (>= x (1- (nth 2 edges)))))
  83.     (setq x (- x (nth 0 edges)))
  84.     (setq y (- y (nth 1 edges)))
  85.  
  86. ;    (error "mouse-hit %d %d %d" buttons x y) ;;;; debug
  87.  
  88.     (cond (in-modeline-p
  89.        (select-window window)
  90.        (cond ((= buttons mouse-left)
  91.           (scroll-up))
  92.          ((= buttons mouse-right)
  93.           (scroll-down))
  94.          ((= buttons mouse-center)
  95.           (goto-char (/ (* x
  96.                    (- (point-max) (point-min)))
  97.                 (1- (window-width))))
  98.           (beginning-of-line)
  99.           (what-cursor-position)))
  100.        (select-window old-window))
  101.       (in-scrollbar-p
  102.        (select-window window)
  103.        (scroll-up
  104.         (cond ((= buttons mouse-left)
  105.            y)
  106.           ((= buttons mouse-right)
  107.            (+ y (- 2 (window-height))))
  108.           ((= buttons mouse-center)
  109.            (/ (+ 2 y y (- (window-height))) 2))
  110.           (t
  111.            0)))
  112.        (select-window old-window))
  113.       (same-window-p
  114.        (cond ((= buttons mouse-left)
  115.           (sup-move-point-to-x-y x y))
  116.          ((= buttons mouse-2left)
  117.           (sup-move-point-to-x-y x y)
  118.           (kill-word 1))
  119.          ((= buttons mouse-3left)
  120.           (sup-move-point-to-x-y x y)
  121.           (save-excursion
  122.             (copy-region-as-kill
  123.              (point) (progn (forward-word 1) (point))))
  124.           (setq this-command 'yank)
  125.           )
  126.          ((= buttons mouse-right)
  127.           (push-mark)
  128.           (sup-move-point-to-x-y x y)
  129.           (exchange-point-and-mark))
  130.          ((= buttons mouse-2right)
  131.           (push-mark)
  132.           (sup-move-point-to-x-y x y)
  133.           (kill-region (mark) (point)))
  134.          ((= buttons mouse-3right)
  135.           (push-mark)
  136.           (sup-move-point-to-x-y x y)
  137.           (copy-region-as-kill (mark) (point))
  138.           (setq this-command 'yank))
  139.          ((= buttons mouse-center)
  140.           (sup-move-point-to-x-y x y)
  141.           (setq this-command 'yank)
  142.           (yank))
  143.          ((= buttons mouse-2center)
  144.           (yank-pop 1))
  145.          )
  146.        )
  147.       (in-minibuf-p
  148.        (cond ((= buttons mouse-right)
  149.           (call-interactively 'eval-expression))
  150.          ((= buttons mouse-left)
  151.           (call-interactively 'execute-extended-command))
  152.          ((= buttons mouse-center)
  153.           (describe-function 'sup-mouse-report)); silly self help 
  154.          ))
  155.       (t                ;in another window
  156.        (select-window window)
  157.        (cond ((not sup-mouse-fast-select-window))
  158.          ((= buttons mouse-left)
  159.           (sup-move-point-to-x-y x y))
  160.          ((= buttons mouse-right)
  161.           (push-mark)
  162.           (sup-move-point-to-x-y x y)
  163.           (exchange-point-and-mark))
  164.          ((= buttons mouse-center)
  165.           (sup-move-point-to-x-y x y)
  166.           (setq this-command 'yank)
  167.           (yank))
  168.          ))
  169.       )))
  170.  
  171.  
  172. (defun sup-get-tty-num (term-char)
  173.   "Read from terminal until TERM-CHAR is read, and return intervening number.
  174. Upon non-numeric not matching TERM-CHAR signal an error."
  175.   (let
  176.       ((num 0)
  177.        (char (read-char)))
  178.     (while (and (>= char ?0)
  179.         (<= char ?9))
  180.       (setq num (+ (* num 10) (- char ?0)))
  181.       (setq char (read-char)))
  182.     (or (eq term-char char)
  183.     (error "Invalid data format in mouse command"))
  184.     num))
  185.  
  186. (defun sup-move-point-to-x-y (x y)
  187.   "Position cursor in window coordinates.
  188. X and Y are 0-based character positions in the window."
  189.   (move-to-window-line y)
  190.   (move-to-column x)
  191.   )
  192.  
  193. (defun sup-pos-to-window (x y)
  194.   "Find window corresponding to screen coordinates.
  195. X and Y are 0-based character positions on the screen."
  196.   (let ((edges (window-edges))
  197.     (window nil))
  198.     (while (and (not (eq window (selected-window)))
  199.         (or (<  y (nth 1 edges))
  200.             (>= y (nth 3 edges))
  201.             (<  x (nth 0 edges))
  202.             (>= x (nth 2 edges))))
  203.       (setq window (next-window window))
  204.       (setq edges (window-edges window))
  205.       )
  206.     (or window (selected-window))
  207.     )
  208.   )
  209.