如何锁定 Wayland 中显示的工作区/防止其他应用程序更改工作区?

如何锁定 Wayland 中显示的工作区/防止其他应用程序更改工作区?

请注意,这个问题与

因为这个问题不是关于如何

  • 在当前工作区中打开一个程序。我知道。
  • 打开另一个工作区上的程序。我知道。
  • 阻止窗口移动到某个工作区。我知道该如何处理。
  • 防止单击图标时切换工作区或使用任务切换器。

这个问题也与 Chromium 无关。Chromium 只是众多行为不当的应用程序中最为突出的一个。

问题是,当另一个应用程序尝试在没有直接用户交互的情况下将焦点切换到自身(如 Chromium 或其他应用程序)时,如何防止 Wayland 切换当前工作区。 这有点像焦点窃取,当它发生在当前工作区时就已经够烦人的了。

如果我使用 Compiz 选择了一个工作区,那么在我选择其他工作区之前,这个工作区都不能改变,不管其他应用程序在后台尝试做什么。

有没有办法告诉 Wayland 只服从某些应用程序(如 Compiz 和 wmctrl)的切换命令?也许可以通过某种dbus过滤器来实现这一点(即使我知道如何根据自己的需要破解 Linux 内核模块(如 CIFS 或 ZFS)的代码,但我真的还不了解dbusWayland 或 SystemD,抱歉)。 LD_PRELOAD?一些(现有的)X0 协议防火墙?什么都可以?

我目前的解决方法是运行

while sleep .01; do DISPLAY=:0 wmctrl -s 2; done

这样,如果 Chromium(或其他应用程序之一)切换工作区,Wayland 会立即切换回我工作的工作区。但是,由于这种来回切换而导致的这种长达一分钟的稳定屏幕闪烁令人恼火。有时,由于闪烁,鼠标焦点会丢失(或者发生完全不同的情况,例如由于暴露的竞争条件而将某些东西放到错误的桌面上)。

请注意,Chromium 是最烦人的。大多数其他应用程序只会切换一次工作区。然而,Chromium 显然会在启动时对它打开的每个窗口都执行此操作。在我这边打开了几千个窗口的情况下,整个启动过程需要几分钟(我的机器有足够的 RAM 和 CPU,所以这不是交换问题),并且在启动时,它会稳定地尝试切换工作区,直到准备就绪。然而,问题还在于如何防止 FireFox、IDE 和其他窗口以这种方式窃取焦点。

请注意,这个问题与焦点窃取本身无关。它只是与通过切换工作区而发生的焦点窃取有关,因为这与观察到的正常焦点窃取完全不同。

所以我不想阻止窗口跳来跳去、移动到另一个工作区或窃取当前工作区的焦点。所以应用程序仍然可以破坏我的窗口位置。

我想要的只是“锁定”当前工作区,这样,在我选择移动到另一个工作区之前,任何其他东西都不允许更改它。


对此的一些想法:

Wayland 仅呈现更大画布(包含所有工作区)的某个部分(工作区)。因此,更改工作区只是更改显示画布的原点。显示是相对于此原点的区域。(当然,还有更多事情要做,因为输入焦点也必须移动。)

据我所知,应该很容易防止原点移动(从而防止焦点改变)。这正是我想要存档的。也许这已经在 Wayland 的某个地方内置了。或者它可能被黑客入侵到代码中,就像防火墙一样,可以防止未经授权的应用程序更改原点。如果我能够找到 Wayland 中发生原点更改的正确位置,我就可以实现这一点。

但在深入研究这个问题之前(这可能需要几天时间),我想知道是否有更好或标准的方法来存档它。


最后说明一下:

我需要使用 Ubuntu 和 Wayland,因为我的显示设置/硬件/HWE 堆栈在普通 X11 下不受支持。(它无法正确驱动我的一台显示器。请注意,我很可能有能力找到这个错误并修复它,但我没有时间这样做。)

因此,放弃 Wayland 对我来说没有帮助。当然,我运行的是 LTS,所以也设置了 Ubuntu 22.04,所以更改操作系统也无济于事。

相关内容