하나의 작업 공간에서 다른 창으로 모든 창 (또는 최소화되지 않은 창 모두)을 이동할 수 있습니까?
Shift+ Ctrl+ Alt+를 사용하여 하나의 창을 다른 작업 공간으로 arrow옮길 수는 있지만 해당 창 하나만 이동합니다.
하나의 작업 공간에서 다른 창으로 모든 창 (또는 최소화되지 않은 창 모두)을 이동할 수 있습니까?
Shift+ Ctrl+ Alt+를 사용하여 하나의 창을 다른 작업 공간으로 arrow옮길 수는 있지만 해당 창 하나만 이동합니다.
답변:
Unity : 뷰포트 란 무엇입니까?
우분투 유니티는 뷰포트를 사용합니다. 기본적으로 좌표계 (좌표 0,0은 왼쪽 상단)는 하나의 거대한 데스크탑이 화면 해상도에 맞는 덩어리로 세분화되어 있습니다. 오른쪽과 아래쪽으로 이동하면 좌표의 가치가 증가합니다.
좌표계는 상대적입니다. 내 현재 뷰포트가 왼쪽 위에 있으면 해당 뷰포트와 관련된 모든 것이 너비와 높이의 증분으로 양수 값이됩니다. 예를 들어, 현재 뷰포트가 가장 왼쪽 상단 인 경우, 상단 중앙 작업 공간의 파이어 폭스 창은 가장 왼쪽 상단 뷰포트에 대해 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
이에 대한합니다. 먼저 다음 두 유틸리티가 설치되어 있는지 확인하십시오.
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와 같은 데스크탑 환경에 대한 솔루션을 찾기가 어렵습니다 .