[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] Add notifications.el
From: |
Julien Danjou |
Subject: |
[PATCH] Add notifications.el |
Date: |
Sat, 5 Jun 2010 19:07:37 +0200 |
Signed-off-by: Julien Danjou <address@hidden>
---
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 <address@hidden>
+
+ * net/notifications.el: New file.
+
2010-06-04 Juanma Barranquero <address@hidden>
* 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 <address@hidden>
+;; 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
- [PATCH] Add notifications.el,
Julien Danjou <=
- Re: [PATCH] Add notifications.el, Michael Albinus, 2010/06/07
- Re: [PATCH] Add notifications.el, Stefan Monnier, 2010/06/07
- Re: [PATCH] Add notifications.el, Julien Danjou, 2010/06/07
- [PATCH] Add notifications.el, Julien Danjou, 2010/06/07
- Re: [PATCH] Add notifications.el, Davis Herring, 2010/06/07
- Re: [PATCH] Add notifications.el, Julien Danjou, 2010/06/08
- [PATCH] Add notifications.el, Julien Danjou, 2010/06/08
- Re: [PATCH] Add notifications.el, Michael Albinus, 2010/06/08