编辑

编辑

总体而言,我更喜欢 Unity 3D,而不是 2D 版本,因为 2D 版本在我的计算机上有点问题。但是,我经常做演示,而 Compiz 不支持多屏幕。每次做演示时,我都不得不退出 3D 并进入 2D,然后返回 3D 以获得更易用的桌面。

为了避免这种不便,我编写了一个脚本,可以在 Unity 2D 和 3D 之间切换,而无需注销。不幸的是,当我从 2D 运行它时,我最终运行的是 3D,2D 面板和启动器。两者同时显示在屏幕上。我怀疑我正在终止的 2D 进程不知何故重新生成。有人能帮我调试我的脚本吗?

#!/bin/bash

set -x

unity_2d="unity-2d-places unity-2d-launcher unity-2d-panel unity-2d-spread"

start_2d() {
  metacity --replace &
  for i in $unity_2d; do
    "$i" &
  done
}

stop_2d() {
  killall $unity_2d  # The lack of quotes around $unity_2d is deliberate.
}

start_3d() {
  unity --replace &
}

stop_3d() {
  : # no-op for now
}

if ps -u "$USER" | grep -q [m]etacity; then
  # Unity 2D is currently running.
  stop_2d
  start_3d
else
  # Unity 3D is currently running.
  stop_3d
  start_2d
fi

编辑

当我登录 3D 时,我的脚本可以工作。当我登录 2D 时,它却不工作。因此,它适用于我最常见的用例,但事实上,它反过来却失败了,这表明我做错了什么。

答案1

当您运行 metacity --replace 时,我希望它会为您结束 Compiz 会话。因此,如果您这样做,也许会有所帮助不是调用 stop_3d,但只调用 start_2d。现在可能手动终止 3D,这会触发 Compiz 的重新启动,但在重新启动之前,2D 会启动但认为 3D 未运行,因此不会正确结束它(不会触发重新启动)。

这只是一种预感,但你永远不知道。

相关内容