Làm thế nào để di chuyển tất cả các cửa sổ sang không gian làm việc khác


8

Có thể di chuyển tất cả các cửa sổ (hoặc tất cả các cửa sổ không được thu nhỏ) tạo thành không gian làm việc này sang không gian làm việc khác không?

Tôi biết tôi có thể di chuyển một cửa sổ sang không gian làm việc khác với Shift+ Ctrl+ Alt+ arrow, nhưng nó sẽ chỉ di chuyển một cửa sổ tập trung đó.


Bạn vẫn quan tâm đến một giải pháp Unity?
Jacob Vlijm

vâng, tôi muốn giải pháp cho Unity. xin lỗi, tôi không xác định chính xác rằng tôi đang sử dụng Unity
betatester07

Bạn có nhận thấy điều này? Tôi đã không thử, không biết nếu nó vẫn hoạt động. Nếu không, tôi có thể xem xét để thay thế dưới tổ hợp phím tắt.
Jacob Vlijm

Ah, xin lỗi, đó là cho một cửa sổ duy nhất, sẽ xem xét nó!
Jacob Vlijm

Đã làm việc trên nó, và có một "loại" kịch bản làm việc. Tuy nhiên, các vấn đề xảy ra ngẫu nhiên làm cho nó khó sử dụng. sẽ đăng nó nếu tôi tìm ra nguyên nhân của nó.
Jacob Vlijm

Câu trả lời:


5

Thống nhất: Viewports là gì?

Ubuntu Unity sử dụng chế độ xem - về cơ bản là một hệ tọa độ (với tọa độ 0,0 là góc trên cùng bên trái), trong đó một máy tính để bàn khổng lồ được chia thành các khối phù hợp với độ phân giải màn hình của bạn. Tọa độ tăng giá trị khi bạn di chuyển sang phải và xuống dưới.

nhập mô tả hình ảnh ở đây

Hệ tọa độ là tương đối. Nếu chế độ xem hiện tại của tôi ở trên cùng bên trái, mọi thứ liên quan đến chế độ xem đó sẽ là các giá trị dương theo gia số chiều rộng và chiều cao. Chẳng hạn, nếu chế độ xem hiện tại của tôi ở trên cùng bên trái, cửa sổ firefox trong không gian làm việc ở giữa trên cùng mà bạn thấy ở trên được đặt ở giá trị x 1366 và giá trị y 0 so với chế độ xem ngoài cùng bên trái. Nếu chế độ xem hoạt động của tôi ở giữa trên cùng, cửa sổ đầu cuối ở chế độ xem ngoài cùng bên trái được đặt ở giá trị x -1327 60. Đây là vấn đề chínhxdotoolxdotoolkhông xử lý các số âm.

Cũng lưu ý rằng, góc trên cùng bên trái của chế độ xem hiện tại của bạn sẽ luôn được xdotool giả sử là tọa độ 0 0. Điều đó có nghĩa là chúng ta chỉ có thể di chuyển công cụ đúng và xuống.

Làm xdotool hoạt động cho Unity

Bây giờ chúng tôi biết rằng xdotoolcó thể di chuyển các cửa sổ chỉ liên quan đến góc trên bên trái của chúng tôi (nghĩa là bạn luôn có thể di chuyển cửa sổ xuống và phải, nhưng không bao giờ lên và sang trái). Làm thế nào để chúng ta làm việc đó cho sự thống nhất. Chà, ý tưởng cơ bản sẽ là

  1. Chỉ ra tất cả các cửa sổ trên chế độ xem hiện tại
  2. Di chuyển đến chế độ xem được yêu cầu trong giây lát để tạo góc trên cùng bên trái giả sử tọa độ 0 0 tại chế độ xem đó
  3. Di chuyển tất cả các cửa sổ sang tọa độ khung nhìn do người dùng xác định
  4. Quay trở lại chế độ xem cũ (tùy chọn, cũng có thể theo các cửa sổ)

Giải pháp kịch bản

Kịch bản dưới đây thực hiện chính xác các thủ tục được mô tả ở trên. Nó có thể được gọi bằng một trong hai -vcờ để chỉ định tọa độ theo cách thủ công hoặc bạn có thể sử dụng -gcờ để hiển thị hộp thoại GUI. -fcờ sẽ báo cho kịch bản chuyển đổi chế độ xem; nếu cờ đó không được sử dụng - bạn sẽ vẫn ở chế độ xem hiện tại và chỉ các cửa sổ sẽ được di chuyển xung quanh

