Как заставить Alt+Tab возвратиться к тому же окну приложения как в последний раз используемый (Единица)

Используя Высокий звук +Tab обычно делает то, что я хочу; это группирует окна из того же приложения. Если я хочу переключиться между окнами одного и того же приложения, я использую Высокий звук +'

Однако, если у меня есть несколько окон терминала, открытых (например), и я использую Высокий звук +Tab, чтобы переключиться на другое приложение и затем переключиться назад на терминал, другое окно терминала впереди, чем последнее.

Как я вынуждаю это всегда возвратиться к тому же окну приложения, как гном 3 делает?

Ubuntu 14,04 единиц.

1
задан 22 January 2015 в 00:26

1 ответ

Ниже сценария, который переключается через окна приложения. Это помнит используемое последнее (= frontmost) окно всех запущенных приложений, обходя другие окна того же приложения.

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

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

  • Использование сценария wmctrl

    sudo apt-get install wmctrl
    
  • Скопируйте сценарий ниже в пустой файл, то же это как alternative_switcher.py

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

    python3 /path/to/alternative_switcher.py
    
  • Используйте его в качестве альтернативного переключателя с Вашим сочетанием клавиш.

Примечание:

Сценарий переключается среди "нормальных" окон приложения, столь же определенных как: "_NET_WM_WINDOW_TYPE_NORMAL" в выводе xprop -id <window_id> команда. Это означает, что диалоговые окна будут исключены из списка окна, а также Idle окна, например, которые имеют pid 0.

Сценарий

#!/usr/bin/env python3
import subprocess
import os
import getpass

home = os.environ["HOME"]
lastdir = home+"/.config/alternative_switcher"; wlist = lastdir+"/"+"wlist.txt"

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def get_frontmost():
    cmd = "xprop -root"
    frontmost = [l for l in get(cmd).splitlines() if\
                 "ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
    return frontmost[:2]+"0"+frontmost[2:]
# read last used windowlist
if not os.path.exists(lastdir):
    os.makedirs(lastdir)
try:
    with open(wlist) as src:
        windowlist = eval(src.read())
except (FileNotFoundError, SyntaxError):
    windowlist = []
# creating window list: id, application name
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
[windowlist.remove(w) for w in windowlist if not w[1] in [data[0] for data in w_data]]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
           for w in w_data if "_NET_WM_WINDOW_TYPE_NORMAL" in get("xprop -id "+w[0])]
# get frontmost window + application
frontmost = [data for data in windows if data[1] == get_frontmost()][0]
[windowlist.remove(item) for item in windowlist if item[0] == frontmost[0]]
# add frontmost to  windowlist of last-used application windows
windowlist.insert(0, frontmost)
current_app = frontmost[0]
# determine next application
apps = sorted(set([w[0] for w in windows]))
next_app_i = apps.index(current_app)+1
if next_app_i == len(apps):
    next_app_i = 0
next_app = apps[next_app_i]
# find matching window to raise
try:
    next_w = [w[1] for w in windowlist if w[0] == next_app][0]
except IndexError:
    next_w = [w[1] for w in windows  if w[0] == next_app][0]
# write last- window list
with open(wlist, "wt") as out:
    out.write(str(windowlist))
# raise next window
cmd = "wmctrl -ia "+next_w
subprocess.Popen(["/bin/bash", "-c", cmd])
1
ответ дан 7 December 2019 в 16:25

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

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