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

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

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

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

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

1
задан 12 November 2017 в 19:11

3 ответа

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

Что нужно учитывать

. Концепция не сложна: просто установите все липкие окна:

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

Пример сценария (python)

В следующем скрипте:

Поскольку вы хотите исключить некоторые приложения, нам нужно будет указать эти приложения и проверить окна для их оконного класса, решить, следует ли устанавливать их липкими (отображаться на всех рабочих пространствах) или нет. Затем сценарий запускается
xprop -id <window_id>
. В котором мы можем найти информацию о _NET_WM_WINDOW_TYPE и WM_CLASS В списке окон, как вывод wmctrl -l, также показаны несколько типов окон, таких как DOCK и DESKTOP, из которых вы не должны редактировать свои свойства в целом.

] Поскольку скрипт действует только на вновь созданные окна, он не добавит никакой заметной нагрузки на вашу систему.

Сценарий

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

Как настроить

[d22 ] Убедитесь, что установлен wmctrl:
sudo apt install wmctrl
Скопируйте сценарий в пустой файл, сохраните его как set_sticky.py. В разделе главы вашего скрипта установите исключение WM_CLASS -ses (вы можете удалить обезьяна, это было для целей тестирования :)) Протестируйте ее с помощью команды:
python3 /path/to/set_sticky.py
Если все работает нормально, y ou может добавить его в приложения для запуска, но не забудьте добавить небольшой прорыв, чтобы предотвратить взлом скрипта на еще не подготовленном рабочем столе:
/bin/bash -c "sleep 10 && python3 /path/to/set_sticky.py"

Удачи:)

Примечание

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

2
ответ дан 22 May 2018 в 16:45
  • 1
    Я сделал свою собственную PHP-реализацию. Не удалось сделать это без вашего ввода. github.com/janw-oostendorp/Digsby – janw 14 November 2017 в 23:32

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

Что нужно учитывать

. Концепция не сложна: просто установите все липкие окна:

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

Пример сценария (python)

В следующем скрипте:

Поскольку вы хотите исключить некоторые приложения, нам нужно будет указать эти приложения и проверить окна для их оконного класса, решить, следует ли устанавливать их липкими (отображаться на всех рабочих пространствах) или нет. Затем сценарий запускается xprop -id <window_id> . В котором мы можем найти информацию о _NET_WM_WINDOW_TYPE и WM_CLASS В списке окон, как вывод wmctrl -l, также показаны несколько типов окон, таких как DOCK и DESKTOP, из которых вы не должны редактировать свои свойства в целом.

] Поскольку скрипт действует только на вновь созданные окна, он не добавит никакой заметной нагрузки на вашу систему.

Сценарий

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

Как настроить

Убедитесь, что установлен wmctrl: sudo apt install wmctrl Скопируйте сценарий в пустой файл, сохраните его как set_sticky.py. В разделе главы вашего скрипта установите исключение WM_CLASS -ses (вы можете удалить обезьяна, это было для целей тестирования :)) Протестируйте ее с помощью команды: python3 /path/to/set_sticky.py Если все работает нормально, y ou может добавить его в приложения для запуска, но не забудьте добавить небольшой прорыв, чтобы предотвратить взлом скрипта на еще не подготовленном рабочем столе: /bin/bash -c "sleep 10 && python3 /path/to/set_sticky.py"

Удачи:)

Примечание

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

2
ответ дан 18 July 2018 в 03:47

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

Что нужно учитывать

. Концепция не сложна: просто установите все липкие окна:

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

Пример сценария (python)

В следующем скрипте:

Поскольку вы хотите исключить некоторые приложения, нам нужно будет указать эти приложения и проверить окна для их оконного класса, решить, следует ли устанавливать их липкими (отображаться на всех рабочих пространствах) или нет. Затем сценарий запускается xprop -id <window_id> . В котором мы можем найти информацию о _NET_WM_WINDOW_TYPE и WM_CLASS В списке окон, как вывод wmctrl -l, также показаны несколько типов окон, таких как DOCK и DESKTOP, из которых вы не должны редактировать свои свойства в целом.

] Поскольку скрипт действует только на вновь созданные окна, он не добавит никакой заметной нагрузки на вашу систему.

Сценарий

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

Как настроить

Убедитесь, что установлен wmctrl: sudo apt install wmctrl Скопируйте сценарий в пустой файл, сохраните его как set_sticky.py. В разделе главы вашего скрипта установите исключение WM_CLASS -ses (вы можете удалить обезьяна, это было для целей тестирования :)) Протестируйте ее с помощью команды: python3 /path/to/set_sticky.py Если все работает нормально, y ou может добавить его в приложения для запуска, но не забудьте добавить небольшой прорыв, чтобы предотвратить взлом скрипта на еще не подготовленном рабочем столе: /bin/bash -c "sleep 10 && python3 /path/to/set_sticky.py"

Удачи:)

Примечание

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

2
ответ дан 24 July 2018 в 17:56

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

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