在双屏模式下在屏幕之间移动窗口

在双屏模式下在屏幕之间移动窗口

我有一台笔记本电脑和一台 27 英寸的显示器。我在一个显示器上运行 Qt,在另一个显示器上运行 Pycharm。有没有办法通过组合键在两个屏幕之间切换所有窗口。原因是我只想在大屏幕上编程。我已经有 4 个工作区,并且都已使用。

xrandr 的输出:

Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 32767 x 32767
eDP1 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 344mm x 193mm
   1920x1080      60.2*+   59.9  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
HDMI1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 597mm x 336mm
   1920x1080      60.0*+   50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1600x1200      60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1366x768       59.8  
   1152x864       75.0  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   720x576        50.0  
   720x480        60.0     59.9  
   640x480        75.0     72.8     66.7     60.0     59.9  
   720x400        70.1  
DP1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

答案1

1. 脚本将所有窗口从屏幕 1 切换到屏幕 2,反之亦然

该脚本假设屏幕是相同的垂直的分辨率,左侧屏幕为主要屏幕。水平的脚本会搜索两个屏幕的分辨率。

如何设置

wmctrl需要安装脚本:

sudo apt-get install wmctrl
  1. 将下面的脚本复制到一个空文件中,将其另存为swap_windows(无扩展名)~/.bin。如果目录不存在,则创建该目录,然后使脚本可执行
  2. 如果您刚刚创建了目录~/bin(它尚不存在),请注销/登录或在终端中运行:source ~/.profile
  3. 使用以下命令测试运行脚本:

    swap_windows
    
  4. 如果一切正常,请添加快捷键;选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并添加命令

剧本

#!/usr/bin/env python3
import subprocess
import sys

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shiftright(xr_output):
    lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def get_shiftleft(xr_output):
    lines = [l for l in xr_output.splitlines() if  "+0" in l and not "+0+0" in l][0].split()
    return -int([it for it in lines if "x" in it][0].split("x")[0])

def swap_windows():
    xr_output = get("xrandr")
    shift_r = get_shiftright(xr_output)
    shift_l = get_shiftleft(xr_output)
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    for w in w_data:
        props = get("xprop -id "+w[0])
        if any(["_TYPE_NORMAL" in props, "TYPE_DIALOG" in props]):    
            if 0 < int(w[2]) < shift_r:
                shift = shift_r
            elif shift_r-shift_l > int(w[2]) >= shift_r:
                shift = -shift_r
            else:
                shift = 0
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])     
swap_windows()



2. 将(所有)窗口从一个显示器移动到另一个显示器的脚本

下面的脚本将双显示器设置中的窗口从一个屏幕移动到另一个屏幕,方法如下:

  • 从左到右显示器 -->

    或者

  • 从右侧到左侧显示器<--

根据您运行它的参数(leftright

该脚本(再次)假设屏幕是相同的垂直的分辨率,左侧屏幕为主要屏幕。水平的脚本会搜索两个屏幕的分辨率。

如何设置

wmctrl需要安装脚本:

sudo apt-get install wmctrl
  1. 将下面的脚本复制到一个空文件中,将其另存为shift_windows(无扩展名)~/.bin。如果目录不存在,则创建该目录,然后使脚本可执行
  2. 如果您刚刚创建了目录~/bin(它尚不存在),请注销/登录或在终端中运行:source ~/.profile
  3. 使用命令测试运行脚本

    shift_windows right
    

    和:shift_windows left

    在第一种情况下,你的窗户左边屏幕应移至右侧屏幕,在第二种情况下,反之亦然。

  4. 如果一切正常,请将脚本添加到两个快捷键组合中:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并按照上述说明添加命令。

剧本

#!/usr/bin/env python3
import subprocess
import sys

vec = sys.argv[1]

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shiftright(xr_output):
    lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def get_shiftleft(xr_output):
    lines = [l for l in xr_output.splitlines() if  "+0" in l and not "+0+0" in l][0].split()
    return -int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows():
    xr_output = get("xrandr")
    shift_r = get_shiftright(xr_output)
    shift_l = get_shiftleft(xr_output)
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    for w in w_data:
        props = get("xprop -id "+w[0])
        if vec == "right":
            check = (0 < int(w[2]) < shift_r, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = shift_r
        if vec == "left":
            check = (shift_r-shift_l > int(w[2]) >= shift_r , "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = -shift_r
        if check == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])
shift_windows()




3. 将单个窗口从一个屏幕移动到另一个屏幕

虽然这不是你的问题,但只要多几行,你就可以移动全部窗口从一个屏幕移动到另一个屏幕,也可以使用组合键移动单个屏幕(最前面的)。

使用下面的脚本,你可以移动全部使用命令:

shift_windows right

或者使用以下命令移动单个窗口:

shift_windows right s

设置与上面的脚本几乎相同(不要忘记安装wmctrl

剧本

#!/usr/bin/env python3
import subprocess
import sys

vec = sys.argv[1]
try:
    n = sys.argv[2]
except IndexError:
    n = "a"

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shiftright(xr_output):
    lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def get_shiftleft(xr_output):
    lines = [l for l in xr_output.splitlines() if  "+0" in l and not "+0+0" in l][0].split()
    return -int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows():
    xr_output = get("xrandr")
    shift_r = get_shiftright(xr_output)
    shift_l = get_shiftleft(xr_output)
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    if n == "s":
        frontmost = [l for l in get("xprop -root").splitlines() if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
        frontmost = frontmost[:2]+"0"+frontmost[2:]
        w_data = [l for l in w_data if frontmost in l]
    for w in w_data:
        props = get("xprop -id "+w[0])
        if vec == "right":
            check = (0 < int(w[2]) < shift_r, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = shift_r
        if vec == "left":
            check = (shift_r-shift_l > int(w[2]) >= shift_r , "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = -shift_r
        if check == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])
shift_windows()

相关内容