Cara memindahkan semua jendela ke ruang kerja lain

8

Apakah mungkin untuk memindahkan semua jendela (atau semua jendela yang tidak diperkecil) dari satu ruang kerja ke ruang kerja lainnya?

Saya tahu saya bisa memindahkan satu jendela ke ruang kerja lain dengan Shift+ Ctrl+ Alt+ arrow, tetapi hanya akan memindahkan satu jendela yang terfokus itu.

betatester07
sumber
Apakah Anda masih tertarik dengan solusi Unity?
Jacob Vlijm
ya, saya ingin solusi untuk Unity. maaf, saya tidak benar-benar menentukan bahwa saya menggunakan Unity
betatester07
Apakah Anda memperhatikan yang ini? Saya tidak mencoba, tidak tahu apakah itu masih berfungsi. Jika tidak, saya bisa melihat ke dalam untuk membuat alternatif di bawah kombinasi tombol pintas.
Jacob Vlijm
Ah, maaf, itu untuk satu jendela, akan memeriksanya!
Jacob Vlijm
Telah mengerjakannya, dan memiliki "semacam" naskah kerja. Namun, masalah yang terjadi secara acak membuatnya sulit digunakan. akan mempostingnya jika saya tahu apa penyebabnya.
Jacob Vlijm

Jawaban:

5

Unity: Apa itu Viewports?

Ubuntu Unity menggunakan viewports - pada dasarnya sistem koordinat (dengan koordinat 0,0 menjadi sudut kiri atas), di mana satu desktop raksasa dibagi menjadi beberapa bagian yang sesuai dengan resolusi layar Anda. Koordinat tumbuh nilainya saat Anda bergerak ke kanan dan ke bawah.

masukkan deskripsi gambar di sini

Sistem koordinat bersifat relatif. Jika viewport saya saat ini adalah kiri atas, segala sesuatu yang relatif terhadap viewport itu akan menjadi nilai positif dengan penambahan lebar dan tinggi. Misalnya, jika viewport saya saat ini adalah paling kiri atas, jendela firefox di ruang kerja tengah atas yang Anda lihat di atas diposisikan pada nilai x 1366 dan nilai y 0 relatif terhadap viewport paling kiri atas. Jika viewport aktif saya adalah yang paling atas, jendela terminal di viewport paling kiri atas diposisikan pada nilai x -1327 60. Ini adalah masalah utama untukxdotool , karena xdotooltidak berurusan dengan angka negatif.

Perhatikan juga bahwa, sudut kiri atas viewport Anda saat ini akan selalu dianggap oleh xdotool sebagai koordinat 0 0. Itu berarti kita hanya bisa memindahkan barang ke kanan dan ke bawah.

Membuat xdotool berfungsi untuk Unity

Sekarang kita tahu bahwa hanya xdotooldapat memindahkan jendela relatif ke sudut kiri atas kami (yaitu, Anda selalu dapat memindahkan jendela ke bawah dan ke kanan, tetapi tidak pernah ke atas dan ke kiri). Bagaimana kita membuatnya bekerja untuk persatuan. Yah, ide dasarnya adalah untuk

  1. Cari tahu semua jendela di viewport saat ini
  2. Pindah ke viewport yang diminta sebentar untuk membuat sudut kiri atas menganggap koordinat 0 0 di viewport itu
  3. Pindahkan semua jendela ke koordinat viewport yang ditentukan pengguna
  4. Kembali ke viewport lama (opsional, bisa mengikuti windows juga)

Solusi Penulisan

Script di bawah ini melakukan persis prosedur yang dijelaskan di atas. Itu dapat dipanggil dengan salah satu -vflag untuk secara manual menentukan koordinat atau Anda dapat menggunakan -gflag untuk membuka dialog GUI. -fflag akan memberitahu skrip untuk berganti viewport juga; jika bendera itu tidak digunakan - Anda akan tetap berada di viewport saat ini dan hanya jendela yang akan dipindahkan

Memperoleh naskah

Satu dapat menyalin kode sumber dari posting ini secara langsung atau melalui github menggunakan langkah-langkah berikut:

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

File skrip akan menjadi /opt/sergrep/move_viewport_windows.sh

Untuk mengikat skrip ke pintasan, lihat Bagaimana cara mengikat file .sh ke kombinasi keyboard?

Perhatikan bahwa wmctrldan xdotooldiperlukan agar skrip ini berfungsi dengan baik. Anda dapat menginstalnya melalui sudo apt-get install xdotool dan wmctrl

Kode sumber

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# 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 "$@"

Demo

Webm merekam skrip dalam aksi:

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

Masalah

Karena gridplugin Unity yang bertanggung jawab untuk gertakan jendela, skrip tidak dapat memindahkan jendela yang dimaksimalkan, atau kanan / kiri. Ini akan dicoba untuk menambahkan unset sesaat dan mengatur ulang plugin itu untuk membuat skrip bekerja dengan semua jendela, tetapi karena pengaturan ulang dan pengaturan ulang memiliki waktu tunda, itu mungkin ditinggalkan sebagai ide. Jika Anda ingin agar skrip berfungsi dengan semua jendela, instal unity-tweak-tooldan hapus gertakan jendela di bawah opsi Window Manager.

Sergiy Kolodyazhnyy
sumber
menakjubkan bagaimana jawaban khusus seperti ini hanya mendapat 2-3 upvotes ...
gila tentang natty
3

Lingkungan desktop berbasis Non-Compiz (XFCE, LXDE, GNOME, KDE ...)

Anda dapat menggunakan kombinasi dari wmctrldan xdotooluntuk ini. Pertama, pastikan kedua utilitas ini diinstal:

sudo apt-get install xdotool wmctrl

Dengan dependensi puas Anda harus dapat menggunakan satu-liner berikut untuk memindahkan semua jendela di desktop saat ini ke yang lain:

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)

Rincian cepat dari perintah yang digunakan:

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

    Buat daftar semua jendela, saring yang tidak ada di ruang kerja saat ini, dan ekstrak ID jendela mereka

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

    Pindahkan jendela dengan ID jendela $ike ruang kerja 2.

  • semua ini dikemas dalam satu while read ... do; doneloop sederhana yang berulang di semua jendela pada desktop saat ini

Lingkungan desktop berbasis perusahaan (mis. Unity)

Menemukan solusi untuk lingkungan desktop seperti Unity dipersulit oleh kenyataan bahwa Compiz (pengelola jendela Unity) tidak menggunakan desktop dalam pengertian tradisional .

Glutanimate
sumber
terima kasih, ini terlihat bagus. tetapi saya menggunakan Unity dan berharap untuk beberapa solusi sederhana. Tetapi seperti yang Anda sebutkan, solusi untuk Unity akan sedikit lebih sulit
betatester07
Hanya sebuah komentar kecil, workspace 2 di "Pindahkan jendela dengan jendela ID $ i ke workspace 2." sebenarnya ruang kerja ketiga, bukan yang kedua, karena yang pertama dimulai dengan nol. Jadi, jika Anda hanya memiliki dua ruang kerja, skrip mungkin terlihat tidak berfungsi.
Mohamad Fakih