home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / lucid / lemacs-19.6 / lisp / packages / sup-mouse.el < prev    next >
Encoding:
Text File  |  1992-08-18  |  6.1 KB  |  207 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. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  11.  
  12. ;; GNU Emacs code for lambda/supdup mouse
  13. ;; Copyright (C) Free Software Foundation 1985, 1986
  14.  
  15. ;; This file is part of GNU Emacs.
  16.  
  17. ;; GNU Emacs is free software; you can redistribute it and/or modify
  18. ;; it under the terms of the GNU General Public License as published by
  19. ;; the Free Software Foundation; either version 1, or (at your option)
  20. ;; any later version.
  21.  
  22. ;; GNU Emacs is distributed in the hope that it will be useful,
  23. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  24. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25. ;; GNU General Public License for more details.
  26.  
  27. ;; You should have received a copy of the GNU General Public License
  28. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  29. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  30.  
  31. ;;;  User customization option:
  32.  
  33. (defvar sup-mouse-fast-select-window nil
  34.   "*Non-nil for mouse hits to select new window, then execute; else just select.")
  35.  
  36. (defconst mouse-left 0)
  37. (defconst mouse-center 1)
  38. (defconst mouse-right 2)
  39.  
  40. (defconst mouse-2left 4)
  41. (defconst mouse-2center 5)
  42. (defconst mouse-2right 6)
  43.  
  44. (defconst mouse-3left 8)
  45. (defconst mouse-3center 9)
  46. (defconst mouse-3right 10)
  47.  
  48. ;;;  Defuns:
  49.  
  50. (defun sup-mouse-report ()
  51.   "This function is called directly by the mouse, it parses and
  52. executes the mouse commands.
  53.  
  54.  L move point          *  |---- These apply for mouse click in a window.
  55. 2L delete word            |
  56. 3L copy word          | If sup-mouse-fast-select-window is nil,
  57.  C move point and yank *  | just selects that window.
  58. 2C yank pop          |
  59.  R set mark            *  |
  60. 2R delete region      |
  61. 3R copy region          |
  62.  
  63. on modeline            on \"scroll bar\"    in minibuffer
  64.  L scroll-up            line to top        execute-extended-command
  65.  C proportional goto-char   line to middle    mouse-help
  66.  R scroll-down            line to bottom    eval-expression"
  67.   
  68.   (interactive)
  69.   (let*
  70. ;; expect a string of <esc>:<buttons>;<x-pos>;<y-pos>c
  71.       ((buttons (sup-get-tty-num ?\;))
  72.        (x (sup-get-tty-num ?\;))
  73.        (y (sup-get-tty-num ?c))
  74.        (window (sup-pos-to-window x y))
  75.        (edges (window-edges window))
  76.        (old-window (selected-window))
  77.        (in-minibuf-p (eq y (1- (screen-height))))
  78.        (same-window-p (and (not in-minibuf-p) (eq window old-window)))
  79.        (in-modeline-p (eq y (1- (nth 3 edges))))
  80.        (in-scrollbar-p (>= x (1- (nth 2 edges)))))
  81.     (setq x (- x (nth 0 edges)))
  82.     (setq y (- y (nth 1 edges)))
  83.  
  84. ;    (error "mouse-hit %d %d %d" buttons x y) ;;;; debug
  85.  
  86.     (cond (in-modeline-p
  87.        (select-window window)
  88.        (cond ((= buttons mouse-left)
  89.           (scroll-up))
  90.          ((= buttons mouse-right)
  91.           (scroll-down))
  92.          ((= buttons mouse-center)
  93.           (goto-char (/ (* x
  94.                    (- (point-max) (point-min)))
  95.                 (1- (window-width))))
  96.           (beginning-of-line)
  97.           (what-cursor-position)))
  98.        (select-window old-window))
  99.       (in-scrollbar-p
  100.        (select-window window)
  101.        (scroll-up
  102.         (cond ((= buttons mouse-left)
  103.            y)
  104.           ((= buttons mouse-right)
  105.            (+ y (- 2 (window-height))))
  106.           ((= buttons mouse-center)
  107.            (/ (+ 2 y y (- (window-height))) 2))
  108.           (t
  109.            0)))
  110.        (select-window old-window))
  111.       (same-window-p
  112.        (cond ((= buttons mouse-left)
  113.           (sup-move-point-to-x-y x y))
  114.          ((= buttons mouse-2left)
  115.           (sup-move-point-to-x-y x y)
  116.           (kill-word 1))
  117.          ((= buttons mouse-3left)
  118.           (sup-move-point-to-x-y x y)
  119.           (save-excursion
  120.             (copy-region-as-kill
  121.              (point) (progn (forward-word 1) (point))))
  122.           (setq this-command 'yank)
  123.           )
  124.          ((= buttons mouse-right)
  125.           (push-mark)
  126.           (sup-move-point-to-x-y x y)
  127.           (exchange-point-and-mark))
  128.          ((= buttons mouse-2right)
  129.           (push-mark)
  130.           (sup-move-point-to-x-y x y)
  131.           (kill-region (mark) (point)))
  132.          ((= buttons mouse-3right)
  133.           (push-mark)
  134.           (sup-move-point-to-x-y x y)
  135.           (copy-region-as-kill (mark) (point))
  136.           (setq this-command 'yank))
  137.          ((= buttons mouse-center)
  138.           (sup-move-point-to-x-y x y)
  139.           (setq this-command 'yank)
  140.           (yank))
  141.          ((= buttons mouse-2center)
  142.           (yank-pop 1))
  143.          )
  144.        )
  145.       (in-minibuf-p
  146.        (cond ((= buttons mouse-right)
  147.           (call-interactively 'eval-expression))
  148.          ((= buttons mouse-left)
  149.           (call-interactively 'execute-extended-command))
  150.          ((= buttons mouse-center)
  151.           (describe-function 'sup-mouse-report)); silly self help 
  152.          ))
  153.       (t                ;in another window
  154.        (select-window window)
  155.        (cond ((not sup-mouse-fast-select-window))
  156.          ((= buttons mouse-left)
  157.           (sup-move-point-to-x-y x y))
  158.          ((= buttons mouse-right)
  159.           (push-mark)
  160.           (sup-move-point-to-x-y x y)
  161.           (exchange-point-and-mark))
  162.          ((= buttons mouse-center)
  163.           (sup-move-point-to-x-y x y)
  164.           (setq this-command 'yank)
  165.           (yank))
  166.          ))
  167.       )))
  168.  
  169.  
  170. (defun sup-get-tty-num (term-char)
  171.   "Read from terminal until TERM-CHAR is read, and return intervening number.
  172. Upon non-numeric not matching TERM-CHAR signal an error."
  173.   (let
  174.       ((num 0)
  175.        (char (read-char)))
  176.     (while (and (>= char ?0)
  177.         (<= char ?9))
  178.       (setq num (+ (* num 10) (- char ?0)))
  179.       (setq char (read-char)))
  180.     (or (eq term-char char)
  181.     (error "Invalid data format in mouse command"))
  182.     num))
  183.  
  184. (defun sup-move-point-to-x-y (x y)
  185.   "Position cursor in window coordinates.
  186. X and Y are 0-based character positions in the window."
  187.   (move-to-window-line y)
  188.   (move-to-column x)
  189.   )
  190.  
  191. (defun sup-pos-to-window (x y)
  192.   "Find window corresponding to screen coordinates.
  193. X and Y are 0-based character positions on the screen."
  194.   (let ((edges (window-edges))
  195.     (window nil))
  196.     (while (and (not (eq window (selected-window)))
  197.         (or (<  y (nth 1 edges))
  198.             (>= y (nth 3 edges))
  199.             (<  x (nth 0 edges))
  200.             (>= x (nth 2 edges))))
  201.       (setq window (next-window window))
  202.       (setq edges (window-edges window))
  203.       )
  204.     (or window (selected-window))
  205.     )
  206.   )
  207.