Я знаю о Всегда на видимой рабочей области, Но я хочу, чтобы все окна имели это как значение по умолчанию при открытии за немногим исключением.
Рабочий процесс, который я ищу, является в значительной степени инверсией того, как это работает. Покажите все на всех рабочих областях за несколькими (ручными) исключениями.
Действительно ли это возможно? Если будут требоваться некоторые сценарии, то я, вероятно, не буду возражать.
Я запускаю Ubuntu 17.04 с корицей, Но afaik эта функция присутствует в единице и большинстве настольных сред.
Интересный случай.
Понятие не к сложному: просто установите все липкие окна, однако:
wmctrl -l
также шоу несколько типов окна, как ПРИКРЕПЛЕНИЕ и РАБОЧИЙ СТОЛ, которого Вы не должны редактировать их свойства в целом.В сценарии ниже:
цикл с двумя вторыми циклами работает для сравнения списка окна с предыдущим, с помощью:
wmctrl -l
и впоследствии извлеките идентификатор окна из каждой из строк
Впоследствии, выполнения сценария
xprop -id <window_id>
В котором мы можем найти информацию о _NET_WM_WINDOW_TYPE
и WM_CLASS
Так как сценарий только действует на недавно созданные окна, он не добавит 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
Удостовериться wmctrl
установлен:
sudo apt install wmctrl
set_sticky.py
WM_CLASS
- SES для исключения (Вы могли бы хотеть удалить обезьяну это было для тестирования :))Тестовый прогон это с командой:
python3 /path/to/set_sticky.py
Если все хорошо работает, Вы могли бы добавить его, чтобы Запустить Приложения, но удостовериться, что добавили маленькое повреждение, чтобы препятствовать тому, чтобы сценарий повредился на еще готовом рабочем столе:
/bin/bash -c "sleep 10 && python3 /path/to/set_sticky.py"
Весело провести время :)
Я протестировал его на Волнистом попугайчике Ubuntu (бормотание) в течение 25 минут без проблемы. Это должно хорошо работать на любом менеджере окон, но в случае, если Вы сталкиваетесь с проблемой, просто упоминаете.