diff options
author | Peter Münster <pm@a16n.net> | 2020-09-13 16:18:56 +0200 |
---|---|---|
committer | Bastien Guerry <bastien.guerry@data.gouv.fr> | 2020-09-13 18:41:33 +0200 |
commit | b01332c87ec3e031bfab474b801af6148dadb146 (patch) | |
tree | f9276a0839626b287f59a6e4834f18a5d8ef8b9c | |
parent | 54bdd6cbf7b9e0a49b2fd2607a24e697a2fb272c (diff) | |
download | org-mode-b01332c87ec3e031bfab474b801af6148dadb146.tar.gz |
org-notify.el: Limit the number of notifications
(org-notify-max-notifications-per-run): New option for limiting the
notifications.
(org-notify-process): Use it.
-rw-r--r-- | contrib/lisp/org-notify.el | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/contrib/lisp/org-notify.el b/contrib/lisp/org-notify.el index 56d565c..7f610a0 100644 --- a/contrib/lisp/org-notify.el +++ b/contrib/lisp/org-notify.el @@ -74,6 +74,11 @@ :type 'boolean :group 'org-notify) +(defcustom org-notify-max-notifications-per-run 3 + "Maximum number of notifications per run of `org-notify-process'." + :type 'integer + :group 'org-notify) + (defconst org-notify-actions '("show" "show" "done" "done" "hour" "one hour later" "day" "one day later" "week" "one week later") @@ -158,33 +163,37 @@ PERIOD." (cl-defun org-notify-process () "Process the todo-list, and possibly notify user about upcoming or forgotten tasks." - (cl-macrolet ((prm (k) `(plist-get prms ,k)) (td (k) `(plist-get todo ,k))) - (dolist (todo (org-notify-todo-list)) - (let* ((deadline (td :deadline)) (heading (td :heading)) - (uid (td :uid)) (last-run-sym - (intern (concat ":last-run-" uid)))) - (cl-dolist (prms (plist-get org-notify-map (td :notify))) - (when (< deadline (org-notify-string->seconds (prm :time))) - (let ((period (org-notify-string->seconds (prm :period))) - (last-run (prm last-run-sym)) (now (float-time)) - (actions (prm :actions)) diff plist) - (when (or (not last-run) - (and period (< period (setq diff (- now last-run))) - (org-notify-maybe-too-late diff period heading))) - (setq prms (plist-put prms last-run-sym now) - plist (append todo prms)) - (if (if (plist-member prms :audible) - (prm :audible) - org-notify-audible) - (ding)) - (unless (listp actions) - (setq actions (list actions))) - (dolist (action actions) - (funcall (if (fboundp action) action - (intern (concat "org-notify-action" - (symbol-name action)))) - plist)))) - (cl-return))))))) + (let ((notification-cnt 0)) + (cl-macrolet ((prm (k) `(plist-get prms ,k)) (td (k) `(plist-get todo ,k))) + (dolist (todo (org-notify-todo-list)) + (let* ((deadline (td :deadline)) (heading (td :heading)) + (uid (td :uid)) (last-run-sym + (intern (concat ":last-run-" uid)))) + (cl-dolist (prms (plist-get org-notify-map (td :notify))) + (when (< deadline (org-notify-string->seconds (prm :time))) + (let ((period (org-notify-string->seconds (prm :period))) + (last-run (prm last-run-sym)) (now (float-time)) + (actions (prm :actions)) diff plist) + (when (or (not last-run) + (and period (< period (setq diff (- now last-run))) + (org-notify-maybe-too-late diff period heading))) + (setq prms (plist-put prms last-run-sym now) + plist (append todo prms)) + (if (if (plist-member prms :audible) + (prm :audible) + org-notify-audible) + (ding)) + (unless (listp actions) + (setq actions (list actions))) + (cl-incf notification-cnt) + (dolist (action actions) + (funcall (if (fboundp action) action + (intern (concat "org-notify-action" + (symbol-name action)))) + plist)) + (when (>= notification-cnt org-notify-max-notifications-per-run) + (cl-return-from org-notify-process))) + (cl-return))))))))) (defun org-notify-add (name &rest params) "Add a new notification type. |