如何在双头显示器的两个显示器上全屏显示应用程序?

如何在双头显示器的两个显示器上全屏显示应用程序?

我有两台 Ubuntu 10.4 机器(Ubuntu 继续隐藏越来越多的 xorg.conf 配置,以至于我再也不知道在哪里可以找到它)。一台是双头笔记本电脑 - DP1 是内部屏幕,VGA1 是外部显示器;两者均以 1600x900 运行。另一台机器是台式机,以 1600x900 运行 VGA1 和 HDMI1(实际上是带有 DVI 适配器的显示端口)。因此在这两种情况下,我的桌面都是 3200x900。我在笔记本电脑上运行 VNC 服务器并从桌面连接到它(通过 SSH 隧道)- 当我按下全屏热键时,我会在一台显示器上看到远程机器的 1600x900 视图,在另一台显示器上看到我本地桌面的一半 - “全屏”只会扩展到填满一台本地显示器。

通常,当您全屏显示 Web 浏览器、电子邮件客户端或其他应用程序时,这正是您想要的。我确信有一些 X magic 可以清楚地说明全屏实际上意味着什么,而 VNC 客户端应用程序只是尽职尽责地接受它所被告知的内容。虽然我希望保留常规应用程序的正常全屏行为,但当我通过 VNC 连接到另一台 3200x900 机器时,我真的希望全屏能够扩展到两个本地显示器。将窗口大小调整为“关闭”还不够好,因为我仍然在一个显示器的顶部和底部有本地面板(尽管我可以将它们设置为自动隐藏),加上 VNC 客户端应用程序窗口边框(因为它似乎不尊重 -notitle)。

有什么好办法可以让 X 对单个应用程序撒谎,使其知道“全屏”大小吗?我可以让它对所有应用程序撒谎吗? xrandr --noprimary似乎没有效果。

答案1

我做了一些调查。我假设的 X11 魔法的现代版本实际上是窗口管理器魔法,_NET_WM_STATE_FULLSCREEN。我的 VNC 客户端实际上正在使用该请求,并扩展到单个监视器。似乎它应该首先设置_NET_WM_FULLSCREEN_MONITORS描述使用哪些显示器作为顶部/底部/左侧/右侧边缘,但事实并非如此。但是,我从 dpkg 中获取了源代码并深入研究了它。即使使用 _NET_WM_FULLSCREEN_MONITORS,我也无法引发正确的行为。VNC 客户端确实知道它想要达到 3200x900,并且它尝试多次(30 次)将顶部窗口调整到该大小(在 XA_WM_NORMAL_HINTS 中设置基本和最大宽度和高度,然后使用 XResizeWindow()),但它总是被忽略。也许 compiz 行为不当?

但是 VNC 客户端也有直接处理 X 的代码,而不必通过窗口管理器。当我删除 WM 检测代码时,它会更直接地修改根窗口(XtNoverrideRedirect、XReparentWindow 到顶部、XMapRaised 等),并且效果很好(只要我还在取消全屏功能中禁用检测代码)。可以说它的效果更好 - alt-tab 和其他窗口管理键现在会传递到远程计算机,直到我取消全屏 VNC 客户端窗口。

因此,它可能是黑客行为,并且在其他方​​面存在一些陷阱*,但至少现在我已经让它在我的脑海中表现得可以接受。

*:取消全屏显示无法正确重绘根窗口或其他被覆盖的窗口。但切换到不同的视口然后切换回来会强制重绘,这是一种可接受的解决方法。

答案2

另一个值得探索的可能性是某些程序在启动时被强制到特定大小/位置的能力。

我定义通过 E17 图标运行 Opera 的命令如下:

/usr/local/bin/opera-11.01 -geometry 1600x3200-0+100 %U

这设置了 Opera 窗口的大小和位置。

在 Xemacs 中我无法控制位置,但我可以在 init.el 中指定启动时运行的窗口大小:

(设置框架大小(窗口框架)140 80)

这些并不是针对您的情况的确切解决方案,但也许您可以考虑将您正在运行的任何软件设置为相当于全屏(双屏)的特定尺寸/位置?并非所有软件都有这种选项,但也许值得研究一下。

相关内容