连接外接显示器时,是否有办法防止窗户移动?


9

因此,我在笔记本电脑上使用Ubuntu 14.10,偶尔将其插入电视以显示第二个屏幕。我的电视在桌子的左边。当我将其用作笔记本电脑屏幕左侧的外接显示器时,笔记本电脑屏幕上的所有窗口都移到电视屏幕上。我可以将它们移回去,但是每次都要这样做确实很烦人,尤其是当打开多个窗口时。

左电视

但是,如果将电视屏幕设置为笔记本电脑屏幕的右侧(实际上),则窗口不会移动。但这是可以理解的,因为它与物理设置相反,因此使用起来很混乱。另外,我也不想移动办公桌。

右边的电视

似乎Ubuntu或显示服务器只是简单地假设最左边的监视器是主要监视器,并且所有窗口都应该位于其中。有没有办法禁用此行为?

我一直在检查这些论坛,但还没有真正看到有人对此发表评论。我发现的最接近的线程是这个线程,尽管它不是完全相同的问题。

关闭多个监视器之一时,让Ubuntu不移动窗口

谁有想法?请让我知道。谢谢!

Answers:


2

我没有找到“秘密”设置来更改其设计行为的行为。确实看起来好像假定左屏幕是“基本”屏幕。

但是,很有可能创建一种解决方法,并获得基本相同的结果。您可以创建一个脚本,该脚本在连接第二个屏幕时列出所有窗口。随后,所有最初移至左侧屏幕的窗口将在一两秒钟内移回到右侧屏幕。所有窗口的大小将保留。
这就是下面的脚本所做的。

两个版本

您可以通过两种方式还原排列的窗口:

  • 有时,使用快捷键在连接第二个屏幕后运行。
  • 自动在后台运行脚本,等待屏幕连接。

如何使用

准备工作

  • 安装 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

如果您认为它可以执行此操作,则可能需要将其添加到键盘快捷方式中,选择:“系统设置”>“键盘”>“快捷方式”>“自定义快捷方式”。单击“ +”并添加命令:

  • 如果使用一个在后台运行,请通过以下命令运行它:

    python3 /path/to/move_windows.py
    

    如果它按预期运行,请将其添加到启动应用程序中:Dash> Startup Applications> Add

我用笔记本电脑(在右侧)和两个不同的屏幕(在左侧)测试了脚本。结果是一样的。

笔记本电脑的屏幕

在此处输入图片说明

没有脚本连接

在此处输入图片说明

连接脚本并运行

在此处输入图片说明

脚本完成工作后,窗口将“单独放置”(当然),您可以按自己的方式排列窗口。

脚本

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

雅克,病得很重!
don.joey 2014年

@ K0j0您管理了吗?
Jacob Vlijm

@JacobVlijm不确定是否每5秒轮询一次是最佳解决方案(是否存在事件驱动的可能性?)。无论如何,如果您有兴趣将此脚本转换为Unity指示器(如此处所示),请联系。
Peterino

@Peterino如果存在事件驱动的信号,那将是我的首选。同时:如果背景脚本写得很好,那么它的额外负担实际上(并且可以)几乎没有,而且我总是在此方面专门测试我的脚本。我自己运行了数量不断变化的后台脚本。甚至所有这些都没有明显的作用。请记住,根据定义,系统上正在运行许多循环。关于Unity指标建议:我绝对有兴趣学习如何针对这种情况或其他情况创建指标:)。
Jacob Vlijm

根据Canonical的消息,@JacobVlijm看起来Windows的自动放置将自动从Ubuntu的下一版本(“正在进行中”)开始自动进行。在当前版本的剩余几个月中,可能不值得进行投资。不过,我将在IRC#ubuntu-mir @ freenode上与Mir开发人员进行仔细检查。
Peterino
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.