Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Window list launcher  (gelezen 2114 keer)

Window list launcher
« Gepost op: 2011/06/19, 17:58:15 »
Voor diegene die het handig vinden om een lijst met alle open vensters te hebben, heb ik eens uit interesse hiervoor een script geschreven.

Voorbeeld van een paar open vensters en de window list geopend:


Er zijn 2 bestandjes nodig en het is belangrijk om deze correct te benoemen en plaatsen. Installeer ook het volgende pakketje: gir1.2-wnck-3.0

Het eerste is het .desktop bestand dat windowlistlauncher.desktop moet noemen en in ~/.local/share/applications/ of /usr/share/applications/ moet staan:
[Desktop Entry]
Version=1.0
Name=Windowlist
Comment=View all open windows
Terminal=false
Type=Application
Icon=desktop
Exec=windowlistlauncher -d
Dit bestand kan na het aanmaken naar de launcher versleept worden om vast te zetten.

Het volgende moet windowlistlauncher noemen, uitvoerbaar gemaakt worden en in een map die in PATH staat gezet worden. Meestal is dit /usr/bin of ~/bin
#!/usr/bin/env python

"""
A Unity launcher icon that represents a window list.
"""

__author__ = "Timo Vanwynsberghe"
__version__ = 0.1

import os
import sys
import time
from xdg import BaseDirectory
from gi.repository import Gtk, Gdk, GObject, Unity, Dbusmenu, Wnck


class MainDialog(Gtk.Dialog):
    def __init__(self):
        Gtk.Dialog.__init__(self, "Windowlist launcher")
        self.connect("response", self.on_dialog_response)

        label = Gtk.Label("Nothing to see here for now, please right click on "
                          "the launcher.\n\nPreferences will be added here in "
                          "the future if needed.")
        label.set_justify(Gtk.Justification.CENTER)
        content_area = self.get_content_area()
        content_area.pack_start(label, False, False, 0)
        self.show_all()

    def on_dialog_response(self, dialog, response):
        Gtk.main_quit()


def on_menuitem_activated(menuitem, obj, window):
    #TODO: is this time correct?
    window.activate(time.time())

def on_window_opened(screen, window, quicklist):
    if window.get_window_type() not in (Wnck.WindowType.NORMAL, Wnck.WindowType.DIALOG):
        return
    item = Dbusmenu.Menuitem.new()
    item.connect("item-activated", on_menuitem_activated, window)
    item.property_set(Dbusmenu.MENUITEM_PROP_LABEL, window.get_name())
    item.property_set_bool(Dbusmenu.MENUITEM_PROP_VISIBLE, True)
    quicklist.child_append(item)
    window.set_data("menuitem", item)
    window.connect("name-changed", on_window_name_changed, item)

def on_window_closed(screen, window):
    menuitem = window.get_data("menuitem")
    if menuitem is None: return
    parent = menuitem.get_parent()
    parent.child_delete(menuitem)

def on_window_name_changed(window, item):
    item.property_set(Dbusmenu.MENUITEM_PROP_LABEL, window.get_name())

def get_desktop_file():
    dfile = None
    dfile_dirs = [os.path.join(d, 'applications') for d in BaseDirectory.xdg_data_dirs]
    for dfile_dir in dfile_dirs:
        if not os.path.isdir(dfile_dir): continue
        checking = os.path.join(dfile_dir, 'windowlistlauncher.desktop')
        if os.path.exists(checking):
            dfile = checking
            break
    return dfile

def setup():
    dfile = get_desktop_file()
    if dfile is None:
        raise SystemExit("Could not find the correct .desktop file!")

    quicklist = Dbusmenu.Menuitem.new()
    launcher = Unity.LauncherEntry.get_for_desktop_file(dfile)
    launcher.set_property("quicklist", quicklist)

    screen = Wnck.Screen.get_default()
    screen.connect("window-opened", on_window_opened, quicklist)
    screen.connect("window-closed", on_window_closed)

if __name__ == '__main__':
    if len(sys.argv) > 1 and sys.argv[1] == '-d':
        dialog = MainDialog()
        Gtk.main()
    else:
        setup()
        loop = GObject.MainLoop()
        try:
            loop.run()
        except KeyboardInterrupt:
            loop.quit()
Voeg dit script daarna toe aan de opstarttoepassingen.

Hierna even afmelden zodat het script geladen kan worden en alle geopende vensters zouden nu zichtbaar moeten zijn.
Dit is nog maar een begin en ik heb nog enkele plannen, zoals:
 - een beter icoontje
 - groeperen per applicatie
 - groeperen per werkblad
 - vierkante haakjes plaatsen bij een geminimaliseerd venster
 - maximum breedte voor de labels
 - applicatie naam toevoegen (indien niet aanwezig)
 - een voorkeuren venster voor het bovenstaande

Offline Timo

  • Forumteam
    • timo.diedering
Re: Window list launcher
« Reactie #1 Gepost op: 2011/06/19, 18:03:44 »
Ziet er goed uit, ga ik eens (wanneer ik tijd heb) proberen! :)