Как я могу определить разные окна Chrome при использовании команды «Продолжить, где вы остановились» -опция (для использования в wmctrl)?

Я использую несколько окон Chrome (3-5) со многими открытыми вкладками для каждого, и я использую настройки «On startup»> «Продолжить, когда вы остановились». Проблема в том, что когда я запускаю хром, все окна открываются в текущем рабочем пространстве (я использую 4 рабочих пространства). Мне нужно сделать это, чтобы переместить каждое окно в конкретное рабочее пространство. Мне нужно выбрать окно по его идентификатору, потому что заголовок окна может быть всегда другим (в зависимости от того, какая вкладка находится в фокусе). Это раздражает, чтобы постоянно перемещать окна на рабочее место вручную.

Это результат моей команды 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 - xxxxxx@gmail.com - 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 

А теперь, скажем, мне нужно переместить окно YouTube в рабочее пространство №2. Работает следующая команда:

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

а также это работает:

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

Но проблема в том, что идентификатор окна отличается от каждого перезапуска, и каждый раз, когда я переключаю вкладку, это название отличается. Есть ли способ выбрать окно по частям (последние 3-4 цифры) его идентификатора (он заходит, что последние 2-3 цифры всегда совпадают, когда я запускаю окно сразу после перезагрузки) или для выбора, например, 7-го окна из список? Причина, по которой мне это нужно, – это написать сценарий, который запустит все необходимые приложения (Chrome, Apache, SublimeText …) и переместит окна на определенные рабочие места (у меня есть одно рабочее место для электронной почты / Facebook, одно для музыки и одно для работы).

PS: Пожалуйста, не предлагайте использовать спящий режим системы – это не вариант для меня из-за некоторых проблем с драйверами.

PS2: Я использую Ubuntu 15.04

Как определить конкретные окна Chrome

Если окна всегда создаются (при запуске) в том же хронологическом порядке (как вы отметили в комментарии), вы можете использовать определенное свойство вывода команды wmctrl -l : Список всегда отображает окна в том порядке, в котором они были созданы .

Это означает, что если у вас есть (например) три окна, которые были созданы в том же порядке, вы можете просто сначала отфильтровать окна, принадлежащие Chrome , а затем «пометить» окна своим порядком, как они появляются (ed) в выход wmctrl .

Как отфильтровать окна Chrome из wmctrl

Чтобы идентифицировать окна, принадлежащие к приложению, вам необходимо использовать команду:

 wmctrl -lp 

который также покажет pid, к которому принадлежит окно. Обычно это единственный pid. В случае Chrome однако, их будет несколько. Процедура, программно, заключается в следующем:

  1. Найдите файлы Chrome , выполнив:

     pgrep chrome 
  2. Выполните команду:

     wmctrl -lp 
  3. parse out, per window, pid, к которому принадлежит окно, и поиск соответствия в выводе (списке) pgrep chrome

    введите описание изображения здесь

  4. Это приведет к созданию списка окон, принадлежащих Chrome . Их идентификация, как уже упоминалось, является их порядком в списке. Все, что вам нужно сделать, это проанализировать их идентификатор окна (первая строка в их строке в выводе wmctrl -lp который вы запустили), и все готово.

Затем используйте обычную команду для перемещения окон в нужное рабочее пространство.

Пример; тест

В качестве примера скрипта проверить, работает ли это (python, что еще :))

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

В этом примере я открыл три окна Chrome , закрыл их, как вы описали, и снова открыл Chrome .

В matches[0] (последняя строка) я заставил его поднять первое окно списка:

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

При следующем запуске идентификатор окна изменился:

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

но их порядок в списке остался, так как (действительно) окна всегда создаются в том же (хронологическом) порядке. Поэтому последняя строка скрипта:

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

всегда делает одно и то же (первое) окно рейза, в то время как

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

всегда будет поднимать второе и так далее.

Замените команду raise командой move, и ваш скрипт будет работать.

Поэтому я смог решить проблему с помощью Python. И имейте в виду, что это мой первый сценарий Python, поэтому он не идеален.

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