すべてのウィンドウを別のワークスペースに移動する方法


8

ワークスペースからすべてのウィンドウ(または最小化されていないウィンドウ)を別のワークスペースに移動することはできますか?

Shift+ Ctrl+ Alt+ arrowで1つのウィンドウを他のワークスペースに移動できることはわかっていますが、移動するのはその1つのフォーカスされたウィンドウだけです。


Unityソリューションにまだ興味がありますか?
Jacob Vlijm 2015

はい、Unityのソリューションが必要でした。申し訳ありませんが、私はUnityを使用していることを正確に指定していません
でした

これに気づきましたか?私は試しませんでした、それがまだ機能するかどうかわかりません。そうでない場合は、ショートカットキーの組み合わせで代替案を作成することを検討します。
Jacob Vlijm 2015

ああ、ごめんなさい、それは単一のウィンドウのためのものです、それを調べます!
Jacob Vlijm 2015

それに取り組んできており、 "一種の"作業スクリプトがあります。ただし、ランダムに発生する問題により、使用が困難になります。何が原因かを見つけたら、投稿します。
Jacob Vlijm 2015年

回答:


5

Unity:ビューポートとは何ですか?

Ubuntu Unityはビューポートを使用します-基本的には座標系(座標0,0が左上隅)で、1つの巨大なデスクトップが画面の解像度に合わせてチャンクに分割されています。座標は、右下に移動するにつれて値が大きくなります。

ここに画像の説明を入力してください

座標系は相対的です。現在のビューポートが左上にある場合、そのビューポートに関連するすべての要素は、幅と高さの増分で正の値になります。たとえば、現在のビューポートが左上にある場合、上に表示される上部中央のワークスペースのFirefoxウィンドウは、左上にあるビューポートに対してx値1366およびy値0に配置されます。アクティブなビューポートが上中央のビューポートである場合、左上のビューポートのターミナルウィンドウはx値-1327 60に配置され ます。は負の数を処理しないため、の重要な問題ですxdotoolxdotool

また、現在のビューポートの左上隅は常にxdotoolによって座標0 0と見なされます。つまり、右と下にのみ移動できます。

Unityでxdotoolを機能させる

これで、xdotoolウィンドウが左上隅を基準にしてのみ移動できることがわかりました(つまり、常にウィンドウを上下に移動できますが、上下には移動できません)。どのようにして団結のためにそれを機能させるのか。まあ、基本的なアイデアは

  1. 現在のビューポートのすべてのウィンドウを把握する
  2. 要求されたビューポートに一時的に移動して、左上隅がそのビューポートで座標0 0になるようにする
  3. すべてのウィンドウをユーザー定義のビューポート座標に移動します
  4. 古いビューポートに戻ります(オプションで、ウィンドウを追跡することもできます)

スクリプトソリューション

以下のスクリプトは、上記の手順を正確に実行します。-v手動で座標を指定する-gフラグを使用して呼び出すことも、フラグを使用してGUIダイアログを表示することもできます。-fフラグはスクリプトにビューポートも切り替えるよう指示します。そのフラグが使用されていない場合-現在のビューポートに留まり、ウィンドウのみが移動されます

スクリプトの入手

この投稿から直接、または次の手順でgithubを介してソースコードをコピーできます。

  1. sudo apt-get install git
  2. cd /opt ; sudo git clone https://github.com/SergKolo/sergrep.git
  3. 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ウィンドウマネージャーオプションでウィンドウスナップをインストールおよび設定解除します。


このような専用の答えは...のみ2-3 upvotesを取得する方法を素晴らしい
粋についてのナッツの

3

非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のウィンドウマネージャー)が従来の意味でデスクトップを使用しないという事実により困難になっています


ありがとう、よさそうだ。しかし、私はUnityを使用していて、簡単な解決策を望んでいました。しかし、あなたが述べたように、Unityのソリューションはもう少し難しいでしょう
betatester07

"ウィンドウID $ iのウィンドウをワークスペース2に移動する"のワークスペース2 最初のものはゼロから始まるため、実際には2番目ではなく3番目のワークスペースです。したがって、ワークスペースが2つしかない場合、スクリプトは機能していないように見えることがあります。
Mohamad Fakih
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.