]> code.delx.au - gnu-emacs-elpa/blobdiff - beacon.el
[Fix #14] Blink when Emacs frame is focused
[gnu-emacs-elpa] / beacon.el
index feda34b88819a81c0fa36d80443d037c6b2dce24..777e809985bf90754e8aedb908b345b1e7e2ccd9 100644 (file)
--- a/beacon.el
+++ b/beacon.el
@@ -5,7 +5,7 @@
 ;; Author: Artur Malabarba <emacs@endlessparentheses.com>
 ;; URL: https://github.com/Malabarba/beacon
 ;; Keywords: convenience
 ;; Author: Artur Malabarba <emacs@endlessparentheses.com>
 ;; URL: https://github.com/Malabarba/beacon
 ;; Keywords: convenience
-;; Version: 0.1
+;; Version: 0.1.1
 ;; Package-Requires: ((seq "1.9"))
 
 ;; This program is free software; you can redistribute it and/or modify
 ;; Package-Requires: ((seq "1.9"))
 
 ;; This program is free software; you can redistribute it and/or modify
@@ -46,7 +46,7 @@
 
 (defvar beacon--timer nil)
 
 
 (defvar beacon--timer nil)
 
-(defcustom beacon-push-mark nil
+(defcustom beacon-push-mark 35
   "Should the mark be pushed before long movements?
 If nil, `beacon' will not push the mark.
 Otherwise this should be a number, and `beacon' will push the
   "Should the mark be pushed before long movements?
 If nil, `beacon' will not push the mark.
 Otherwise this should be a number, and `beacon' will push the
@@ -96,14 +96,18 @@ If it is a string, it is a color name or specification,
 e.g. \"#666600\"."
   :type '(choice number color))
 
 e.g. \"#666600\"."
   :type '(choice number color))
 
-(defcustom beacon-dont-blink-predicates nil
+(defvar beacon-dont-blink-predicates nil
   "A list of predicates that prevent the beacon blink.
 These predicate functions are called in order, with no
 arguments, before blinking the beacon.  If any returns
   "A list of predicates that prevent the beacon blink.
 These predicate functions are called in order, with no
 arguments, before blinking the beacon.  If any returns
-non-nil, the beacon will not blink."
-  :type 'hook)
+non-nil, the beacon will not blink.
+
+For instance, if you want to disable beacon on buffers where
+`hl-line-mode' is on, you can do:
+
+    (add-hook \\='beacon-dont-blink-predicates
+              (lambda () (bound-and-true-p hl-line-mode)))")
 
 
-(add-hook 'beacon-dont-blink-predicates (lambda () (bound-and-true-p hl-line-mode)))
 (add-hook 'beacon-dont-blink-predicates #'window-minibuffer-p)
 
 (defcustom beacon-dont-blink-major-modes '(magit-status-mode)
 (add-hook 'beacon-dont-blink-predicates #'window-minibuffer-p)
 
 (defcustom beacon-dont-blink-major-modes '(magit-status-mode)
@@ -267,11 +271,18 @@ If DELTA is nil, return nil."
        (markerp beacon--previous-place)
        (equal (marker-buffer beacon--previous-place)
               (current-buffer))
        (markerp beacon--previous-place)
        (equal (marker-buffer beacon--previous-place)
               (current-buffer))
+       ;; Quick check that prevents running the code below in very
+       ;; short movements (like typing).
        (> (abs (- (point) beacon--previous-place))
           delta)
        (> (abs (- (point) beacon--previous-place))
           delta)
-       (> (count-screen-lines (min (point) beacon--previous-place)
-                              (max (point) beacon--previous-place))
-          delta)))
+       ;; Check if the movement was >= DELTA lines by moving DELTA
+       ;; lines. `count-screen-lines' is too slow if the movement had
+       ;; thousands of lines.
+       (save-excursion
+         (goto-char (min beacon--previous-place (point)))
+         (vertical-motion delta)
+         (> (max (point) beacon--previous-place)
+            (line-beginning-position)))))
 
 (defun beacon--maybe-push-mark ()
   "Push mark if it seems to be safe."
 
 (defun beacon--maybe-push-mark ()
   "Push mark if it seems to be safe."
@@ -339,11 +350,17 @@ unreliable, so just blink immediately."
   (if beacon-mode
       (progn
         (add-hook 'window-scroll-functions #'beacon--window-scroll-function)
   (if beacon-mode
       (progn
         (add-hook 'window-scroll-functions #'beacon--window-scroll-function)
+        (add-hook 'focus-in-hook #'beacon-blink)
         (add-hook 'post-command-hook #'beacon--post-command)
         (add-hook 'pre-command-hook #'beacon--vanish))
         (add-hook 'post-command-hook #'beacon--post-command)
         (add-hook 'pre-command-hook #'beacon--vanish))
+    (remove-hook 'focus-in-hook #'beacon-blink)
     (remove-hook 'window-scroll-functions #'beacon--window-scroll-function)
     (remove-hook 'post-command-hook #'beacon--post-command)
     (remove-hook 'pre-command-hook #'beacon--vanish)))
 
 (provide 'beacon)
 ;;; beacon.el ends here
     (remove-hook 'window-scroll-functions #'beacon--window-scroll-function)
     (remove-hook 'post-command-hook #'beacon--post-command)
     (remove-hook 'pre-command-hook #'beacon--vanish)))
 
 (provide 'beacon)
 ;;; beacon.el ends here
+
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; End: