Je sais à propos de Always on visible workspace Mais je veux que toutes Windows ait ceci par défaut lors de l'ouverture, à quelques exceptions près.
Le flux de travail que je recherche est à peu près l'inverse de la façon dont cela fonctionne. Afficher tout sur tous les espaces de travail avec quelques exceptions (manuelles).
C'est possible? Si cela nécessite des scripts, cela ne me dérangera probablement pas.
Je suis sous Ubuntu 17.04 avec de la cannelle, mais autant que je sache, cette fonctionnalité est présente dans l’unité et dans la plupart des environnements de bureau.
Cas intéressant.
Le concept n’est pas trop compliqué: il suffit de mettre toutes les fenêtres collantes, cependant:
wmctrl -l
montre également quelques types de fenêtres, tels que DOCK et DESKTOP, pour lesquels vous ne devez pas éditer leurs propriétés en général.Dans le script ci-dessous:
une boucle de deux secondes exécute une comparaison de la liste de fenêtres avec la précédente en utilisant:
wmctrl -l
et ensuite extraire l'identifiant de la fenêtre de chacune des lignes
Par la suite, le script s'exécute
xprop -id <window_id>
Dans lequel nous pouvons trouver des informations sur le _NET_WM_WINDOW_TYPE
et le WM_CLASS
Étant donné que le script n'agit que sur les fenêtres nouvellement créées, il ne créera aucune charge supplémentaire pour votre système.
#!/usr/bin/env python3
import subprocess
import time
# excluded applications
apps = ["gedit", "chromium", "monkey"]
# ignored window types
ignore = [
"= _NET_WM_WINDOW_TYPE_DOCK",
"= _NET_WM_WINDOW_TYPE_DESKTOP",
]
# just a helper
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except (subprocess.CalledProcessError, TypeError):
pass
# initiate windowlist
wins1 = []
while True:
# cycle time
time.sleep(2)
# initiate new list
new_wins = []
# get the most recent window list
windata = get(["wmctrl", "-l"])
if windata:
# extract window -ids
wins2 = [w.split()[0] for w in windata.splitlines()]
new = [w for w in wins2 if w not in wins1]
# check for excluded classes and window types
for w in new:
testdata = get(["xprop", "-id", w])
if all([
not any([ig in testdata for ig in ignore]),
not any([app in testdata for app in apps]),
]):
# set the passed windows to sticky
subprocess.Popen(
["wmctrl", "-i", "-r", w, "-b", "add,sticky"]
)
# refresh the window list for next cycle
wins1 = wins2
Assurez-vous que wmctrl
est installé:
Sudo apt install wmctrl
set_sticky.py
WM_CLASS
-ses à exclure (vous voudrez peut-être supprimer le singe, c'était à des fins de test :))Testez-le avec la commande:
python3 /path/to/set_sticky.py
Si tout fonctionne correctement, vous pouvez l'ajouter aux applications de démarrage, mais veillez à ajouter une petite pause pour empêcher le script de s'interrompre sur un poste de travail pas encore prêt:
/bin/bash -c "sleep 10 && python3 /path/to/set_sticky.py"
S'amuser :)
Je l'ai testé sur Ubuntu Budgie (murmure) pendant 25 minutes sans problème. Il devrait bien fonctionner sur n'importe quel gestionnaire de fenêtres, mais si vous rencontrez un problème, il suffit de le mentionner.