GNU/Linux >> Belajar Linux >  >> Ubuntu

Bagaimana Cara Menambahkan Ruang Kerja Secara Otomatis, Hanya Jika Saya Membutuhkannya?

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

Jawaban yang Diterima:

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

Di bawah versi skrip backround 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, area pandang tambahan akan ditambahkan:

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

Skrip:

#!/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 menggunakan

  1. Copy script di bawah ini ke dalam file kosong, simpan sebagai add_space.py
  2. Di bagian kepala skrip, edit baris jika Anda menyukai pengaturan lain (jumlah maksimum ruang kerja, matriks default, mis. 2×2):

    # --- 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 semuanya berfungsi dengan baik, tambahkan ke aplikasi startup Anda:Dash> Startup Applications> Add the command:

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

Catatan

Seperti biasa, skripnya sangat “rendah jus”, dan tidak menambah beban yang mencolok pada prosesor Anda.

Penjelasan

Cerita di bawah ini sedikit rumit dan sebagian besar merupakan penjelasan tentang konsep dan prosedur , bukan pengkodean. Baca hanya jika Anda tertarik.

Cara menghitung ruang kerja yang dibutuhkan (kolom contoh)

Keluaran dari wmctrl -d terlihat seperti:

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

Pada output, VP: 1680,1050 memberi kita informasi tentang di mana kita berada di ruang kerja yang membentang (matriks dari semua viewports). Informasi ini hanya berguna jika kita juga memiliki resolusi layar, karena mis. 1680 bisa lebar dua (tidak mungkin, tapi masih) atau satu kali layar.
Untungnya, kita dapat mengurai resolusi layar dari perintah xrandr .

Lalu jika kita tahu ukuran x layarnya adalah 1680 dan saat ini kami berada di VP: 1680,1050 , kami tahu kami berada di kolom kedua dalam matriks ruang kerja. Karena kita juga mengetahui ukuran matriks total (DG: 3360x2100 , juga dari keluaran wmctrl -d ), kita tahu matriks saat ini mencakup dua kolom (3360/1680), dan kita berada di kolom "terakhir".

Terkait:Linux – Bagaimana cara menambahkan parameter boot ke kernel dengan bcfg dari shell EFI?

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

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

Ini prinsipnya.

Cara menghitung ruang kerja yang akan dihapus (kolom contoh)

Sekali per 10 detik, skrip menjalankan perintah untuk mendaftar semua jendela yang sedang dibuka, dengan perintah:

wmctrl -lG

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

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

Pada output, 3425 adalah posisi x dari jendela. Namun angka ini relatif terhadap ruang kerja saat ini (sisi kiri). Untuk mengetahui posisi absolut jendela (x-bijaksana) dalam matriks ruang kerja, kita harus menambahkan nomor pertama dari informasi viewport saat ini (mis. VP: 1680,1050 , dari keluaran wmctrl -d ).
Mari kita, untuk alasan kesederhanaan, menganggap kita berada di viewport 1,1 (area pandang kiri atas), sehingga posisi relatif jendela sama posisi absolutnya.

Karena resolusi layar adalah 1680 , kita tahu jendelanya ada di kolom 3425/1680 , dibulatkan, karena semuanya antara 3360 and 5040 berada pada 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 ekstra di kanan/bawah, kita perlu mengatur jumlah kolom ke tertinggi nilai dari:

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

Dan begitulah skripnya 🙂

Baris dikelola dengan prosedur yang sama persis.


Ubuntu
  1. Cara Menambahkan File Swap Di Ubuntu

  2. Bagaimana Menambahkan Pencetak di Ubuntu 11.10 | Tambahkan Pencetak di Ubuntu

  3. Bagaimana cara menambahkan repositori Yum

  1. Bagaimana Cara Memulai Program Secara Otomatis di Ruang Kerja Tertentu Saat Memulai?

  2. Bagaimana Cara Menambahkan Repositori Ppa??

  3. CentOS / RHEL 7 :Cara menambahkan parameter kernel hanya ke kernel tertentu

  1. Cara Menambahkan Pengguna ke Grup di Linux

  2. bagaimana cara memaksa hanya menerima koneksi ssl di vsftpd?

  3. Cara membuat akun pengguna secara otomatis (SSH + LDAP)