我没有找到“秘密”设置来更改其设计行为的行为。确实看起来好像假定左屏幕是“基本”屏幕。
但是,很有可能创建一种解决方法,并获得基本相同的结果。您可以创建一个脚本,该脚本在连接第二个屏幕时列出所有窗口。随后,所有最初移至左侧屏幕的窗口将在一两秒钟内移回到右侧屏幕。所有窗口的大小将保留。
这就是下面的脚本所做的。
两个版本
您可以通过两种方式还原排列的窗口:
- 有时,使用快捷键在连接第二个屏幕后运行。
- 自动在后台运行脚本,等待屏幕连接。
如何使用
准备工作
安装 wmctrl
须藤apt-get install wmctrl
在的帮助下查找两个屏幕的名称,屏幕名称xrandr
将恰好在“ connected”一词的前面。
复制下面的任一脚本,在头部部分,在这两行中用正确的脚本替换屏幕名称:
screen_1 = "LVDS1" # your main screen (laptop)
screen_2 = "VGA1" # secundary screen (on the left)
将脚本另存为 move_windows.py
确保在显示设置中,辅助屏幕位于左侧。两个屏幕的顶行必须对齐(就像您问题的第一张图片一样)。
运行脚本
-如果您偶尔使用该脚本,请在连接第二个屏幕后运行该脚本。
python3 /path/to/move_windows.py
如果您认为它可以执行此操作,则可能需要将其添加到键盘快捷方式中,选择:“系统设置”>“键盘”>“快捷方式”>“自定义快捷方式”。单击“ +”并添加命令:
我用笔记本电脑(在右侧)和两个不同的屏幕(在左侧)测试了脚本。结果是一样的。
笔记本电脑的屏幕
没有脚本连接
连接脚本并运行
脚本完成工作后,窗口将“单独放置”(当然),您可以按自己的方式排列窗口。
脚本
1.“手动”版本,在连接屏幕后运行
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
shift_windows(get_shift(get("xrandr")))
2.自动版本,在后台运行
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
while True:
try:
screen_info1 = get("xrandr")
time.sleep(5)
screen_info2 = get("xrandr")
check = screen_2+" connected"
if (check in screen_info1, check in screen_info2) == (False, True):
time.sleep(5)
shift_windows(get_shift(screen_info2))
except:
pass