Lấy kịch bản

Người ta có thể sao chép mã nguồn từ bài đăng này trực tiếp hoặc thông qua github bằng các bước sau:

  1. sudo apt-get install git
  2. cd /opt ; sudo git clone https://github.com/SergKolo/sergrep.git
  3. sudo chmod -R +x sergrep

Tệp script sẽ là /opt/sergrep/move_viewport_windows.sh

Để liên kết tập lệnh với phím tắt, hãy tham khảo Làm cách nào để liên kết các tệp .sh với tổ hợp bàn phím?

Lưu ý rằng wmctrlxdotoolđược yêu cầu để kịch bản này hoạt động đúng. Bạn có thể cài đặt chúng qua sudo apt-get install xdotool và wmctrl

Mã nguồn

#!/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 "$@"

Bản giới thiệu

Webm ghi lại kịch bản đang hoạt động:

https://www.youtube.com/watch?v=cJMlC41CWWo

Các vấn đề

Do gridplugin của Unity chịu trách nhiệm chụp nhanh cửa sổ, tập lệnh không thể di chuyển các cửa sổ được bật tối đa hoặc phải / trái. Nó sẽ được cố gắng thêm phần không cài đặt tạm thời và đặt lại plugin đó để làm cho tập lệnh hoạt động với tất cả các cửa sổ, nhưng vì việc đặt lại và đặt lại có độ trễ về thời gian, nó có thể bị bỏ qua như một ý tưởng. Nếu bạn muốn tập lệnh hoạt động với tất cả các cửa sổ, hãy cài đặt unity-tweak-toolvà bỏ cài đặt cửa sổ chụp bên dưới các tùy chọn Trình quản lý cửa sổ.


thật đáng ngạc nhiên khi một câu trả lời tận tình như thế này chỉ nhận được 2-3 lượt upvote ...
hấp dẫn về

3

Các môi trường máy tính để bàn không dựa trên Compiz (XFCE, LXDE, Gnome, KDE ...)

Bạn có thể sử dụng kết hợp wmctrlxdotoolcho việc này. Trước tiên hãy đảm bảo hai tiện ích này được cài đặt:

sudo apt-get install xdotool wmctrl

Với các phụ thuộc thỏa mãn, bạn có thể sử dụng một lớp lót sau để di chuyển tất cả các cửa sổ trên màn hình hiện tại sang một màn hình khác:

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)

Phân tích nhanh các lệnh được sử dụng:

  • wmctrl -l | awk -v var=$(xdotool get_desktop) '{if ($2 == var) print $0;}' | cut -d' ' -f1

    Liệt kê tất cả các cửa sổ, lọc ra những cái không có trên không gian làm việc hiện tại và trích xuất ID cửa sổ của chúng

  • wmctrl -i -t 2 -r "$i"

    Di chuyển cửa sổ với ID cửa sổ $isang không gian làm việc 2.

  • tất cả điều này được đóng gói trong một while read ... do; donevòng lặp đơn giản lặp đi lặp lại trên tất cả các cửa sổ trên màn hình hiện tại

Môi trường máy tính để bàn dựa trên Compiz (ví dụ: Unity)

Việc tìm giải pháp cho các môi trường máy tính để bàn như Unity trở nên khó khăn bởi thực tế là Compiz (trình quản lý cửa sổ của Unity) không sử dụng máy tính để bàn theo nghĩa truyền thống .


cảm ơn, có vẻ tốt nhưng tôi đang sử dụng Unity và hy vọng một số giải pháp đơn giản. Nhưng như bạn đã đề cập, giải pháp cho Unity sẽ khó khăn hơn một chút
betatester07

Chỉ cần một nhận xét nhỏ, không gian làm việc 2 trong "Di chuyển cửa sổ với ID cửa sổ $ i sang không gian làm việc 2." thực sự là không gian làm việc thứ ba, không phải là không gian thứ hai, vì không gian làm việc thứ nhất bắt đầu bằng không. Vì vậy, nếu bạn chỉ có hai không gian làm việc, tập lệnh có thể trông không hoạt động.
Mohamad Fakih
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.