Hi, Please find attached 2 patches for org-notify.el.
Kind regards, -- Peter
>From 9ffa89dc99bfe967d9c591948d84dddb2eccdc38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCnster?= <p...@a16n.net> Date: Sun, 13 Sep 2020 15:44:00 +0200 Subject: [PATCH 1/2] org-notify.el: Use cl- prefixed functions, and require cl-lib --- contrib/lisp/org-notify.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/lisp/org-notify.el b/contrib/lisp/org-notify.el index 9f8677871..56d565c74 100644 --- a/contrib/lisp/org-notify.el +++ b/contrib/lisp/org-notify.el @@ -57,7 +57,7 @@ ;;; Code: -(eval-when-compile (require 'cl)) +(eval-when-compile (require 'cl-lib)) (require 'org-element) (declare-function appt-delete-window "appt" ()) @@ -155,7 +155,7 @@ PERIOD." (message "Warning: notification for \"%s\" behind schedule!" heading)) t) -(defun org-notify-process () +(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))) @@ -163,7 +163,7 @@ forgotten tasks." (let* ((deadline (td :deadline)) (heading (td :heading)) (uid (td :uid)) (last-run-sym (intern (concat ":last-run-" uid)))) - (dolist (prms (plist-get org-notify-map (td :notify))) + (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)) @@ -184,7 +184,7 @@ forgotten tasks." (intern (concat "org-notify-action" (symbol-name action)))) plist)))) - (return))))))) + (cl-return))))))) (defun org-notify-add (name &rest params) "Add a new notification type. -- 2.26.2
>From 54134c8d07bafee3d8fc7492658c3a1c067aea5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCnster?= <p...@a16n.net> Date: Sun, 13 Sep 2020 16:18:56 +0200 Subject: [PATCH 2/2] 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. --- contrib/lisp/org-notify.el | 63 ++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/contrib/lisp/org-notify.el b/contrib/lisp/org-notify.el diff --git a/contrib/lisp/org-notify.el b/contrib/lisp/org-notify.el index 56d565c74..7f610a0df 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. -- 2.26.2