Desktop Notifications Spec 0.3
Mike Hearn
m.hearn at signal.QinetiQ.com
Thu Sep 16 12:53:13 EEST 2004
Christian Hammond wrote:
> Hey everyone.
>
> Mike Hearn and I are announcing version 0.3 of the desktop
> notifications spec today. We're hoping for some discussion on it, as
> some details will still need to be worked out. For the most part,
> though, we feel this is nearly ready for use. Any implementations
> using it now shouldn't have to change a whole lot by the time we have
> the final draft.
Yep. There are a couple of known issues with this version of the spec,
based on experience gained while implementing it (which is why it's good
to have a reference implementation :). I'll list them in a moment.
> We are not providing reference implementations at this time, as Mike
> is working on those but is for the most part without a network
> connection for the next couple of weeks.
To be more accurate I only have web and email access at work. Next
weekend I'm visiting relatives so I have to wait to check in the work
I've got.
The current reference implementation (on my laptop) has the following
attributes:
- The server is written in a simplified form of C++, with multiple
backends possible via inheritence. Right now there are only two, a
super-simple console backend (just prints the notification really)
and a GTK+ based backend that vaguely resembles the mockup made by
tigert here:
http://nat.org/2004/september/gnome-notification-timeout-colorshade-anim.gif
- The client library is written as a glib/c library. It's quite simple
though, Qt/KDE bindings to the protocol would take perhaps an hour to
knock up :) It's done this way because these are the technologies that
Christian and I happen to be familiar with. Neither of us are GNOME
developers.
It contains some unit tests, and a notify-send command which lets you
send simple notifications from shell scripts. You *can* use dbus-send
but the actual protocol isn't really designed to be used without some
kind of thin wrapper.
- It supports most of the spec, including:
- All the basics needed to actually display a notification
- Static images
- Actions, represented as hyperlinks a la the mockup in the GTK+
backend
- Basic layout
- Simple markup courtesy of Pango
Things left to implement are:
- Animated images
- Full markup support
- Visual representation of urgency levels
- Animations/slide ins/etc. Right now they just appear.
- Positioning the notifications so they don't overlap the panels.
KDE has some code for this in a generic NETWM class we may steal :)
- Currently doesn't do anything with app name/icon. Not really
essential
- Obviously it's not finished. I'm hoping to have at least animated
images and urgency levels implemented before I head back to
university. At that point it'll probably be up to other people to
fill out the rest at least for a bit. That's OK though. Hacking on
this is fun, I'm sure there will be volunteers :)
- It's designed with future, different presentational styles in mind.
For instance you could subclass the GtkPopupNotifier class again
and add code to use X compositing for extra eye candy, or you could
have a QtPopupNotifier, or you could have a ticker-tape type
backend that integrates into your desktop as a panel applet, or
MacOS X style "bezels". These are coloured, translucent rounded
rectangles which appear in the middle of the screen to grab your
attention.
No matter what you do, you can build on the reference implementation
to reuse the DBUS connection code, [de]marshalling code, error
handling code, layout code and so on.
> The specification is currently available at:
>
> http://galago.sourceforge.net/notification-spec/
>
> We are hoping that applications will start experimentally using the
> specification so that real-world tests can be done.
Right. At some point in the future, once it's been integrated with some
real world apps experimentally and people are happy with the spec, the
plan is to freeze the protocol and libnotify API then not break
backwards compatibility from that point forward.
Here are some of the known issues with version 0.3 of the specification:
- Having expiry times given as seconds since the epoch allows for
accurate timing (for countdowns and such) but suffers a nasty race
condition. The time taken to page in the server from disk, construct
the notification GUI, and perhaps load the given image from the icon
theme is not zero, and actually on my laptop (600mhz with 128mb of
ram!) this can sometimes take several seconds. If your notification
is set to expire in several seconds .... yep, you guessed it. It won't
appear.
- Actions should perhaps not be optional. If your program is relying
on feedback from the notification it might cause some pain to be
able to do without it.
On the other hand, making a notification server a hard dependency of
your application is probably a bad idea anyway. There's no guarantee
the user will have it set up and running.
- The "backwards compatibility" section originally talked about KNotify.
However, in recent discussions on this list it became clear that I
had misunderstood the purpose and design of KNotify, and they weren't
really similar systems at all.
I think there is at least one KDE hacker interested in implementing
this spec already, though I don't know their name. But, the plan would
be to simply make it an additional part of the KNotify server. So,
KDE apps would continue to use KNotify but KDE would still accept
notifications compliant with this specification.
That leaves the question of what the backwards compatibility section
is doing there. Not sure :)
- Should markup be a required feature? If not, should it be stripped
client side or server side? No strong feelings either way on this
but currently neither the client lib nor server in the reference
implementation do anything with markup.
- The "FOO or NIL" idiom used in the protocol may not be something
DBUS and/or bindings are really designed for .... not sure.
- The spec doesn't really address error handling in any meaningful
way. I've started putting error handling into the reference server,
you can throw exceptions from most points and they'll be converted
into DBUS error responses. But this should probably be a part of the
spec rather than just a quirk of the ref impl.
Examples of errors might be:
* Image specified doesn't exist
* Markup doesn't parse
* Binary data provided for image isn't a recognised type
* Protocol error
- The protocol doesn't currently let you specify the primary frame
for animations (is this overkill? do people want animated
images?) even though the spec talks about it.
- Do we *really* want more tags than just bold, italic, underline and
hyperlink?
- If you embed an image directly into the notification it has to be
a PNG file. Do we care enough about the resolution independent
desktop to allow this to be an SVG file as well? You can already
specify SVG files via the icon theme support, so does it make
sense to let you stream it directly also?
- Do we need to specify UTF-8 encoding for strings or do we get this
for free as part of using DBUS?
thanks -mike
More information about the xdg
mailing list