mirror of
				https://github.com/wting/autojump
				synced 2025-06-13 12:54:07 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			210 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python
 | 
						|
 | 
						|
import subprocess
 | 
						|
import cPickle
 | 
						|
import os.path
 | 
						|
import os
 | 
						|
import sys
 | 
						|
import pygtk
 | 
						|
pygtk.require('2.0')
 | 
						|
import gtk
 | 
						|
 | 
						|
defaults={}
 | 
						|
actions={}
 | 
						|
 | 
						|
#decorator truff
 | 
						|
def action(validator,name=None):
 | 
						|
    if name is None:
 | 
						|
        def wrapper(action):
 | 
						|
            actions[action.__name__]=(action,validator)
 | 
						|
    else:
 | 
						|
        def wrapper(action):
 | 
						|
            actions[name]=(action,validator)
 | 
						|
    return wrapper
 | 
						|
 | 
						|
#validator helper
 | 
						|
def has_child_dir(dirname,recursion=0):
 | 
						|
    def wrapper(path):
 | 
						|
        k=recursion
 | 
						|
        ii=""
 | 
						|
        while k>=0:
 | 
						|
            if os.path.isdir(os.path.join(path,ii,dirname)): return True
 | 
						|
            k-=1
 | 
						|
            ii=os.path.join("..",ii)
 | 
						|
        return False
 | 
						|
    return wrapper
 | 
						|
 | 
						|
 | 
						|
def has_child_file(filename):
 | 
						|
    def wrapper(path):
 | 
						|
        return os.path.isfile(os.path.join(path,filename))
 | 
						|
    return wrapper
 | 
						|
 | 
						|
#do the work
 | 
						|
def load_paths(filename="~/.autojump_py",maxpath=10):
 | 
						|
    dic_file=os.path.expanduser(filename)
 | 
						|
 | 
						|
    try:
 | 
						|
        aj_file=open(dic_file)
 | 
						|
        path_dict=cPickle.load(aj_file)
 | 
						|
        aj_file.close()
 | 
						|
    except IOError:
 | 
						|
        pass
 | 
						|
 | 
						|
    path_dict=path_dict.items()
 | 
						|
    path_dict.sort(key=lambda x: x[1],reverse=True)
 | 
						|
 | 
						|
    return [path for path,score in path_dict[:maxpath]]
 | 
						|
 | 
						|
def load_defaults(filename="~/.jumpapplet_py"):
 | 
						|
    print "loading settings"
 | 
						|
    global defaults
 | 
						|
    dic_file=os.path.expanduser(filename)
 | 
						|
 | 
						|
    try:
 | 
						|
        aj_file=open(dic_file,'r')
 | 
						|
        defaults=cPickle.load(aj_file)
 | 
						|
        aj_file.close()
 | 
						|
    except IOError:
 | 
						|
        print "no config file"
 | 
						|
        pass
 | 
						|
 | 
						|
    if not "terminal" in defaults: defaults["terminal"]="gnome-terminal"
 | 
						|
    if not "navigator" in defaults: defaults["navigator"]="nautilus"
 | 
						|
 | 
						|
    create_actions()
 | 
						|
 | 
						|
def save_defaults(filename="~/.jumpapplet_py"):
 | 
						|
    print "saving settings"
 | 
						|
    dic_file=os.path.expanduser(filename)
 | 
						|
 | 
						|
    aj_file=open(dic_file,'w')
 | 
						|
    cPickle.dump(defaults,aj_file)
 | 
						|
    aj_file.close()
 | 
						|
 | 
						|
 | 
						|
def get_actions(path):
 | 
						|
    return [(name,action) for name,(action,validator) in actions.items() if validator(path)]
 | 
						|
 | 
						|
def popup(sender,button,activation):
 | 
						|
    paths=load_paths()
 | 
						|
 | 
						|
    menu=gtk.Menu()
 | 
						|
    for path in paths:
 | 
						|
        actions=get_actions(path)
 | 
						|
        if not actions: continue
 | 
						|
 | 
						|
        item=gtk.MenuItem(path)
 | 
						|
        submenu=gtk.Menu()
 | 
						|
        item.set_submenu(submenu)
 | 
						|
        for name,action in actions:
 | 
						|
            subitem=gtk.MenuItem(name)
 | 
						|
            subitem.connect("activate",action,path)
 | 
						|
            submenu.append(subitem)
 | 
						|
        menu.append(item)
 | 
						|
 | 
						|
    menu.append(gtk.SeparatorMenuItem())
 | 
						|
    
 | 
						|
    item=gtk.MenuItem("settings")
 | 
						|
    item.connect("activate",settings)
 | 
						|
    menu.append(item)
 | 
						|
    item=gtk.MenuItem("quit")
 | 
						|
    item.connect("activate",quit)
 | 
						|
    menu.append(item)
 | 
						|
 | 
						|
    menu.show_all()
 | 
						|
    menu.popup(None,None,gtk.status_icon_position_menu,button,activation,sender)
 | 
						|
 | 
						|
