问题简介
Linux 下的 QQ 和微信一直有个问题:一旦登陆了账号,叉掉后会最小化到托盘;之后想再打开该会话,必须从托盘打开。重新运行 linuxqq/wechat 程序无效、或是会打开一个新的登陆界面。
用托盘打开有一些问题:
- 一定得用鼠标点击。用起来很不爽;
- 有些 windows manager(比如 GNOME)中,系统托盘已经是 deprecated 的设计了。要用得另外装 extension。
我希望起到的效果是,重新运行 linuxqq/wechat 时,若存在已有会话,则重新打开该会话。
解决方案
我找到的解决方法包括以下两步:
1. 安装 tray-control
这个软件可以显示/激活 dbus tray。
当然现在这个主仓库的代码似乎有些兼容性问题。可以看其 pr#2 的仓库。
这样以后,你就可以看到系统所有有托盘应用的托盘了:
% tray-show -v
Category: ApplicationStatus
Title:
Id: chrome_status_icon_1
Status: Active
Category: ApplicationStatus
Title: wechat
Id: wechat
Status: Active
IconName:
这两个分别是 qq 和 wechat 了(qq 这个 Id 好抽象)。
之后使用 tray-activate -i chrome_status_icon_1 或是 tray-activate -i wechat 就可以激活 qq/wechat 了。
2. 修改 .desktop
注:我以下的文件路径/内容都是参考 Arch Linux AUR 包的;其它发行版及安装途径需作适当修改。
我复制 /usr/share/applications/qq.desktop 到 ~/.local/share/applications/qq.desktop,并修改:
--- /usr/share/applications/qq.desktop
+++ /home/user/.local/share/applications/qq.desktop
@@ -1,6 +1,6 @@
[Desktop Entry]
Name=QQ
-Exec=linuxqq %U
+Exec=sh -c 'pgrep -u "$USER" -x qq >/dev/null && tray-activate -i chrome_status_icon_1 || linuxqq %U'
Terminal=false
Type=Application
Icon=qq
我复制 /usr/share/applications/wechat.desktop 到 ~/.local/share/applications/wechat.desktop,并修改:
--- /usr/share/applications/wechat.desktop
+++ /home/user/.local/share/applications/wechat.desktop
@@ -1,7 +1,7 @@
[Desktop Entry]
Name=wechat
Name[zh_CN]=微信
-Exec=/opt/wechat/wechat %U
+Exec=sh -c 'pgrep -u "$USER" -x wechat >/dev/null && tray-activate -i wechat || /opt/wechat/wechat %U'
StartupNotify=true
Terminal=false
Icon=/usr/share/icons/hicolor/256x256/apps/wechat.png
使用同名的 .desktop,会使得 local 的覆盖 system level 的。如果你想保留原功能(比如 qq 原功能为新开一个窗口,从而方便登陆多个账号),可以改成不同的名字,比如叫
qq-activate.desktop,并相应地修改文件中Name项。
但这可能会有些问题,毕竟可能会造成tray-show中存在多个 Id 相同的项。到时候就不知道激活哪个了… (我没测试过)
结果
现在就可以使用一些应用启动器(如 fuzzel/GNOME search 等),直接激活 qq/wechat 当前窗口了。