让 Linux 下 QQ 和微信重新打开时返回上次会话

问题简介

Linux 下的 QQ 和微信一直有个问题:一旦登陆了账号,叉掉后会最小化到托盘;之后想再打开该会话,必须从托盘打开。重新运行 linuxqq/wechat 程序无效、或是会打开一个新的登陆界面。

用托盘打开有一些问题:

  1. 一定得用鼠标点击。用起来很不爽;
  2. 有些 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 当前窗口了。

1 个赞

牛,这思路可以的