
複数のモニターにまたがって複数のウィンドウが開いているとします。その後、1 つのモニターに切り替えると (おそらく、ラップトップをドッキング ステーションから取り外したため)、すべてのウィンドウが 1 つの画面に表示されます。
次に、マルチモニター構成に戻します。画面スペースは広くなりましたが、最初はすべてのウィンドウが 1 つのモニターに積み重なっています。ウィンドウが元のモニターに戻れば便利です。
これを実現する方法について何かアイデアはありますか?
答え1
xdoツール
大まかなアイデアですが、いくつかのコマンドを作成することで目的を達成できます。xdotool
1 台または 2 台のモニターが接続されている場合は、それに応じて実行できます。
この記事には、これをどのように実行できるかについての非常に良い例があります。Xubuntu – モニター間でウィンドウを移動する。
セクションからの抜粋: アクティブ ウィンドウを他のモニターに移動する (ついに!)
私たちが行う必要があるのは以下のとおりです。
- アクティブなウィンドウを見つける
- 最大化された状態を取得し、それを記憶する
- 最大化を解除
- ジオメトリを取得する
- 新しい位置を計算する
- それを移動
- 以前の状態に基づいて最大化
- 上げる
これを実行するスクリプトは次のとおりです。
wid=`xdotool getactivewindow`
max_state=`xprop -id $wid _NET_WM_STATE`
wmctrl -ir $wid -b remove,maximized_vert,maximized_horz
eval `xdotool getwindowgeometry --shell $wid`
new_x=1600
if [[ "$X" -ge "$new_x" ]]; then
new_x=0
fi
xdotool windowmove $wid $new_x $Y
if [ -z "${max_state/*_NET_WM_STATE_MAXIMIZED_*/}" ]; then
wmctrl -ir $wid -b add,maximized_vert,maximized_horz
fi
xdotool windowraise $wid
よりインタラクティブな方法
また、別のアプローチも見つけました。これも を利用しますxdotool
が、シェル スクリプトでラップして、ショートカット キーに関連付けることができます。この方法を使用すると、ウィンドウを選択して、そのウィンドウを前面に出してフォーカスを当て、ショートカット キーの組み合わせを押すと、アプリケーションを別のウィンドウに送ることができます。この記事のタイトルは次のとおりです。モニター間でウィンドウを移動する。
このメソッドは次のスクリプトを提供しますwindowmove.sh
。
#!/bin/bash
if [ $1 -eq 2 ]
then
POS1=`xrandr --current | head -2 | tail -1 | cut -d 'x' -f1 | cut -d ' ' -f3`
POS2=0
else
POS1=0
POS2=0
fi
/usr/bin/xdotool windowmove `/usr/bin/xdotool getwindowfocus` $POS1 $POS2
exit 0
POS1 は、xrandr の出力を使用してメイン画面の幅を計算します。スクリプトがウィンドウを右に移動できないが、左に移動できることがわかった場合は、その行を POS1=1920 に置き換え、1920 をメイン モニターのピクセル単位の幅に置き換えてみてください。
次に、キーボード バインディング アプレットを実行します。
$ gnome-keybinding-properties
注記:これは、GUI を介してさまざまなディストリビューションのさまざまな場所から実行できます。
次の 2 つのアプリケーションの起動を使用して 2 つのキーバインドを作成します。
- バインディング#1のコマンド:
./Scripts/windowmove.sh 1
- バインディング#2のコマンド:
./Scripts/windowmove.sh 2
答え2
は必要ありませんxdotool
。すべてのウィンドウの位置を記録しておき、後で だけで復元できますwmctrl
。
記録:wmctrl -lG > ${rcfile}
場所:
while read row; do
IFS=" " read id g x y w h _ <<< ${row}
wmctrl -ir ${id} -e 0,${x},${y},${w},${h}
done < ${rcfile}