如何停止在任务切换中对相同类型的多个预览窗口进行重排序?

在Ubuntu 12.04的默认图形模式下使用任务切换时,如果有多个相同类型的窗口,例如多个终端窗口,您可以将它们全部显示在一起,并选择您想要的窗口。

enter image description here

我的问题是这些窗口的顺序经常变化。它遵循“最近使用”的顺序。 我希望它们始终按照固定的顺序排列;我该如何做到呢?

3非常烦人的功能。我在这里问了同样的问题http://askubuntu.com/questions/271506/how-to-disable-application-window-previews-rotation-in-unity-3d,但不幸的是还没有答案。 - humkins
5这个“问题”在14.04版本中也存在!这些窗口应该根据它们在屏幕上的相对位置以及桌面上的位置进行排序,当来自多个桌面的窗口被预览时。只有当一个窗口紧密地放置在另一个窗口的上方(在一定范围内的像素测量)时,预览的位置才应该依赖于“最后使用”的规则。我甚至会对这个规则做出更多的“调整”:根据区域语言偏好(从左到右或从右到左的文本),决定屏幕的哪一边被认为是“第一”——左边还是右边。 - Enterprise
1一个可能的解决方案是保持窗口按照它们创建的顺序,但至少要按照固定的顺序排列。与这种混乱相比,我更喜欢一个随机但稳定的顺序,感觉自己一直在不停地调整屏幕。 - Minos
1我相信这需要改变Unity代码。你可以从这里开始:http://unity3d.com/learn/documentation - Elder Geek
我在2018年的18.04版本仍然遇到这个问题。真是超级烦人。 - Jesbus
同样的问题在18.10版本中出现了,我讨厌它,这是有史以来最糟糕的功能。 - Hyperplane
3个回答

不必更改Unity代码库,您可以考虑使用桌面来达到所需的结果。
例如,在CompizConfigSettingsManager中使用Compiz Desktop Cube:
打开CompizConfigSettingsManager(ccsm),并更改设置以匹配以下内容:

ccsm-1

ccsm-2

打开终端1
使用键盘快捷键CTRL-ALT->(右箭头)跳转到右边的下一个桌面。
打开终端2
再次使用键盘快捷键CTRL-ALT->(右箭头)跳转到右边的下一个桌面。
打开终端3
使用键盘快捷键CTRL-ALT-<-(左箭头)跳转到包含终端2的前一个桌面(或者按两次返回到终端1)。
另一种选择是,在CompizConfig SettingManager中使用视口管理器,并为直接跳转到所选桌面分配一个键盘组合键。
注意:到目前为止,我只能让10个工作,但使用这种方法应该可以实现12个。
更新:根据评论中提出的担忧:
只需右键单击gedit标题栏,然后选择“始终在可见工作区上”。
不必为各种活动打开单独的终端(或工作区),您也可以在 GNOME 终端中使用选项卡。切换选项卡的快捷键可在终端首选项中找到。请参见下文:

terminal-prefs


