Paneru: мозаичный оконный менеджер для macOS с бесконечной лентой
Традиционное управление окнами в macOS часто требует от пользователя постоянной ручной настройки размеров приложений и перетаскивания элементов интерфейса. Классические мозаичные (тайлинговые) менеджеры автоматически распределяют окна без перекрытий, но на небольших экранах ноутбуков открытие каждого нового окна делает существующие слишком мелкими, а на больших дисплеях макеты либо чрезмерно растягиваются, либо дробятся на крошечные части. Open-source утилита Paneru, написанная на языке Rust, предлагает альтернативный подход, перенося на macOS концепцию бесконечной горизонтальной прокручиваемой ленты (scrollable tiling), вдохновленную Niri для Linux и PaperWM для GNOME. Окна размещаются в горизонтальный ряд и автоматически сдвигаются вправо при открытии новых без изменения своих размеров, сохраняя стабильность макета (layout stability).
Возможности и архитектурные особенности Paneru
Каждый монитор в Paneru работает с собственной независимой лентой, что предотвращает хаотичный переток окон между дисплеями. Менеджер интегрируется со стандартными рабочими столами macOS (Spaces), поддерживает перетаскивание окон и системные жесты трекпада. Экспериментальная функция виртуальных рабочих столов (Virtual Workspaces) позволяет группировать окна в несколько горизонтальных рядов внутри одного пространства macOS, отображая номер активного пространства индикатором в строке меню (Menu Bar). Также поддерживаются нативная обработка вкладок macOS (например, в эмуляторе терминала Ghostty) и автоматическое сохранение состояния раскладки в файл ~/.local/state/paneru/state.json. Функция фокуса за курсором (Focus follows mouse) позволяет активировать окна без клика.
Архитектура Paneru спроектирована на базе Bevy ECS (Entity Component System) — паттерна разделения данных и логики, популярного в игровой индустрии. Дисплеи и окна представлены как сущности (Entities), их свойства — как компоненты (Components), а поведение — как системы (Systems). Программа состоит из трех слоев:
- Platform Layer (
src/platform/): транслирует Cocoa-события через библиотекуobjc2и Core Graphics в канал Bevy. - Management Layer (
src/manager/): описывает абстрактные оконные API, реализованные для macOS через интерфейс доступности (Accessibility API) и SkyLight API. - ECS Layer (
src/ecs/): обрабатывает события, считывает ввод и рассчитывает анимации окон.
Автоматизация через Unix-сокет
Paneru открывает Unix-сокет по пути /tmp/paneru.socket, позволяя управлять программой из скриптов через CLI-утилиту paneru send-cmd <command>.
Основные команды управления:
window focus <direction>— переместить фокус (west— влево,east— вправо,north/south— вверх/вниз,first/last— в начало/конец ленты).window swap <direction>— поменять активное окно местами с соседним.window center— отцентрировать окно на экране.window resize— сменить ширину по заранее настроенным шаблонам.window virtualnum <n>— переключить виртуальный рабочий стол.window virtualsendnum <n>— отправить окно на столnбез перехода пользователя.
Примеры использования в терминале:
# Фокус вправо и центрирование
paneru send-cmd window focus east
paneru send-cmd window center
Команда paneru query state --json возвращает JSON-снимок состояния ECS, а paneru subscribe --json оставляет сокет открытым и транслирует события (смена фокуса, изменение окон) в реальном времени в формате line-delimited JSON. Это позволяет интегрировать менеджер со сторонними статус-барами (например, SketchyBar) или автоматизировать сценарии (например, запуск приложения с позиционированием: open -a Safari && sleep 0.5 && paneru send-cmd window resize).
Обход системных ограничений macOS
macOS принудительно возвращает на экран или переносит на другой монитор окна, которые полностью уходят за видимую границу. Для обхода этого ограничения Paneru оставляет видимой тонкую полосу скрытого окна на краю экрана (параметры sliver_width и sliver_height).
При использовании нескольких горизонтальных мониторов macOS перемещает скрываемые окна на соседний экран. В качестве решения рекомендуется расположить дисплеи вертикально (один над другим) в настройках macOS. Сделать такое расположение естественным для движения мыши позволяет опция horizontal_mouse_warp в Aerospace.
Руководство по установке и настройке
- Шаг 1. Настройка системы. Включите опцию «Дисплеи имеют отдельные пространства» (Displays have separate spaces) в настройках дисплеев macOS.
- Шаг 2. Установка. Выберите один из способов установки:
- Homebrew:
brew install paneruилиbrew tap karinushka/paneru && brew install paneru - Cargo:
cargo install paneru - Сборка:
git clone https://github.com/karinushka/paneru.git && cd paneru && cargo build --release && cargo install --path . - Nix: руководство описано в файле
nix/README.md.
- Homebrew:
- Шаг 3. Доступность. Разрешите приложению
paneruуправление в разделе «Системные настройки» -> «Конфиденциальность и безопасность» -> «Универсальный доступ» (Accessibility). - Шаг 4. Конфигурация. Создайте конфигурационный файл
~/.paneru.toml(также поддерживается~/.paneruили~/.config/paneru/paneru.toml). Базовый шаблон:Конфигурация перезагружается на лету (live reloading). Полное руководство доступно в официальной wiki.[options] focus_follows_mouse = true mouse_follows_focus = true [bindings] window_focus_west = "cmd - h" window_focus_east = "cmd - l" window_resize = "alt - r" window_center = "alt - c" quit = "ctrl + alt - q" - Шаг 5. Запуск. Запустите утилиту напрямую (
paneru) или в качестве службы:paneru install && paneru start. - Шаг 6. Проверка и безопасность. Убедитесь, что открытые окна выстроились в горизонтальный ряд. Проверьте отправку команд:
paneru send-cmd window center. Убедитесь, что права доступа на Unix-сокет/tmp/paneru.socketограничивают доступ посторонних процессов. Не сохраняйте секреты или API-ключи в конфигурационном файле. - Шаг 7. Сессии. Настройте сохранение окон через секцию
[restore], согласно документации по восстановлению сессий.

