如何使用单个命令将所有窗口移动到一个屏幕上?

如何使用单个命令将所有窗口移动到一个屏幕上?

当将我的笔记本电脑从双视图外接显示器移除回单个屏幕时,我希望有一个命令将所有窗口移动到我的主屏幕上。

尽管 nvidia 做了一些工作以便我可以看到窗口的边缘,但是用鼠标、键盘或 compiz 插件移动每个窗口都需要时间。

答案1

您可以使用wmctrl一个小的 bash 脚本来循环遍历窗口,然后将它们定位到主显示器上。我把它们拼凑起来了。这对您来说可能就足够了。

#! /bin/bash

#dump the list of windows to a file
wmctrl -l > /tmp/window_list.txt
x=40; y=40

#read the window information from the file
while read id sticky host win_title; do

    #move any non-sticky windows except the desktop
    if [ "$sticky" == "0" -a "$win_title" != "x-nautilus-desktop" ]
      then
        wmctrl -i -r $id -e 0,$x,$y,-1,-1
        x=$(($x + 40))
        y=$(($y + 40))
    fi

done < /tmp/window_list.txt

#delete the temporary file
rm /tmp/window_list.txt
exit 0

将其保存到名为“move_windows.sh”或类似名称的文件中并授予其执行权限,chmod +x move_windows.sh然后为其创建一个启动器。

答案2

下面我编写的脚本对我有用,只需要wmctrl。你可以在 Ubuntu 上使用命令获取它sudo apt-get install wmctrl

如果需要的话,你可能需要做一些细微修改

$BEFORE_WINDOW_NAME必须设置为计算机名称的最后一个字符串(您可以从System Settings> Details>Device name)。

$MONITORS这适用于 2 个显示器(分辨率为),但您可以通过为连接到设备的每个显示器设置一个元素并将其设置为该屏幕上的1920x####任何坐标来重新定义此变量。x

$SKIPPED_WINDOWS是调用此脚本时您不想移动的窗口列表。您可以随意添加或删除项目。输入命令即可查看项目列表 wmctrl -l

最后,该脚本接受一个参数,即:window_control.sh nn监视器在哪里移动窗口。

#! /bin/bash
IFS=$'\n' #prevents window names from breaking in loop

#Computers Name
#change this to the last characters before window names 
#0x02a00002  0 mycomputer-Envy-M3970 XdndCollectionWindowImp -> ie:last characters in computer name

BEFORE_WINDOW_NAME="M3970" #MODIFY ME!!
WINDOWS=$(wmctrl -l | grep -oh -P "(?<=$BEFORE_WINDOW_NAME\ ).*")
#MODIFY MONITORS if needed
declare -a MONITORS=(
'0'     # Monitor 1
'2150'  # Monitor 2
);  
declare -a SKIPPED_WINDOWS=(
'XdndCollectionWindowImp'
'unity-launcher'
'unity-panel'
'unity-dash'
'Hud'
'Desktop'
'Ubuntu'
);

#loop through window names and move them
for i in $WINDOWS; do
  if [[ " ${SKIPPED_WINDOWS[@]} " =~ " ${i} " ]]; then
    # whatever you DO NOT want to do when arr contains value
#    echo "Skipping $i"
    echo ""
  else
    # whatever you want to do when arr contains value
    echo "Moving $i"
    wmctrl -r "$i" -b remove,maximized_vert,maximized_horz
    wmctrl -r "$i" -e 0,"${MONITORS[$1]}",0,800,800
    wmctrl -r "$i" -b add,maximized_vert,maximized_horz
  fi
done

答案3

我很想找到更好的解决方案,但是康比兹团体窗户。

答案4

此外@Ramón回答(谢谢 bwt)。我想将所有窗口移到主显示器上,所以我用了xrandr这个。

*通常在运行时,主监视器在输出列表中会标有xrandr --listactivemonitors

sven@NB-PF26RJG3:~$ xrandr --listactivemonitors
Monitors: 3
 0: +*DVI-I-1-1 1920/598x1080/336+2560+1080  DVI-I-1-1
 1: +eDP-1 1920/309x1080/174+2560+0  eDP-1
 2: +DVI-I-2-2 2560/597x1440/336+0+1080  DVI-I-2-2

所以我添加了一些额外的行来确定主显示器的原始xy

MAIN_MONITOR_WORSPACE=`xrandr --listactivemonitors | awk '/\+\*/ {print $3}' | awk '{ print $2, $3}' FS=+`
declare -i x=`echo "${MAIN_MONITOR_WORSPACE}" | awk '{print $1}'`
declare -i y=`echo "${MAIN_MONITOR_WORSPACE}" | awk '{print $2}'`

# Some horizontal padding, i have my taskbar vertically on the left
x=$((${x} + 24))

相关内容