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

Я использую несколько окон Chrome (3-5) со многими открытыми вкладками на каждой и использую настройки «При запуске»> «Продолжить с того места, где вы остановились». Проблема в том, что когда я запускаю Chrome, все окна открываются в текущем рабочем пространстве (я использую 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

3
задан 13 April 2017 в 15:24

2 ответа

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

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

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

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

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

wmctrl -lp

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

  1. Найдите pids Chrome путем выполнения:

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

    wmctrl -lp
    
  3. проанализируйте на окно, pid окно принадлежит, и ищите соответствие в выводе (список) pgrep chrome

    enter image description here

  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]])

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

Замените повышение - управляют перемещением - команда, и у Вас будет своя работа сценария.

2
ответ дан 14 April 2017 в 01:24
  • 1
    спасибо 4 быстрый кусочек ответа. я знаю ноутбук w/атом n270 doesn' t поддерживают виртуализацию. этот shouldn' t исключают выполнение 16.04 все же. i' m заинтересованный выполнением его собственный компонент, не под любым видом гипервизора. какие-либо предложения?-tnx. – arthur sherman avraham shir-el 5 December 2016 в 09:04

Таким образом, я смог решить проблему с помощью 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
0
ответ дан 14 April 2017 в 01:24
  • 1
    @arthurshermanavrahamshir-el Ха-ха форум, который Вы посетили, пытался сказать Вам, как установить Ubuntu в VirtualBox. Если Вы хотите установить его, исходно см. askubuntu.com/questions/6328/how-do-i-install-ubuntu . Вы don' t нужна виртуализация для установки Ubuntu исходно. Если этот ответ помог отметить его как корректный:) – negusp 5 December 2016 в 09:31

Другие вопросы по тегам:

Похожие вопросы: