Bagaimana saya bisa menambahkan ruang kerja secara otomatis, hanya jika saya membutuhkannya?

16

Asumsikan saya menggunakan 4 ruang kerja dan saya membutuhkan lebih banyak, apakah ada proses otomatis atau, jika tidak mungkin, cara mudah untuk menambahkan lebih banyak ruang kerja (daripada menginstal Ubuntu tweakdll.).

kernel_panic
sumber
@JacobVlijm imgur.com/LaDYwGb Dipilih dan Diterima, terima kasih atas jawaban yang sangat bagus
kernel_panic
Terkait: Posting lama ini bertanya pada "Bagaimana cara membuat lebih banyak ruang kerja dibuat / dihapus secara otomatis?" dengan dua jawaban berbeda. Kemudian lagi, jawaban yang lebih lama cenderung kurang puas jika dibandingkan dengan jawaban yang lebih baru di sini.
clearkimura

Jawaban:

14

Secara otomatis mengatur jumlah ruang kerja; menambah dan menghapus kolom dan baris, tergantung pada kebutuhan Anda

Di bawah versi skrip backround (yang) yang secara otomatis akan menambahkan ruang kerja jika Anda memasukkan kolom atau baris terakhir dari matriks ruang kerja Anda.

Begini Cara kerjanya:

  1. Jika Anda tiba di kolom atau baris terakhir, viewports tambahan ditambahkan:

    masukkan deskripsi gambar di sini

  2. Jika ruang kerja Anda tidak digunakan selama 5-10 detik dan tidak ada jendela di sana, ruang kerja tambahan akan dihapus lagi. Namun Anda akan selalu menyimpan satu baris tambahan di bawah ini, dan satu kolom tambahan di kanan viewport Anda saat ini:

    masukkan deskripsi gambar di sini

Naskah:

#!/usr/bin/env python3
import subprocess
import time
import math

# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10

def set_workspaces(size, axis):
    subprocess.Popen([
        "dconf", "write", "/org/compiz/profiles/unity/plugins/core/"+axis,
                str(size)
                ])

def get_res():
    resdata = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    curr = resdata.index("current")
    return (int(resdata[curr+1]), int(resdata[curr+3].replace(",", "")))

def wspace():
    try:
        sp = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
        return ([int(n) for n in sp[3].split("x")],
                [int(n) for n in sp[5].split(",")])

    except subprocess.CalledProcessError:
        pass


def clean_up(curr_col, curr_row):
    try:
        w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
        xpos = max([math.ceil((int(w[2])+span[1][0])/res[0]) for w in w_list])
        min_x = max(xpos, curr_col+1, hsize)
        if xpos >= hsize:
            set_workspaces(min_x, "hsize")
        else:
            set_workspaces(min_x, "hsize")
        ypos = max([math.ceil((int(w[3])+span[1][1])/res[1]) for w in w_list])
        min_y = max(ypos, curr_row+1, vsize)
        if ypos >= vsize:
            set_workspaces(min_y, "vsize")
        else:
            set_workspaces(min_y, "vsize")
    except subprocess.CalledProcessError:
        pass

res = get_res()
t = 0

while True:
    span = wspace()
    if span != None:
        cols = int(span[0][0]/res[0]); rows = int(span[0][1]/res[1])
        currcol = int((span[1][0]+res[0])/res[0])
        if all([currcol == cols, cols*rows < max_ws]):
            set_workspaces(cols+1, "hsize")
        currrow = int((span[1][1]+res[1])/res[1])
        if all([currrow == rows, cols*rows < max_ws]):
            set_workspaces(rows+1, "vsize")
        if t == 10:
            clean_up(currcol, currrow)
            t = 0
        else:
            t = t+1
        time.sleep(1)

Cara Penggunaan

  1. Salin skrip di bawah ini ke file kosong, simpan sebagai add_space.py
  2. Di bagian kepala skrip, edit baris jika Anda suka pengaturan lain (jumlah maksimum ruang kerja, matriks default misalnya 2x2):

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. Uji-jalankan dengan perintah:

    python3 /path/to/add_space.py
    
  4. Jika semua berfungsi dengan baik, tambahkan ke aplikasi startup Anda: Dash> Aplikasi Startup> Tambahkan perintah:

    /bin/bash -c "sleep 15 &&  python3 /path/to/add_space.py`
    

Catatan

Seperti biasa, skrip sangat "rendah jus", dan tidak menambah beban yang terlihat ke prosesor Anda.

Penjelasan

Cerita di bawah ini agak rumit dan sebagian besar merupakan penjelasan tentang konsep dan prosedur , daripada pengkodean. Hanya baca jika Anda tertarik.

Cara menghitung ruang kerja yang dibutuhkan (kolom contoh)

Output dari wmctrl -dterlihat seperti:

0  * DG: 3360x2100  VP: 1680,1050  WA: 65,24 1615x1026  N/A

Dalam output, VP: 1680,1050beri kami informasi tentang di mana kami berada di ruang kerja spanning (matriks semua viewports). Informasi ini hanya berguna jika kita juga memiliki resolusi layar, karena misalnya 1680bisa menjadi lebar dua (tidak mungkin, tetapi masih) atau satu kali layar.
Untungnya, kita dapat mengurai resolusi layar dari perintah xrandr.

Kemudian jika kita tahu ukuran x layar 1680dan saat ini kita aktif VP: 1680,1050, kita tahu kita berada di kolom kedua dalam matriks ruang kerja. Karena kita juga tahu ukuran matriks total ( DG: 3360x2100, juga dari output wmctrl -d), kita tahu matriks saat ini mencakup dua kolom (3360/1680), dan kita berada pada yang "terakhir".

masukkan deskripsi gambar di sini

Script kemudian akan mengirim instruksi untuk menambahkan kolom ke matriks dengan perintah:

dconf write /org/compiz/profiles/unity/plugins/core/hsize <current_viewport_column+1>

Inilah prinsipnya.

Cara menghitung ruang kerja yang akan dihapus (kolom contoh)

Sekali per 10 detik, skrip menjalankan perintah untuk mencantumkan semua jendela yang saat ini dibuka, dengan perintah:

wmctrl -lG

Ini memberi kami informasi tentang posisi jendela juga, terlihat seperti:

0x04604837  0 3425 24   1615 1026 jacob-System-Product-Name Niet-opgeslagen document 2 - gedit

Dalam output, 3425adalah posisi x dari jendela. Namun angka ini relatif terhadap ruang kerja saat ini (sisi kiri). Untuk mengetahui posisi absolut dari jendela (x-wise) dalam workspace-matrix, kita harus menambahkan nomor pertama dari informasi viewport saat ini (misalnya VP: 1680,1050, dari output wmctrl -d).
Namun mari kita, untuk alasan kesederhanaan, anggap kita berada di viewport 1,1(topleft viewport), sehingga posisi relatif jendela sama dengan posisi absolutnya.

Karena resolusi layarnya 1680, kita tahu bahwa jendela berada pada kolom 3425/1680, dibulatkan ke atas, karena semuanya 3360 and 5040berada di kolom yang sama dalam matriks (antara 3 dan 4 kali resolusi). Untuk perhitungan yang tepat, kami menggunakan math.ceil()( python)

Karena skrip juga mempraktikkan aturan untuk selalu memiliki ruang kerja tambahan di kanan / bawah, kita perlu mengatur jumlah kolom ke nilai tertinggi :

  • yang saat ini ruang kerja kolom + 1
  • yang terakhir kolom dengan jendela di atasnya
  • jumlah kolom default, seperti yang ditetapkan di kepala skrip

Dan skripnya :)

Baris dikelola dengan prosedur yang persis sama.

Yakub Vlijm
sumber
1
Wow, jawaban yang bagus, sudah terbalik =)
AB
@ AB Terima kasih! :) Ini adalah jenis hal yang suka saya lakukan :)
Jacob Vlijm
2
@kernel_panic Wow, terima kasih :) Saya sebenarnya berpikir untuk menjadikannya ppa, seperti ini: askubuntu.com/a/608295/72216, dan yang ini: askubuntu.com/a/560734/72216, akhirnya (di masa depan) menggabungkan ketiganya menjadi satu aplikasi "workspace_tools" di mana mereka dapat ditetapkan sebagai opsi atau sesuatu seperti itu :).
Jacob Vlijm
1
@JacobVlijm Saya akan menghapus jawaban lama dari sini untuk alasan singkat: itu masih akan terlihat dalam riwayat edit bagi mereka yang tertarik ...
Fabby
1
Sama-sama ... Anda harus mampir ke ruang obrolan dan keracunan lebih sering! : P
Fabby
6

Secara teknis, tidak ada pintasan untuk mengubah ukuran ruang kerja, tetapi Anda dapat menggunakan skrip sederhana di bawah dan ikat ke pintasan.

  1. Ambil skrip di bawah, simpan di .local/share/applicationsfolder, atau di mana pun Anda suka.
  2. Pastikan skrip dibuat dapat dieksekusi dengan chmod 755 /path/to/script
  3. Ikatkan pintasan di Pengaturan Sistem -> Keyboard -> Pintasan -> Pintasan Khusus

Misalnya, saya memiliki pengaturan ini:

masukkan deskripsi gambar di sini

Script terikat ShiftCtrlAltI. Tetapi CtrlAltIbisa bekerja juga. Saya memberikan path lengkap ke skrip, yaitu

/home/xieerqi/resize-workspaces.sh

Dan beginilah tampilannya:

masukkan deskripsi gambar di sini

Naskah

#!/bin/bash
# Author : Serg Kolo
# Date: Sept 19, 2015
# Purpose: simple script to resize 
# unity workspaces
# Written for: http://askubuntu.com/q/676046/295286

HEIGHT=$(gsettings get org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize)
WIDTH=$(gsettings get org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize)
NEWSIZE=$(zenity --entry --text="Current desktop set-up $HEIGHT x $WIDTH. Enter new setup in HEIGHTxWIDTH format"  --width=250 | tr 'x' ' ' )

ARRAY=( $NEWSIZE )
[ -z ${ARRAY[1]}  ] && exit
    gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize ${ARRAY[0]}
    gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize ${ARRAY[1]}

Sangat mudah digunakan, sangat mudah diatur

Sergiy Kolodyazhnyy
sumber