Вопрос или проблема
В случае, если я знаю, что окно вот-вот откроется, иногда я хочу, чтобы оно открылось нормально (перемещая другие окна для освобождения места), но в другое время я знаю, что хочу, чтобы оно плавало и избегать изменения размеров других окон. Один из таких сценариев — это когда открыто много терминальных окон, и изменение их размеров приведет к неопрятному отображению, и я только кратковременно хочу новое окно.
Я не хочу настраивать правила для каждого приложения или класса окон для этого, по крайней мере, не для целей этого вопроса.
Что бы мне хотелось, так это возможность зажать клавишу, ожидая, когда откроется окно, и если клавиша зажата, новое окно будетforced to float, чтобы другие окна не изменялись в размерах.
Возможно ли это? Как я могу этого достичь?
Это сработало для меня в sway, который в значительной степени совместим с i3:
set $mod Mod4
set $float disable
bindsym $mod+f set $$float enable
for_window [title=".*"] floating $$float; set $$float disable
Теперь, когда я нажимаю Mod4+f
, следующее открытое окно будет плавать, но любое новое окно после этого будет плиткой, пока я снова не нажму Mod4+f
. Обратите внимание, что swaymsg
эквивалентен i3msg
.
Вы спрашивали о задерживании клавиши для включения режима плавания. Это кажется сложным для настройки в универсальном плане, так как нет способа проверить статус клавиши-модификатора в i3/sway (по крайней мере, я об этом не знаю). Если у вас есть небольшое количество программ, которые вы предполагаете запускать в режиме плавания, вы можете просто настроить поведение отдельно для каждой, вот так:
bindsym $mod+z exec evince
bindsym $mod+Shift+z set $$float enable; exec evince
Обратите внимание, что критерий в первом ответе [title=".*"]
будет включать каждое окно. Это может вызвать неожиданные проблемы, например, привести к тому, что диалоговые окна больше не будут плавать по умолчанию. Вам придется уточнить критерий, чтобы исключить типы окон, которые вы не хотите, чтобы они подвергались влиянию. В качестве альтернативы это может сработать:
set $float toggle
bindsym $mod+f set $$float enable
for_window [title=".*"] floating $$float, floating $$float, set $$float toggle
floating toggle, floating toggle
не должно иметь никакого эффекта, сохраняя оригинальный статус плавания.
Ответ или решение
Вопрос о том, возможно ли временно заставить любое новое окно открываться в плавающем режиме в среде рабочего стола i3, является актуальной темой для пользователей, стремящихся к эффективной и гибкой организации рабочего пространства. i3 — это менеджер окон, предоставляющий пользователям возможность максимально оптимизировать использование экранного пространства, однако иногда возникает необходимость открывать окна, избегая их автоматического изменения размеров. В данном ответе мы подробно рассмотрим решение, которое позволит открыть новые окна в плавающем режиме, когда это необходимо, без углубленного конфигурирования для каждой отдельной программы или класса окна.
Основная проблема
Работая с несколькими терминалами одновременно, пользователи могут столкнуться с проблемой неупорядоченного отображения окон в результате их автоматического изменения размеров при открытии нового окна. Часто возникает необходимость быстро открыть новое окно, не ухудшая текущее расположение открытых окон.
Решение с использованием i3
Вы можете достичь желаемого поведения, добавив в ваш конфигурационный файл i3 (обычно ~/.config/i3/config
) соответствующие строки. Приведем пример кода, который поможет вам добиться такого поведения:
set $mod Mod4
set $float disable
bindsym $mod+f set $$float enable
for_window [title=".*"] floating $$float; set $$float disable
Объяснение
-
Модификатор клавиш: Мы устанавливаем переменную
$mod
какMod4
, что обычно соответствует клавише "Windows". Это позволит вам использовать сочетание с этой клавишей для активации плавающего режима. -
Переменная состояния плавающего окна: Переменная
$float
по умолчанию установлена в значениеdisable
, что обозначает, что новые окна будут открываться в обычном режиме. -
Команда для переключения режима: С помощью сочетания клавиш
$mod+f
вы активируете плавающий режим, что позволит следующему открываемому окну появляться в этом режиме. -
Обработка открываемых окон: Выражение
for_window [title=".*"] floating $$float; set $$float disable
обеспечивает автоматическое возвращение к нормальному режиму для последующих окон после первого.
Устранение проблем с длительным удерживанием клавиш
Хотя вы выразили желание реализовать функциональность путем удерживания клавиши, к сожалению, в i3 (и sway) нет возможности в стандартной конфигурации запросить статус модификаторной клавиши. Можно рассмотреть альтернативный подход:
set $float toggle
bindsym $mod+f set $$float enable
for_window [title=".*"] floating $$float, floating $$float, set $$float toggle
Заключение
Таким образом, использование приведенных выше настроек и концепций позволит вам временно открывать окна в плавающем режиме, предотвращая изменение размеров других окон. Вы сможете адаптировать рабочую среду i3 по своему усмотрению, не прибегая к сложной настройке для каждого отдельного приложения. При этом важно отметить, что следует остерегаться потенциальных случаев, когда расширение правил может негативно сказаться на поведении некоторых окон, таких как диалоговые окна.
В случае возникновения дополнительных вопросов или необходимости индивидуальных советов, рекомендую обратиться на профильные форумы или сообщества пользователей i3, где вам смогут помочь с более конкретными настройками под ваши нужды.