1 # -*- coding: utf-8 -*-
7 # lists to store information for cleanup in the shutdown script
8 mainwindow_merge_ids = []
9 mainwindow_actions = []
12 # function definitions
14 def add_python_documentation_menu_item():
15 # Adds a Help -> Python API documentation menu item
17 # callback for "Python API documentation" action
18 import os, tempfile, subprocess, pydoc
19 working_directory = os.getcwd() # store current working directory
20 os.chdir(tempfile.gettempdir()) # switch to a temporary directory
21 pydoc.writedoc(clawsmail) # write out API documentation to $TEMP/clawsmail.html
22 subprocess.Popen(["xdg-open", "clawsmail.html"]) # start html viewer in the background
23 os.chdir(working_directory) # switch back to original working directory
25 global mainwindow_merge_ids
26 global mainwindow_actions
28 # create "Python API documentation" menu item
29 group = clawsmail.get_mainwindow_action_group()
30 ui_manager = clawsmail.get_mainwindow_ui_manager()
31 action = gtk.Action("pydoc", "Python API documentation", None, None)
32 action.connect("activate", pydoc_cb)
33 group.add_action(action)
34 merge_id = ui_manager.new_merge_id()
35 ui_manager.add_ui(merge_id, "/Menu/Help", "pydoc", "pydoc", gtk.UI_MANAGER_MENUITEM, True)
36 mainwindow_merge_ids.append(merge_id)
37 mainwindow_actions.append(action)
39 def add_mark_thread_read_menu_item():
40 # Adds an Edit -> Mark thread as read menu item
41 def thread_read_cb(action):
42 # callback for "Mark thread as read" action
43 selected_messages = clawsmail.get_summaryview_selected_message_list()
44 group = clawsmail.get_mainwindow_action_group()
45 group.get_action("Edit/SelectThread").activate()
46 group.get_action("Message/Mark/MarkRead").activate()
47 clawsmail.summaryview_select_messages(selected_messages)
49 global mainwindow_merge_ids
50 global mainwindow_actions
52 # create "Mark thread read" menu item
53 group = clawsmail.get_mainwindow_action_group()
54 ui_manager = clawsmail.get_mainwindow_ui_manager()
55 action = gtk.Action("ThreadRead", "Mark thread as read", None, None)
56 action.connect("activate", thread_read_cb)
57 group.add_action_with_accel(action, None)
58 merge_id = ui_manager.new_merge_id()
59 ui_manager.add_ui(merge_id, "/Menu/Edit", "ThreadRead", "ThreadRead", gtk.UI_MANAGER_MENUITEM, False)
60 mainwindow_merge_ids.append(merge_id)
61 mainwindow_actions.append(action)
63 def add_dbus_interface():
64 # exports an interface to Claws Mail on the session D-Bus
66 # Example invokation to trigger an update of the summary view from the command line:
67 # dbus-send --session --type=method_call --dest=org.ClawsMail.PythonPlugin /org/ClawsMail/PythonPlugin org.ClawsMail.PythonPlugin.MainWindow.TriggerGtkAction string:'View/UpdateSummary'
71 from dbus.mainloop.glib import DBusGMainLoop
73 print 'Cannot setup D-Bus interface: D-Bus Python bindings not available.'
76 class ClawsMailService(dbus.service.Object):
77 @dbus.service.method("org.ClawsMail.PythonPlugin.MainWindow", in_signature='s', out_signature='')
78 def TriggerGtkAction(self, action_path):
79 action = clawsmail.get_mainwindow_action_group().get_action(action_path)
83 print 'No such action:', action_path
85 loop = DBusGMainLoop(set_as_default=True)
86 session_bus = dbus.SessionBus()
87 name = dbus.service.BusName("org.ClawsMail.PythonPlugin", session_bus)
88 object = ClawsMailService(session_bus, '/org/ClawsMail/PythonPlugin')
91 # call the functions that have been defined above, or comment the functions that you want to omit
92 add_python_documentation_menu_item()
93 add_mark_thread_read_menu_item()
94 dbus_interface = add_dbus_interface()