]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix handling double-click-time nil or t
authorStefan Kangas <stefankangas@gmail.com>
Mon, 2 May 2022 10:03:08 +0000 (12:03 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 2 May 2022 10:03:08 +0000 (12:03 +0200)
* lisp/mouse.el (mouse-double-click-time): New function to always
return a number for `double-click-time'.
* lisp/emulation/viper-mous.el (viper-multiclick-timeout):
* lisp/foldout.el (foldout-mouse-swallow-events):
* lisp/help.el (help--read-key-sequence):
* lisp/org/org-mouse.el (org-mouse-show-context-menu): Use
'mouse-double-click-time' instead of 'double-click-time'.
* src/keyboard.c (syms_of_keyboard): Mention
'mouse-double-click-time' in doc string of 'double-click-time'.
* test/lisp/mouse-tests.el (mouse-test-mouse-double-click-time):
New test.

lisp/emulation/viper-mous.el
lisp/foldout.el
lisp/help.el
lisp/mouse.el
lisp/org/org-mouse.el
src/keyboard.c
test/lisp/mouse-tests.el

index 7581ece2142d6b0d7b209433d26d7337663cc6ed..1a90cab767468cbaa5d12fbdf92a56a831bf443b 100644 (file)
@@ -62,8 +62,8 @@ or a triple-click."
 ;; time interval in millisecond within which successive clicks are
 ;; considered related
 (defcustom viper-multiclick-timeout (if (viper-window-display-p)
-                                        double-click-time
-                                   500)
+                                        (mouse-double-click-time)
+                                     500)
   "Time interval in milliseconds for mouse clicks to be considered related."
   :type 'integer)
 
index 4b192a7b6aa2e7ce4fc61461c0a8df0380b39245..e00fb40e3ca2b7b679cb525ea9627c965996786f 100644 (file)
@@ -473,7 +473,7 @@ What happens depends on the number of mouse clicks:-
   "Swallow intervening mouse events so we only get the final click-count.
 Signal an error if the final event isn't the same type as the first one."
   (let ((initial-event-type (event-basic-type event)))
-    (while (null (sit-for (/ double-click-time 1000.0) 'nodisplay))
+    (while (null (sit-for (/ (mouse-double-click-time) 1000.0) 'nodisplay))
       (setq event (read--potential-mouse-event)))
     (or (eq initial-event-type (event-basic-type event))
        (error "")))
index fe999de63824a9b2fc1d3622a5351d6dc1d4916f..3c0370fee166c8847fa39df29e73a1c545ab24ef 100644 (file)
@@ -867,7 +867,7 @@ with `mouse-movement' events."
                   (memq 'down last-modifiers)
                   ;; After a click, see if a double click is on the way.
                   (and (memq 'click last-modifiers)
-                       (not (sit-for (/ double-click-time 1000.0) t))))
+                       (not (sit-for (/ (mouse-double-click-time) 1000.0) t))))
             (let* ((seq (read-key-sequence "\
 Describe the following key, mouse click, or menu item: "
                                            nil nil 'can-return-switch-frame))
index c08ecaf33479b1c86336101e1c488d1d1b754671..0446bc6dd87a9a6276f3dd09fe59261807ea7466 100644 (file)
@@ -167,6 +167,17 @@ Expects to be bound to `(double-)mouse-1' in `key-translation-map'."
 (define-key key-translation-map [double-mouse-1]
   #'mouse--click-1-maybe-follows-link)
 
+(defun mouse-double-click-time ()
+  "Return a number for `double-click-time'.
+In contrast to using the `double-click-time' variable directly,
+which could be set to nil or t, this function is guaranteed to
+always return a positive integer or zero."
+  (let ((ct double-click-time))
+   (cond ((eq ct t) 10000) ; arbitrary number useful for sit-for
+         ((eq ct nil) 0)
+         ((and (numberp ct) (> ct 0)) ct)
+         (t 0))))
+
 \f
 ;; Provide a mode-specific menu on a mouse button.
 
index 20c20acc3206bfdf4f70e4f15994bda0cd3e9a7d..a590ff87f248d53f94b6ad1db280e09f8db71bf4 100644 (file)
@@ -208,7 +208,7 @@ this function is called.  Otherwise, the current major mode menu is used."
   (interactive "@e \nP")
   (if (and (= (event-click-count event) 1)
           (or (not mark-active)
-              (sit-for (/ double-click-time 1000.0))))
+               (sit-for (/ (mouse-double-click-time) 1000.0))))
       (progn
        (select-window (posn-window (event-start event)))
        (when (not (org-mouse-mark-active))
index 69e741070c4c724df74ccde5b12c9490759d3e4b..70908120cb0ab2b5fef993fab359d7b9839f7ce5 100644 (file)
@@ -12434,7 +12434,10 @@ Polling is automatically disabled in all other cases.  */);
               doc: /* Maximum time between mouse clicks to make a double-click.
 Measured in milliseconds.  The value nil means disable double-click
 recognition; t means double-clicks have no time limit and are detected
-by position only.  */);
+by position only.
+
+In Lisp, you might want to use `mouse-double-click-time' instead of
+reading the value of this variable directly.  */);
   Vdouble_click_time = make_fixnum (500);
 
   DEFVAR_INT ("double-click-fuzz", double_click_fuzz,
index 1be32006a10b484efa4dabbbb73cfa4aa6de0af9..03ecbc19858beb832ae7b60885b6df7350c9b226 100644 (file)
 
 ;;; Code:
 
+(ert-deftest mouse-test-mouse-double-click-time ()
+  (let ((double-click-time 500))
+    (should (= (mouse-double-click-time) 500)))
+  (let ((double-click-time 0))
+    (should (= (mouse-double-click-time) 0)))
+  (let ((double-click-time -500))
+    (should (= (mouse-double-click-time) 0)))
+  (let ((double-click-time nil))
+    (should (= (mouse-double-click-time) 0)))
+  (let ((double-click-time t))
+    (should (numberp (mouse-double-click-time))))
+  (let ((double-click-time '(invalid)))
+    (should (= (mouse-double-click-time) 0))))
+
 (ert-deftest bug23288-use-return-value ()
   "If `mouse-on-link-p' returns a string, its first character is used."
   (cl-letf ((unread-command-events '((down-mouse-1 nil 1) (mouse-1 nil 1)))