Я использую несколько окон 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
Если окна всегда создаются (на запуске) в том же хронологическом порядке (как Вы упомянули в комментарии), можно использовать определенное свойство вывода команды wmctrl -l
: Список всегда перечисляет окна в порядке, они были созданы.
Это означает это, если Вы имеете (например). три окна, пере - созданный во всегда том же порядке, можно просто сначала отфильтровать окна, принадлежа Chrome
, затем "отметьте" окна согласно их порядку как их появляющиеся (редактор) в выводе wmctrl
.
Chrome
окна от wmctrlДля идентификации окон, принадлежа приложению, необходимо использовать команду:
wmctrl -lp
который также покажет pid, окно принадлежит. Обычно, это - единственный pid. В случае Chrome
однако, будут несколько. Процедура, программно, затем:
Найдите pids Chrome
путем выполнения:
pgrep chrome
Выполните команду:
wmctrl -lp
проанализируйте на окно, pid окно принадлежит, и ищите соответствие в выводе (список) pgrep chrome
Это произведет список окон, принадлежа 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]])
будет всегда повышать второе и так далее.
Замените повышение - управляют перемещением - команда, и у Вас будет своя работа сценария.
Таким образом, я смог решить проблему с помощью 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