|
|
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 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: )
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.