如果我理解正确,这将使我需要使用不同的快捷方式或点击方式来切换任务。我猜应该是可以做到的。然而,当我需要或希望在终端和其他窗口之间进行快速交互时,如何克隆我所需的所有非终端窗口,这些窗口通常只有一个实例,并且分布在所有桌面上? - n611x007
你需要多少个实例?使用视口管理器可以提供最多12个。键盘激活。这是否“咔哒声”? - Elder Geek
请参阅http://askubuntu.com/questions/34572/how-can-i-reduce-or-increase-the-number-of-workspaces-in-unity。 - Elder Geek
我觉得我的表述可能有些误解了……工作区已经足够了。让我试着这样说吧。举个假设的例子。之前:3个终端,“t1”、“t2”、“t3”,加上1个gedit窗口。我需要在gedit和“t1”、“t2”之间来回复制粘贴。任务切换顺序很糟糕。之后(应用您的解决方法):我将3个终端分别放在3个工作区“w1”、“w2”、“w3”中,gedit窗口放在“w1”中。我需要在gedit和“t1”、“t2”之间进行复制粘贴。如何在“w2”上最舒适地在“t2”和gedit之间进行复制粘贴呢? - n611x007
我在工作区之间复制和粘贴的过程中没有遇到任何问题,所以我不太确定您具体在问什么。由于"最舒适的方式"是一个主观意见而非可衡量的事实,因此我很抱歉,但我认为我无法对此做出合乎逻辑的回答。 - Elder Geek
我明白了,请将“复制-粘贴”更改为“任务切换”。我的意思是,如果gedit只在“w1”上,而且仅在“w1”上,则会从“w2”中消失,因此从“w2”(上的“t2”)转到“w1”只是为了切换到gedit,这样做是否会让人感到不舒服,需要使用多个按键组合? - n611x007
让我们在聊天中继续这个讨论。 - Elder Geek
@n611x007或许我在回答中添加的"另一个选择"更适合你的工作流程。 - Elder Geek
好吧,这个问题只是以终端作为一个例子。如果有选项卡的话那太好了,但是如果一个程序没有选项卡,那么只能使用原始的解决方法。还是谢谢提供这个选项。 - n611x007
在我看来,选项卡是一个很好的解决方案,本应该是默认设置。对于其他应用程序来说,就太糟糕了。Unity处理相同类型的多个窗口的方式真是让人头疼。连微软都做得更好。 - laugh salutes Monica C
大多数我常用的应用程序都有选项卡。我的妻子仍然使用微软,我认为那更加麻烦。各有所好。 - Elder Geek

我认为你可以通过修改Unity 7的源代码来实现这一点。只需按照开发者网站上描述的步骤进行操作,但在开始构建过程之前,打开:./trunk/plugins/unityshell/src/unityshell.cpp并查看SetUpAndShowSwitcher函数。
void UnityScreen::SetUpAndShowSwitcher(switcher::ShowMode show_mode)
{
  RaiseInputWindows();

  if (!optionGetAltTabBiasViewport())
  {
    if (show_mode == switcher::ShowMode::CURRENT_VIEWPORT)
      show_mode = switcher::ShowMode::ALL;
    else
      show_mode = switcher::ShowMode::CURRENT_VIEWPORT;
  }

  auto results = launcher_controller_->GetAltTabIcons(show_mode == switcher::ShowMode::CURRENT_VIEWPORT,
                                                      switcher_controller_->show_desktop_disabled());

  if (switcher_controller_->CanShowSwitcher(results))
    switcher_controller_->Show(show_mode, switcher::SortMode::FOCUS_ORDER, results);
}

在这里,你可以清楚地看到这正是我们所寻找的功能。上部分负责切换视口模式。

Show modes

每当我们进入一个应用程序组或者离开该组时,这种切换都会出现。`optionGetAltTabBiasViewport`指示了何时发生这种情况。 然后,`GetAltTabIcons`被调用以获取正确的图标。最后,使用`Show`函数和`SortMode::FOCUS_ORDER`来显示我们排序后的图标。`SortMode`是一个枚举类型:
enum class SortMode
{
  LAUNCHER_ORDER,
  FOCUS_ORDER,
};

更改FOCUS_ORDERLAUNCHER_ORDER应该可以解决你的问题。在调用Show之前,你可以插入一个额外的if语句来防止在ShowMode::ALL情况下对启动器顺序进行排序。
请注意,Unity 8的源代码看起来完全不同。所以这个解决方案可能只适用于Unity 7。在花了半个小时修复缺失的依赖项和另一个小时与cmake作斗争后,我决定不破坏我的系统,并在明天的虚拟机中尝试一下 ;)

另一个选项是,如果您的桌面足够大,可以将一些窗口设置为“始终置顶”,并将它们排列在周围,以便您可以使用鼠标进行切换。这是一个权宜之计...但当我需要同时处理多个相同类型的窗口时,有时会发现它很有用。
另一个选项是定义几个具有不同颜色方案的终端配置文件,并为每个终端使用不同的配置文件...这样它们就容易识别了。enter image description here 是的,这也是一个解决方法。