xfce:防止应用程序的多个实例

xfce:防止应用程序的多个实例

Ubuntu 中真正令人讨厌的是,当一些不需要多个实例的应用程序(例如“外观设置”、Web 浏览器、终端窗口)在启动时会再次加载。对于浏览器或终端,我仍然可以理解,尽管此类应用程序有“新窗口”选项。但对于设置应用程序,例如“外观”或“键盘设置”的多个实例完全没用。

如何防止启动器再次启动已经启动的应用程序(例如 Firefox)?

我尝试了一个名为 launch.sh 的 shellscript:

#!/bin/sh
if ! pgrep $1 >/dev/null; then 
    "$2" &
fi

在 Firefox 的 xfce 启动器中我设置

launch.sh firefox /usr/bin/firefox

它确实有效(当区域打开时,firefox 不会启动),但xfce4-appearance-settings它不起作用,因为pgrep xfce4-appearance-settings当 xfce4-appearance-settings 打开时没有返回任何内容。

在 macOS 中它可以正常工作:此类应用程序仅启动一次,当再次单击应用程序图标时,它会移动到前台,而不是启动新的过时实例。

在 Ubuntu 中如何实现这一点?

答案1

应用程序本身控制该行为。

例如,对于 Firefox 来说,切换到正在运行的窗口,并且仅当程序未运行时才启动该程序,如下所示:

wmctrl -x -a firefox || firefox

在 bash 中,命令分隔||符表示“OR”。第一个命令wmctrl尝试切换到 WM_CLASS 为“firefox”的窗口。如果失败,firefox则执行 。

第一个实例firefox指的是 Firefox 窗口的 WM_CLASS。您可以在 的输出中看到正在运行的窗口的 WM_CLASS wmctrl -lx

要将其用作快捷键或在 .desktop 启动器中使用它,请使用以下命令:

sh -c "wmctrl -x -a firefox || firefox"

答案2

继续钒的答案,您可以制作一个通用的可执行文件,它可以对任何应用程序的.desktop文件执行此操作,从而有效地为您提供随意的配置。

在您的主文件夹中创建一个文件。我将其命名为switch-to-if-open。不需要扩展名。

touch switch-to-if-open.

在您选择的编辑器中输入以下内容:

#!/bin/sh
wmctrl -x -a $1 || "$@"

$1是应用程序名称,并使用文件"$@"中定义的所有其他参数运行完整命令.desktop,包括域代码%u(类似于Firefox 使用的URL )。

使其可执行:

sudo chmod +x switch-to-if-open

在您的.desktop文件中(使用 Firefox 作为示例),在[Desktop Entry]部分下,更改:

Exec: firefox %u

到:

Exec: /home/${user}/switch-to-if-open firefox %u

在此处替换${user}为您的用户名。

如果适用,您可能希望对文件[Desktop Action ...]中的任何其他后续部分执行此操作。.desktop

如果你想让系统的所有用户都使用此功能,该文件应放置在/usr/local/bin而不是您的home目录。

如果你想避免引用完整路径,你应该能够将其添加到你的 $PATH 或创建一个符号链接。不确定.desktop文件是否关心您在此处使用哪种方法。

您应该使用使用具有多个参数和/或字段代码的复杂命令的应用程序进行测试,以确保它们仍然按预期运行。我使用 GNOME 桌面,所以我使用了吉奥测试 URL(%u字段代码)是否仍然通过。我相信exo-open可以在 xfce 中用于相同目的。

相关内容