Главная » 2011»Май»2 » Ubuntu 11.04. Скрипт для редактирования контекстного меню значка в панели.
11:08
Ubuntu 11.04. Скрипт для редактирования контекстного меню значка в панели.
Имхо, unity довольно-таки удобен. Но меня сильно выморозило отсутствие аналога places из Gnome2 Если что,я об этом : Можно привести его (редактированием /usr/share/applications/nautilus.desktop) к такому виду : Но редактировать так всё что можно бы изменить не гуд :-) Так что за вечер наваял скрипт на питоне. (код под спойлером)
Code
#!/usr/bin/python #encoding: utf-8
#Вывод сообщения об ошибке с последующим выходом из программы def printerr(message): print(message) exit()
#Получение аргумента командной строки с указанным номером. Если такого нет - выход с указанием ошибки def getArgument(num): try: res = sys.argv[num] except: printerr("Uncorrect parameters") return res
#Запись значения в группу строк вида #[$group] #$value=$new_value def changeINIvalue(lines,group,value,new_value): res = lines toC = len(lines) founded = False i=0 #поиск группы while ((i<toC) and (not founded)): if (lines[i]=="["+group+"]\n"): founded = True i=i+1 if (founded==True): #Если нашли группу - ищем значение для изменения i=i-1 founded=False while ((i<toC) and (not founded)): if len(lines[i])>len(value): if (lines[i][0:len(value)]==value): res[i] = value+"="+new_value founded=True i=i+1 #Выходим с ошибкой, если не нашли значения if not founded: printerr("Not found item '"+value+"'") else: #Выходим с ошибкой, если не нашли группу printerr("Uncorrent file. Group '"+group+"' not found") return res
#Получение значения def getINIvalue(lines,group,item,notExit=False): toC = len(lines) founded = False i = 0 while ((i<toC) and (not founded)): if(lines[i]=="["+group+"]\n"): founded = True i = i+1 if (founded==True): i = i - 1 founded=False while ((i<toC) and (not founded)): if (len(lines[i])>len(item)): if (lines[i][0:len(item)]==item): res=lines[i][len(item)+1:len(lines[i])] founded=True i=i+1 if (not founded): if (not notExit): printerr("Not found item '"+item+"'") else: print("Uncorrent file") return "" return res else: if not notExit: printerr("Uncorrent file. Group '"+group+"' not found") else: print("Uncorrent file.") return ""
#установка указанного значения, если param==param_name def changeINIvalueIfParam(lines,param,param_name,group,name): if (param==param_name): try: value=getArgument(3) except: printerr("Uncorrect parameters") res = changeINIvalue(lines,group,name,value) else: res = lines return res
#Удаление элементов из lines с позиций от rform до rto def removeElements(lines,rfrom,rto): res = [] i = 0 j = len(lines) while (i<j): if (not ((i>=rfrom)and(i<=rto)) ): res.append(lines[i]) i=i+1 return res
#Удаление группы вида #[groupName] #item1=value1 #item2=value2 #... def remove_group(lines,groupName): i=0 toC=len(lines) founded = False while ((i<toC)and(not founded)): if (lines[i]==groupName+"\n"): founded=True i=i+1 s_from=i - 1 s_to = len(lines)-1 founded = False i = i+1 while ((i<toC)and(not founded)): if(lines[i][0:1]=="["): founded=True i=i+1 if (founded==True): s_to = i - 2 res = removeElements(lines,s_from,s_to) return res
#Добавление элемента e_el в o_list на позицию i_pos def addElement(o_list,i_pos,e_el): a1=o_list[0:i_pos] a2=o_list[i_pos:len(o_list)] res=a1+[e_el]+a2 return res
import getpass #Если запуск от рута... if(getpass.getuser()=="root"): import sys
#.desktop файл нужного приложения app=getArgument(1) #Что делать changeParam=getArgument(2)
#Чтение данных try: print("Opening file : '"+app+"'") appf=open(app,"r") print("Reading data") lines=appf.readlines() print("Closing file") appf.close() except: printerr("Error while reading")
print("Changing data") #Меняем значения в desktop entry, если нам указано это new_lines = changeINIvalueIfParam(lines,changeParam,"main-name", "Desktop Entry", "Name") new_lines = changeINIvalueIfParam(lines,changeParam,"generic-name", "Desktop Entry", "GenericName") new_lines = changeINIvalueIfParam(lines,changeParam,"X-Full-Name", "Desktop Entry", "X-GNOME-FullName") new_lines = changeINIvalueIfParam(lines,changeParam,"comment", "Desktop Entry", "Comment") new_lines = changeINIvalueIfParam(lines,changeParam,"exec", "Desktop Entry", "Exec") new_lines = changeINIvalueIfParam(lines,changeParam,"icon", "Desktop Entry", "Icon") new_lines = changeINIvalueIfParam(lines,changeParam,"terminal", "Desktop Entry", "Terminal") new_lines = changeINIvalueIfParam(lines,changeParam,"categories", "Desktop Entry", "Categories") new_lines = changeINIvalueIfParam(lines,changeParam,"startup-notify", "Desktop Entry", "StartupNotify") new_lines = changeINIvalueIfParam(lines,changeParam,"bugzilla", "Desktop Entry", "X-GNOME-Bugzilla-Bugzilla") new_lines = changeINIvalueIfParam(lines,changeParam,"bugzilla-product", "Desktop Entry", "X-GNOME-Bugzilla-Product") new_lines = changeINIvalueIfParam(lines,changeParam,"bugzilla-component", "Desktop Entry", "X-GNOME-Bugzilla-Component") new_lines = changeINIvalueIfParam(lines,changeParam,"gettext-domain", "Desktop Entry", "X-GNOME-Gettext-Domain") if (changeParam=="get-value"): group = getArgument(3) item = getArgument(4) print(getINIvalue(new_lines,group,item)) if (changeParam=="get-group"): group = getArgument(3) i=0 toC=len(new_lines) found=False while((i<toC)and(not found)): if new_lines[i]=="["+group+"]": found=True i=i+1 if found: sfrom=i-1 print("-----------------------------------") print(new_lines[sfrom]) found=False while ((i<toC)and(not found)): if new_lines[i][0:1]=="[": found=True else: print(new_lines[i]) print("-----------------------------------") else: printerr("Not found group '"+group+"'") if (changeParam=="show-all"): print("---------------------------") for el in new_lines: s=el try: s.remove("\n") print(s) except: print(el) print("---------------------------")
if (changeParam=="shortcut-group"): groups = getINIvalue(lines,"Desktop Entry","X-Ayatana-Desktop-Shortcuts",True).split(";") print("Groups:") print(groups) new_lines=lines if (groups==['']): i=0 toC = len(lines) f1=False f2=False while ((i<toC)and( (not f1) or (not f2) )): if (lines[i]=="[Desktop Entry]"): f1=True else: if (f1 and (lines[i][0:1]=="[")): f2=True i=i+1 noGroup=True if (not f2): groupPos=len(new_lines) else: groupsPos = i - 2 else: noGroup=False
print("writing data") try: appf=open(app,"w") for el in new_lines: if(not (el.strip()=="\n")): appf.write(el.strip()+"\n") appf.close() except: printerr("Error while writing")
else: print("This need sudo privilegies. Use 'sudo' or 'su' commands to run it")
Т.е. мы можем использовать его так :
editIcon $filename $param $value если нужно изменить что-то в desktop entry
editIcon $filename get-value $group $item если нужно вывести значение параметра $item в $group
editIcon $filename get-group $group если нужно вывести код всей группы
editIcon $filename show-all код всего файла
editIcon $filename shortcut-group add $groupName $showTitle $exec $showOnlyIn - добавление действия с идентификатором $groupName и текстом $showTitle в контекстное меню значка (будет отображаться в $showOnlyIn и выполнять код $exec
editIcon $filename shortcut-group remove $groupName - удаление действия с идентификатором $groupName
editIcon $filename shortcut-group edit $groupName $parameter $value - изменение значения у $groupName в $parameter на $value
Предположим мы хотим добавить habrahabr.ru в контекстное меню chromium Тогда это будет выглядеть так : sudo editIcon /usr/share/applications/chromium-browser.desktop shortcut-group add "Habrahabr" "Хабрахабр" "chromium-browser http://habrahabr.ru" "Unity"
(перед изменением открепляем значок, потом перезапускаем chromium и закрепляем снова. В тяжелых случаях потребуется перезапуск сеанса). Таким вот образом получил у себя :