GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Comment ajouter automatiquement des espaces de travail, uniquement si j'en ai besoin ?

Supposons que j'utilise 4 espaces de travail et que j'en ai besoin de plus, existe-t-il un processus automatisé ou, si impossible, un moyen simple d'ajouter accidentellement plus d'espaces de travail (au lieu d'installer Ubuntu tweak etc. etc.).

Réponse acceptée :

Définir automatiquement le nombre d'espaces de travail ; ajoutez et supprimez des colonnes et des lignes, selon vos besoins

Ci-dessous une version d'un (le) script de fond qui ajoutera automatiquement des espaces de travail si vous avez entré la dernière colonne ou ligne de votre matrice d'espace de travail.

Voici comment cela fonctionne :

  1. Si vous arrivez à la dernière colonne ou ligne, des fenêtres supplémentaires sont ajoutées :

  2. Si vos espaces de travail sont inutilisés pendant 5 à 10 secondes et s'il n'y a pas de fenêtres dessus, les espaces de travail supplémentaires seront à nouveau supprimés. Vous conserverez cependant toujours une ligne supplémentaire en dessous et une colonne supplémentaire à droite de votre fenêtre actuelle :

Le scénario :

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

Comment utiliser

  1. Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous add_space.py
  2. Dans la section d'en-tête du script, modifiez les lignes si vous aimez d'autres paramètres (nombre maximum d'espaces de travail, matrice par défaut, par exemple 2 x 2) :

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. Testez-le avec la commande :

    python3 /path/to/add_space.py
    
  4. Si tout fonctionne bien, ajoutez-le à vos applications de démarrage :Dash> Startup Applications> Add the command :

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

Remarque

Comme toujours, le script est extrêmement "faible en jus" et n'ajoute aucune charge notable à votre processeur.

Explication

L'histoire ci-dessous est un peu compliquée et surtout une explication sur le concept et la procédure , plutôt que le codage. Ne lisez que si vous êtes intéressé.

Comment calculer les espaces de travail nécessaires (exemples de colonnes)

La sortie de wmctrl -d ressemble à :

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

Dans la sortie, VP: 1680,1050 nous donne des informations sur l'endroit où nous nous trouvons sur l'espace de travail couvrant (la matrice de toutes les fenêtres). Cette information n'est utile que si nous avons également la résolution de l'écran, car par ex. 1680 pourrait être la largeur de deux (peu probable, mais quand même) ou une fois l'écran.
Heureusement, nous pouvons analyser la résolution de l'écran à partir de la commande xrandr .

Ensuite, si nous savons que la taille x de l'écran est 1680 et nous sommes actuellement sur VP: 1680,1050 , nous savons que nous sommes sur la deuxième colonne dans la matrice de l'espace de travail. Puisque nous connaissons aussi la taille de la matrice totale (DG: 3360x2100 , également à partir de la sortie de wmctrl -d ), nous savons que la matrice actuelle comprend deux colonnes (3360/1680), et nous sommes sur la "dernière".

En relation :Linux – Comment ajouter des paramètres de démarrage au noyau avec bcfg depuis le shell EFI ?

Le script enverra alors une instruction pour ajouter une colonne à la matrice par la commande :

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

C'est le principe.

Comment calculer les espaces de travail à supprimer (exemple de colonnes)

Une fois toutes les 10 secondes, le script exécute la commande pour lister toutes les fenêtres actuellement ouvertes, avec la commande :

wmctrl -lG

Cela nous donne également des informations sur la position de la fenêtre, ressemblant à :

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

Dans la sortie, 3425 est la position x de la fenêtre. Ce chiffre est cependant relatif à l'espace de travail actuel (côté gauche). Pour connaître la position absolue de la fenêtre (x-wise) dans la matrice de l'espace de travail, nous devons ajouter le premier numéro des informations de la fenêtre actuelle (par exemple, VP: 1680,1050 , à partir de la sortie de wmctrl -d ).
Supposons cependant, pour des raisons de simplicité, que nous sommes sur la fenêtre 1,1 (fenêtre en haut à gauche), donc la position relative de la fenêtre est égale sa position absolue.

Puisque la résolution de l'écran est de 1680 , nous savons que la fenêtre est sur la colonne 3425/1680 , arrondi, puisque tout entre 3360 and 5040 est sur la même colonne de la matrice (entre 3 et 4 fois la résolution). Pour un calcul correct, nous utilisons math.ceil() (python )

Puisque le script aussi pratique la règle de toujours avoir un espace de travail supplémentaire à droite/en bas, nous devons définir le nombre de colonnes sur le plus élevé valeur de :

  • le courant colonne d'espace de travail + 1
  • le dernier colonne avec une fenêtre dessus
  • le nombre de colonnes par défaut, tel que défini dans l'en-tête du script

Et donc le script fait 🙂

Les lignes sont gérées exactement de la même manière.


Ubuntu
  1. Comment ajouter un fichier d'échange sur Ubuntu

  2. Comment ajouter une imprimante dans Ubuntu 11.10 | Ajouter une imprimante dans Ubuntu

  3. Comment ajouter un référentiel Yum

  4. Comment démarrer automatiquement des programmes dans des espaces de travail spécifiques au démarrage ?

  5. comment forcer accepter uniquement les connexions ssl dans vsftpd?

Comment ajouter une imprimante à Ubuntu

Comment ajouter une entrée MX dans cPanel

Comment ajouter plusieurs espaces de travail dans Unity 2d ?

Comment monter automatiquement une partition d'échange ?

Comment ajouter un nouveau domaine pour les e-mails uniquement ?

Comment ajouter un utilisateur à Sudoers sur Ubuntu 22.04