web-dev-qa-db-fra.com

Démarrer chaque fenêtre sur tous les espaces de travail, avec quelques exclusions

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.

2
janw

Cas intéressant.

Ce qu'il faut prendre en compte

Le concept n’est pas trop compliqué: il suffit de mettre toutes les fenêtres collantes, cependant:

  • Étant donné que vous souhaitez exclure certaines applications, nous devrons les répertorier et vérifier la classe de fenêtres de windows afin de décider si nous devons les définir ou non (affiché sur tous les espaces de travail).
  • La liste des fenêtres, telle que sortie de 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.
  • Nous devrons nous assurer que seules les nouvelles fenêtres collantes sont placées afin d'éviter une consommation inutile de carburant.

Exemple de script (python)

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

  • Si la nouvelle fenêtre "passe" ces tests, i.o.w. la fenêtre n'appartient à aucune des applications exclues et ne fait partie des types exclus, elle est définie comme étant collante.

É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.

Le scénario

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

Comment configurer

  1. Assurez-vous que wmctrl est installé:

    Sudo apt install wmctrl
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom set_sticky.py
  3. Dans la section head de votre script, définissez le WM_CLASS -ses à exclure (vous voudrez peut-être supprimer le singe, c'était à des fins de test :))
  4. Testez-le avec la commande:

    python3 /path/to/set_sticky.py
    
  5. 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 :)

Remarque

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.

2
Jacob Vlijm