# HG changeset patch # User Kim F. Storm # Date 1038524610 0 # Node ID 3e3b1f1265f53843a833246531d97b3837bf5a85 # Parent a982201fa7a6576e8c59f986ef6bd488f5aa20c0 Avoid accidental yanking of text while scrolling with the mouse wheel. This adds a short period after each mouse wheel scroll event where a click on the mouse wheel button is ignored. (mouse-wheel-click-event, mouse-wheel-inhibit-click-time): New customs. (mouse-wheel-click-button, mwheel-inhibit-click-event-timer): New vars. (mwheel-inhibit-click-timeout,mwheel-filter-click-events): New defuns. (mwheel-scroll): Add mwheel-filter-click-events as pre-command-hook. Start mwheel-inhibit-click-event-timer with timeout handler mwheel-inhibit-click-timeout. diff -r a982201fa7a6 -r 3e3b1f1265f5 lisp/mwheel.el --- a/lisp/mwheel.el Thu Nov 28 23:02:45 2002 +0000 +++ b/lisp/mwheel.el Thu Nov 28 23:03:30 2002 +0000 @@ -1,4 +1,4 @@ -;;; mwheel.el --- Mouse support for MS intelli-mouse type mice +;;; mwheel.el --- Wheel mouse support ;; Copyright (C) 1998,2000,2001,2002 Free Software Foundation, Inc. ;; Maintainer: William M. Perry @@ -40,6 +40,7 @@ ;;; Code: (require 'custom) +(require 'timer) ;; Setter function for mouse-button user-options. Switch Mouse Wheel ;; mode off and on again so that the old button is unbound and @@ -74,6 +75,26 @@ :type 'symbol :set 'mouse-wheel-change-button) +(defvar mouse-wheel-click-button 2 + "Obsolete. Use `mouse-wheel-click-event'.") +(defcustom mouse-wheel-click-event + ;; In the latest versions of XEmacs, we could just use mouse-%s as well. + (intern (format (if (featurep 'xemacs) "button%s" "mouse-%s") + mouse-wheel-click-button)) + "Event that should be temporarily inhibited after mouse scrolling. +The mouse wheel is typically on the mouse-2 button, so it may easily +happen that text is accidentially yanked into the buffer when +scrolling with the mouse wheel. To prevent that, this variable can be +set to the event sent when clicking on the mouse wheel button." + :group 'mouse + :type 'symbol + :set 'mouse-wheel-change-button) + +(defcustom mouse-wheel-inhibit-click-time 0.35 + "Time in seconds to inhibit clicking on mouse wheel button after scroll." + :group 'mouse + :type 'float) + (defcustom mouse-wheel-scroll-amount '(5 ((shift) . 1) ((control) . nil)) "Amount to scroll windows by when spinning the mouse wheel. This is an alist mapping the modifier key to the amount to scroll when @@ -140,6 +161,19 @@ (posn-window (event-start event))) (fset 'mwheel-event-window 'event-window)) +(defvar mwheel-inhibit-click-event-timer nil + "Timer running while mouse wheel click event is inhibited.") + +(defun mwheel-inhibit-click-timeout () + "Handler for `mwheel-inhibit-click-event-timer'." + (setq mwheel-inhibit-click-event-timer nil) + (remove-hook 'pre-command-hook 'mwheel-filter-click-events)) + +(defun mwheel-filter-click-events () + "Discard `mouse-wheel-click-event' while scrolling the mouse." + (if (eq (event-basic-type last-input-event) mouse-wheel-click-event) + (setq this-command 'ignore))) + (defun mwheel-scroll (event) "Scroll up or down according to the EVENT. This should only be bound to mouse buttons 4 and 5." @@ -165,8 +199,14 @@ (cond ((eq button mouse-wheel-down-event) (scroll-down amt)) ((eq button mouse-wheel-up-event) (scroll-up amt)) (t (error "Bad binding in mwheel-scroll")))) - (if curwin (select-window curwin))))) - + (if curwin (select-window curwin)))) + (when (and mouse-wheel-click-event mouse-wheel-inhibit-click-time) + (if mwheel-inhibit-click-event-timer + (cancel-timer mwheel-inhibit-click-event-timer) + (add-hook 'pre-command-hook 'mwheel-filter-click-events)) + (setq mwheel-inhibit-click-event-timer + (run-with-timer mouse-wheel-inhibit-click-time nil + 'mwheel-inhibit-click-timeout)))) ;;;###autoload (define-minor-mode mouse-wheel-mode