В текущей рабочей области я не хочу видеть край окна, с которым я работал на другой рабочей области.
Также мне нравится способность пихнуть окно главным образом от экрана, настолько вызывающие границы не были бы хорошим решением.
Существует ли путь только к не, показывают окно, если это не часть текущей рабочей области?
Я полагаю, что решение ниже делает то, что Вы описываете. Это - то, что это делает:
Обычный эффект: накладывающиеся окна появятся на смежных рабочих областях
Эффективно, при нажатии сочетания клавиш, это будет результатом
Пример
Решение включает два сценария; один фоновый сценарий, который отслеживает на z-порядке окон (так как у нас нет инструментов для получения его иначе), и сценарий, чтобы минимизировать окна и отслеживать, на котором окна уже были минимизированы пользователем.
Почему два сценария?
Первоначально, мне объединили сценарий в одном, и это, казалось, хорошо работало. Однако в моей системе, это увеличило (неактивное) размещение процессора от 3-4% до appr. 9-11%, который является слишком много для фонового сценария, по-моему, особенно когда Вы запускаете несколько скриптов одновременно.
Сценарий теперь разделяется на фоновый раздел, который отслеживает на фокусе - история (для сможения к не-минимизируют окна в том же порядке z-, как Вы оставили рабочую область), и сценарий для вызова с сочетанием клавиш. Фоновый сценарий не добавляет практически фонового шума.
Потребность сценария (сценариев) оба wmctrl
и xdotool
:
sudo apt-get install wmctrl xdotool
Скопируйте script1 ниже в пустой файл, безопасный это как focus_history.py
:
#!/usr/bin/env python3
import subprocess
import time
import os
rootdata = os.environ["HOME"]+"/.focus_history"
def current_windows():
try:
return subprocess.check_output(["wmctrl", "-l"]).decode("utf-8")
except subprocess.CalledProcessError:
pass
def convert_format(w_id):
return w_id[:2]+(10-len(w_id))*"0"+w_id[2:]
def read_data():
return open(rootdata).read().splitlines()
def get_top(wlist):
try:
top = convert_format(
[l.split("#")[-1].strip() for l in subprocess.check_output(
["xprop", "-root"]
).decode("utf-8").splitlines() \
if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0])
return [l for l in wlist if top in l][0]
except IndexError:
pass
open(rootdata, "wt").write("This is an empty line")
while True:
time.sleep(0.5)
wdata = current_windows()
if wdata != None:
wlist = wdata.splitlines()
# get frontmost window (as in wmctrl -lG)
top = get_top(wlist)
oldlist = read_data()
if not any([top == oldlist[0], top == None]):
# clean up closed windows
[oldlist.remove(l) for l in oldlist if not l.split()[0] in wdata]
# remove possible other mentions of the active window
[oldlist.remove(l) for l in oldlist if l.startswith(top.split()[0])]
open(rootdata, "wt").write(("\n").join([top]+oldlist))
Скопируйте script2 ниже в пустой файл, безопасный это как stop_overlap.py
:
#!/usr/bin/env python3
import subprocess
import time
import os
wfile = os.environ["HOME"]+"/.m_list"
rootdata = os.environ["HOME"]+"/.focus_history"
def get_res():
# get the resolution (workspace- size)
data = subprocess.check_output(["xrandr"]).decode("utf-8").split()
mark = data.index("current")
return [int(n) for n in [data[mark+1], data[mark+3].replace(",", "")]]
res = get_res()
def get_wlist(res):
try:
# get the window data
wlist = [l.split() for l in subprocess.check_output(
["wmctrl", "-lG"]).decode("utf-8").splitlines()]
# check if windows are "normal" windows and see if they are minimized
show = []; hide = []
for w in wlist:
w_data = subprocess.check_output(
["xprop", "-id", w[0]]
).decode("utf-8")
quality = [
"_NET_WM_WINDOW_TYPE_NORMAL" in w_data,
"_NET_WM_STATE_HIDDEN" in w_data,
]
# check if windows are on current workspace or elsewhere
onthis = all([0 < int(w[2]) < res[0],
0 < int(w[3]) < res[1]])
# summarize what should be done with the windows
if all([quality == [True ,True], onthis == True]):
show.append(w[0])
elif all([quality == [True, False], onthis == False]):
hide.append(w[0])
return [show, hide, [l[0] for l in wlist]]
except subprocess.CalledProcessError:
pass
oncurrent = []; onother = []; d_wlist = []
wins = get_wlist(res)
for w in wins[1]:
# hide (minimize) windows on other workspacec -only if- they are not hidden already!
subprocess.Popen(["xdotool", "windowminimize", w])
# write hidden windows to a file, so the script will only un- minimize windows
# that were not hidden in the first place
open(wfile, "a+").write("\n"+w)
if wins[0]:
# if there are windows on the current workspace that need to be un- minimized,
# show them in the correct z- order, as recorded by the other script
priority = reversed([l.split()[0] for l in open(rootdata).read().splitlines()])
try:
d_wlist = [l for l in open(wfile).read().splitlines() if not l == "\n"]
except FileNotFoundError:
d_wlist = []
for w in priority:
if all([w in wins[0], w in d_wlist]):
subprocess.Popen(["wmctrl", "-ia", w])
time.sleep(0.1)
d_wlist.remove(w)
# clean up window list, remove non- existant windows
d_wlist = set([item for item in d_wlist if item in wins[2]])
open(wfile, "wt").write(("\n").join(d_wlist))
Тестовый прогон установка: прежде, чем открыть любые другие окна:
Выполненный script1 из окна терминала командой:
python3 /path/to/focus_history.py
Теперь откройте некоторые случайные окна, некоторые перекрывающие Ваши рабочие области
Теперь переместитесь в смежную рабочую область, выполните сценарий 2 с командой:
python3 /path/to/stop_overlap.py
Накладывающиеся окна должны исчезнуть
Если все хорошо работает, добавьте script1 для Запущения Приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:
/bin/bash -c "sleep 15 && python3 /path/to/focus_history.py
Добавьте script2 к сочетанию клавиш: выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:
python3 /path/to/stop_overlap.py
к ярлыку по Вашему выбору...