Вопрос или проблема
Я перешел с i3 на Wayland, и всё работает нормально, за исключением скрипта, который я написал некоторое время назад. Скрипт использует i3-msg для фокусировки на окне по его имени класса или идентификатору (из дерева i3-msg). Sway имеет команду swaymsg -t get_tree
, которая делает то же самое, что и в i3. С помощью этой команды я могу извлечь id
, app_id
, window
, pid
или любые другие данные из командной строки с помощью команды
swaymsg -t get_tree | jq -c -r '..|try select(.focused == true) | [.id]' | tr -d "[]"
(В зависимости от атрибута, .id
конечно будет заменен на правильный запрос).
Когда я пытаюсь использовать информацию о контейнере для фокусировки на конкретном окне с помощью
swaymsg for_window -r [id=10] focus
ничего не происходит, хотя я проверил, что id правильный. Из-за опции -r
swaymsg
даже выводит (флаг не влияет на тот факт, что ничего не произошло):
[
{
"success": true
}
]
поэтому, кажется, нет никаких ошибок. Я пробовал множество параметров, из других источников я читал, что app_id
кажется правильным выбором в Wayland при взаимодействии с окнами или контейнерами через swaymsg
, но ничего не происходит. Я также пробовал команду с разными программами, такими как терминалы или браузеры, ничего не изменяется. В руководстве swaymsg
также говорится, что нужно обернуть команду в кавычки, но это тоже не помогает. Поскольку я не получаю никаких ошибок, я в затруднении, как отладить.
Хотя пост уже довольно старый, кто-то другой может наткнуться на тот же вопрос, как и я.
По всей видимости, фокус не работает с for_window
, а просто через <criteria> focus
. Также, возможно, вам нужно использовать con_id
вместо id
. Из man 5 sway
:
id может использоваться только с xwayland-видами
Так что полная команда будет:
swaymsg -r [con_id=10] focus
Ответ или решение
Проблема с фокусировкой окна в Sway через команду swaymsg
является распространённой среди пользователей, которые переходят с i3 на Wayland. Ваш опыт, описанный в вопросе, поднимает несколько важных моментов, о которых полезно знать, чтобы успешно управлять окнами в Sway.
Описание проблемы
Вы стремитесь вызвать фокусировку окна через swaymsg
с использованием идентификатора окна, аналогично тому, как это делалось в i3. Однако, при выполнении команды с использованием for_window
, фокусировка некорректно работает. Вы проверили идентификатор, который получен из команды swaymsg -t get_tree
, но, несмотря на успешное выполнение команды, фокусировка окна не происходит.
Разъяснение команды swaymsg
Команда swaymsg
в Sway использует другой подход к управлению окнами по сравнению с i3. Важно понимать, что использование неправильного атрибута, такого как id
, может привести к тому, что команда не будет выполняться корректно. На основе документации man 5 sway
объясняется, что id
может использоваться только с Xwayland версиями окон.
Решение проблемы
Согласно вашему наблюдению, использование con_id
вместо id
может быть ключом к успеху. Чтобы добиться нужного результата, правильная команда будет следующей:
swaymsg -r [con_id=10] focus
Объяснение параметров:
-
con_id
: это коннектор для контейнера, который использует Sway для отображения окон и управления ими. По сравнению сid
,con_id
более универсален для применения в Wayland, так как работает в средеWayland без Xwayland. -
-r
: флаг, позволяющий волосы возвращать ответ в формате JSON, что позволяет проверять успешность выполнения команды.
Дополнительные рекомендации по отладке
-
Проверка доступных окон: Вы можете выполнить
swaymsg -t get_tree
и внимательно изучить структуру, чтобы убедиться, что идентификатор окна, который вы используете, действительно существует и что оно находится в состоянии, когда его можно фокусировать. -
Использование других атрибутов: Если использование
con_id
не решает проблему, вы можете попробовать фокусироваться по другим критериям, таким какapp_id
или сочетание атрибутов. -
Логи Sway: Для более глубокого понимания проблемы можно включить более детализированные журналы Sway. Возможно, вы получите дополнительную информацию о том, почему фокусировка не работает.
-
Тестирование с различными приложениями: Попробуйте выполнить ту же команду с разными приложениями (например, терминалами или браузерами), чтобы исключить возможность того, что особенность приложения мешает фокусировке.
Заключение
По сути, переход с i3 на Wayland через Sway требует переосмысления некоторых подходов к взаимодействию с окнами. Изменение идентификаторов и чёткое понимание различий между id
, con_id
и другими атрибутами станут залогом успешного использования Sway. Следуя указанным рекомендациям и используя правильные команды, вы сможете эффективно управлять фокусировкой окон в вашей среде Wayland.