修改桌面檔案後/usr/share/applications
,我需要刷新啟動器圖示應用程式選單,以便我的修改顯示出來。為了清楚起見,應該修改的選單是當指標位於啟動器的圖示上時右鍵單擊出現的選單(螢幕左側充滿圖示的大欄)。
最好的答案是一個簡單的命令列。
我沒有使用 ubuntu-2d 並且不想登出/登入。
我知道一些部分解決方案:
unity --replace
重新載入所有內容(視窗裝飾、通知區域...)killall ubuntu-2d-launcher
僅限 ubuntu-2d,但如果存在類似的單行命令以實現統一,那將是一個很好的解決方案。- 登出然後重新登入也可以,但我不能僅僅為了更新選單而丟失所有會話。
- 在 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)