web-dev-qa-db-fra.com

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

Supposons que j'utilise 4 espaces de travail et que, soit dit en passant, ai-je besoin de plus, existe-t-il un processus automatisé ou, si cela est impossible, un moyen facile d'ajouter accidentellement d'autres espaces de travail (au lieu d'installer Ubuntu Tweak etc. etc.)?.

16
kernel_panic

Définissez automatiquement le nombre d'espaces de travail; ajouter et supprimer des colonnes et des lignes, selon vos besoins

Ci-dessous une version d'un (du) 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:

    enter image description here

  2. Si vos espaces de travail ne sont pas utilisés pendant 5 à 10 secondes et ​​, il n'y a pas de fenêtre dessus, les espaces de travail supplémentaires seront supprimés. . Toutefois, vous conserverez toujours une ligne supplémentaire en dessous et une colonne à droite de votre fenêtre d'affichage actuelle:

    enter image description here

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 le nom add_space.py
  2. Dans la section head du script, modifiez les lignes si vous aimez les autres paramètres (nombre maximal d'espaces de travail, matrice par défaut, par exemple 2x2):

    # --- 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 correctement, ajoutez-le à vos applications de démarrage: Dash> Applications de démarrage> Ajoutez la commande:

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

Remarque

Comme toujours, le script est extrêmement "sobre" et n’ajoute aucune charge notable à votre processeur.

Explication

L'histoire ci-dessous est un peu compliquée et consiste principalement en une explication du concept ​​et de la procédure, plutôt que du codage. Ne lisez que si vous êtes intéressé.

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

La sortie de wmctrl -d ressemble à ceci:

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

Dans la sortie, VP: 1680,1050 nous donne des informations sur l'emplacement de l'espace de travail recouvrant (la matrice de toutes les fenêtres). Cette information n’est utile que si nous avons également la résolution de l’écran, par exemple 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 que 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. Comme nous connaissons également la taille de la matrice totale (DG: 3360x2100, également à partir du résultat de wmctrl -d), nous savons que la matrice actuelle comprend deux colonnes (3360/1680), et nous sommes sur la "dernière " un.

enter image description here

Le script enverra ensuite une instruction pour ajouter une colonne à la matrice à l'aide de 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 (exemples de colonnes)

Une fois toutes les 10 secondes, le script exécute la commande pour répertorier toutes les fenêtres actuellement ouvertes à l'aide de la commande suivante:

wmctrl -lG

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

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 par rapport à l'espace de travail actuel (côté gauche). Pour connaître la position absolue de la fenêtre (x-wise) dans la matrice d’espace de travail, nous devons ajouter le premier numéro des informations de la fenêtre de visualisation courante (par exemple, VP: 1680,1050, à partir du résultat de wmctrl -d).
Cependant, pour des raisons de simplicité, supposons que nous sommes dans la fenêtre 1,1 (fenêtre 1), donc la position relative de la fenêtre est égale à sa position absolue.

La résolution de l'écran étant 1680, nous savons que la fenêtre se trouve dans la colonne 3425/1680, arrondie, car tout ce qui se situe entre 3360 and 5040 se trouve dans la même colonne de la matrice (entre 3 et 4 fois la valeur). résolution). Pour un calcul correct, nous utilisons math.ceil() (python)

Comme le script aussi utilise la règle pour toujours avoir un espace de travail supplémentaire à droite/en dessous, nous devons définir le nombre de colonnes sur la plus haute valeur de:

  • la colonne current ​​espace de travail + 1
  • la dernière colonne avec une fenêtre dessus
  • le nombre de colonnes par défaut, défini dans l'en-tête du script

Et si le script fait :)

Les lignes sont gérées exactement selon la même procédure.

14
Jacob Vlijm

Techniquement, il n'y a pas de raccourci pour redimensionner les espaces de travail, mais vous pouvez utiliser le script ci-dessous et le lier à un raccourci.

  1. Prenez le script ci-dessous, enregistrez-le dans le dossier .local/share/applications ou à l'endroit que vous préférez.
  2. Assurez-vous que le script est rendu exécutable avec chmod 755 /path/to/script
  3. Liez-le à un raccourci dans Paramètres système -> Clavier -> Raccourcis -> Raccourcis personnalisés

Par exemple, j'ai cette configuration:

enter image description here

Le script est lié à ShiftCtrlAltI. Mais CtrlAltI pourrait travailler aussi. Je donne le chemin complet au script, qui est

/home/xieerqi/resize-workspaces.sh

Et voici à quoi cela devrait ressembler:

enter image description here

Script

#!/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]}

Très simple à utiliser, très simple à configurer

6
Sergiy Kolodyazhnyy