web-dev-qa-db-ja.com

1つのコマンドですべてのウィンドウを1つの画面に移動するにはどうすればよいですか?

ラップトップをTwinview外部モニターから単一の画面にドッキング解除するとき、すべてのウィンドウをプライマリ画面に移動する単一のコマンドが必要です。

Nvidiaはウィンドウのエッジが見えるようにいくつかの作業を行いますが、マウス、キーボード、またはcompizプラグインで各ウィンドウを移動するには時間がかかります。

3
Cas

以下で作成したスクリプトは私のために機能し、wmctrlのみを必要とします。 UbuntuでSudo apt-get install wmctrlコマンドを使用してこれを取得できます。

必要に応じて、いくつかのマイナーな変更を作成する必要があります。

$BEFORE_WINDOW_NAMEは、プルしたコンピューター名の最後の文字列に設定する必要があります(これはSystem Settings> Details> Device name)。

$MONITORSこれは2つのモニターで機能します(1920x####の解像度で)。ただし、デバイスに接続されている各モニターに要素を設定して設定し、この変数を再定義できます。その画面上の任意のx座標に。

$SKIPPED_WINDOWSは、このスクリプトが呼び出されたときに移動したくないウィンドウのリストです。アイテムを自由に追加または削除してください。コマンドwmctrl -lを入力すると、アイテムのリストを表示できます。

最後に、このスクリプトは1つのパラメーター、つまり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

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そして、そのためのランチャーを作成します。

3
Ramón

より良い解決策を見つけたいのですが、 Compiz には Group ウィンドウがあります。

0
earthmeLon