当将我的笔记本电脑从双视图外接显示器移除回单个屏幕时,我希望有一个命令将所有窗口移动到我的主屏幕上。
尽管 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 n
,n
监视器在哪里移动窗口。
#! /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
所以我添加了一些额外的行来确定主显示器的原始x
和y
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))