GNU/Linux >> Znalost Linux >  >> Ubuntu

Jak automaticky přidávat pracovní prostory, pouze pokud je potřebuji?

Předpokládejme, že používám 4 pracovní prostory a mimochodem potřebuji další, existuje automatizovaný proces nebo, pokud to není možné, snadný způsob, jak náhodně přidat další pracovní prostory (místo instalace Ubuntu tweak atd. atd.).

Přijatá odpověď:

Automaticky nastavit počet pracovních ploch; přidat a odebrat sloupce a řádky v závislosti na vašich potřebách

Níže je verze (the) backround skriptu, který automaticky přidá pracovní prostory, pokud zadáte poslední sloupec nebo řádek matice pracovního prostoru.

Funguje to takto:

  1. Pokud se dostanete na poslední sloupec nebo řádek, přidají se další výřezy:

  2. Pokud se vaše pracovní prostory 5–10 sekund nepoužívají a nejsou na něm žádná okna, další pracovní plochy budou opět odstraněny. Vždy si však ponecháte jeden řádek navíc níže a jeden sloupec navíc vpravo od vašeho aktuálního výřezu:

Skript:

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

Jak používat

  1. Zkopírujte níže uvedený skript do prázdného souboru a uložte jej jako add_space.py
  2. V sekci head skriptu upravte řádky, pokud chcete další nastavení (maximální počet pracovních ploch, výchozí matice, např. 2×2):

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. Test- spusťte jej příkazem:

    python3 /path/to/add_space.py
    
  4. Pokud vše funguje dobře, přidejte jej do spouštěcích aplikací:Dash> Startup Applications> Add the command:

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

Poznámka

Jako vždy je skript extrémně „málo šťávy“ a nezatěžuje váš procesor.

Vysvětlení

Níže uvedený příběh je trochu komplikovaný a většinou jde o vysvětlení konceptu a postup , spíše než kódování. Čtěte pouze v případě, že vás to zajímá.

Jak vypočítat potřebné pracovní prostory (příklady sloupců)

Výstup wmctrl -d vypadá takto:

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

Ve výstupu VP: 1680,1050 nám dává informace o tom, kde se nacházíme na pracovní ploše (matice všech výřezů). Tato informace je užitečná pouze v případě, že máme k dispozici i rozlišení obrazovky, protože např. 1680 může být šířka dvou (nepravděpodobné, ale přesto) nebo jednorázové obrazovky.
Naštěstí můžeme analyzovat rozlišení obrazovky příkazem xrandr .

Pokud tedy víme, že velikost x obrazovky je 1680 a aktuálně jsme na VP: 1680,1050 , víme, že jsme na druhém sloupci v matici pracovního prostoru. Protože známe také velikost celkové matice (DG: 3360x2100 , také z výstupu wmctrl -d ), víme, že aktuální matice obsahuje dva sloupce (3360/1680) a my jsme na „posledním“.

Související:Linux – Jak přidat zaváděcí parametry do jádra pomocí bcfg z EFI shellu?

Skript poté odešle pokyn k přidání sloupce do matice příkazem:

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

Toto je princip.

Jak vypočítat pracovní prostory k odstranění (příklady sloupců)

Jednou za 10 sekund skript spustí příkaz pro výpis všech aktuálně otevřených oken s příkazem:

wmctrl -lG

To nám také poskytuje informace o poloze okna, které vypadají takto:

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

Ve výstupu 3425 je poloha x okna. Tento údaj se však vztahuje k aktuálnímu pracovnímu prostoru (levá strana). Abychom poznali absolutní polohu okna (po směru x) v matici pracovního prostoru, musíme přidat první číslo aktuální informace o výřezu (např. VP: 1680,1050 , z výstupu wmctrl -d ).
Předpokládejme však pro jednoduchost, že se nacházíme ve výřezu 1,1 (výřez vlevo nahoře), takže relativní poloha okna rovná se jeho absolutní pozice.

Protože rozlišení obrazovky je 1680 , víme, že okno je ve sloupci 3425/1680 , zaokrouhleno nahoru, protože vše mezi 3360 and 5040 je ve stejném sloupci v matici (mezi 3 a 4 násobkem rozlišení). Pro správný výpočet používáme math.ceil() (python )

Protože skript také praktikuje pravidlo, aby byl vždy vpravo/dole pracovní prostor navíc, musíme nastavit počet sloupců na nejvyšší hodnota:

  • aktuální sloupec pracovního prostoru + 1
  • poslední sloupec s oknem
  • výchozí počet sloupců, jak je nastaveno v záhlaví skriptu

A tak to scénář dělá 🙂

Řádky jsou spravovány přesně stejným postupem.


Ubuntu
  1. Jak přidat odkládací soubor na Ubuntu

  2. Jak přidat úložiště Yum

  3. jak vynutit přijetí pouze připojení SSL ve vsftpd?

  1. Jak přidat tiskárnu v Ubuntu 11.10 | Přidejte tiskárnu v Ubuntu

  2. Jak automaticky spouštět programy v konkrétních pracovních prostorech při spuštění?

  3. Jak automaticky vytvářet uživatelské účty (SSH + LDAP)

  1. Jak přidat uživatele do skupiny v Linuxu

  2. Jak přidat úložiště Ppa?

  3. CentOS / RHEL 7 :Jak přidat parametr jádra pouze do konkrétního jádra