← На главную

Wayland и sway готовы к multi-seat, а GTK 4 и SDL — нет

29.07.2026 00:59 · hackernews

Автор три недели изучал, как в Linux и Wayland обстоят дела с multi-seat — когда к одному компьютеру подключено несколько мышей и клавиатур, а на общем рабочем столе двигаются несколько независимых курсоров. Такой «многопользовательский» режим удобен для парного программирования, совместных игр и естественной совместной работы без сложных алгоритмов синхронизации. В статье используется термин logical seat: несколько человек сидят перед одним экраном, у каждого свои устройства ввода, но все управляют одной и той же графической сессией. Это не physical seat, где у каждого свой монитор.

Протокол Wayland изначально закладывает поддержку multi-seat: каждое событие ввода привязано к wl_pointer или wl_keyboard, которые принадлежат конкретному wl_seat. Среди композиторов отличную работу с несколькими местами показал Weston — он умеет показывать несколько курсоров, давать фокус окнам независимо для каждого seat и корректно обрабатывает меню, хотя есть забавные краевые случаи вроде исчезновения курсора при перетаскивании. Sway также реализует per-seat window focus и позволяет назначать устройства через swaymsg, но есть баг: при назначении на другой seat устройство добавляется, а не перемещается (автор подготовил патч). River обладает довольно глубокой интеграцией multi-seat и собственным протоколом river-input-management-v1, для которого автор написал river-multi-seat-configurator на Rust. В niri полноценной поддержки нет, автор сделал хак для двух мест с захардкоженными именами устройств.

На уровне графических библиотек GTK 4 предоставляет метод get_seat, однако большинство виджетов игнорирует разделение ввода. Главный баг — GTK не замечает добавления новых мест после запуска приложения. SDL начиная с версии 3.3.4 передаёт идентификатор устройства в поле which у событий мыши и клавиатуры, но для абсолютного режима мыши этот идентификатор принудительно обнуляется — автор опубликовал простой патч, комментирующий строки с SDL_GLOBAL_MOUSE_ID. На основе SDL он пропатчил LÖVE, чтобы в Lua-колбэки приходило поле which, и сделал физическую песочницу, где несколько курсоров вместе таскают блоки.

Готовых приложений с поддержкой multi-seat нет. Автор собрал прототип многоseater-ного текстового виджета на GTK и Rust, где каждый seat вставляет текст в позицию своего курсора. Терминал Kitty реагирует только на первый seat, Alacritty принимает ввод отовсюду. В Firefox можно работать вдвоём, если места были настроены до запуска браузера, но выделения ведут себя как от одного устройства; Chromium события от дополнительных мест игнорирует.

Для удалённой совместной работы автор использует wayvnc с флагом --transient-seat: сервер создаёт виртуальные устройства для каждого входящего VNC-подключения, опираясь на протокол ext-transient-seat-v1, который реализован в sway. Веб-клиент novnc позволяет подключаться через браузер, а связка с openssl даёт быстрый способ поднять защищённый туннель. Автор отмечает, что VNC — технология старая, и в будущем стоит посмотреть в сторону Sunshine. В целом он доволен связкой sway + wayvnc и считает, что самое интересное сейчас — писать приложения и игры, умеющие работать с несколькими местами. Все утилиты и патчи выложены, а в тексте расставлены 📝 с идеями для желающих присоединиться к разработке.

Читать оригинал →