web-dev-qa-db-fra.com

Comment identifier différentes fenêtres Chrome lorsque j'utilise l'option "Continuer à l'endroit où vous l'avez laissée" (à utiliser dans wmctrl)?

J'utilise plusieurs Chrome fenêtres (3-5) avec de nombreux onglets ouverts et j'utilise les paramètres "Au démarrage"> "Continuer à l'endroit où vous l'avez laissé". Le problème est que, lorsque je lance Chrome, toutes les fenêtres sont ouvertes sur l’espace de travail actuel (j’utilise 4 espaces de travail). Ce que je dois faire est de déplacer chaque fenêtre vers un espace de travail spécifique. Je dois sélectionner window par son ID car le titre de la fenêtre peut être toujours différent (en fonction de l'onglet sélectionné). Il est un peu ennuyeux de déplacer les fenêtres vers le lieu de travail droit manuellement tout le temps.

Voici le résultat de ma commande wmctrl -l:

wmctrl -l
0x01e00002  0 posuk13-PCSPEC XdndCollectionWindowImp
0x01e00005  0 posuk13-PCSPEC unity-launcher
0x01e00008  0 posuk13-PCSPEC unity-panel
0x01e0000b  0 posuk13-PCSPEC unity-dash
0x01e0000c  0 posuk13-PCSPEC Hud
0x0300000a  0 posuk13-PCSPEC Desktop
0x04400001  0 posuk13-PCSPEC Inbox - [email protected] - Gmail - Google Chrome
0x04400039  0 posuk13-PCSPEC How to move Chrome windows using wmctrl? - Ask Ubuntu - Google Chrome
0x0440003a  0 posuk13-PCSPEC YouTube - Google Chrome
0x0440003b  0 posuk13-PCSPEC Online regex tester and debugger: JavaScript, Python, PHP, and PCRE - Google Chrome

Et maintenant, disons que je dois déplacer la fenêtre YouTube vers l'espace de travail n ° 2. La commande suivante fonctionne:

wmctrl -r YouTube -e 0,2000,0,-1,-1

et aussi cela fonctionne:

wmctrl -r 0x0440003a -i -e 0,2000,0,-1,-1

Mais le problème est que l'ID de la fenêtre est différent à chaque redémarrage et que son titre est différent à chaque fois que je change d'onglet. Existe-t-il un moyen de sélectionner fenêtre par partie (3 ou 4 derniers chiffres) de son ID (les 2 ou 3 derniers chiffres sont toujours identiques lorsque je lance la fenêtre juste après le redémarrage), ou de sélectionner par exemple 7ème fenêtre de la liste? J’ai besoin de cela, c’est que je veux écrire un script qui lance toutes les applications requises (Chrome, Apache, SublimeText ...) et déplace les fenêtres vers des lieux de travail spécifiques (j’ai un lieu de travail pour la messagerie électronique/Facebook, un pour la musique et un pour des trucs de travail).

PS: S'il vous plaît, ne suggérez pas d'utiliser l'hibernation du système - ce n'est pas une option pour moi à cause de certains problèmes de pilote.

PS2: J'utilise Ubuntu 15.04

3
Juraj.Lorinc

Comment identifier des fenêtres spécifiques de Chrome

Si les fenêtres sont toujours créées (au démarrage) dans le même ordre chronologique (comme vous l'avez mentionné dans un commentaire), vous pouvez utiliser une propriété spécifique du sortie de la commande wmctrl -l: la liste répertorie toujours les fenêtres dans leur ordre de création .

Cela signifie que si vous avez (par exemple) trois fenêtres, recréées toujours dans le même ordre, vous pouvez simplement filtrer d'abord les fenêtres appartenant à Chrome, puis "marquer" les fenêtres par leur ordre d'apparition (ed) dans la sortie de wmctrl.

Comment filtrer les fenêtres Chrome de wmctrl

Pour identifier les fenêtres appartenant à une application, vous devez utiliser la commande:

wmctrl -lp

qui affichera également le pid auquel la fenêtre appartient. Généralement, il s’agit d’un pid simple . Dans le cas de Chrome, il y en aura plusieurs. La procédure, par programme, est alors:

  1. Trouvez les pids de Chrome en lançant:

    pgrep chrome
    
  2. Exécutez la commande:

    wmctrl -lp
    
  3. analyser, par fenêtre, le pid auquel appartient la fenêtre et rechercher une correspondance dans la sortie (liste) de pgrep chrome

    enter image description here

  4. Ceci produira une liste de fenêtres, appartenant à Chrome. Leur identification, comme mentionné, est alors leur ordre dans la liste. Il ne vous reste plus qu'à analyser leur identifiant de fenêtre (la première chaîne de leur ligne dans le résultat de wmctrl -lp que vous avez exécuté) et vous avez terminé.

Ensuite, utilisez la commande habituelle pour déplacer les fenêtres vers l’espace de travail souhaité.

Un exemple; le test

Comme exemple de script pour vérifier si cela fonctionne (python, quoi d'autre :))

#!/usr/bin/env python3
import subprocess

# get the list of pids of chrome
pids = [p for p in subprocess.check_output(["pgrep", "chrome"]).decode("utf-8").splitlines()]
# get the list of windows
windows = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()]
# filter out the windows of chrome, parse their window-id
matches = [w[0] for w in windows if w[2] in pids]
print(matches)

# raise the window
subprocess.Popen(["wmctrl", "-ia", matches[0]])

Pour cet exemple, j'ai ouvert trois fenêtres Chrome, je les ai fermées comme vous l'avez décrit et j'ai rouvert Chrome.

Dans matches[0] (dernière ligne), je l’ai fait soulever la première fenêtre de la liste:

['0x05600001', '0x05600039', '0x0560003a']

À la prochaine exécution, l'identifiant de la fenêtre a changé:

['0x05800001', '0x05800039', '0x0580003a']

mais leur ordre dans la liste est resté, puisque (effectivement) les fenêtres sont toujours créées dans le même ordre (chronologique). Donc la dernière ligne du script:

subprocess.Popen(["wmctrl", "-ia", matches[0]])

toujours fait la même (première) levée de fenêtre, alors que

subprocess.Popen(["wmctrl", "-ia", matches[1]])

sera toujours soulever la seconde et ainsi de suite.

Remplacez la commande de relance par la commande de déplacement et votre script fonctionnera.

2
Jacob Vlijm

J'ai donc pu résoudre le problème en utilisant Python. N'oubliez pas qu'il s'agit de mon tout premier script Python, il n'est donc pas parfait.

#!/usr/bin/python
import subprocess

foo=subprocess.check_output(["wmctrl", "-lx"])  #list windows with WM_CLASS
def f1(foo=foo): return iter(foo.splitlines())
list=list(f1());
gloop=0  #google loop - to count google windows
sloop=0  #sublime loop - to count sublime windows (currently only one, but I might add more in future)
google = [ ["0", "0"], ["2000", "0"], ["2000", "2000"],  ["2000", "0"] ]  #google windows positioning
sublime = [ ["2000", "0"] ]  #sublime windows positioning
for s in list:
    if (s[14:20]=='Google'):
        #print "Google"
        windowid=s[0:10]
        windowpos="0,"+google[gloop][0]+","+google[gloop][1]+",-1,-1"
        subprocess.call(["wmctrl", "-r", windowid, "-i", "-e", windowpos]);
        gloop+=1
    if (s[14:20]=='sublim'):
        #print "Sublime_text"
        windowid=s[0:10]
        windowpos="0,"+sublime[sloop][0]+","+sublime[sloop][1]+",-1,-1"
        subprocess.call(["wmctrl", "-r", windowid, "-i", "-e", windowpos]);
        sloop+=1
0
Juraj.Lorinc