Как я могу группировать окна, которые нужно поднимать как один?

У меня есть два окна: A и B. Возможно ли каким-то образом связать два окна вместе, так что переключение на A также вызывает B, или переключение на B также увеличивает A?

Я понимаю, Рабочие пространства - альтернативный вариант, но было интересно, возможно ли это также?

1
задан 2 August 2016 в 16:37

1 ответ

Поднимите произвольное количество окон как одно

. Решение ниже позволит вам выбрать любую комбинацию из двух, трех или более окон, которые будут объединены и подняты как одна с сочетанием клавиш.

Скрипт выполняет свою работу с тремя аргументами:

add

, чтобы добавить активное окно к группе

raise

, чтобы поднять группу set

[ f3]

, чтобы очистить группу, готов к определению новой группы

Сценарий

#!/usr/bin/env python3
import sys
import os
import subprocess

wlist = os.path.join(os.environ["HOME"], ".windowlist")

arg = sys.argv[1]

if arg == "add":
    active = subprocess.check_output([
        "xdotool", "getactivewindow"
        ]).decode("utf-8").strip()
    try:
        currlist = open(wlist).read()
    except FileNotFoundError:
        currlist = []
    if not active in currlist:
        open(wlist, "a").write(active + "\n")
elif arg == "raise":
    group = [w.strip() for w in open(wlist).readlines()]
    [subprocess.call(["wmctrl", "-ia", w]) for w in group]
elif arg == "clear":
    os.remove(wlist)

Как использовать

Сценарий нуждается в wmctrl и xdotool:
sudo apt-get install wmctrl xdotool
Скопируйте сценарий выше в пустой файл, сохраните его как groupwindows.py. Запустите сценарий: откройте два окна терминала, запустите команду:
python3 /absolute/path/to/groupwindows.py add
в обоих из них. Закройте их другими окнами (или минимизируйте их). Откройте третье окно терминала, запустите команду:
python3 /absolute/path/to/groupwindows.py raise
Первые два окна будут подняты как один. Если все работает нормально, создайте три пользовательских сочетания клавиш: Выберите: Системные настройки> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите «+» и добавьте приведенные ниже команды к трем отдельным ярлыкам: в моей системе я использовал: Alt + A, выполнив команду:
python3 /absolute/path/to/groupwindows.py add
..., чтобы добавить окно в группу. Alt + R, выполнив команду:
python3 /absolute/path/to/groupwindows.py raise
..., чтобы поднять группу. Alt + C, выполнив команду:
python3 /absolute/path/to/groupwindows.py clear
..., чтобы очистить группу

Объяснение

Скрипт работает довольно просто:

При запуске с Аргумент add, скрипт хранит / добавляет идентификатор окна активного окна в скрытый файл ~/.windowlist. Когда он запускается с аргументом raise, сценарий читает файл, он вызывает окна в списке с помощью команды:
wmctrl -ia <window_id>
При запуске с аргументом clear скрипт удаляет скрытый файл ~/.windowlist.

Примечания

При запуске с аргументом add скрипт хранит / добавляет идентификатор окна активного окна в скрытый файл ~/.windowlist Если набор окон находится в другом окне просмотра, сценарий переключается на соответствующий видовой экран . Когда он запускается с аргументом raise, сценарий читает файл, он вызывает окна в списке с помощью команды:
wmctrl -ia <window_id>

Больше гибкости?

Как уже упоминалось, сценарий выше позволяет добавлять окна в любое время к сгруппированным окнам. Версия ниже также позволяет любому любому из окон (в любое время) из сгруппированного списка:

#!/usr/bin/env python3
import sys
import os
import subprocess

wlist = os.path.join(os.environ["HOME"], ".windowlist")
arg = sys.argv[1]
# add windows to the group
if arg == "add":
    active = subprocess.check_output([
        "xdotool", "getactivewindow"
        ]).decode("utf-8").strip()
    try:
        currlist = open(wlist).read()
    except FileNotFoundError:
        currlist = []
    if not active in currlist:
        open(wlist, "a").write(active + "\n")
# delete window from the group
if arg == "delete":
    try:
        currlist = [w.strip() for w in open(wlist).readlines()]
    except FileNotFoundError:
        pass
    else:
        currlist.remove(subprocess.check_output([
            "xdotool", "getactivewindow"]).decode("utf-8").strip())      
        open(wlist, "w").write("\n".join(currlist)+"\n")
# raise the grouped windows
elif arg == "raise":
    group = [w.strip() for w in open(wlist).readlines()]
    [subprocess.call(["wmctrl", "-ia", w]) for w in group]
# clear the grouped window list
elif arg == "clear":
    os.remove(wlist)

Дополнительным аргументом для запуска скрипта является delete, поэтому :

python3 /absolute/path/to/groupwindows.py delete

удаляет активное окно из сгруппированных окон. Чтобы запустить эту команду, в моей системе я установил Alt + D как ярлык.

6
ответ дан 23 May 2018 в 07:35

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

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