Как обновить значок меню приложений в Ubuntu 12.04?

Как обновить значок меню приложений в Ubuntu 12.04?

После изменения файла рабочего стола в /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)
    

Связанный контент