Как я могу циклически повторить окна в порядке панели задач?

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

При поиске я нашел способы сделать это в Windows или возможно compiz с другими дистрибутивами, ничто, что я мог использовать в Ubuntu.

6
задан 24 October 2018 в 10:08

1 ответ

Цикл через окна слева направо

(или на текущей области просмотра только, или через все области просмотра)

Сценарий ниже, добавленный к сочетанию клавиш, циклически повторится через Ваши окна слева направо:

enter image description here

Сценарий

#!/usr/bin/env python3
import subprocess
from operator import itemgetter
import sys

this_ws = True if "oncurrent" in sys.argv[1:] else False
nxt = -1 if "backward" in sys.argv[1:] else 1

def get(command):
    try:
        return subprocess.check_output(command).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def exclude(w_id):
    # exclude window types; you wouldn't want to incude the launcher or Dash
    exclude = ["_NET_WM_WINDOW_TYPE_DOCK", "_NET_WM_WINDOW_TYPE_DESKTOP"]
    wdata = get(["xprop", "-id", w_id])
    return any([tpe in wdata for tpe in exclude])

if this_ws:
    # if only windows on this viewport should be picked: get the viewport size
    resdata = get("xrandr").split(); index = resdata.index("current")
    res = [int(n.strip(",")) for n in [resdata[index+1], resdata[index+3]]]

# get the window list, geometry
valid = [w for w in sorted([[w[0], int(w[2]), int(w[3])] for w in [
    l.split() for l in get(["wmctrl", "-lG"]).splitlines()
    ]], key = itemgetter(1)) if not exclude(w[0])]

# exclude windows on other viewports (if set)
if this_ws:
    valid = [w[0] for w in valid if all([
        0 <= w[1] < res[0], 0 <= w[2] < res[1]
        ])]
else:
    valid = [w[0] for w in valid]

# get active window
front = [l.split()[-1] for l in get(["xprop", "-root"]).splitlines() if \
         "_NET_ACTIVE_WINDOW(WINDOW)" in l][0]

# convert xprop- format for window id to wmctrl format
current = front[:2]+((10-len(front))*"0")+front[2:]

# pick the next window
try:
    next_win = valid[valid.index(current)+nxt]
except IndexError:
    next_win = valid[0]

# raise next in row
subprocess.Popen(["wmctrl", "-ia", next_win])

Как использовать

  1. Для сценария нужен wmctrl

    sudo apt-get install wmctrl
    
  2. Скопируйте сценарий в пустой файл, сохраните его как cyclewins.py

  3. Добавьте сценарий к сочетанию клавиш: выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:

    python3 /path/to/cyclewins.py
    

Именно

Только цикл через окна на текущей области просмотра?

В случае, если Вы только хотите циклически повториться через окна на текущей области просмотра, сценарий с аргументом oncurrent:

python3 /path/to/cyclewins.py oncurrent

Циклически повториться назад?

В случае, если требуется циклически повториться справа налево, запустите скрипт с аргументом backward:

python3 /path/to/cyclewins.py backward

Конечно, комбинация этих двух аргументов возможна;

python3 /path/to/cyclewins.py backward oncurrent

циклически повторится назад через Ваши окна на текущей области просмотра.

4
ответ дан 23 November 2019 в 07:59

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

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