|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 5377 (0x1501)
Types: TextFile
Names: »bg-mouse.el«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/gnu-31mar87/emacs/lisp/bg-mouse.el«
;; GNU Emacs code for BBN Bitgraph mouse.
;; Copyright (C) Free Software Foundation, Inc. Oct 1985.
;; This file is part of GNU Emacs.
;; GNU Emacs 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 it
;; or for whether it serves any particular purpose or works at all,
;; unless he says so in writing. Refer to the GNU Emacs General Public
;; License for full details.
;; Everyone is granted permission to copy, modify and redistribute
;; GNU Emacs, but only under the conditions described in the
;; GNU Emacs General Public License. A copy of this license is
;; supposed to have been given to you along with GNU Emacs so you
;; can know your rights and responsibilities. It should be in a
;; file named COPYING. Among other things, the copyright notice
;; and this notice must be preserved on all copies.
;;; Original version by John Robinson (jr@bbn-unix.arpa, bbncca!jr), Oct 1985
;;; User customization option:
(defvar bg-mouse-fast-select-window nil
"*Non-nil for mouse hits to select new window, then execute; else just select.")
;;; Defuns:
(defun bg-mouse-report ()
"Read and parse BBN BitGraph mouse report, and do what it asks.
L-- move point * |---- These apply for mouse click in a window.
--R set mark * | If bg-mouse-fast-select-window is nil,
L-R kill region | a starred command on a nonselected window
-C- move point and yank * | just selects that window.
LC- yank-pop
-CR or LCR undo | \"Scroll bar\" is right-hand window column.
on modeline on \"scroll bar\" in minibuffer
L-- scroll-up line to top execute-extended-command
--R scroll-down line to bottom eval-expression
-C- proportional goto-char line to middle suspend-emacs
To reenable the mouse if terminal is reset, type ESC : RET ."
(interactive)
(bg-get-tty-num ?\;)
(let*
((x (min (1- (screen-width))
(/ (bg-get-tty-num ?\;) 9))) ; Don't hit column 86!
(y (- (1- (screen-height))
(/ (bg-get-tty-num ?\;) 16))) ; Assume default font size.
(buttons (% (bg-get-tty-num ?c) 8))
(window (bg-pos-to-window x y))
(edges (window-edges window))
(old-window (selected-window))
(in-minibuf-p (eq y (1- (screen-height))))
(same-window-p (and (not in-minibuf-p) (eq window old-window)))
(in-modeline-p (eq y (1- (nth 3 edges))))
(in-scrollbar-p (>= x (1- (nth 2 edges)))))
(setq x (- x (nth 0 edges)))
(setq y (- y (nth 1 edges)))
(cond (in-modeline-p
(select-window window)
(cond ((= buttons 4)
(scroll-up))
((= buttons 1)
(scroll-down))
((= buttons 2)
(goto-char (/ (* x
(- (point-max) (point-min)))
(1- (window-width))))
(beginning-of-line)
(what-cursor-position)))
(select-window old-window))
(in-scrollbar-p
(select-window window)
(scroll-up
(cond ((= buttons 4)
y)
((= buttons 1)
(+ y (- 2 (window-height))))
((= buttons 2)
(/ (+ 2 y y (- (window-height))) 2))
(t
0)))
(select-window old-window))
(same-window-p
(cond ((= buttons 4)
(bg-move-point-to-x-y x y))
((= buttons 1)
(push-mark)
(bg-move-point-to-x-y x y)
(exchange-point-and-mark))
((= buttons 5)
(kill-region (mark) (point)))
((= buttons 2)
(bg-move-point-to-x-y x y)
(setq this-command 'yank)
(yank))
((= buttons 6)
(yank-pop 1))
((or (= buttons 3) (= buttons 7))
(undo))
)
)
(in-minibuf-p
(cond ((= buttons 1)
(call-interactively 'eval-expression))
((= buttons 4)
(call-interactively 'execute-extended-command))
((= buttons 2)
(suspend-emacs))
))
(t ;in another window
(select-window window)
(cond ((not bg-mouse-fast-select-window))
((= buttons 4)
(bg-move-point-to-x-y x y))
((= buttons 1)
(push-mark)
(bg-move-point-to-x-y x y)
(exchange-point-and-mark))
((= buttons 2)
(bg-move-point-to-x-y x y)
(setq this-command 'yank)
(yank))
))
)))
\f
(defun bg-get-tty-num (term-char)
"Read from terminal until TERM-CHAR is read, and return intervening number.
Upon non-numeric not matching TERM-CHAR, reprogram the mouse and signal an error."
(let
((num 0)
(char (- (read-char) 48)))
(while (and (>= char 0)
(<= char 9))
(setq num (+ (* num 10) char))
(setq char (- (read-char) 48)))
(or (eq term-char (+ char 48))
(progn
(bg-program-mouse)
(error "Invalid data format in mouse command")))
num))
(defun bg-move-point-to-x-y (x y)
"Position cursor in window coordinates.
X and Y are 0-based character positions in the window."
(move-to-window-line y)
(move-to-column x)
)
(defun bg-pos-to-window (x y)
"Find window corresponding to screen coordinates.
X and Y are 0-based character positions on the screen."
(let ((edges (window-edges))
(window nil))
(while (and (not (eq window (selected-window)))
(or (< y (nth 1 edges))
(>= y (nth 3 edges))
(< x (nth 0 edges))
(>= x (nth 2 edges))))
(setq window (next-window window))
(setq edges (window-edges window))
)
(or window (selected-window))
)
)
(defun bg-program-mouse ()
(send-string-to-terminal "\e:0;7;;;360;512;9;16;9;16c"))