Как я могу предотвратить раздражающую рабочую область - появление накладывающегося окна?

В текущей рабочей области я не хочу видеть край окна, с которым я работал на другой рабочей области.

Также мне нравится способность пихнуть окно главным образом от экрана, настолько вызывающие границы не были бы хорошим решением.

Существует ли путь только к не, показывают окно, если это не часть текущей рабочей области?

2
задан 5 December 2015 в 18:36

1 ответ

Как предотвратить рабочую область - накладывающиеся окна

Я полагаю, что решение ниже делает то, что Вы описываете. Это - то, что это делает:

Обычный эффект: накладывающиеся окна появятся на смежных рабочих областях

enter image description here

Эффективно, при нажатии сочетания клавиш, это будет результатом

enter image description here

На практике:

Пример

  • Продолжать работать (например). рабочая область 1, с некоторыми окнами, накладывающимися на других рабочих областях
  • Затем переместитесь в рабочую область 2, нажмите комбинацию сочетания клавиш: все окна, кроме тех на текущей рабочей области, будут минимизированы и таким образом не появятся на текущей рабочей области так или иначе (за исключением средства запуска).
  • Затем возвращаясь к рабочей области 1, нажимая сочетание клавиш снова, рабочий стол будет точно похож на Вас, оставил его. Даже порядок окна de (z-wise) и возможно минимизированные окна будут точно похожи на это, был. В то же время окна на кроме текущей рабочей области будут скрыты.

Как это работает

Решение включает два сценария; один фоновый сценарий, который отслеживает на z-порядке окон (так как у нас нет инструментов для получения его иначе), и сценарий, чтобы минимизировать окна и отслеживать, на котором окна уже были минимизированы пользователем.

Почему два сценария?

Первоначально, мне объединили сценарий в одном, и это, казалось, хорошо работало. Однако в моей системе, это увеличило (неактивное) размещение процессора от 3-4% до appr. 9-11%, который является слишком много для фонового сценария, по-моему, особенно когда Вы запускаете несколько скриптов одновременно.
Сценарий теперь разделяется на фоновый раздел, который отслеживает на фокусе - история (для сможения к не-минимизируют окна в том же порядке z-, как Вы оставили рабочую область), и сценарий для вызова с сочетанием клавиш. Фоновый сценарий не добавляет практически фонового шума.

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

  1. Потребность сценария (сценариев) оба wmctrl и xdotool:

    sudo apt-get install wmctrl xdotool
    
  2. Скопируйте 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))
    
  3. Скопируйте 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))
    
  4. Тестовый прогон установка: прежде, чем открыть любые другие окна:

    • Выполненный 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

к ярлыку по Вашему выбору...

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

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

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