После изменения файла рабочего стола в /usr/share/applications
мне нужно обновить меню приложения значка запуска, чтобы отобразилась моя модификация. Для ясности, меню, которое должно быть изменено, — это то, которое появляется при щелчке правой кнопкой мыши, когда указатель находится на значке запуска (большая полоса, полная значков, в левой части экрана).
Лучшим ответом будет простая командная строка.
Я не использую Ubuntu-2D и не хочу выходить из системы/входить в нее.
Мне известно о некотором частичном решении:
unity --replace
перезагружает все (оформление окна, область уведомлений, ...)killall ubuntu-2d-launcher
только для Ubuntu-2D, но если бы существовала похожая однострочная команда для Unity, это было бы хорошим решением.- Выход из системы и повторный вход в систему тоже работает, но я не могу позволить себе потерять всю сессию только ради обновления меню.
- в Ubuntu 14.04 у меня такой проблемы нет: любые изменения, внесенные в файлы «*.desktop», по-видимому, воспроизводятся в реальном времени.
Есть предложения? Есть ли способ благодаря ccsm?
решение1
Самый элегантный способ — «перезапустить» значок; удалить значок с его позиции в панели запуска и заменить его на ту же позицию. Скрипт ниже делает эту работу. Он в python2, так как 12.04 не поставляется с python3 по умолчанию. Однако его можно использовать и в python3, только в этом случае измените shebang. Скрипт также может быть полезен (также и в более поздних версиях Ubuntu), например, для немедленного применения измененного значка.
Вы можете просто использовать его, вызвав скрипт, указав в качестве аргумента отредактированный файл рабочего стола (см. далее).
Примечание: в 12.04, если обновленный значок представляет собойбегприложение, рассматриваемое приложение выйдет из строя, как описано вэтот вопрос, поэтому если вы его используете, убедитесь, что приложение не запущено. В 14.04 значок просто не будет обновляться в случае запущенного приложения.
Сценарий
#!/usr/bin/env python
import subprocess
import time
import sys
desktopfile = sys.argv[-1]
def read_currentlauncher():
# reads the current launcher contents
get_launcheritems = subprocess.Popen([
"gsettings", "get", "com.canonical.Unity.Launcher", "favorites"
], stdout=subprocess.PIPE)
return get_launcheritems.communicate()[0].decode("utf-8")
def set_launcher(llist):
# sets a defined unity launcher list
current_launcher = str(llist).replace(", ", ",")
subprocess.Popen([
"gsettings", "set", "com.canonical.Unity.Launcher", "favorites",
current_launcher,
])
def refresh_icon(desktopfile):
current_launcher = read_currentlauncher()
current_launcher_temp = eval(current_launcher)
item = [item for item in current_launcher_temp if desktopfile in item][0]
index = current_launcher_temp.index(item)
current_launcher_temp.pop(index)
set_launcher(current_launcher_temp)
time.sleep(2)
set_launcher(current_launcher)
refresh_icon(desktopfile)
Как это использовать
- Скопируйте приведенный выше скрипт в пустой файл и сохраните его как
refresh.py
- Для удобства сделайте его исполняемым.
Обновите иконку командой:
/path/to/script/refresh.py name_of_edited_desktopfile (e.g. 'firefox.desktop')
Если вы действительно хотите сделать это гладко
Сделайте скрипт исполняемым, удалите
.py
расширение, сохраните его в~/bin
. После выхода/входа из системы вы можете запустить его командой:refresh firefox.desktop (as an example)