是否可以更改指示器应用程序中图标的顺序?

有没有办法改变指示器小程序中显示的图标顺序?我安装了Tomboy指示器、天气指示器、剪贴板管理器指示器、Ubuntu One和Dropbox指示器,还有一个电池状态指示器,除了经典的消息指示器和声音菜单指示器。我的指示器小程序有点乱,如果能排序图标就好了...

1不是一个答案,但在KDE(Kubuntu)下,我可以在桌面和面板上放置或移除几乎任何东西,包括指示器。 - Joe
4个回答

系统指标是按照设计固定的顺序排列的。虽然你可能不喜欢这个顺序,但通过固定的顺序可以更容易地提供支持(我们可以无休止地争论顺序)。应用程序指标的工作方式略有不同,它们被设计成具有默认顺序,但应用程序可以调整以保持连贯性。例如,如果一个应用程序希望将两个指标放在一起。
由于这种系统可能导致应用程序开发者滥用的情况,系统中设置了一组覆盖功能。首先是系统级别的覆盖,这样一旦发行版发现存在滥用的应用程序,就可以为所有用户修复。它位于:
   /usr/share/indicator-application/ordering-override.keyfile

你可以在那里放置任何状态通知器ID,并为其指定一个新的排序索引,这将成为该应用程序的新索引。还有一个每个用户的覆盖文件,可以存在于你的主目录中的位置:
  ~/.local/share/indicators/application/ordering-override.keyfile

希望这能帮助你按照自己的喜好调整面板!

我拿到了第一个文件中列出的系统指示器。但是我没有~/.local/share/indicators目录。求助! - charlie
2这个答案可能已经过时了,在~/.local目录下我没有这样的文件。在/usr/share目录下的文件并不包含所有指示器应用程序的条目,而且更改它也没有产生任何效果。希望能够得到一个适用于14.04版本的答案。 - Luís de Sousa
1它适用于Ubuntu 14.04,你只需要将你使用的每个指示器明确地添加到文件中。运行以下命令以查找你正在使用的指示器:dbus-send --type=method_call --print-reply --dest=com.canonical.indicator.application /com/canonical/indicator/application/service com.canonical.indicator.application.service.GetApplications | grep "object path" | sed 's/_/-/g' | cut -d"/" -f5 然而,它无法与Dropbox一起工作,因为状态通知器ID会根据Dropbox的PID而变化。我已经在下面添加了一个答案,以根据Dropbox的PID更新ordering-override.keyfile。 - Gruzzles
这对于15.04版本有效吗?我已经在.local目录下创建了文件,但是没有看到它起作用。原始的全局文件在/usr/share目录中存在,这表明它应该可以工作。这个文件的解析是否被记录在任何地方?有没有办法调试是否出现了任何问题? - Jean Jordaan
@ted-gould 你能找出 indicator-applet 源代码中使顺序固定的那部分代码吗? - Khurshid Alam

官方的Ubuntu图标(天气、ubu-one、电池、信息、我、声音、关机)是硬编码在固定位置的。很糟糕。其他图标应该按照先到先得、从左到右的优先顺序排列。根据这个头脑风暴/功能请求,答案是:不,你不能通过图形界面手动更改图标的顺序。但可以参考@Ted Gould的回答。


1我也遇到了那个bug。不错的发现。谢谢。 - Scaine

要更改Unity面板上应用程序指示器的位置,您必须编辑一个名为ordering-override.keyfile的文件,该文件位于/usr/share/indicator-application下。由于编辑此文件将更改所有用户的设置,您可以将其复制到~/.local/share/indicators/application/ordering-override.keyfile并仅为您自己的用户进行更改:

mkdir -p ~/.local/share/indicators/application
cp /usr/share/indicator-application/ordering-override.keyfile ~/.local/share/indicators/application/

现在在终端中运行以下命令来打开文件:
gedit ~/.local/share/indicators/application/ordering-override.keyfile

