10

After modifying a desktop file in /usr/share/applications, I need to refresh the launcher icon application menu so that my modification shows up. For the sake of clarity, the menu that should get modified is the one that appears with a right click when the pointer is on an icon of the launcher (the big bar full of icon on the left side of the screen).

Best answer would be a simple command line.

I am not using ubuntu-2d and I don't want to logout/login.

I'm aware of some partial solution:

  • unity --replace reloads everything (window decoration, notification area, ...)
  • killall ubuntu-2d-launcher is ubuntu-2d only, but if a similar one-line command exists for unity, that would be a good solution.
  • logging out then logging back in works also, but I can't afford loosing all my session just to update the menu.
  • on ubuntu 14.04 I don't have this issue: any changes made to "*.desktop" files seems to be repercuted live.

Any suggestions ? Is there a way thanks to ccsm ?

3
  • Hi @vaab, I have a dekstop file and i change the icon of it by editing the path inside the .desktop file. Was the accepted solution what you went with? unity --replace works? I dont mind the reload of everything.
    – Noitidart
    Feb 2, 2015 at 9:18
  • Confirmed unity --replace works in ubuntu 16.04 but will not reload the heavy applications like Chrome, Thunderbirds...
    – PhatHV
    Oct 10, 2016 at 2:14
  • @PhatHV: oh sorry, it doesn't reload any application, only unity is reloaded, but it manages many different aspect of the display so every displayed element will be refreshed, not any application gets reloaded actually.
    – vaab
    Oct 12, 2016 at 18:27

1 Answer 1

8

The most elegant way is to "restart" the icon; to remove the icon from its position in the launcher and replace it on the same position. The script below does the job. It is in python2, since 12.04 does not come with python3 by default. However, it can be used in python3 as well, only change the shebang in that case. The script can also be useful (on later Ubuntu versions as well) to immediately apply a changed icon for example.

You can simply use it by calling the script, with the edited desktop file as an argument (see further below).

Note: in 12.04, if a refreshed icon represents a running application, the application in question will crash, as described in this question, so if you use it, make sure the application is not running. In 14.04, the icon will simply not refresh in case of a running application.

The script

#!/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)

How to use it

  • Copy the script above into an empty file and safe it as refresh.py
  • For convenience reasons, make it executable
  • Refresh the icon by the command:

    /path/to/script/refresh.py name_of_edited_desktopfile (e.g. 'firefox.desktop')
    

If you really want to make it smooth

  • Make the script executable, remove the .py extension, save it in ~/bin. After log out/in, you can run it by the command:

    refresh firefox.desktop (as an example)
    
1

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .