Запустите каждое окно на всех рабочих областях с несколькими исключениями

Я знаю о Всегда на видимой рабочей области, Но я хочу, чтобы все окна имели это как значение по умолчанию при открытии за немногим исключением.

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

Действительно ли это возможно? Если будут требоваться некоторые сценарии, то я, вероятно, не буду возражать.

Я запускаю Ubuntu 17.04 с корицей, Но afaik эта функция присутствует в единице и большинстве настольных сред.

2
задан 12 November 2017 в 18:11

1 ответ

Интересный случай.

Что мы должны принять во внимание

Понятие не к сложному: просто установите все липкие окна, однако:

  • Так как Вы хотите исключить некоторые приложения, мы должны будем перечислить те приложения и проверить окна на их класс окна, чтобы решить, должны ли мы установить их липкий (обнаружьтесь на всех рабочих областях), или нет.
  • Список окна, как произведено от wmctrl -l также шоу несколько типов окна, как ПРИКРЕПЛЕНИЕ и РАБОЧИЙ СТОЛ, которого Вы не должны редактировать их свойства в целом.
  • Мы должны будем удостовериться только набор новые липкие окна, для предотвращения ненужного расхода топлива.

Сценарий в качестве примера (Python)

В сценарии ниже:

  • цикл с двумя вторыми циклами работает для сравнения списка окна с предыдущим, с помощью:

    wmctrl -l
    

    и впоследствии извлеките идентификатор окна из каждой из строк

  • Впоследствии, выполнения сценария

    xprop -id <window_id>
    

    В котором мы можем найти информацию о _NET_WM_WINDOW_TYPE и WM_CLASS

  • Если новое окно "проходит" эти тесты, i.o.w. окно не принадлежит ни одному из исключенных приложений и не ни одного из исключенных типов, оно установлено липкое.

Так как сценарий только действует на недавно созданные окна, он не добавит noticable нагрузки для Вашей системы.

Сценарий

#!/usr/bin/env python3
import subprocess
import time

# excluded applications
apps = ["gedit", "chromium", "monkey"]


# ignored window types
ignore = [
    "= _NET_WM_WINDOW_TYPE_DOCK",
    "= _NET_WM_WINDOW_TYPE_DESKTOP",
]


# just a helper
def get(cmd):

    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except (subprocess.CalledProcessError, TypeError):
        pass


# initiate windowlist
wins1 = []


while True:
    # cycle time
    time.sleep(2)
    # initiate new list
    new_wins = []
    # get the most recent window list
    windata = get(["wmctrl", "-l"])
    if windata:
        # extract window -ids
        wins2 = [w.split()[0] for w in windata.splitlines()]
        new = [w for w in wins2 if w not in wins1]
        # check for excluded classes and window types
        for w in new:
            testdata = get(["xprop", "-id", w])
            if all([
                not any([ig in testdata for ig in ignore]),
                not any([app in testdata for app in apps]),
                ]):
                # set the passed windows to sticky
                subprocess.Popen(
                    ["wmctrl", "-i", "-r", w, "-b", "add,sticky"]
                    )
        # refresh the window list for next cycle
        wins1 = wins2

Как установить

  1. Удостовериться wmctrl установлен:

    sudo apt install wmctrl
    
  2. Скопируйте сценарий в пустой файл, сохраните его как set_sticky.py
  3. В главном разделе Вашего сценария, набор WM_CLASS - SES для исключения (Вы могли бы хотеть удалить обезьяну это было для тестирования :))
  4. Тестовый прогон это с командой:

    python3 /path/to/set_sticky.py
    
  5. Если все хорошо работает, Вы могли бы добавить его, чтобы Запустить Приложения, но удостовериться, что добавили маленькое повреждение, чтобы препятствовать тому, чтобы сценарий повредился на еще готовом рабочем столе:

    /bin/bash -c "sleep 10 && python3 /path/to/set_sticky.py"
    

Весело провести время :)

Примечание:

Я протестировал его на Волнистом попугайчике Ubuntu (бормотание) в течение 25 минут без проблемы. Это должно хорошо работать на любом менеджере окон, но в случае, если Вы сталкиваетесь с проблемой, просто упоминаете.

2
ответ дан 2 December 2019 в 03:36

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

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