file isExecutable
Reduce lists iterations
# NOTICE: This script is currently broken as the libpurple DBus # bindings have been removed. # This is a dbus script to show a docklet for Finch. This should work # for any 'compatible' purple client. # By 'compatible', I mean any client that sets and updates the # "unseen-count" data on the conversations. # It allows doing the following things: # - It allows changing status. # - It shows the current status and info about unread messages in # - It can blink on unread IM/Chat messages, and it allows canging # the preference for that. # It requires GTK+ 2.10 or above, since it uses GtkStatusIcon. # Sadrul <sadrul@pidgin.im> from __future__ import absolute_import, division, print_function import os # to get the pkg-config output pygtk.require("2.0") # noqa obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject") purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface") def pack_image_label(menu, image, label): item = gtk.ImageMenuItem(label) img.set_from_stock(image, 1) def activate_primitive_status(item, status): saved = purple.PurpleSavedstatusFindTransientByTypeAndMessage(status, "") saved = purple.PurpleSavedstatusNew("", status) purple.PurpleSavedstatusActivate(saved) def activate_popular_status(item, time): saved = purple.PurpleSavedstatusFindByCreationTime(time) purple.PurpleSavedstatusActivate(saved) def generate_status_menu(menu): item = gtk.MenuItem("Available") item.connect("activate", activate_primitive_status, 2) item = gtk.MenuItem("Away") item.connect("activate", activate_primitive_status, 5) item = gtk.MenuItem("Invisible") item.connect("activate", activate_primitive_status, 4) item = gtk.MenuItem("Offline") item.connect("activate", activate_primitive_status, 1) menu.append(gtk.MenuItem()) popular = purple.PurpleSavedstatusesGetPopular(10) title = purple.PurpleSavedstatusGetTitle(pop).replace('_', '__') item = gtk.MenuItem(title) item.set_data("timestamp", purple.PurpleSavedstatusGetCreationTime(pop)) item.connect("activate", activate_popular_status, purple.PurpleSavedstatusGetCreationTime(pop)) def toggle_pref(item, pref): purple.PurplePrefsSetBool(pref, item.get_active()) def quit_finch(item, null): def close_docklet(item, null): def popup_menu(icon, button, tm, none): # item = gtk.ImageMenuItem(gtk.STOCK_QUIT) # item.connect("activate", quit_finch, None) item = gtk.ImageMenuItem(gtk.STOCK_CLOSE) item.connect("activate", close_docklet, None) menu.append(gtk.MenuItem()) item = gtk.CheckMenuItem("Blink for unread IM") purple.PurplePrefsGetBool("/plugins/dbus/docklet/blink/im")) item.connect("activate", toggle_pref, "/plugins/dbus/docklet/blink/im") item = gtk.CheckMenuItem("Blink for unread Chats") purple.PurplePrefsGetBool("/plugins/dbus/docklet/blink/chat")) item.connect("activate", toggle_pref, "/plugins/dbus/docklet/blink/chat") menu.append(gtk.MenuItem()) # item = pack_image_label(menu, None, "Change Status...") item = gtk.MenuItem("Change Status...") item.set_submenu(submenu) generate_status_menu(submenu) menu.popup(None, None, None, button, tm) def get_status_message(): status = purple.PurpleSavedstatusGetCurrent() msg = purple.PurpleSavedstatusGetMessage(status) text += "(" + status_names[purple.PurpleSavedstatusGetType(status)] + ")" def detect_unread_conversations(): im = purple.PurplePrefsGetBool("/plugins/dbus/docklet/blink/im") chat = purple.PurplePrefsGetBool("/plugins/dbus/docklet/blink/chat") convs = purple.PurpleGetConversations() convs = purple.PurpleGetIms() convs = purple.PurpleGetChats() count = purple.PurpleConversationGetData(conv, "unseen-count") tooltip += "\n%s (%d)" % (purple.PurpleConversationGetName(conv), t.set_from_file(path + "/share/pixmaps/pidgin.png") # "/share/pixmaps/pidgin/tray/22/tray-message.png") tooltip = "\nUnread Messages:" + tooltip # There's going to be some way to expose the client's display name in # 2.1.0. Use that instead of hardcoding Finch here. t.set_tooltip("Finch: " + get_status_message() + tooltip) def conversation_updated(conv, type): detect_unread_conversations() def savedstatus_changed(new, old): # Change the icon for status perhaps? detect_unread_conversations() if not purple.PurplePrefsExists("/plugins/dbus/docklet/blink"): purple.PurplePrefsAddNone("/plugins") purple.PurplePrefsAddNone("/plugins/dbus") purple.PurplePrefsAddNone("/plugins/dbus/docklet") purple.PurplePrefsAddNone("/plugins/dbus/docklet/blink") purple.PurplePrefsAddBool("/plugins/dbus/docklet/blink/im", True) purple.PurplePrefsAddBool("/plugins/dbus/docklet/blink/chat", True) pkg = os.popen("pkg-config --variable=prefix pidgin") path = pkg.readline().rstrip() bus.add_signal_receiver(conversation_updated, dbus_interface="im.pidgin.purple.PurpleInterface", signal_name="ConversationUpdated") bus.add_signal_receiver(savedstatus_changed, dbus_interface="im.pidgin.purple.PurpleInterface", signal_name="SavedstatusChanged") t.connect("popup-menu", popup_menu, None) detect_unread_conversations() dialog = gtk.Dialog("pietray: Error", None, gtk.DIALOG_NO_SEPARATOR | gtk.DIALOG_MODAL, ("Close", gtk.RESPONSE_CLOSE)) dialog.set_resizable(False) error_label = gtk.Label("There was some error. Perhaps a purple client is " dialog.vbox.pack_start(error_label, False, False, 0)