모든 창을 다른 작업 공간으로 이동하는 방법


8

하나의 작업 공간에서 다른 창으로 모든 창 (또는 최소화되지 않은 창 모두)을 이동할 수 있습니까?

Shift+ Ctrl+ Alt+를 사용하여 하나의 창을 다른 작업 공간으로 arrow옮길 수는 있지만 해당 창 하나만 이동합니다.


여전히 Unity 솔루션에 관심이 있습니까?
Jacob Vlijm

예, Unity 솔루션을 원했습니다. 죄송합니다, 나는 정확히 내가 유니티를 사용하고 지정 didnt한다
betatester07

이거 알아? 시도하지 않았지만 여전히 작동하는지 모르겠습니다. 그렇지 않다면 바로 가기 키 조합으로 대안을 만들 수 있습니다.
Jacob Vlijm

아, 죄송합니다. 단일 창입니다.
Jacob Vlijm

그것에 대해 작업하고 있으며 "종류의"작업 스크립트가 있습니다. 그러나 무작위로 발생하는 문제는 거의 사용할 수 없습니다. 내가 원인을 찾으면 게시 할 것입니다.
Jacob Vlijm

답변:


5

Unity : 뷰포트 란 무엇입니까?

우분투 유니티는 뷰포트를 사용합니다. 기본적으로 좌표계 (좌표 0,0은 왼쪽 상단)는 하나의 거대한 데스크탑이 화면 해상도에 맞는 덩어리로 세분화되어 있습니다. 오른쪽과 아래쪽으로 이동하면 좌표의 가치가 증가합니다.

여기에 이미지 설명을 입력하십시오

좌표계는 상대적입니다. 내 현재 뷰포트가 왼쪽 위에 있으면 해당 뷰포트와 관련된 모든 것이 너비와 높이의 증분으로 양수 값이됩니다. 예를 들어, 현재 뷰포트가 가장 왼쪽 상단 인 경우, 상단 중앙 작업 공간의 파이어 폭스 창은 가장 왼쪽 상단 뷰포트에 대해 x 값 1366과 y 값 0에 위치합니다. 활성 뷰포트가 맨 위 가운데 뷰포트 인 경우 맨 왼쪽 맨 위 뷰포트의 터미널 창은 x 값 -1327 60에 배치 됩니다. 음수를 처리하지 않기 때문에이 문제는 주요 문제입니다xdotoolxdotool .

또한 현재 뷰포트의 왼쪽 상단 모서리는 항상 xdotool에서 좌표 0 0으로 가정합니다. 그것은 우리가 물건을 상하로만 움직일 수 있다는 것을 의미합니다.

Unity 용 xdotool 작동

이제 우리는 xdotool왼쪽 상단 모서리를 기준으로 만 창을 이동할 수 있다는 것을 알고 있습니다. 우리는 어떻게 그 일을 연합시키기 위해 노력합니까? 기본 아이디어는

  1. 현재 뷰포트의 모든 창을 파악
  2. 요청한 뷰포트로 잠시 이동하여 왼쪽 상단 코너에서 해당 뷰포트의 좌표가 0 0이되도록합니다.
  3. 모든 창을 사용자 정의 뷰포트 좌표로 이동
  4. 이전 뷰포트로 돌아갑니다 (선택 사항, 창을 따를 수도 있음)

스크립팅 솔루션

아래 스크립트는 위에서 설명한 절차를 정확하게 수행합니다. -v좌표를 수동으로 지정하기 위해 플래그로 호출 하거나 -gGUI 대화 상자를 표시하기 위해 플래그를 사용할 수 있습니다 . -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 파일을 키보드 조합에 어떻게 바인딩합니까?를 참조하십시오 .

wmctrlxdotool제대로 작동하려면이 스크립트가 필요합니다. 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 개의 투표를받는 방법에 놀랍습니다.
nutty about natty

3

비 Compiz 기반 데스크탑 환경 (XFCE, LXDE, GNOME, KDE ...)

당신의 조합을 사용할 수 있습니다 wmctrlxdotool이에 대한합니다. 먼저 다음 두 유틸리티가 설치되어 있는지 확인하십시오.

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)

Compiz (Unity의 창 관리자) 가 전통적인 의미에서 데스크탑을 사용하지 않기 때문에 Unity와 같은 데스크탑 환경에 대한 솔루션을 찾기가 어렵습니다 .


고마워, 좋아 보인다. 그러나 나는 Unity를 사용하고 있으며 간단한 해결책을 원했습니다. 그러나 당신이 언급 한 바와 같이, 유니티에 대한 해결책은 좀 더 어려울 것
betatester07

"창 ID가 $ i 인 창을 작업 공간 2로 이동"의 작업 공간 2에 대한 간단한 설명입니다. 첫 번째 작업은 0으로 시작하므로 실제로 두 번째 작업 공간이 아닌 세 번째 작업 공간입니다. 따라서 작업 공간이 두 개인 경우 스크립트가 작동하지 않는 것처럼 보일 수 있습니다.
Mohamad Fakih
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.