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.)?.
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:
Si vous arrivez à la dernière colonne ou ligne, des fenêtres supplémentaires sont ajoutées:
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:
#!/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)
add_space.py
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
Testez-le avec la commande:
python3 /path/to/add_space.py
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`
Comme toujours, le script est extrêmement "sobre" et n’ajoute aucune charge notable à votre processeur.
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.
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:
Et si le script fait :)
Les lignes sont gérées exactement selon la même procédure.
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.
.local/share/applications
ou à l'endroit que vous préférez.chmod 755 /path/to/script
Par exemple, j'ai cette configuration:
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:
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