]> code.delx.au - gnu-emacs/commitdiff
Allow further `mouse-avoidance-mode' customisations
authorThierry Volpiatto <thierry.volpiatto@gmail.com>
Fri, 13 Apr 2012 21:15:22 +0000 (23:15 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 13 Apr 2012 21:15:22 +0000 (23:15 +0200)
* avoid.el (mouse-avoidance-banish-position): New variable.
(mouse-avoidance-banish-destination): Use it.

etc/NEWS
lisp/avoid.el

index 095f783b523fa87819948912cf2ef448c04da096..f20b7a840b77508fe4790bca2480302aeaba6bb6 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -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.
+
 \f
 * Changes in Specialized Modes and Packages in Emacs 24.2
 
index 17d99fd65177de60a5513ad49246db3eca3b3381..81e0737c849c1a11fa28ac9002fbee4893278e2d 100644 (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)