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 :
-
Si vous arrivez à la dernière colonne ou ligne, des fenêtres supplémentaires sont ajoutées :
-
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
- Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous
add_space.py
-
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
-
Testez-le avec la commande :
python3 /path/to/add_space.py
-
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".
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.