ワークスペースからすべてのウィンドウ(または最小化されていないウィンドウ)を別のワークスペースに移動することはできますか?
Shift+ Ctrl+ Alt+ arrowで1つのウィンドウを他のワークスペースに移動できることはわかっていますが、移動するのはその1つのフォーカスされたウィンドウだけです。
ワークスペースからすべてのウィンドウ(または最小化されていないウィンドウ)を別のワークスペースに移動することはできますか?
Shift+ Ctrl+ Alt+ arrowで1つのウィンドウを他のワークスペースに移動できることはわかっていますが、移動するのはその1つのフォーカスされたウィンドウだけです。
回答:
Unity:ビューポートとは何ですか?
Ubuntu Unityはビューポートを使用します-基本的には座標系(座標0,0が左上隅)で、1つの巨大なデスクトップが画面の解像度に合わせてチャンクに分割されています。座標は、右下に移動するにつれて値が大きくなります。
座標系は相対的です。現在のビューポートが左上にある場合、そのビューポートに関連するすべての要素は、幅と高さの増分で正の値になります。たとえば、現在のビューポートが左上にある場合、上に表示される上部中央のワークスペースのFirefoxウィンドウは、左上にあるビューポートに対してx値1366およびy値0に配置されます。アクティブなビューポートが上中央のビューポートである場合、左上のビューポートのターミナルウィンドウはx値-1327 60に配置され ます。は負の数を処理しないため、の重要な問題ですxdotool
xdotool
。
また、現在のビューポートの左上隅は常にxdotoolによって座標0 0と見なされます。つまり、右と下にのみ移動できます。
Unityでxdotoolを機能させる
これで、xdotool
ウィンドウが左上隅を基準にしてのみ移動できることがわかりました(つまり、常にウィンドウを上下に移動できますが、上下には移動できません)。どのようにして団結のためにそれを機能させるのか。まあ、基本的なアイデアは
スクリプトソリューション
以下のスクリプトは、上記の手順を正確に実行します。-v
手動で座標を指定する-g
フラグを使用して呼び出すことも、フラグを使用してGUIダイアログを表示することもできます。-f
フラグはスクリプトにビューポートも切り替えるよう指示します。そのフラグが使用されていない場合-現在のビューポートに留まり、ウィンドウのみが移動されます
スクリプトの入手
この投稿から直接、または次の手順でgithubを介してソースコードをコピーできます。
sudo apt-get install git
cd /opt ; sudo git clone https://github.com/SergKolo/sergrep.git
sudo chmod -R +x sergrep
スクリプトファイルは /opt/sergrep/move_viewport_windows.sh
スクリプトをショートカットにバインドするには、「。shファイルをキーボードの組み合わせにバインドするにはどうすればよいですか?」を参照してください。
このスクリプトが正しく機能するには、wmctrl
およびxdotool
が必要であることに注意してください。sudo apt-get install xdotoolとwmctrlでインストールできます。
ソースコード
#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com
# Date: April 17 2016
# Purpose: Move all windows on the current viewport
# to a user-defined one
# Written for:
# Tested on: Ubuntu 14.04 LTS , Unity 7.2.6
###########################################################
# Copyright: Serg Kolo , 2016
#
# Permission to use, copy, modify, and distribute this software is hereby granted
# without fee, provided that the copyright notice above and this permission statement
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
get_active_viewport()
{
xprop -root -notype _NET_DESKTOP_VIEWPORT
}
get_screen_geometry()
{
xwininfo -root | awk '/-geometry/{gsub(/+|x/," ");print $2,$3}'
}
current_wins()
{
HEX="$(wmctrl -lG | \
awk -v xlim="$XMAX" -v ylim="$YMAX" \
'BEGIN{printf "ibase=16;"} $3>0 && $3<xlim && $4>0 && $4<ylim \
{ gsub(/0x/,""); printf "%s;",toupper($1) } ')"
echo $HEX | bc | tr '\n' ' '
}
gui_selection()
{
SCHEMA="org.compiz.core:/org/compiz/profiles/unity/plugins/core/"
read swidth sdepth <<< "$(get_screen_geometry)"
vwidth=$(gsettings get $SCHEMA hsize)
vheight=$(gsettings get $SCHEMA vsize)
width=0
for horizontal in $(seq 1 $vwidth); do
height=0
for vertical in $(seq 1 $vheight); do
array+=( FALSE )
array+=( $(echo "$width"x"$height") )
height=$(($height+$sdepth))
done
width=$(($width+$swidth))
done
zenity --list --radiolist --column="" --column "CHOICE" ${array[@]} --width 350 --height 350 2> /dev/null
}
print_usage()
{
cat << EOF
move_viewport_windows.sh [-v 'XPOS YPOS' ] [-g] [-f ] [-h]
Copyright Serg Kolo , 2016
The script gets list of all windows on the current Unity
viewport and moves them to user-specified viewport. If
ran without flags specified, script prints this text
-g flag brings up GUI dialog with list of viewports
-v allows manually specifying viewoport. Argument must be
quoted, X and Y position space separated
-f if set, the viewport will switch to the same one where
windows were sent
-h prints this text
** NOTE **
wmctrl and xdotool are required for this script to work
properly. You can install them via sudo apt-get install
xdotool and wmctrl
EOF
}
parse_args()
{
if [ $# -eq 0 ];then
print_usage
exit
fi
while getopts "v:ghf" opt
do
case ${opt} in
v) NEWVP=${OPTARG}
;;
g) NEWVP="$(gui_selection | tr 'x' ' ' )"
[ -z "$NEWVP" ] && exit 1
;;
f) FOLLOW=true
;;
h) print_usage
exit 0
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
shift $((OPTIND-1))
}
main()
{
# Basic idea:
#-------------------
# 1. get current viewport and list of windows
# 2. go to viewport 0 0 and move all windows from list
# to desired viewport
# 3. go back to original viewport or follow the windows,
# depending on user choice
# 4. Tell the user where they are currently
local FOLLOW
local NEWVP # coordinates of desired viewport
local XMAX YMAX # must be two vals for awk to work
local OLDVP=$(get_active_viewport | awk -F '=' '{sub(/,/," ");print $2}' )
parse_args "$@"
read XMAX YMAX <<< "$(get_screen_geometry)" # move to getopts
windows=( $(current_wins) )
xdotool set_desktop_viewport 0 0
for win in ${windows[@]} ; do
echo "$win"
xdotool windowmove $win $NEWVP
done
# sleep 0.25 # uncomment if necessary
if [ $FOLLOW ]; then
xdotool set_desktop_viewport $NEWVP
else
xdotool set_desktop_viewport $OLDVP
fi
sleep 0.25 # delay to allow catching active viewport
notify-send "current viewport is $(get_active_viewport | awk -F '=' '{sub(/,/," ");print $2}' )"
exit 0
}
main "$@"
デモ
実行中のスクリプトのWebm記録:
https://www.youtube.com/watch?v=cJMlC41CWWo
問題
grid
ウィンドウのスナップを担当するUnityのプラグインのため、スクリプトは最大化された、または右/左のスナップされたウィンドウを移動できません。スクリプトをすべてのウィンドウで機能させるために、そのプラグインの一時的な未設定とリセットを追加しようとしますが、設定解除とリセットには時間がかかるため、アイデアとして放棄される可能性があります。スクリプトがすべてのウィンドウで機能するようにする場合は、unity-tweak-tool
ウィンドウマネージャーオプションでウィンドウスナップをインストールおよび設定解除します。
非Compizベースのデスクトップ環境(XFCE、LXDE、GNOME、KDE ...)
wmctrl
との組み合わせを使用できますxdotool
。まず、これら2つのユーティリティがインストールされていることを確認します。
sudo apt-get install xdotool wmctrl
依存関係が満たされると、次のワンライナーを使用して、現在のデスクトップ上のすべてのウィンドウを別のウィンドウに移動できるはずです。
while read i; do wmctrl -i -t 2 -r "$i" ; done < <(wmctrl -l | awk -v var=$(xdotool get_desktop) '{if ($2 == var) print $0;}' | cut -d' ' -f1)
使用したコマンドの簡単な内訳:
wmctrl -l | awk -v var=$(xdotool get_desktop) '{if ($2 == var) print $0;}' | cut -d' ' -f1
すべてのウィンドウを一覧表示し、現在のワークスペースにないウィンドウを除外して、ウィンドウIDを抽出します
wmctrl -i -t 2 -r "$i"
ウィンドウIDのウィンドウ$i
をワークスペース2に移動します。
これはwhile read ... do; done
すべて、現在のデスクトップのすべてのウィンドウを反復する単純なループにパックされています
Compizベースのデスクトップ環境(Unityなど)
Unityなどのデスクトップ環境向けのソリューションを見つけることは、Compiz(Unityのウィンドウマネージャー)が従来の意味でデスクトップを使用しないという事実により困難になっています。