-;;; avoid.el -- make mouse pointer stay out of the way of editing.
+;;; avoid.el --- make mouse pointer stay out of the way of editing
;;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
-;; Author: Boris Goldowsky <boris@cs.rochester.edu>
+;; Author: Boris Goldowsky <boris@gnu.ai.mit.edu>
;; Keywords: mouse
-;; Version: 1.10
;; This file is part of GNU Emacs.
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
;;; Commentary:
-;;;
-;;; For those who are annoyed by the mouse pointer obscuring text,
-;;; this mode moves the mouse pointer - either just a little out of
-;;; the way, or all the way to the corner of the frame.
-;;; To use, load or evaluate this file and type M-x mouse-avoidance-mode .
-;;; To set up permanently, put this file on your load-path and put the
-;;; following in your .emacs:
-;;;
-;;; (cond (window-system
-;;; (require 'avoid)
-;;; (mouse-avoidance-mode 'animate)))
-;;;
-;;; The 'animate can be 'jump or 'banish or 'exile or 'protean if you prefer.
-;;; See the documentation for function `mouse-avoidance-mode' for
-;;; details of the different modes.
-;;;
-;;; For added silliness, make the animatee animate...
-;;; put something similar to the following into your .emacs:
-;;;
-;;; (cond (window-system
-;;; (setq x-pointer-shape
-;;; (eval (nth (random 4)
-;;; '(x-pointer-man x-pointer-spider
-;;; x-pointer-gobbler x-pointer-gumby))))
-;;; (set-mouse-color (cdr (assoc 'mouse-color (frame-parameters))))))
-;;;
-;;; For completely random pointer shape, replace the setq above with:
-;;; (setq x-pointer-shape (mouse-avoidance-random-shape))
-;;;
-;;; Bugs / Warnings / To-Do:
-;;;
-;;; - Using this code does slow emacs down. "banish" mode shouldn't
-;;; ever be too bad though, and on my workstation even "animate" doesn't
-;;; seem to have a noticable effect during editing.
-;;;
-;;; - It should find out where any overlapping frames are and avoid them,
-;;; rather than always raising the frame.
-
-;;; Credits:
-;;; This code was helped by all those who contributed suggestions,
-;;; fixes, and additions
-;;; Joe Harrington (and his advisor), for the original inspiration.
-;;; Ken Manheimer, for dreaming up the Protean mode.
-;;; Richard Stallman, for the awful cat-and-mouse pun, among other things.
-;;; Mike Williams, Denis Howe, Bill Benedetto, Chris Moore, Don Morris,
-;;; Simon Marshall, and M.S. Ashton, for their feedback.
-;;;
+
+;; For those who are annoyed by the mouse pointer obscuring text,
+;; this mode moves the mouse pointer - either just a little out of
+;; the way, or all the way to the corner of the frame.
+;; To use, load or evaluate this file and type M-x mouse-avoidance-mode .
+;; To set up permanently, put the following in your .emacs:
+;;
+;; (if window-system (mouse-avoidance-mode 'animate))
+;;
+;; The 'animate can be 'jump or 'banish or 'exile or 'protean if you prefer.
+;; See the documentation for function `mouse-avoidance-mode' for
+;; details of the different modes.
+;;
+;; For added silliness, make the animatee animate...
+;; put something similar to the following into your .emacs:
+;;
+;; (if window-system
+;; (mouse-avoidance-set-pointer-shape
+;; (eval (nth (random 4)
+;; '(x-pointer-man x-pointer-spider
+;; x-pointer-gobbler x-pointer-gumby)))))
+;;
+;; For completely random pointer shape, replace the setq above with:
+;; (setq x-pointer-shape (mouse-avoidance-random-shape))
+;;
+;; Bugs / Warnings / To-Do:
+;;
+;; - Using this code does slow emacs down. "banish" mode shouldn't
+;; be too bad, and on my workstation even "animate" is reasonable.
+;;
+;; - It ought to find out where any overlapping frames are and avoid them,
+;; rather than always raising the frame.
+
+;; Credits:
+;; This code was helped by all those who contributed suggestions,
+;; fixes, and additions
+;; Joe Harrington (and his advisor), for the original inspiration.
+;; Ken Manheimer, for dreaming up the Protean mode.
+;; Richard Stallman, for the awful cat-and-mouse pun, among other things.
+;; Mike Williams, Denis Howe, Bill Benedetto, Chris Moore, Don Morris,
+;; Simon Marshall, and M.S. Ashton, for their feedback.
+
;;; Code:
(provide 'avoid)
(defvar mouse-avoidance-state nil)
(defvar mouse-avoidance-pointer-shapes nil)
(defvar mouse-avoidance-n-pointer-shapes 0)
+(defvar mouse-avoidance-old-pointer-shape nil)
;;; Functions:
+(defsubst mouse-avoidance-set-pointer-shape (shape)
+ "Set the shape of the mouse pointer to SHAPE."
+ (setq x-pointer-shape shape)
+ (set-mouse-color nil))
+
(defun mouse-avoidance-point-position ()
"Return the position of point as (FRAME X . Y).
Analogous to mouse-position."
;; Args are the CURRENT location, the desired DELTA for
;; warp-conservation, the DISTANCE we like to move, the VARIABILITY
;; in distance allowed, and the MIN and MAX possible window positions.
- ;; Returns something as close to DELTA as possible withing the constraints.
+ ;; Returns something as close to DELTA as possible within the constraints.
(let ((L1 (max (- min cur) (+ (- dist) (- var))))
(R1 (+ (- dist) var ))
(L2 (+ dist (- var)))
(+ (cdr mouse-avoidance-state) deltay)))
(if (or (eq mouse-avoidance-mode 'animate)
(eq mouse-avoidance-mode 'proteus))
- (let ((i 0.0)
- (color (cdr (assoc 'mouse-color (frame-parameters)))))
+ (let ((i 0.0))
(while (<= i 1)
(mouse-avoidance-set-mouse-position
(cons (+ (car cur-pos) (round (* i deltax)))
(+ (cdr cur-pos) (round (* i deltay)))))
(setq i (+ i (max .1 (/ 1.0 mouse-avoidance-nudge-dist))))
(if (eq mouse-avoidance-mode 'proteus)
- (progn
- (setq x-pointer-shape (mouse-avoidance-random-shape))
- (set-mouse-color color)))
+ (mouse-avoidance-set-pointer-shape
+ (mouse-avoidance-random-shape)))
(sit-for mouse-avoidance-animation-delay)))
(mouse-avoidance-set-mouse-position (cons (+ (car (cdr cur)) deltax)
(+ (cdr (cdr cur)) deltay))))))
(mouse-avoidance-too-close-p (mouse-position)))
(let ((old-pos (mouse-position)))
(mouse-avoidance-nudge-mouse)
- (if (not (eq (selected-frame) (car old-pos))) ; move went awry
- (set-mouse-position old-pos (car old-pos) ; sigh..
- (car (cdr old-pos))
- (cdr (cdr old-pos)))))))
+ (if (not (eq (selected-frame) (car old-pos)))
+ ;; This should never happen.
+ (apply 'set-mouse-position old-pos)))))
(defun mouse-avoidance-kbd-command (key)
"Return t if the KEYSEQENCE is composed of keyboard events only.
(setq i (1+ i))))
t))))
+;;;###autoload
(defun mouse-avoidance-mode (&optional mode)
"Set cursor avoidance mode to MODE.
MODE should be one of the symbols `banish', `exile', `jump', `animate',
nil t))))
(if (eq mode 'cat-and-mouse)
(setq mode 'animate))
- (setq post-command-hook
- (delete 'mouse-avoidance-banish-hook (append post-command-hook nil)))
- (setq post-command-hook
- (delete 'mouse-avoidance-exile-hook (append post-command-hook nil)))
- (setq post-command-hook
- (delete 'mouse-avoidance-fancy-hook (append post-command-hook nil)))
+ (remove-hook 'post-command-idle-hook 'mouse-avoidance-banish-hook)
+ (remove-hook 'post-command-idle-hook 'mouse-avoidance-exile-hook)
+ (remove-hook 'post-command-idle-hook 'mouse-avoidance-fancy-hook)
+
+ ;; Restore pointer shape if necessary
+ (if (eq mouse-avoidance-mode 'proteus)
+ (mouse-avoidance-set-pointer-shape mouse-avoidance-old-pointer-shape))
+
+ ;; Do additional setup depending on version of mode requested
(cond ((eq mode 'none)
(setq mouse-avoidance-mode nil))
((or (eq mode 'jump)
(eq mode 'animate)
(eq mode 'proteus))
- (add-hook 'post-command-hook 'mouse-avoidance-fancy-hook)
+ (add-hook 'post-command-idle-hook 'mouse-avoidance-fancy-hook)
(setq mouse-avoidance-mode mode
- mouse-avoidance-state (cons 0 0)))
+ mouse-avoidance-state (cons 0 0)
+ mouse-avoidance-old-pointer-shape x-pointer-shape))
((eq mode 'exile)
- (add-hook 'post-command-hook 'mouse-avoidance-exile-hook)
+ (add-hook 'post-command-idle-hook 'mouse-avoidance-exile-hook)
(setq mouse-avoidance-mode mode
mouse-avoidance-state nil))
((or (eq mode 'banish)
(eq mode t)
(and (null mode) (null mouse-avoidance-mode))
(and mode (> (prefix-numeric-value mode) 0)))
- (add-hook 'post-command-hook 'mouse-avoidance-banish-hook)
+ (add-hook 'post-command-idle-hook 'mouse-avoidance-banish-hook)
(setq mouse-avoidance-mode 'banish))
(t (setq mouse-avoidance-mode nil)))
(force-mode-line-update))