Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Мозаичный оконный менеджер Paneru с горизонтальной лентой для macOS

Paneru: мозаичный оконный менеджер для macOS с бесконечной лентой

Традиционный тайлинг окон на macOS часто деформирует интерфейсы. Бесплатный мозаичный менеджер Paneru на Rust решает эту проблему, располагая окна на бесконечной горизонтальной ленте без изменения их размеров. Карточка содержит пошаговую инструкцию по установке, настройке и автоматизации через сокет.

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). Программа состоит из трех слоев:

  1. Platform Layer (src/platform/): транслирует Cocoa-события через библиотеку objc2 и Core Graphics в канал Bevy.
  2. Management Layer (src/manager/): описывает абстрактные оконные API, реализованные для macOS через интерфейс доступности (Accessibility API) и SkyLight API.
  3. 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.
  • Шаг 3. Доступность. Разрешите приложению paneru управление в разделе «Системные настройки» -> «Конфиденциальность и безопасность» -> «Универсальный доступ» (Accessibility).
  • Шаг 4. Конфигурация. Создайте конфигурационный файл ~/.paneru.toml (также поддерживается ~/.paneru или ~/.config/paneru/paneru.toml). Базовый шаблон:
    [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"
    
    Конфигурация перезагружается на лету (live reloading). Полное руководство доступно в официальной wiki.
  • Шаг 5. Запуск. Запустите утилиту напрямую (paneru) или в качестве службы: paneru install && paneru start.
  • Шаг 6. Проверка и безопасность. Убедитесь, что открытые окна выстроились в горизонтальный ряд. Проверьте отправку команд: paneru send-cmd window center. Убедитесь, что права доступа на Unix-сокет /tmp/paneru.socket ограничивают доступ посторонних процессов. Не сохраняйте секреты или API-ключи в конфигурационном файле.
  • Шаг 7. Сессии. Настройте сохранение окон через секцию [restore], согласно документации по восстановлению сессий.