Рейтинг:2

переключение между окнами одного и того же приложения не всегда работает

флаг gb

Когда я переключаюсь между окнами одного и того же приложения, оно не работает с все Приложения:

  • терминал гнома: ОК
  • гэд: хорошо
  • хром: нокаут
  • емакс: нокаут

В частности, для chrome и emacs он видит только одно окно, в то время как открыто два.

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

В «Настройки» -> «Сочетания клавиш» я настроил «Переключение окон приложения» с помощью «Super + Tab» и отключил «Переключение приложений».

Текст

Это известная проблема?

У меня работает Ubuntu 20.04 Воспоминание Gnome 3.36.8 (метасити).

Спасибо!

флаг ru
Комментарии не для расширенного обсуждения; этот разговор был [перенесен в чат] (https://chat.stackexchange.com/rooms/129129/discussion-on-question-by-ricky-robinson-switching-between-windows-of-the-same-a) .
Рейтинг:1
флаг by

Я пробовал на 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. Возможно, вам может понадобиться установить одну или две дополнительные библиотеки, но давайте выясним, есть ли вывод в терминале.

флаг gb
Большое спасибо за сценарий! Хотя это кажется немного излишним. :) Вы определенно заслуживаете награды, позвольте мне просто выяснить, смогу ли я исправить это, обновив мою установку.
Jacob Vlijm avatar
флаг by
@RickyRobinson, вы имеете в виду излишество, чтобы сделать для него сценарий, или излишество, чтобы использовать для него сценарий? Если первое: не волнуйтесь, это отредактированная/упрощенная python-версия кода, который я использую в другом месте. Использовать его на самом деле не сложно, и это устраняет проблему. Другой вариант, конечно, обновить до более поздней версии Ubuntu, где она, по-видимому, исправлена ​​(по крайней мере, в версии 21.10 dev.). Однако это гораздо больше работы :)
Рейтинг:0
флаг cn

Попробуйте перезаписать значения.

  1. Установите новое значение для Переключить приложения.
  2. Перезапишите значение для Переключить окна.
флаг gb
Я понимаю. Но на другой машине у меня debian + xfce и переключение между окнами одного и того же приложения работает очень хорошо. По крайней мере, в этой настройке нет никаких различий в поведении от одного приложения к другому.
Unix avatar
флаг cn
Ах, чувак, я «читал» (неправильно) «вкладки» вместо «окна» ... Позвольте мне исправить свой ответ.
флаг gb
Конечно! Но... «переключение приложений» сводится к «переключению окон» в моей настройке. Кажется, он делает то же самое на обоих моих рабочих местах. Моя проблема в том, что переключение между окнами одного и того же приложения глючит...
Unix avatar
флаг cn
Если перезапись значений (просто для проверки) не решает проблему, то следующим шагом будет проверка инструмента dconf. Взгляните на этот ответ: https://superuser.com/a/860001/396041
флаг gb
Хорошо, но это ни к чему не привело, к сожалению. Проблема не в том, что это никогда не работает. Проблема в том, что для одних приложений работает, а для других видит только одно окно, а их много.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.