summaryrefslogtreecommitdiff
path: root/lisp/gnus/gnus-notifications.el
diff options
context:
space:
mode:
authorJulien Danjou <julien@danjou.info>2012-08-30 22:14:27 +0000
committerKatsumi Yamaoka <yamaoka@jpl.org>2012-08-30 22:14:27 +0000
commitba7ac1f6e5f675614953c51dafff677b7ddafa2b (patch)
tree7bca576779a5d51f2fa4c58138973d0a400a24a3 /lisp/gnus/gnus-notifications.el
parentb118352941c84d26d38be3ab77d4939bfd70de2f (diff)
downloademacs-ba7ac1f6e5f675614953c51dafff677b7ddafa2b.tar.gz
gnus-notifications.el: Add defcustom for timeout and actions support
Diffstat (limited to 'lisp/gnus/gnus-notifications.el')
-rw-r--r--lisp/gnus/gnus-notifications.el58
1 files changed, 41 insertions, 17 deletions
diff --git a/lisp/gnus/gnus-notifications.el b/lisp/gnus/gnus-notifications.el
index 8811b47ba42..811a90895ae 100644
--- a/lisp/gnus/gnus-notifications.el
+++ b/lisp/gnus/gnus-notifications.el
@@ -58,20 +58,42 @@ not get notifications."
:type 'integer
:group 'gnus-notifications)
+(defcustom gnus-notifications-timeout nil
+ "Timeout used for notifications sent via `notifications-notify'."
+ :type 'integer
+ :group 'gnus-notifications)
+
(defvar gnus-notifications-sent nil
"Notifications already sent.")
+(defvar gnus-notifications-id-to-msg nil
+ "Map notifications ids to messages.")
+
+(defun gnus-notifications-action (id key)
+ (when (string= key "read")
+ (let ((group-article (assoc id gnus-notifications-id-to-msg)))
+ (when group-article
+ (let ((group (cadr group-article))
+ (article (caddr group-article)))
+ (gnus-fetch-group group (list article)))))))
+
(defun gnus-notifications-notify (from subject photo-file)
- "Send a notification about a new mail."
+ "Send a notification about a new mail.
+Return a notification id if any, or t on success."
(if (fboundp 'notifications-notify)
(notifications-notify
:title from
:body subject
+ :actions '("read" "Read")
+ :on-action 'gnus-notifications-action
:app-icon (image-search-load-path "gnus/gnus.png")
:app-name "Gnus"
:category "email.arrived"
+ :timeout gnus-notifications-timeout
:image-path photo-file)
- (message "New message from %s: %s" from subject)))
+ (message "New message from %s: %s" from subject)
+ ;; Don't return an id
+ t))
(defun gnus-notifications-get-photo (mail-address)
"Get photo for mail address."
@@ -136,21 +158,23 @@ This is typically a function to add in
(article-decode-encoded-words) ; to decode mail addresses, subjects, etc
(let* ((address-components (mail-extract-address-components
(or (mail-fetch-field "From") "")))
- (address (cadr address-components))
- (photo-file (gnus-notifications-get-photo-file
- address)))
- (when (or
- ;; Ignore mails from ourselves
- (gnus-string-match-p gnus-ignored-from-addresses
- address)
- (gnus-notifications-notify
- (or (car address-components) address)
- (mail-fetch-field "Subject")
- photo-file))
- ;; Register that we did notify this message
- (setcdr group-notifications (cons article (cdr group-notifications))))
- (when photo-file
- (delete-file photo-file)))))))))))
+ (address (cadr address-components)))
+ ;; Ignore mails from ourselves
+ (unless (gnus-string-match-p gnus-ignored-from-addresses
+ address)
+ (let* ((photo-file (gnus-notifications-get-photo-file address))
+ (notification-id (gnus-notifications-notify
+ (or (car address-components) address)
+ (mail-fetch-field "Subject")
+ photo-file)))
+ (when notification-id
+ ;; Register that we did notify this message
+ (setcdr group-notifications (cons article (cdr group-notifications)))
+ (unless (eq notification-id t)
+ ;; Register the notification id for later actions
+ (add-to-list 'gnus-notifications-id-to-msg (list notification-id group article))))
+ (when photo-file
+ (delete-file photo-file)))))))))))))
(provide 'gnus-notifications)