#!/usr/bin/env python icon_size = 24; import sys try: import pygtk pygtk.require("2.0") except: pass try: import gtk import gtk.glade except: sys.exit(1) import sys import os from threading import Thread import xdg.Menu import xdg.DesktopEntry import xdg.IconTheme class pyRunner: """This is the PyWine application""" def __init__(self): #Set the Glade file self.gladefile = "runner.glade" self.wTree = gtk.glade.XML(self.gladefile, "mainWindow") #Create our dictionay and connect it dic = { "on_mainWindow_destroy" : gtk.main_quit, "on_entry1_changed" : self.update, "on_entry1_activate" : self.run, "on_programlist_row_activated" : self.run_row } self.wTree.signal_autoconnect(dic) #Get the entry from the widget Tree self.entry = self.wTree.get_widget("entry1") #Get the treeView from the widget Tree self.runnerView = self.wTree.get_widget("programlist") #Add all of the List Columns to the wineView column = gtk.TreeViewColumn("Icon", gtk.CellRendererPixbuf(), pixbuf=0) column.set_resizable(True) column.set_sort_column_id(0) self.runnerView.append_column(column) #Add all of the List Columns to the wineView column = gtk.TreeViewColumn("Name", gtk.CellRendererText(), text=1) column.set_resizable(True) column.set_sort_column_id(1) self.runnerView.append_column(column) #Create the listStore Model to use with the wineView self.runnerList = gtk.ListStore(gtk.gdk.Pixbuf, str, str) #Attache the model to the treeView self.runnerView.set_model(self.runnerList) def setList(self, name): self.runnerList.clear() x = 0 for items in database.programs: if name.lower() == items['name'][:len(name)].lower(): if items['icon'] != None: img = gtk.gdk.pixbuf_new_from_file(items['icon']) img = img.scale_simple(icon_size,icon_size, gtk.gdk.INTERP_BILINEAR) else: img = None self.runnerList.append( [ img, items['name'], items['exec'] ] ) x = x+1 if x > 10: break self.runnerView.get_selection().select_path((0)) def run(self, entry): (model, iter) = self.runnerView.get_selection().get_selected() run = model.get_value(iter, 2) name = model.get_value(iter, 1) gtk.main_quit() run = run.replace("%U",self.entry.get_text()[len(name):]); print run os.system(run) def run_row(self,bla,blah,blaah): self.run(self) def update(self, entry): self.setList(entry.get_text()) class pyDatabase: """This is the class holding the applications""" def __init__(self): #Thread.__init__(self) self.programs = [] def run(self): print 'retrieving menus started' self.parse_menu(xdg.Menu.parse()) self.programs.sort(self.sort_menu) print 'retrieving menus done' def parse_menu(self, menu, depth = 0): for entry in menu.getEntries(): if isinstance(entry, xdg.Menu.Menu): self.parse_menu(entry, depth) elif isinstance(entry, xdg.Menu.MenuEntry): self.programs.append({ 'name':entry.DesktopEntry.getName().encode("ascii", 'ignore'), 'exec':entry.DesktopEntry.getExec(), 'icon':xdg.IconTheme.getIconPath(entry.DesktopEntry.getIcon(),icon_size), 'pressed':0 }) def sort_menu(self,x, y): if x['pressed']>y['pressed']: return 1 elif x['pressed']==y['pressed']: if x['name']>y['name']: return 1 elif x['name']==y['name']: return 0 else: # x