#!/usr/bin/python
# -*- coding: utf-8 -*-
import gtk, os, sys
def print_usage():
print "Usage:"
print "PyMenu label:command[:icon] ..."
print "The label:command:icon tuple can appear multiple times."
print "icon is a string identifier of a gtk stock icon. You can, for example, use either 'new' or 'gtk-new'."
exit()
def _generate_callback(command):
"""
Generates a callback for a menu item.
"""
def callback(menuitem):
os.system(command+" &")
exit()
return callback
def _create_normal_menu_item(text):
"""
Internal method; creates standart gtk.MenuItem
"""
item = gtk.MenuItem(text)
return item
def _create_stock_menu_item(text, stock_id):
"""
Internal method; creates a menu item from stock - gtk.ImageMenuItem, but replaces the stock text
"""
if not stock_id.startswith("gtk-"):
stock_id = "gtk-"+stock_id
stock_lookup = gtk.stock_lookup(stock_id)
if not stock_lookup:
print "Warning: Stock_id", stock_id, "not found"
item = gtk.ImageMenuItem(stock_id)
label = item.get_children()[0]
label.set_text(text)
return item
def create_menu_item(entry):
"""
Creates a menu item, with or without a stock icon.
"""
label = entry["label"]
command = entry["command"]
if "icon" in entry:
icon = entry["icon"]
else:
icon = None
item = None
if icon:
item = _create_stock_menu_item(label, icon)
else:
item = _create_normal_menu_item(label)
item.connect("activate", _generate_callback(command))
return item
def parse_args(args):
"""
Parses the command line arguments. Each entry is saved as a dict.
"""
entries = []
for arg in args:
entry = {}
if ":" not in arg:
print "Misformatted argument:", arg
print_usage()
entry_raw = arg.split(':')
if len(entry_raw)!=2 and len(entry_raw)!=3:
print "Misformatted argument:", arg
print_usage()
entry["label"] = entry_raw[0]
entry["command"] = entry_raw[1]
if len(entry_raw)==3:
entry["icon"] = entry_raw[2]
entries.append(entry)
return entries
def create_menu(entries):
menu = gtk.Menu()
for entry in entries:
menu.append(create_menu_item(entry))
menu.connect("deactivate", gtk.main_quit)
menu.show_all()
return menu
if __name__ == "__main__":
if len(sys.argv)==1 or sys.argv[1]=="-h" or sys.argv[1]=="--help":
print_usage()
entries = parse_args(sys.argv[1:])
menu = create_menu(entries)
menu.popup(None, None, None, 0, 0)
gtk.main()