def settings(sender):
 | 
						|
    window=gtk.Window(gtk.WINDOW_TOPLEVEL)
 | 
						|
    window.set_title("jump applet settings")
 | 
						|
 | 
						|
    vbox=gtk.VBox()
 | 
						|
    window.add(vbox)
 | 
						|
    def add_setting(name):
 | 
						|
        label=gtk.Label("%10s: " %name)
 | 
						|
        entry=gtk.Entry()
 | 
						|
        if name in defaults: entry.set_text(defaults[name])
 | 
						|
 | 
						|
        hbox=gtk.HBox()
 | 
						|
        hbox.add(label)
 | 
						|
        hbox.add(entry)
 | 
						|
        vbox.add(hbox)
 | 
						|
        return (name,entry)
 | 
						|
 | 
						|
    entries=[]
 | 
						|
    entries.append(add_setting("terminal"))
 | 
						|
    entries.append(add_setting("navigator"))
 | 
						|
    button=gtk.Button("save")
 | 
						|
    button.connect("clicked",save_settings,entries,window)
 | 
						|
    vbox.add(button)
 | 
						|
 | 
						|
    window.show_all();
 | 
						|
 | 
						|
def save_settings(sender,entries,window):
 | 
						|
    window.hide_all()
 | 
						|
    global defaults
 | 
						|
    for name,entry in entries:
 | 
						|
        defaults[name]=entry.get_text()
 | 
						|
 | 
						|
    save_defaults()
 | 
						|
    create_actions()
 | 
						|
        
 | 
						|
 | 
						|
def init():
 | 
						|
    load_defaults()
 | 
						|
    if os.path.isfile("icon.png"): icon=gtk.status_icon_new_from_file("icon.png")
 | 
						|
    elif os.path.isfile("/usr/share/autojump/icon.png"): icon=gtk.status_icon_new_from_file("/usr/share/autojump/icon.png")
 | 
						|
    else: icon=gtk.status_icon_new_from_icon_name("help")
 | 
						|
    icon.set_visible(True)
 | 
						|
    icon.connect("popup-menu",popup)
 | 
						|
 | 
						|
def quit(sender):
 | 
						|
    gtk.main_quit()
 | 
						|
 | 
						|
######################################################
 | 
						|
#insert other actions here using the action decorator#
 | 
						|
######################################################
 | 
						|
def create_actions():
 | 
						|
    global actions
 | 
						|
    actions={}
 | 
						|
 | 
						|
    @action(has_child_dir(".git",recursion=3))
 | 
						|
    def gitk(sender,path):
 | 
						|
        if not os.fork():
 | 
						|
            os.chdir(path)
 | 
						|
            subprocess.Popen(['gitk']).wait()
 | 
						|
            sys.exit()
 | 
						|
 | 
						|
    @action(has_child_file("CMakeCache.txt"),"configure")
 | 
						|
    def cmake(sender,path):
 | 
						|
        if not os.fork():
 | 
						|
            os.chdir(path)
 | 
						|
            subprocess.Popen(['cmake-gui','.']).wait()
 | 
						|
            sys.exit()
 | 
						|
 | 
						|
    @action(os.path.isdir)
 | 
						|
    def terminal(sender,path):
 | 
						|
        print "launch terminal '%s'" % defaults["terminal"]
 | 
						|
        if not os.fork():
 | 
						|
            try:
 | 
						|
                os.chdir(path)
 | 
						|
                subprocess.Popen([defaults["terminal"]]).wait()
 | 
						|
            except OSError:
 | 
						|
                pass
 | 
						|
            sys.exit()
 | 
						|
 | 
						|
    @action(os.path.isdir)
 | 
						|
    def navigator(sender,path):
 | 
						|
        print "launch navigator '%s'" % defaults["navigator"]
 | 
						|
        if not os.fork():
 | 
						|
            try:
 | 
						|
                subprocess.Popen([defaults["navigator"],path]).wait()
 | 
						|
            except OSError:
 | 
						|
                pass
 | 
						|
            sys.exit()
 | 
						|
 | 
						|
if __name__=='__main__':
 | 
						|
    init()
 | 
						|
    gtk.main()
 |