我想要实现以下行为:当我使用笔记本电脑屏幕时,将使用第一个工作区。当我插入第二个屏幕(通过HDMI)时,将使用第二个工作区,该第二个屏幕上所有新打开的窗口将落在第二个空间中,除非我将第二个屏幕上的工作区切换到另一个工作区。
当我拔出第二个屏幕的电源时,所有窗口将保留在创建它们的工作区中,并且可以在笔记本电脑上切换工作区以查看它们。
这种行为已经可能吗?
我想要实现以下行为:当我使用笔记本电脑屏幕时,将使用第一个工作区。当我插入第二个屏幕(通过HDMI)时,将使用第二个工作区,该第二个屏幕上所有新打开的窗口将落在第二个空间中,除非我将第二个屏幕上的工作区切换到另一个工作区。
当我拔出第二个屏幕的电源时,所有窗口将保留在创建它们的工作区中,并且可以在笔记本电脑上切换工作区以查看它们。
这种行为已经可能吗?
Answers:
这种行为已经可能吗?
在Linux中一切皆有可能。您将需要一些有关Xserver的基础知识,需要一些时间和一个系统来进行测试,因为您搞砸了X,并且如果需要帮助,您当然需要运行浏览器:-)
我认为有三种可能的解决方案:
多监视器设置使用Xinerama。我能想到的最简单的解决方案是在配置中添加第三个虚拟屏幕,然后使用xdotool将窗口移到那里。该解决方案有一些缺点,但是不需要在不同的Xserver之间移动窗口,这通常是不可能的。
因为它是不可能的不同之间移动窗口Xservers中,我们需要一种像代理XMOVE或Xpra为我们做到这一点。我认为这些窗口然后驻留在单独的Xfvb会话中以隐藏窗口。您可以附加和分离到会话。
无论使用哪种方法,都需要在监视器断开电源时发生事件。当屏幕断开连接以及重新连接时,应该触发该事件。您可以守护脚本来监视事件。
由于各种原因,我希望使用Xpra解决方案。我只能给您一些提示。解决方案尚未完成,但应该可以帮助您入门。
Xinerama设置必须扩展为具有静态配置:请参阅https://help.ubuntu.com/community/XineramaHowTo
我们可以使用xdotool搜索Windows。之后,我们可以检查它们的位置并移动它们。我假设1920x1080
配置了两个监视器。下面将所有窗口从右移到左xinerama屏幕。
while read xwindowid; do
eval $(xdotool getwindowgeometry --shell "$xwindowid")
if (( X > 1920 && X <= (1920 * 2))); then
xdotool windowmove --relative $WINDOW -1920 y
fi
done <<< "$(xdotool search --screen 0 '.*')"
现在,如果连接了显示器,则可以将所有窗口从笔记本电脑屏幕(screen0)移至第三(虚拟)屏幕。同时,您可以将存储在第三个屏幕上的任何窗口移动到第一个屏幕。
为了使用Xpra移动窗口,所有窗口必须事先由Xpra进行管理。您必须在系统启动时使用Xpra启动整个桌面。两次是您在其中工作的主桌面,另一次主要是虚拟桌面。
xpra start-desktop :99
xpra start-desktop :1 --exit-with-children −−attach
现在,您可以在单独的xpra会话中运行用于断开连接屏幕的Windows,并在监视器切换时从中附加/断开连接。
xpra attach :99
xpra detatch :99
如果您想在启动的xpra显示之间手动将窗口从隐藏窗口移动到正常窗口,还有一个断续的gnome shell扩展,可能很有用。:99
:0
如果需要,也许可以使用xwininfo监视 xinerama的尺寸变化,使其独立于未插拔的显示器,例如,将设置扩展到3个显示器并拔出任意设备。请注意,这仅适用于xpra解决方案。
xwininfo -display :0 -root | grep -e "-geometry"
-geometry 5760x2160+0+0