X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/00ed33e7ab1f430e43aeff27c3aa767590b2207e..2c3d59853173258cd84dab5b12c239705dd8fc02:/lisp/avoid.el diff --git a/lisp/avoid.el b/lisp/avoid.el index 48f0914f16..0ce9e47922 100644 --- a/lisp/avoid.el +++ b/lisp/avoid.el @@ -32,7 +32,9 @@ ;; ;; (if window-system (mouse-avoidance-mode 'animate)) ;; -;; The 'animate can be 'jump or 'banish or 'exile or 'protean if you prefer. +;; Other legitimate alternatives include +;; `banish', `exile', `jump', `cat-and-mouse', and `proteus'. +;; They do somewhat different things. ;; See the documentation for function `mouse-avoidance-mode' for ;; details of the different modes. ;; @@ -75,11 +77,21 @@ :group 'mouse) -(defvar mouse-avoidance-mode nil - "Value is t or a symbol if the mouse pointer should avoid the cursor. -See function `mouse-avoidance-mode' for possible values. Changing this -variable is NOT the recommended way to change modes; use that function -instead.") +(defcustom mouse-avoidance-mode nil + "Activate mouse avoidance mode. +See function `mouse-avoidance-mode' for possible values. +You must modify via \\[customize] for this variable to have an effect." + :set (lambda (symbol value) + ;; 'none below prevents toggling when value is nil. + (mouse-avoidance-mode (or value 'none))) + :initialize 'custom-initialize-default + :type '(choice (const :tag "none" nil) (const banish) (const jump) + (const animate) (const exile) (const proteus) + ) + :group 'avoid + :require 'avoid + :version "20.3") + (defcustom mouse-avoidance-nudge-dist 15 "*Average distance that mouse will be moved when approached by cursor. @@ -111,6 +123,9 @@ Only applies in mouse-avoidance-modes `animate' and `jump'." (defvar mouse-avoidance-n-pointer-shapes 0) (defvar mouse-avoidance-old-pointer-shape nil) +;; This timer is used to run something when Emacs is idle. +(defvar mouse-avoidance-timer nil) + ;;; Functions: (defsubst mouse-avoidance-set-pointer-shape (shape) @@ -253,14 +268,30 @@ redefine this function to suit your own tastes." (defun mouse-avoidance-banish-hook () (if (and (not executing-kbd-macro) ; don't check inside macro - (mouse-avoidance-kbd-command (this-command-keys))) + ;; Don't do anything if last event was a mouse event. + (not (and (consp last-input-event) + (symbolp (car last-input-event)) + (let ((modifiers (event-modifiers (car last-input-event)))) + (or (memq (car last-input-event) + '(mouse-movement scroll-bar-movement)) + (memq 'click modifiers) + (memq 'drag modifiers) + (memq 'down modifiers)))))) (mouse-avoidance-banish-mouse))) (defun mouse-avoidance-exile-hook () ;; For exile mode, the state is nil when the mouse is in its normal ;; position, and set to the old mouse-position when the mouse is in exile. (if (and (not executing-kbd-macro) - (mouse-avoidance-kbd-command (this-command-keys))) + ;; Don't do anything if last event was a mouse event. + (not (and (consp last-input-event) + (symbolp (car last-input-event)) + (let ((modifiers (event-modifiers (car last-input-event)))) + (or (memq (car last-input-event) + '(mouse-movement scroll-bar-movement)) + (memq 'click modifiers) + (memq 'drag modifiers) + (memq 'down modifiers)))))) (let ((mp (mouse-position))) (cond ((and (not mouse-avoidance-state) (mouse-avoidance-too-close-p mp)) @@ -279,7 +310,15 @@ redefine this function to suit your own tastes." (defun mouse-avoidance-fancy-hook () ;; Used for the "fancy" modes, ie jump et al. (if (and (not executing-kbd-macro) ; don't check inside macro - (mouse-avoidance-kbd-command (this-command-keys)) + ;; Don't do anything if last event was a mouse event. + (not (and (consp last-input-event) + (symbolp (car last-input-event)) + (let ((modifiers (event-modifiers (car last-input-event)))) + (or (memq (car last-input-event) + '(mouse-movement scroll-bar-movement)) + (memq 'click modifiers) + (memq 'drag modifiers) + (memq 'down modifiers))))) (mouse-avoidance-too-close-p (mouse-position))) (let ((old-pos (mouse-position))) (mouse-avoidance-nudge-mouse) @@ -287,21 +326,6 @@ redefine this function to suit your own tastes." ;; 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. -Return nil if there are any lists in the key sequence." - (cond ((null key) nil) ; Null event seems to be - ; returned occasionally. - ((not (vectorp key)) t) ; Strings are keyboard events. - ((catch 'done - (let ((i 0) - (l (length key))) - (while (< i l) - (if (listp (aref key i)) - (throw 'done nil)) - (setq i (1+ i)))) - t)))) - ;;;###autoload (defun mouse-avoidance-mode (&optional mode) "Set cursor avoidance mode to MODE. @@ -335,9 +359,9 @@ definition of \"random distance\".)" nil t)))) (if (eq mode 'cat-and-mouse) (setq mode 'animate)) - (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) + (if mouse-avoidance-timer + (cancel-timer mouse-avoidance-timer)) + (setq mouse-avoidance-timer nil) ;; Restore pointer shape if necessary (if (eq mouse-avoidance-mode 'proteus) @@ -349,19 +373,22 @@ definition of \"random distance\".)" ((or (eq mode 'jump) (eq mode 'animate) (eq mode 'proteus)) - (add-hook 'post-command-idle-hook 'mouse-avoidance-fancy-hook) + (setq mouse-avoidance-timer + (run-with-idle-timer 0.1 t 'mouse-avoidance-fancy-hook)) (setq mouse-avoidance-mode mode mouse-avoidance-state (cons 0 0) mouse-avoidance-old-pointer-shape x-pointer-shape)) ((eq mode 'exile) - (add-hook 'post-command-idle-hook 'mouse-avoidance-exile-hook) + (setq mouse-avoidance-timer + (run-with-idle-timer 0.1 t '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-idle-hook 'mouse-avoidance-banish-hook) + (setq mouse-avoidance-timer + (run-with-idle-timer 0.1 t 'mouse-avoidance-banish-hook)) (setq mouse-avoidance-mode 'banish)) (t (setq mouse-avoidance-mode nil))) (force-mode-line-update)) @@ -372,4 +399,8 @@ definition of \"random distance\".)" ;; (setq minor-mode-alist (cons '(mouse-avoidance-mode " Avoid") ;; minor-mode-alist))) -;;; End of avoid.el +;; Needed for custom. +(if mouse-avoidance-mode + (mouse-avoidance-mode mouse-avoidance-mode)) + +;;; avoid.el ends here