rendered paste body#!/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<y
return -1
else: # x<y
return -1
if __name__ == "__main__":
wine = pyRunner()
database = pyDatabase()
database.start()
wine.setList("")
gtk.main()