我正在运行 XFCE 4.12,并在同一台计算机上将 3 个显示器设置为两个 X 屏幕和两个显卡。其中两个显示器使用 nvidia twinview 功能形成一个 X 屏幕,即 Xorg 配置中 Device0 上的 Screen0。第三个显示器用于第二个屏幕,即 Xorg 配置中 Device1 上的 Screen1。我可以在 Screen0 的显示器之间拖动窗口。我还可以在 Screen0 和 Screen1 之间自由移动鼠标,甚至剪贴板数据也可以在两个 X 屏幕之间传输。
这两个 X 屏幕都充当独立的桌面,拥有自己的一组视口。我喜欢这种方式,它对于使一侧自动“粘”很有用。但是,如果我在一个 X 屏幕上启动一个程序,我无法通过简单地将其拖动到另一个 X 屏幕上。如果我想在另一个屏幕上运行该程序,我必须在该屏幕上重新启动它。
我的问题是,是否有办法使用 X windows 的某些命令或其他功能在程序运行时将程序移动到另一个屏幕。谢谢。
更新:我将对这个问题开始悬赏,但我已经想知道这个问题有一段时间了。要获得赏金,您必须提供一些证明引用。
答案1
您无法移动直接通过最终显示该应用程序的 X 服务器启动的 X 应用程序,这是因为 X 客户端“在其整个生命周期内都与其启动时所在的 X 服务器(X 显示)绑定在一起”[1] 这很可能与 X 服务器保存的有关客户端窗口的元数据有关,这些元数据无法在 X 服务器之间轻松传输。
对于没有明确编写的多屏幕支持的程序来说,单独配置的屏幕(当不使用诸如 Xinerama 或 Twinview 之类的扩展时)也是如此 - “使用此配置,不可能在屏幕之间移动窗口,除了一些特殊的程序,如 GIMP 和 Emacs,它们具有多屏幕支持。”[2]
理论上,如果应用程序被设计为应对 X 服务器上下文切换,则可以为其提供新的显示/屏幕编号、保存其窗口的状态、连接到新的 X 服务器/屏幕并恢复其窗口,但很少有应用程序将以这种方式设计,并且必然涉及大量样板文件或包含可以以某种方式促进这一点的库。
对您来说最好的选择可能是使用其他应用程序,这些应用程序可以充当 X 客户端和显示 X 服务器之间的代理,就像 GNU 屏幕可用于控制台应用程序和终端一样。 Xmove 和 Xpra [3&4] 似乎是最广泛使用的实现。使用这些的注意事项是,您启动的应用程序必须向 Xmove 或 Xpra 注册作为其 X 服务器,以便能够在不同显示服务器之间进行上下文切换。
最后还有另一个问题,关于超级用户,这是出于稍微不同的目的提出类似的问题(在 X 崩溃后重新连接到 X,而不是故意断开/重新连接客户端)[5]
- [1]https://en.wikipedia.org/wiki/Xmove
- [2]https://wiki.archlinux.org/index.php/Multihead#Separate_screens
- [3]https://wiki.archlinux.org/index.php/Allow_a_program_to_continue_after_logoff
- [4]https://wiki.archlinux.org/index.php/Xpra
- [5]https://superuser.com/questions/238728/recover-an-application-in-sleeping-state-after-an-x-server-crash