Created
May 5, 2009 19:54
-
-
Save segphault/107156 to your computer and use it in GitHub Desktop.
Experimental UI for the Ubuntu messaging indicator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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