/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
699.2.7 by Andrew Starr-Bochicchio
Fix accidental shebang change in bzr-notify.
1
#!/usr/bin/env python
505.1.3 by Jelmer Vernooij
Move notify icon to a separate script so it's easier to add to startup scripts.
2
3
"""Run the bzr tray icon.
4
5
This is a background program which will pop up a notification on the users
6
screen when a commit occurs.
7
"""
8
9
from bzrlib.plugin import load_plugins
10
load_plugins()
11
722 by Jelmer Vernooij
Fix imports.
12
from bzrlib.plugins.gtk.commands import open_display
505.1.3 by Jelmer Vernooij
Move notify icon to a separate script so it's easier to add to startup scripts.
13
553.1.1 by Jelmer Vernooij
Fix notify import.
14
from bzrlib.plugins.gtk.notify import NotifyPopupMenu
505.1.3 by Jelmer Vernooij
Move notify icon to a separate script so it's easier to add to startup scripts.
15
gtk = open_display()
16
17
import cgi
18
import dbus
19
import dbus.service
625.5.1 by James Westby
Import gobject in bzr-notify, as it is used there to set a timeout.
20
import gobject
505.1.3 by Jelmer Vernooij
Move notify icon to a separate script so it's easier to add to startup scripts.
21
import pynotify
22
from bzrlib.bzrdir import BzrDir
23
from bzrlib.osutils import format_date
24
from bzrlib.transport import get_transport
674.1.1 by Sense Hofstede
* Use Indicator Application rather than GtkStatusIcon
25
26
menu = NotifyPopupMenu()
682 by Jelmer Vernooij
Merge qense's indicator application work, but don't require appindicator to be installed.
27
try:
683.1.1 by Jelmer Vernooij
Fix formatting.
28
    import appindicator
682 by Jelmer Vernooij
Merge qense's indicator application work, but don't require appindicator to be installed.
29
except ImportError:
699.2.6 by Andrew Starr-Bochicchio
Use bzr-panel for gtk.status_icon.
30
    icon = gtk.status_icon_new_from_icon_name("bzr-panel")
683.1.1 by Jelmer Vernooij
Fix formatting.
31
    icon.connect('popup-menu', menu.display)
32
    icon.set_visible(False)
33
    hide_icon = lambda: icon.set_visible(False)
34
    show_icon = lambda: icon.set_visible(True)
682 by Jelmer Vernooij
Merge qense's indicator application work, but don't require appindicator to be installed.
35
else:
683.1.1 by Jelmer Vernooij
Fix formatting.
36
    indicator = appindicator.Indicator ("bzr-gtk-notify",
699.2.8 by Andrew Starr-Bochicchio
Re-merge on trunk, resolving one conflict.
37
        "bzr-panel", appindicator.CATEGORY_OTHER)
683.1.1 by Jelmer Vernooij
Fix formatting.
38
    indicator.set_status (appindicator.STATUS_PASSIVE)
699.2.2 by Andrew Starr-Bochicchio
Use panel icon.
39
    indicator.set_attention_icon("bzr-panel")
683.1.1 by Jelmer Vernooij
Fix formatting.
40
    indicator.set_menu(menu)
41
    hide_icon = lambda: indicator.set_status (appindicator.STATUS_PASSIVE)
42
    show_icon = lambda: indicator.set_status (appindicator.STATUS_ATTENTION)
674.1.1 by Sense Hofstede
* Use Indicator Application rather than GtkStatusIcon
43
505.1.3 by Jelmer Vernooij
Move notify icon to a separate script so it's easier to add to startup scripts.
44
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
683.1.1 by Jelmer Vernooij
Fix formatting.
45
    import dbus.glib
505.1.3 by Jelmer Vernooij
Move notify icon to a separate script so it's easier to add to startup scripts.
46
BROADCAST_INTERFACE = "org.bazaarvcs.plugins.dbus.Broadcast"
47
bus = dbus.SessionBus()
48
49
def catch_branch(revision_id, urls):
683.1.1 by Jelmer Vernooij
Fix formatting.
50
    # TODO: show all the urls, or perhaps choose the 'best'.
51
    url = urls[0]
52
    try:
53
        if isinstance(revision_id, unicode):
54
            revision_id = revision_id.encode('utf8')
55
        transport = get_transport(url)
56
        a_dir = BzrDir.open_from_transport(transport)
57
        branch = a_dir.open_branch()
58
        revno = branch.revision_id_to_revno(revision_id)
59
        revision = branch.repository.get_revision(revision_id)
60
        summary = 'New revision %d in %s' % (revno, url)
61
        body = 'Committer: %s\n' % revision.committer
62
        body += 'Date: %s\n' % format_date(revision.timestamp,
63
            revision.timezone)
64
        body += '\n'
65
        body += revision.message
66
        body = cgi.escape(body)
67
        nw = pynotify.Notification(summary, body)
68
        def start_viz(notification=None, action=None, data=None):
69
            """Start the viz program."""
70
            from bzrlib.plugins.gtk.commands import start_viz_window
71
            pp = start_viz_window(branch, revision_id)
72
            pp.show()
73
        def start_branch(notification=None, action=None, data=None):
74
            """Start a Branch dialog"""
75
            from bzrlib.plugins.gtk.branch import BranchDialog
76
            bd = BranchDialog(remote_path=url)
77
            bd.run()
78
        if "actions" in pynotify.get_server_caps():
79
            nw.add_action("inspect", "Inspect", start_viz, None)
80
            nw.add_action("branch", "Branch", start_branch, None)
81
        show_icon()
82
        gobject.timeout_add(5000, hide_icon)
83
        nw.set_timeout(5000)
84
        nw.show()
85
    except Exception, e:
86
        print e
87
        raise
505.1.3 by Jelmer Vernooij
Move notify icon to a separate script so it's easier to add to startup scripts.
88
bus.add_signal_receiver(catch_branch,
683.1.1 by Jelmer Vernooij
Fix formatting.
89
                        dbus_interface=BROADCAST_INTERFACE,
90
                        signal_name="Revision")
505.1.3 by Jelmer Vernooij
Move notify icon to a separate script so it's easier to add to startup scripts.
91
pynotify.init("bzr-notify")
92
gtk.main()