在修改桌面文件后/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)