X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/7be1c708c5abc7dea388d45454bd19bff07b7943..ba3189039adc8ec5eba5ed3e21d42019a4616b7c:/lisp/avoid.el diff --git a/lisp/avoid.el b/lisp/avoid.el index 038927105e..f301372893 100644 --- a/lisp/avoid.el +++ b/lisp/avoid.el @@ -1,6 +1,6 @@ ;;; avoid.el --- make mouse pointer stay out of the way of editing -;; Copyright (C) 1993-1994, 2000-2011 Free Software Foundation, Inc. +;; Copyright (C) 1993-1994, 2000-2014 Free Software Foundation, Inc. ;; Author: Boris Goldowsky ;; Keywords: mouse @@ -41,9 +41,9 @@ ;; ;; (if (eq window-system 'x) ;; (mouse-avoidance-set-pointer-shape -;; (eval (nth (random 4) -;; '(x-pointer-man x-pointer-spider -;; x-pointer-gobbler x-pointer-gumby))))) +;; (nth (random 4) +;; (list 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)) @@ -67,7 +67,7 @@ ;;; Code: -(provide 'avoid) +(eval-when-compile (require 'cl-lib)) (defgroup avoid nil "Make mouse pointer stay out of the way of editing." @@ -80,7 +80,7 @@ See function `mouse-avoidance-mode' for possible values. Setting this variable directly does not take effect; use either \\[customize] or the function `mouse-avoidance-mode'." - :set (lambda (symbol value) + :set (lambda (_symbol value) ;; 'none below prevents toggling when value is nil. (mouse-avoidance-mode (or value 'none))) :initialize 'custom-initialize-default @@ -115,6 +115,24 @@ Only applies in Mouse Avoidance modes `animate' and `jump'." :type 'integer :group 'avoid) +(defcustom mouse-avoidance-banish-position '((frame-or-window . frame) + (side . right) + (side-pos . 3) + (top-or-bottom . top) + (top-or-bottom-pos . 0)) + "Position to which Mouse Avoidance mode `banish' moves the mouse. +An alist where keywords mean: +FRAME-OR-WINDOW: banish the mouse to corner of frame or window. +SIDE: banish the mouse on right or left corner of frame or window. +SIDE-POS: Distance from right or left edge of frame or window. +TOP-OR-BOTTOM: banish the mouse to top or bottom of frame or window. +TOP-OR-BOTTOM-POS: Distance from top or bottom edge of frame or window." + :group 'avoid + :version "24.3" + :type '(alist :key-type symbol :value-type symbol) + :options '(frame-or-window side (side-pos integer) + top-or-bottom (top-or-bottom-pos integer))) + ;; Internal variables (defvar mouse-avoidance-state nil) (defvar mouse-avoidance-pointer-shapes nil) @@ -136,13 +154,15 @@ Only applies in Mouse Avoidance modes `animate' and `jump'." (defun mouse-avoidance-point-position () "Return the position of point as (FRAME X . Y). Analogous to `mouse-position'." - (let ((edges (window-inside-edges)) - (x-y (posn-x-y (posn-at-point)))) - (cons (selected-frame) - (cons (+ (car edges) - (/ (car x-y) (frame-char-width))) - (+ (car (cdr edges)) - (/ (cdr x-y) (frame-char-height))))))) + (let* ((edges (window-inside-edges)) + (posn-at-point (posn-at-point)) + (x-y (and posn-at-point (posn-x-y posn-at-point)))) + (when x-y + (cons (selected-frame) + (cons (+ (car edges) + (/ (car x-y) (frame-char-width))) + (+ (car (cdr edges)) + (/ (cdr x-y) (frame-char-height)))))))) ;(defun mouse-avoidance-point-position-test () ; (interactive) @@ -167,29 +187,63 @@ MOUSE is the current mouse position as returned by `mouse-position'. Acceptable distance is defined by `mouse-avoidance-threshold'." (let* ((frame (car mouse)) (mouse-y (cdr (cdr mouse))) - (tool-bar-lines (frame-parameter nil 'tool-bar-lines))) + (tool-bar-lines (frame-parameter nil 'tool-bar-lines)) + point) (or tool-bar-lines (setq tool-bar-lines 0)) - (if (and mouse-y (< mouse-y tool-bar-lines)) - nil - (let ((point (mouse-avoidance-point-position)) - (mouse-x (car (cdr mouse)))) + (cond + ((and mouse-y (< mouse-y tool-bar-lines)) + nil) + ((setq point (mouse-avoidance-point-position)) + (let ((mouse-x (car (cdr mouse)))) (and (eq frame (car point)) (not (null mouse-x)) (< (abs (- mouse-x (car (cdr point)))) mouse-avoidance-threshold) (< (abs (- mouse-y (cdr (cdr point)))) - mouse-avoidance-threshold)))))) + mouse-avoidance-threshold))))))) (defun mouse-avoidance-banish-destination () "The position to which Mouse Avoidance mode `banish' moves the mouse. -You can redefine this if you want the mouse banished to a different corner." - (let* ((pos (window-edges))) - (cons (- (nth 2 pos) 2) - (nth 1 pos)))) + +If you want the mouse banished to a different corner set +`mouse-avoidance-banish-position' as you need." + (let* ((fra-or-win (assoc-default + 'frame-or-window + mouse-avoidance-banish-position 'eq)) + (list-values (pcase fra-or-win + (`frame (list 0 0 (frame-width) (frame-height))) + (`window (window-edges)))) + (alist (cl-loop for v in list-values + for k in '(left top right bottom) + collect (cons k v))) + (side (assoc-default + 'side + mouse-avoidance-banish-position #'eq)) + (side-dist (assoc-default + 'side-pos + mouse-avoidance-banish-position #'eq)) + (top-or-bottom (assoc-default + 'top-or-bottom + mouse-avoidance-banish-position #'eq)) + (top-or-bottom-dist (assoc-default + 'top-or-bottom-pos + mouse-avoidance-banish-position #'eq)) + (side-fn (pcase side + (`left '+) + (`right '-))) + (top-or-bottom-fn (pcase top-or-bottom + (`top '+) + (`bottom '-)))) + (cons (funcall side-fn ; -/+ + (assoc-default side alist 'eq) ; right or left + side-dist) ; distance from side + (funcall top-or-bottom-fn ; -/+ + (assoc-default top-or-bottom alist 'eq) ; top/bottom + top-or-bottom-dist)))) ; distance from top/bottom (defun mouse-avoidance-banish-mouse () - ;; Put the mouse pointer in the upper-right corner of the current frame. + "Put the mouse pointer to `mouse-avoidance-banish-position'." (mouse-avoidance-set-mouse-position (mouse-avoidance-banish-destination))) (defsubst mouse-avoidance-delta (cur delta dist var min max) @@ -218,7 +272,6 @@ You can redefine this if you want the mouse banished to a different corner." ;; For these modes, state keeps track of the total offset that we've ;; accumulated, and tries to keep it close to zero. (let* ((cur (mouse-position)) - (cur-frame (car cur)) (cur-pos (cdr cur)) (pos (window-edges)) (wleft (pop pos)) @@ -408,4 +461,6 @@ definition of \"random distance\".)" (if mouse-avoidance-mode (mouse-avoidance-mode mouse-avoidance-mode)) +(provide 'avoid) + ;;; avoid.el ends here