我想实现这样的行为:当我使用笔记本电脑屏幕时,将使用第一个工作区。当我插入第二个屏幕(通过 HDMI)时,将使用第二个工作区,并且第二个屏幕上所有新打开的窗口都将进入第二个空间,除非我将第二个屏幕上的工作区切换到另一个工作区。
当我拔下第二个屏幕时,所有窗口将保留在创建它们的工作区中,我可以在笔记本电脑上切换工作区来查看它们。
这种行为已经可能了吗?
答案1
这种行为已经可能了吗?
在 Linux 中一切皆有可能。你需要一些关于 Linux 的基本知识。X服务器,需要一些时间和一个系统来进行测试,因为你正在摆弄你的X,而且如果你需要帮助的话你肯定需要运行浏览器:-)
我认为有三种可能的解决方案:
多显示器设置使用新内拉玛我能想到的最简单的解决方案是将第三个虚拟屏幕添加到您的配置中,然后使用 xdotool 将窗口简单地移动到那里。这个解决方案有一些缺点,但它不需要付出努力在不同的 Xserver 之间移动窗口这一般来说是不可能的。
由于无法在不同的X服务器,我们需要一种代理,例如移动或者西普拉为我们做这件事。我认为窗户就在一个单独的西弗吉尼亚会话隐藏窗口。您可以附加或分离会话。
无论使用哪种方法,当显示器断开连接时都需要一个事件。当屏幕断开连接以及重新连接时,该事件都应触发。您可以将脚本设为守护进程来监视该事件。
出于各种原因,我更喜欢使用 Xpra 的解决方案。我只能给你一些提示。这些解决方案并不完整,但应该可以让你入门。
Xinerama 解决方案
设置
Xinerama 设置必须扩展才能具有静态配置:参见https://help.ubuntu.com/community/XineramaHowTo
获取受影响的窗口
我们可以用工具搜索窗口。之后我们可以检查它们的位置并移动它们。我假设有两个带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
现在,您可以让断开连接的屏幕的 Windows 在单独的 xpra 会话中运行,并在显示器切换时连接/分离它。
xpra attach :99
xpra detatch :99
还有一个已停用的 gnome shell 扩展如果您想在启动的 xpra 显示之间手动将窗口从隐藏状态移动:99
到正常状态,这可能会很有用。:0
事件
您可以观看断开/重新连接特定显示器
也许可以使用以下方法观察 xinerama 的尺寸变化信息网如果您希望将设置扩展到 3 个显示器并拔下任意设备,请将其独立于未插电的显示器。请注意,这仅适用于 xpra 解决方案。
xwininfo -display :0 -root | grep -e "-geometry"
-geometry 5760x2160+0+0