unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [PATCH] Add notifications.el
@ 2010-06-05 17:07 Julien Danjou
  2010-06-07 12:12 ` Michael Albinus
  2010-06-09 18:18 ` Tassilo Horn
  0 siblings, 2 replies; 55+ messages in thread
From: Julien Danjou @ 2010-06-05 17:07 UTC (permalink / raw)
  To: emacs-devel; +Cc: Julien Danjou

Signed-off-by: Julien Danjou <julien@danjou.info>
---

FYI I've signed the copyright assignment papers.

 lisp/ChangeLog            |    4 +
 lisp/net/notifications.el |  174 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 178 insertions(+), 0 deletions(-)
 create mode 100644 lisp/net/notifications.el

diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index a33c43f..378449c 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,7 @@
+2010-06-05  Julien Danjou  <julien@danjou.info>
+
+	* net/notifications.el: New file.
+
 2010-06-04  Juanma Barranquero  <lekktu@gmail.com>

 	* subr.el (directory-sep-char): Move from fileio.c and make a defconst.
diff --git a/lisp/net/notifications.el b/lisp/net/notifications.el
new file mode 100644
index 0000000..aeeea31
--- /dev/null
+++ b/lisp/net/notifications.el
@@ -0,0 +1,174 @@
+;;; notifications.el --- Client interface to desktop notifications.
+
+;; Copyright (C) 2010 Free Software Foundation, Inc.
+
+;; Author: Julien Danjou <julien@danjou.info>
+;; Keywords: comm desktop notifications
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides an implementation of the Desktop Notifications
+;; <http://www.galago-project.org/specs/notification/>.
+
+;; In order to activate this package, you must add the following code
+;; into your .emacs:
+;;
+;;   (require 'notifications)
+
+;;; Code:
+
+;; Pacify byte-compiler.  D-Bus support in the Emacs core can be
+;; disabled with configuration option "--without-dbus".  Declare used
+;; subroutines and variables of `dbus' therefore.
+(declare-function dbus-call-method "dbusbind.c")
+
+(require 'dbus)
+
+(defconst notifications-application-name "Emacs"
+  "Default application name.")
+
+(defconst notifications-service "org.freedesktop.Notifications"
+  "D-Bus notifications service name.")
+
+(defconst notifications-path "/org/freedesktop/Notifications"
+  "D-Bus notifications service path.")
+
+(defconst notifications-interface "org.freedesktop.Notifications"
+  "D-Bus notifications service path.")
+
+(defconst notifications-notify-method "Notify"
+  "D-Bus notifications service path.")
+
+(defconst notifications-close-notification-method "CloseNotification"
+  "D-Bus notifications service path.")
+
+(defun notifications-notify (&rest params)
+  "Send notification via D-Bus using the Freedesktop notification protocol.
+Various PARAMS can be set:
+
+ :title          The notification title.
+ :body           The notification body text.
+ :app-name       The name of the application sending the notification.
+                 Default to `notifications-application-name'.
+ :replaces-id    The notification ID that this notification replaces.
+ :app-icon       The notification icon.
+ :action         A list of actions.
+ :timeout        The timeout time in milliseconds since the display
+                 of the notification at which the notification should
+                 automatically close.
+                 If -1, the notification's expiration time is dependent
+                 on the notification server's settings, and may vary for
+                 the type of notification (default).
+                 If 0, the notification never expires.
+ :urgency        The urgency level.
+                 Either `low', `normal' or `critical'.
+ :category       The type of notification this is.
+ :desktop-entry  This specifies the name of the desktop filename representing
+                 the calling program.
+ :image-data     This is a raw data image format which describes the width,
+                 height, rowstride, has alpha, bits per sample, channels and
+                 image data respectively.
+ :sound-file     The path to a sound file to play when the notification pops up.
+ :suppress-sound Causes the server to suppress playing any sounds, if it has
+                 that ability.
+ :x              Specifies the X location on the screen that the notification
+                 should point to. The \"y\" hint must also be specified.
+ :y              Specifies the Y location on the screen that the notification
+                 should point to. The \"x\" hint must also be specified.
+
+This function returns a notification id, an integer, which can be
+used to manipulate the notification item with
+`notifications-close'."
+  (let ((title (plist-get params :title))
+        (body (plist-get params :body))
+        (app-name (plist-get params :app-name))
+        (replaces-id (plist-get params :replaces-id))
+        (app-icon (plist-get params :app-icon))
+        (action (plist-get params :action))
+        (timeout (plist-get params :timeout))
+        ;; Hints
+        (hints '(:array))
+        (urgency (plist-get params :urgency))
+        (category (plist-get params :category))
+        (desktop-entry (plist-get params :desktop-entry))
+        (image-data (plist-get params :image-data))
+        (sound-file (plist-get params :sound-file))
+        (suppress-sound (plist-get params :suppress-sound))
+        (x (plist-get params :x))
+        (y (plist-get params :y)))
+    ;; Build hints array
+    (when urgency
+      (add-to-list 'hints `(:dict-entry
+                            "urgency"
+                            (:variant :byte ,(case urgency
+                                               ('low 0)
+                                               ('critical 2)
+                                               (t 1)))) t))
+    (when category
+      (add-to-list 'hints `(:dict-entry
+                            "category"
+                            (:variant :string ,category)) t))
+    (when desktop-entry
+      (add-to-list 'hints `(:dict-entry
+                            "desktop-entry"
+                            (:variant :string ,desktop-entry)) t))
+    (when image-data
+      (add-to-list 'hints `(:dict-entry
+                            "image_data"
+                            (:variant :struct ,image-data)) t))
+    (when sound-file
+      (add-to-list 'hints `(:dict-entry
+                            "sound-file"
+                            (:variant :string ,sound-file)) t))
+    (when suppress-sound
+      (add-to-list 'hints `(:dict-entry
+                            "suppress-sound"
+                            (:variant :boolean ,suppress-sound)) t))
+    (when x
+      (add-to-list 'hints `(:dict-entry "x" (:variant :int32 ,x)) t))
+    (when y
+      (add-to-list 'hints `(:dict-entry "y" (:variant :int32 ,y)) t))
+
+    ;; Call Notify method
+    (dbus-call-method :session
+                      notifications-service
+                      notifications-path
+                      notifications-interface
+                      notifications-notify-method
+                      :string (or app-name
+                                  notifications-application-name)
+                      :uint32 (or replaces-id 0)
+                      :string (if app-icon
+                                  (expand-file-name app-icon)
+                                "")
+                      :string (or title "")
+                      :string (or body "")
+                      `(:array ,@action)
+                      hints
+                      :int32 (or timeout -1))))
+
+(defun notifications-close-notification (id)
+  "Close a notification with identifier ID."
+  (dbus-call-method :session
+                    notifications-service
+                    notifications-path
+                    notifications-interface
+                    notifications-close-notification-method
+                    :int32 id))
+
+(provide 'notifications)
-- 
1.7.1




^ permalink raw reply related	[flat|nested] 55+ messages in thread

end of thread, other threads:[~2010-06-14 19:09 UTC | newest]

Thread overview: 55+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-05 17:07 [PATCH] Add notifications.el Julien Danjou
2010-06-07 12:12 ` Michael Albinus
2010-06-07 13:31   ` Stefan Monnier
2010-06-07 15:17   ` Julien Danjou
2010-06-07 15:18     ` Julien Danjou
2010-06-07 15:36     ` Michael Albinus
2010-06-07 15:59       ` Julien Danjou
2010-06-07 22:28     ` Davis Herring
2010-06-08  8:08       ` Julien Danjou
2010-06-08  8:45         ` Julien Danjou
2010-06-08 12:42           ` Michael Albinus
2010-06-08 13:07             ` Julien Danjou
2010-06-10 23:16               ` Jan Moringen
2010-06-11  6:46                 ` Julien Danjou
     [not found]                 ` <3277_1276238795_o5B6kZER023748_87aar22hj1.fsf@keller.adm.naquadah.org>
2010-06-11  7:30                   ` Jan Moringen
2010-06-11  9:15                     ` Julien Danjou
2010-06-11  9:27                       ` Jan Moringen
2010-06-11 10:25                       ` Michael Albinus
2010-06-09  0:37             ` Stefan Monnier
2010-06-09  7:44               ` Michael Albinus
2010-06-09 18:18 ` Tassilo Horn
2010-06-09 18:53   ` Julien Danjou
2010-06-09 19:16     ` Tassilo Horn
2010-06-09 19:47       ` Julien Danjou
2010-06-09 20:10         ` Tassilo Horn
2010-06-09 20:39         ` Stefan Monnier
2010-06-09 20:58           ` Julien Danjou
2010-06-10  0:26             ` Stefan Monnier
2010-06-10  6:33               ` Tassilo Horn
2010-06-10  7:55                 ` Julien Danjou
2010-06-10  8:26                   ` Michael Albinus
2010-06-10  8:43                     ` [PATCH] Passes notification id as argument of on-action and on-close functions Julien Danjou
2010-06-10 13:00                       ` Michael Albinus
2010-06-10 13:08                         ` Julien Danjou
2010-06-10 13:25                           ` Michael Albinus
2010-06-10 15:20                             ` Juri Linkov
2010-06-10 15:45                               ` Michael Albinus
2010-06-10 16:56                                 ` Juri Linkov
2010-06-10 18:41                                   ` Michael Albinus
2010-06-10 18:53                                   ` Stefan Monnier
2010-06-10 20:23                                     ` Juri Linkov
2010-06-11  0:43                                       ` Stefan Monnier
2010-06-11  6:35                                         ` Daniel Pittman
2010-06-11  8:07                                           ` Juri Linkov
2010-06-11 13:20                                           ` Stefan Monnier
2010-06-11  8:06                                         ` Juri Linkov
2010-06-11 13:21                                           ` Stefan Monnier
2010-06-11 14:54                                             ` Chong Yidong
2010-06-11 15:51                                               ` Stefan Monnier
2010-06-11 19:14                                                 ` Juri Linkov
2010-06-12  6:20                                                   ` Dan Nicolaescu
2010-06-12 20:10                                                     ` Juri Linkov
2010-06-12 20:49                                                     ` Stefan Monnier
2010-06-14 15:51                                                       ` Juri Linkov
2010-06-14 19:09                                                         ` Stefan Monnier

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).