All pastes #409930 Raw Edit

Anonymous

public text v1 · immutable
#409930 ·published 2007-03-26 00:13 UTC
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()