Como posso identificar diferentes janelas do Chrome ao usar a opção "Continuar de onde você parou" (para usar no wmctrl)?

3

Estou usando várias janelas do Chrome (3-5) com muitas guias abertas em cada uma delas e estou usando "Na inicialização" > "Continue de onde você parou" configurações. O problema é que, quando eu inicio o chrome, todas as janelas estão abertas no espaço de trabalho atual (estou usando 4 espaços de trabalho). O que eu preciso fazer é mover cada janela para um espaço de trabalho específico. Eu preciso selecionar a janela por seu ID porque o título da janela pode ser sempre diferente (dependendo de qual guia está em foco). É um pouco chato mover as janelas para o local de trabalho certo manualmente o tempo todo.

Esta é a saída do meu comando 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

E agora vamos dizer que preciso mover a janela do YouTube para o espaço de trabalho # 2. O seguinte comando funciona:

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

e isso também funciona:

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

Mas o problema é que a ID da janela é diferente a cada reinicialização e seu título é diferente toda vez que eu alternar a guia. Existe uma maneira de selecionar janela por peça (últimos 3-4 dígitos) de sua identificação (parece que os últimos 2 a 3 dígitos são sempre os mesmos quando eu inicio a janela logo após a reinicialização) ou para selecionar, por exemplo, 7ª janela da lista? A razão pela qual eu preciso disso é que quero escrever um script que inicie todos os aplicativos necessários (Chrome, Apache, SublimeText ...) e mova as janelas para locais de trabalho específicos (eu tenho um local de trabalho para email / Facebook, um para música e um para coisas de trabalho).

PS: Por favor, não sugira usar a hibernação do sistema - não é uma opção para mim por causa de alguns

PS2: Estou usando o Ubuntu 15.04

    
por Juraj.Lorinc 14.09.2015 / 22:21

2 respostas

2

Como identificar janelas específicas do Chrome

Se as janelas forem sempre criadas (na inicialização) na mesma ordem cronológica (como você mencionou em um comentário), você pode usar uma propriedade específica da saída do comando wmctrl -l : A lista sempre lista as janelas na ordem em que foram criadas .

Isso significa que se você tiver (por exemplo) três janelas, recriadas sempre na mesma ordem, você pode simplesmente filtrar as janelas, pertencentes a Chrome , "marcar" as janelas por ordem aparecer (ed) na saída de wmctrl .

Como filtrar as janelas Chrome do wmctrl

Para identificar janelas, pertencentes a um aplicativo, você precisa usar o comando:

wmctrl -lp

que também mostrará o pid ao qual a janela pertence. Normalmente, este é um single pid. No caso de Chrome , no entanto, haverá vários. O procedimento, programaticamente, é então:

  1. Encontre os pids de Chrome executando:

    pgrep chrome
    
  2. Execute o comando:

    wmctrl -lp
    
  3. analise, por janela, o pid a janela pertence e procure por uma correspondência na saída (lista) de pgrep chrome

  4. IssoproduziráumalistadejanelaspertencentesaChrome.Suaidentificação,comomencionado,éaordemdelesnalista.Tudooquevocêprecisafazeréanalisaroiddajanela(aprimeirastringnalinhanasaídadewmctrl-lpquevocêexecutou)epronto.

Posteriormente,useocomandousualparamoverasjanelasparaoespaçodetrabalhodesejado.

Umexemplo;oteste

Comoexemplodescriptparatestarseissofunciona(python,oquemais:))

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

Neste exemplo, abri as três Chrome janelas, fechei-as como você descreveu e abri Chrome novamente.

Em matches[0] (última linha), criei a primeira janela da lista:

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

Na próxima execução, o ID da janela mudou:

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

mas sua ordem na lista permaneceu, uma vez que (na verdade) as janelas são sempre criadas na mesma ordem (cronológica). Portanto, a última linha do script:

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

sempre faz a mesma janela (primeira) aumentar, enquanto

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

sempre aumentará o segundo e assim por diante.

Substitua o comando raise pelo comando move e você terá seu script funcionando.

    
por Jacob Vlijm 14.09.2015 / 23:20
0

Então, consegui resolver o problema usando o Python. E tenha em mente que este é o meu primeiro script Python, então não é perfeito.

#!/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
    
por Juraj.Lorinc 15.09.2015 / 09:21