Allow further `mouse-avoidance-mode' customisations

* avoid.el (mouse-avoidance-banish-position): New variable.
(mouse-avoidance-banish-destination): Use it.
This commit is contained in:
Thierry Volpiatto 2012-04-13 23:15:22 +02:00 committed by Lars Ingebrigtsen
parent 7b55b8bf5a
commit 0f84437ba2
2 changed files with 57 additions and 5 deletions

View file

@ -41,6 +41,9 @@ been adding them there, put them somewhere else, eg site-lisp.
** M-x move-to-column, if called interactively with no prefix arg, now
prompts for a column number.
** `mouse-avoidance-banish-position' can now be used to customize
`mouse-avoidance-mode' further.
* Changes in Specialized Modes and Packages in Emacs 24.2

View file

@ -115,6 +115,23 @@ 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
: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)
@ -183,13 +200,45 @@ Acceptable distance is defined by `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 (case fra-or-win
(frame (list 0 0 (frame-width) (frame-height)))
(window (window-edges))))
(alist (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 (case side
(left '+)
(right '-)))
(top-or-bottom-fn (case 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)