在这个文件中,您应该看到面板上应用指示器顺序的现有规则。第一个是nm-applet,其值为"1",意味着它将作为第一个应用指示器从右到左显示在面板上。
以此为例,您可以添加自己的应用指示器,并通过输入它们的名称和一个数字来指定它们的位置,比如transmission=6,这将使Transmission应用指示器显示为面板上的第6个指示器(从右到左),如果其他5个指示器存在的话。
来源:http://www.webupd8.org/2011/06/how-to-change-application-indicators.html 现在,在您的情况下,ordering-override.keyfile文件应该如下所示:
[Ordering Index Overrides]
nm-applet=1
My_Weather_Indicator=2
lang_indicator=3
bluetooth_manager=4
indicator_sysmonitor=5
transmission=6

1@James 显然,这也适用于应用程序提供的指标,因为Transmission被用作一个例子。 - Léo Lam
这适用于15.04吗?我已经在.local中创建了文件,但没有看到它起作用。原始的全局文件在/usr/share中存在,这表明它应该可以工作。这个文件的解析是否被记录在任何地方?如果有什么问题,有没有调试的方法? - Jean Jordaan
执行 kill $(pgrep unity-panel-service) 之后,它确实起作用了 :-) 我在创建完 ordering-override.keyfile 后重新启动了系统,所以不知道为什么这个面板重启后才生效。 - Jean Jordaan
这种重新启动面板的方式 root@laptop:~# restart unity-panel-service 不再起作用了: restart: 无法连接到 Upstart:无法连接到套接字 /com/ubuntu/upstart:拒绝连接 - Jean Jordaan

启用排序 Dropbox 指示器的说明

按照 Ted Gould 的说明操作,然后如果您想要对 Dropbox 指示器进行排序,还需要执行以下几个步骤:

注意:如果您在 /usr/share/... 中编辑了文件,则必须将脚本放置在 /etc/rc.local 中(请参阅下面的注意

由于 Dropbox 将 PID 附加到指示器名称中,并且每次启动 Dropbox 时都会更改,因此您需要在每次启动 Dropbox 时更新 ordering-override.keyfile

为此,您可以打开文本编辑器,复制并粘贴以下脚本,并将其命名为类似于 start-dropbox.sh 的名称。然后,要么右键单击,选择“属性”,转到“权限”选项卡,并选中“允许将文件作为程序执行”框,要么打开终端,导航到您放置脚本的文件夹,并运行sudo chmod 755 ./start-dropbox.sh

#!/bin/bash
#Disclaimer: This script is intended for use with Ubuntu 14.04. You alone are responsible any consequence resulting from its use.
#The purpose of this script is to start dropbox, update the keyfile, and restart the indicator panel.

#Start dropbox if not already started (for some reason pgrep didn't work)
[[ $(ps aux | grep dropbox | grep dist | awk '{print $2 }') = "" ]] && dropbox start -i

#If the override file exists
if [[ -e ~/.local/share/indicators/application/ordering-override.keyfile ]]
then
    while [ "$(ps aux | grep dropbox | grep dist | awk '{print $2 }')" = "" ]; do
        sleep 1s
    done
    sleep 5s #dropbox creates several PIDs, so wait a bit before continuing
    sed -e "s/dropbox-client-.*=/dropbox-client-$(ps aux | grep dropbox | grep dist | awk '{print $2 }')=/g" -i ~/.local/share/indicators/application/ordering-override.keyfile
    restart unity-panel-service
fi

现在你可以打开"启动应用程序",并创建一个新条目,使用你的脚本的完整路径作为"命令"(使用~/start-dropbox.sh不起作用,你必须使用/home/yourname/start-dropbox.sh)。
**注意**:这是你将完整脚本路径添加到/etc/rc.local末尾的地方。
一个可选的步骤是打开Dropbox设置,并取消勾选"系统启动时启动Dropbox"。你不能只是更改已经在启动应用程序列表中的Dropbox命令,因为每次启动Dropbox都会覆盖它。
完成了!
这是我的~/.local/share/indicators/application/ordering-override.keyfile文件的内容:
[Ordering Index Overrides]
multiload=13
My-Weather-Indicator=12
redshift=11
Diodon=10
Chars=9
indicator-brightness=8
dropbox-client-24651=7
nm-applet=6
gnome-power-manager=5
ibus=4
gst-keyboard-xkb=3
gsd-keyboard-xkb=2
chrome-app-indicator-1=1

root@laptop:~# 重启 unity-panel-service 重启:无法连接到 Upstart:无法连接到套接字 /com/ubuntu/upstart:连接被拒绝 - Jean Jordaan