Skip to content

Instantly share code, notes, and snippets.

@segphault
Created May 5, 2009 19:54
Show Gist options
  • Save segphault/107156 to your computer and use it in GitHub Desktop.
Save segphault/107156 to your computer and use it in GitHub Desktop.
Experimental UI for the Ubuntu messaging indicator
#!/usr/bin/env python
import gtk, gobject, indicate, dbus, webkit
from xdg.DesktopEntry import DesktopEntry
from mako.template import Template
class IndicatorInspector:
def __init__(self):
self.servers = []
self.listener = indicate.Listener()
self.listener.connect("server-added", self.on_server_added)
def on_server_added(self, listener, server, kind):
self.servers.append(indicate.server_dbus_name(server))
def generate_indicator_html(self):
print self.servers
return Template("""
<%!
import mx.DateTime
def generate_time_string(t):
d = mx.DateTime.gmt() - mx.DateTime.Parser.DateTimeFromString(t)
if d.hours < 1: return "%i m" % d.minutes
else: return "%i h" % d.hours
%>
<%def name="icon(s, size)">
% if "icon" in s:
% if s["icon"].endswith("="):
<img width="${size}" src="data:image/png;base64,${s["icon"]}" />
% else:
<img width="${size}" src="file://${s["icon"]}" />
% endif
% endif
</%def>
<%def name="time(s)" filter="trim">
${generate_time_string(s["time"])}
</%def>
<%def name="text(s)" filter="trim">
${": %s " % s["body"] if "body" in s else ""}
</%def>
<html>
<body>
% for s in iservers:
<h3>${icon(s, 24)}${s["name"]}</h3>
<ul style="margin: 0px; padding: 0px; padding-left: 15px; font-size: 11px">
% for i in s["messages"]:
<li style="display: block; overflow: hidden; white-space: nowrap; text-overflow: ellipsis">
${icon(i, 18)}(${time(i)}) <b>${i["sender"]}</b>${text(i)}
</li>
% endfor
</ul>
% endfor
<!-- < code style="font-size: x-small">${iservers}</code> -->
</body>
</html>""").render(iservers=[
self.get_indicator_properties(id) for id in self.servers])
def get_indicator_properties(self, server_id):
bus = dbus.SessionBus()
server_obj = bus.get_object(server_id, "/org/freedesktop/indicate")
server = dbus.Interface(server_obj, "org.freedesktop.indicator")
desktop_file = DesktopEntry(dbus.Interface(
server_obj, "org.freedesktop.DBus.Properties").Get(
"/org/freedesktop/indicate", "desktop"))
icon_info = gtk.IconTheme().lookup_icon(desktop_file.getIcon(), 24, 0)
return {
"id": server_id,
"name": desktop_file.getName(),
"icon": icon_info.get_filename() if icon_info else None,
"messages": [
dict((prop, server.GetIndicatorProperty(i, prop)) \
for prop in server.GetIndicatorProperties(i)) \
for i in server.GetIndicatorList()]}
w = gtk.Window()
w.resize(500, 500)
w.connect("destroy", gtk.main_quit)
ii = IndicatorInspector()
html = webkit.WebView()
b = gtk.Button("Reload")
def on_btn_click(*a):
html.load_html_string(ii.generate_indicator_html(), "file://")
b.connect("clicked", on_btn_click)
vb = gtk.VBox()
vb.pack_start(b, False)
vb.pack_start(html)
w.add(vb)
w.show_all()
gtk.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment