summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtur Malabarba <bruce.connor.am@gmail.com>2015-03-07 19:25:29 -0300
committerArtur Malabarba <bruce.connor.am@gmail.com>2015-03-07 19:25:29 -0300
commit3f5871a4f83509aed8cc0877df20ee90a2a607dc (patch)
tree2c8fd1074e51e568fba01672d0224fe1cc013fb9
parent2a7b2eb6d92473cdbdec84df7d05238b43599fb7 (diff)
Customizable speed
-rw-r--r--spinner.el55
1 files changed, 41 insertions, 14 deletions
diff --git a/spinner.el b/spinner.el
index 721f9c2..ec6a17c 100644
--- a/spinner.el
+++ b/spinner.el
@@ -51,20 +51,15 @@ vector, the spinner itself.")
"Spinner curently being displayed on the mode-line.")
(make-variable-buffer-local 'spinner-current)
-(defun spinner-stop ()
- "Stop the current buffer's spinner."
- (when (timerp spinner--timer)
- (cancel-timer spinner--timer))
- (setq spinner--timer nil
- spinner-current nil)
- (setq mode-line-format
- (remove 'spinner--mode-line-construct mode-line-format)))
+(defvar spinner--counter 0
+ "Current frame of the spinner.")
+(make-variable-buffer-local 'spinner--counter)
(defconst spinner--mode-line-construct
'((spinner-current
(" "
(:eval (elt spinner-current
- (% (cadr (current-time))
+ (% spinner--counter
(length spinner-current)))))
(spinner--timer
(:eval (spinner-stop)))))
@@ -75,10 +70,24 @@ vector, the spinner itself.")
"Holds the timer being used on the current buffer.")
(make-variable-buffer-local 'spinner--timer)
-(defun spinner-start (&optional type)
+(defvar spinner-frames-per-second 5
+ "Default speed at which spinners spin, in frames per second.
+Applications can override this value.")
+
+
+;;; The main function
+;;;###autoload
+(defun spinner-start (&optional type fps)
"Start a mode-line spinner of given TYPE.
-Spinners are buffer local. Call `spinner-stop' in the same buffer
-to stop it.
+Spinners are buffer local. It is added to the mode-line in the
+buffer where `spinner-start' is called.
+
+Return value is a function which can be called anywhere to stop
+this spinner. You can also call `spinner-stop' in the same
+buffer where the spinner was created.
+
+FPS, if given, is the number of desired frames per second.
+Default is `spinner-frames-per-second'.
If TYPE is nil, use the first element of `spinner-types'.
If TYPE is `random', use a random element of `spinner-types'.
@@ -99,6 +108,7 @@ is chosen as the spinner type."
spinner-types)))
((symbolp type) (cdr (assq type spinner-types)))
(t (error "Unknown spinner type: %s" type))))
+ (setq spinner--counter 0)
;; Maybe add to mode-line.
(unless (memq 'spinner--mode-line-construct mode-line-format)
@@ -113,14 +123,31 @@ is chosen as the spinner type."
(cancel-timer spinner--timer))
(let ((buffer (current-buffer))
;; Create the timer as a lex variable so it can cancel itself.
- (timer (run-at-time t 1 #'ignore)))
+ (timer (run-at-time t
+ (/ 1.0 (or fps spinner-frames-per-second))
+ #'ignore)))
(timer-set-function
timer (lambda ()
(if (buffer-live-p buffer)
(with-current-buffer buffer
+ (setq spinner--counter (1+ spinner--counter))
(force-mode-line-update))
(ignore-errors (cancel-timer timer)))))
- (setq spinner--timer timer)))
+ (setq spinner--timer timer)
+ ;; Return a stopping function.
+ (lambda () (when (buffer-live-p buffer)
+ (with-current-buffer buffer
+ (spinner-stop))))))
+
+(defun spinner-stop ()
+ "Stop the current buffer's spinner."
+ (when (timerp spinner--timer)
+ (cancel-timer spinner--timer))
+ (setq spinner--timer nil
+ spinner-current nil)
+ (setq mode-line-format
+ (remove 'spinner--mode-line-construct mode-line-format)))
(provide 'spinner)
+
;;; spinner.el ends here