Annotation of GNUtools/emacs/lisp/sup-mouse.el, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.