J'ai actuellement quatre espaces de travail ("Main", "Game", "Work", "Overflow"). Dans une configuration parfaite, l'espace de travail "Jeu" comporterait des raccourcis (sur le bureau ou dans un panneau) pour Steam et les jeux individuels.
Le passage à "Travail" NE devrait PAS avoir de rapport avec le jeu, mais plutôt des liens tels que des liens Google Docs et des raccourcis vers tous mes fichiers liés au travail.
Des espaces de travail personnalisés sont-ils possibles dans xfce4?
Si nous limitons la configuration à un ensemble différent de lanceurs par bureau, ce n’est pas très compliqué. Ce dont nous avons besoin, c’est d’un script fonctionnant en arrière-plan pour suivre l’espace de travail actuel et modifier automatiquement l’ensemble des lanceurs en conséquence.
Disons que j'ai quatre espaces de travail, je veux que les lanceurs suivants soient disponibles sur les différents espaces de travail:
espace de travail 1>espace de travail 2>espace de travail 3>espace de travail 4>
Le script utilise wmctrl
:
Sudo apt-get install wmctrl
Dans votre répertoire personnel (pas dans un sous-répertoire, mais au "premier" niveau), créez un répertoire (exactement) nommé:
desktop_data
dans ce répertoire, créez pour chacun de vos bureaux un dossier nommé (exactement):
desktop_1
desktop_2
desktop_3
desktop_4
Créez des lanceurs pour toutes les applications (pour tous les espaces de travail) sur votre bureau et copiez-les dans les dossiers correspondants.
Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom change_launchers.py
. Testez-le en lançant dans une fenêtre de terminal la commande:
python3 /path/to/change_launchers.py
Si tout fonctionne bien, ajoutez-le à vos applications de démarrage.
Le script
#!/usr/bin/env python3
import subprocess
import os
import time
import shutil
home = os.environ["HOME"]
desktop_dir = home+"/"+"Desktop"
data_dirstr = home+"/desktop_data/desktop_"
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_desktop():
return [l for l in get("wmctrl -d").splitlines() if "*" in l][0].split()[-1]
while True:
curr_dt1 = get_desktop()
time.sleep(1)
curr_dt2 = get_desktop()
# alter the set of launchers when workspace changes
if not curr_dt1 == curr_dt2:
datafolder = data_dirstr+curr_dt2
for f in [f for f in os.listdir(desktop_dir)if f.endswith(".desktop")]:
subject = desktop_dir+"/"+f
os.remove(subject)
for f in os.listdir(datafolder):
subject = datafolder+"/"+f; target = desktop_dir+"/"+f
shutil.copyfile(subject, target)
subprocess.call(["/bin/bash", "-c", "chmod +x "+target])
Dans différentes versions localisées d'Ubuntu, le nom du dossier "Desktop" peut différer (En néerlandais: "Bureaublad"). Si dans votre version Ubuntu le nom du dossier du bureau n'est pas "Bureau", changez-le dans la ligne:
desktop_dir = home+"/"+"Desktop"
Si nous ajoutons quelques lignes au script, les options de paramétrage par espace de travail peuvent être étendues avec un ensemble de modifications de liens vers des répertoires :
Sur un espace de travail, nous avons un exemple un lien vers le dossier Documents , associé à des lanceurs d'applications bureautiques:
Sur un autre espace de travail, nous avons un lien vers le dossier Images , associé aux lanceurs d'éditeurs d'image:
La configuration est à peu près la même que dans l'option 1, mais en outre, dans les dossiers de données (voir option 1), créez des liens vers des dossiers (à l'aide de ln -s <source> <destination>
) que vous souhaitez voir disponibles dans l'espace de travail correspondant:
Le script
#!/usr/bin/env python3
import subprocess
import os
import time
import shutil
home = os.environ["HOME"]
desktop_dir = home+"/"+"Desktop"
data_dirstr = home+"/desktop_data/desktop_"
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_desktop():
return [l for l in get("wmctrl -d").splitlines() if "*" in l][0].split()[-1]
while True:
curr_dt1 = get_desktop()
time.sleep(1)
curr_dt2 = get_desktop()
# alter the set of launchers & links when workspace changes
if not curr_dt1 == curr_dt2:
datafolder = data_dirstr+curr_dt2
for f in os.listdir(desktop_dir):
subject = desktop_dir+"/"+f
if os.path.islink(subject) or subject.endswith(".desktop") :
os.remove(subject)
for f in os.listdir(datafolder):
subject = datafolder+"/"+f; target = desktop_dir+"/"+f
if os.path.islink(subject):
os.symlink(os.readlink(subject), target)
else:
shutil.copy(subject,target)
D'autres environnements de bureau (tels que KDE) offrent cela de manière native, mais cela n'est que partiellement pris en charge dans XFCE.
Qu'est-ce qui fonctionne nativement dans XFCE:
La solution que j'ai adoptée:
Contrairement à l’autre réponse, ce script ne fonctionnera pas comme une boucle sans fin recherchant le statut à chaque seconde. Il ne s'exécute qu'une fois lors de l'ouverture de la session afin d'associer chaque panneau local à son propre espace de travail, puis tout le reste est géré de manière native par le gestionnaire de fenêtres.
#! /bin/sh
# First panel to move
start=2
# Number of panels to move
count=$( wmctrl -d | wc -l )
desk=0
for winid in $( wmctrl -l | grep 'dom0 xfce4-panel$' \
| awk "NR==$start,NR==$(( start + count - 1 )) { print \$1; }" )
do
wmctrl -i -r $winid -b remove,sticky
wmctrl -i -r $winid -t $desk
desk=$(( desk + 1 ))
done
Enregistrez ce script, par exemple sous le nom local-panels.sh
dans votre répertoire personnel, et rendez-le exécutable (chmod u+x ~/local-panels.sh
).
Configurez le script selon vos besoins:
$start
: XFCE numérote vos panneaux, il s’agit du numéro du premier panneau que vous souhaitez rendre local. Ici, le premier panneau reste global et les panneaux 2 et suivants sont localisés dans leurs propres espaces de travail.$count
: Le nombre de panneaux à rendre locaux. Par défaut, cela correspond au nombre d'espaces de travail, c'est-à-dire. un panneau local différent par espace de travail.$desk
: Le premier espace de travail pour avoir un panneau local. Par défaut, chaque espace de travail aura un panneau local, mais si vous définissez cette variable sur une valeur plus élevée, vous ne pouvez pas avoir de panneau local sur les quelques premiers espaces de travail, si vous le souhaitez.Configurez XFCE pour qu'il lance automatiquement ce script à l'ouverture de la session: allez dans Gestionnaire de paramètres XFCE> session et démarrage, cliquez sur l'onglet Démarrage automatique de l'application, et puis sur le bouton Ajouter pour planifier l'exécution du script à chaque ouverture de session.