Я пробовал на Ubuntu (Budgie) 20.04 с тем же результатом, будь то ярлык, если он работал, переключался (только) между двумя самыми последними окнами активного приложения. Как и ты, с а.о. Chrome вообще никаких переключений не происходило.
Мы можем придумать несколько причин, по которым определенные приложения не переключают окна, но нам нужно заглянуть в код, чтобы узнать, что именно происходит. Даже тогда это не совсем решит вашу проблему.
Сценарий ниже, запущенный как демон, в сочетании с отредактированным ярлыком, выполняет свою работу. Он протестирован 20.04 и (по крайней мере) с Chrome без проблем. Я почти уверен, что он отлично работает со всеми приложениями с окнами типа NORMAL.
Что оно делает
Демон запускается файлом триггера, созданным в /tmp
по / ярлыку. Впоследствии он ищет все допустимые окна активного приложения в текущей рабочей области в куча, поэтому мы знаем z-порядок. Затем демон активирует первое окно в стеке, циклически перебирая окна.
В качестве дополнительного
... Вы можете установить ярлык для переключения между двумя последними окнами приложений, что было поведением по умолчанию на моей версии 20.04.
Как настроить
- Скопируйте приведенный ниже скрипт в пустой файл, сохраните его как
цикл_альтернативный
, (или любое другое имя, которое вам нравится). Расширение .py
не требуется.
- Сделать скрипт исполняемым
- Запустите его (продолжайте работать) с помощью команды
/path/to/cycle_alternative
.
- Теперь заставьте свой ярлык выполнить команду
коснитесь /tmp/forward_trigger
чтобы он циклически проходил через все окна активного приложения. Для переключения между два последних окна, установите ярлык для выполнения коснитесь /tmp/switchactive_trigger
Если все работает нормально, добавьте демон в свои приложения для запуска.
Почему демон?
Вы можете добавить ту же функциональность в сценарий, вызываемый ярлыком, но холодный запуск + загрузка библиотек в каждом случае сделают его работу менее отзывчивой. Запуск демона не представляет собой дополнительной нагрузки.
Скрипт/демон
#!/usr/bin/env python3
импорт ги
gi.require_version('Wnck', '3.0')
gi.require_version('Gtk', '3.0')
из gi.repository импортировать Wnck, Gtk, Gio, Gdk, GdkX11
импорт ОС
класс бдительность:
защита __init__(сам):
self.wnckscr = Wnck.Screen.get_default()
# мы будем активировать функцию демона с помощью триггерных файлов
self.triggers = [
"/tmp/forward_trigger",
"/tmp/switchactive_trigger"
]
# так что будем следить за этими двумя файлами
forward_mon = Gio.File.new_for_path(self.triggers[0]).monitor(
Gio.FileMonitorFlags.NONE , Нет
)
switchactive_mon = Gio.File.new_for_path(self.triggers[1]).monitor(
Gio.FileMonitorFlags.NONE , Нет
)
# ...и заставить их что-то активировать
для пн в [
forward_mon, switchactive_mon
]:
mon.connect("изменено", self.switchwindow)
Gtk.main()
def switchwindow (я, arg1, файл, arg3, событие):
# посмотрим, какой триггер сработает, получим имя группы активного окна
fname = файл.get_path()
activewin = self.wnckscr.get_active_window()
checkwinisnormal = Ложь
пытаться:
active_class = activewin.get_class_group_name()
checkwinisnormal = activewin.get_window_type() == Wnck.WindowType.NORMAL
кроме AttributeError:
проходят
# давайте проверим правильность события и корректность окна
я упал([
событие == Gio.FileMonitorEvent.СОЗДАНО,
checkwinisнормальный
]):
# получим окна активного приложения и текущую рабочую область
# искать окна только в этой рабочей области
currclass_xids = []
curr_ws = self.wnckscr.get_active_workspace().get_number()
для w в self.wnckscr.get_windows_stacked():
пытаться:
на этом = w.get_workspace().get_number() == curr_ws
кроме AttributeError:
проходят
еще:
я упал([
w.get_window_type() == Wnck.WindowType.NORMAL,
active_class == w.get_class_group_name(),
на этом
]):
currclass_xids.append(w.get_xid())
target_xid = [0, -2][self.triggers.index(fname)]
для w в self.wnckscr.get_windows_stacked():
пытаться:
если w.get_xid() == currclass_xids[target_xid]:
сейчас = GdkX11.x11_get_server_time(
GdkX11.X11Window.lookup_for_display(
Gdk.Display.get_default(),
GdkX11.x11_get_default_root_xwindow()
)
)
w.активировать (сейчас)
кроме IndexError:
проходят
пытаться:
os.remove(fname)
кроме FileNotFoundError:
проходят
осторожно()
Н.Б.
P.S. Возможно, вам может понадобиться установить одну или две дополнительные библиотеки, но давайте выясним, есть ли вывод в терминале.