Современная работа с несколькими мониторами часто сопряжена с проблемой разного плотностного разрешения (DPI) на каждом экране. Особенно актуально это для пользователей, которые объединяют HiDPI-дисплеи, например встроенные в ноутбуки с высоким разрешением, и более традиционные мониторы с низкой плотностью пикселей. В операционных системах и графических серверах Linux с X11 этот вопрос имеет свои особенности и тонкости, связанных с протоколом, расширениями и поддержкой приложений. Рассмотрим в деталях, как устроен Mixed DPI, как X11 предоставляет эту возможность и почему зачастую пользователи сталкиваются с трудностями в правильно масштабированном отображении интерфейсов на разных мониторах одновременно. X11, или X Window System, представляет собой сетевой протокол и систему для управления графическим интерфейсом в Unix-подобных системах.
Ее история насчитывает более тридцати лет, что объясняет наличие внутри архитектуры и протокола устаревших решений, а также продвинутых возможностей, появившихся с расширениями. Протокол X11 управляет тем, как приложения (клиенты) взаимодействуют с сервером дисплея, который отвечает за вывод на физические экраны и получение данных от устройств ввода. Протокол содержит данные о физических характеристиках каждого подключённого дисплея, включая разрешение, размер и, что важно для нас, DPI. DPI или dots per inch — показатель, который отражает количество точек (пикселей) на дюйм экрана, и служит основной метрикой для корректного отображения графики и интерфейсов. Высокое значение DPI характерно для HiDPI-мониторов (например, современные ноутбуки с Retina-подобными дисплеями), что позволяет отображать элементы интерфейса и шрифты более чётко и детализированно.
Однако смешанное использование экранов с разной плотностью пикселей заставляет отображение выглядеть либо слишком мелким, либо чрезмерно крупным на одном из экранов, если масштабирование стоит одинаковое. В X11 реализовано понятие Mixed DPI, позволяющее серверу распознавать и передавать клиентам информацию о каждом подключённом мониторе с его разрешением и физическим размером. В теории это даёт приложениям возможность адаптироваться, меняя размер шрифтов и интерфейсов в зависимости от экрана, на котором они отображаются. Однако на практике всё не так просто, и разница возникающих проблем во многом связана с историей развития X11 и поддержкой различных расширений. Первоначальный подход к многоэкранной работе в X11 — это создание нескольких отдельных «X Screen» или экранных сегментов.
Каждый такой X Screen может иметь собственные настройки DPI, цвета и свойства. Однако при этом нельзя было свободно перемещать окна между этими экранными сегментами, что создавало ряд неудобств. Позже появилась расширенная поддержка с помощью Xinerama — расширения, создавшего объединённый виртуальный экран из разных физических мониторов. Xinerama позволил перемещать окна между экранами, однако потерял возможность передавать информацию о физических размерах мониторов, что привело к потере корректного подсчёта dpi по каждому из них. В итоге, приложения, запущенные в среде Xinerama, могли понимать только общую площадь виртуального экрана, но не могли корректно адаптировать интерфейс под каждый монитор в отдельности.
Следующим шагом стала разработка расширения RANDR (Resize and Rotate). В версии 1.2, появившейся в 2007 году, оно позволило динамически менять разрешение экранов, их расположение и ориентацию, при этом сохранив информацию о физических размерах каждого экрана. Благодаря этому расширению X сервер получил возможность поддерживать смешанные DPI конфигурации, передавая детальную информацию каждому приложению. В основе механизма RANDR лежит виртуальный фреймбуфер — большая область экрана, на которую накладываются отдельные мониторы в виде «вьюпортов».
Это даёт гибкость в позицийонировании, однако влечёт и некоторую сложность: физические параметры, которые передаёт основная часть протокола X11, становятся условными и не соответствуют реальным характеристикам отдельных экранов. В связи с этим важно правильно настраивать DPI вручную или с помощью инструмента xrandr во время инициализации, чтобы масштабирование интерфейсов соответствовало реальным параметрам дисплеев. При современном использовании X с включённым RANDR приложения, особенно те, которые построены на Qt, имеют встроенную поддержку детектирования DPI для каждого экрана и автоматическое масштабирование, которое можно активировать через переменные окружения или программные атрибуты. Так, начиная с версии Qt 5.6 и выше, разработчики приложений могут включить высококачественное масштабирование для поддержки Mixed DPI.
Пользователи могут помочь адаптировать интерфейс приложений, установив переменные окружения вроде QT_AUTO_SCREEN_SCALE_FACTOR, которая заставит фреймворк учитывать DPI каждого подключённого дисплея. Тем не менее, не все приложения и инструментальные наборы (toolkits) обладают таким уровнем поддержки. Особенно это касается GTK+, которая традиционно значительно отстаёт в вопросах работы с High DPI и смешанным DPI-сценариями под X11. Отсутствие адекватной поддержки в популярных программах нередко создаёт неудобства в работе, например, слишком мелкие или слишком крупные элементы интерфейса на отдельных дисплеях. Одним из способов сгладить эти проблемы является использование масштабирования выставленных на низкий DPI дисплеев путём увеличения их виртуального разрешения.
При помощи команды xrandr и опции --scale-from можно задать виртуальное разрешение монитора выше его физического, что позволяет приблизить его DPI к параметрам HiDPI-экрана. В результате интерфейсы становятся более однородными по размеру при переносе окон между дисплеями — пусть и с некоторым ухудшением качества изображения из-за дополнительного масштабирования. Интересно, что подобные техники масштабирования лежат в основе методов работы Wayland — перспективного протокола, который постепенно замещает X11 в Linux-сообществах. Таким образом, смешанная поддержка DPI является не только важной пользовательской функцией, но и перспективным направлением развития графических подсистем. Финальная рекомендация для пользователей с несколькими экранами с разным DPI — всегда проверять, как именно конфигурация отображается сервером X и какие расширения используются.
Если окружение либо приложение не учитывают корректно параметры каждого монитора, стоит задуматься о смене программного обеспечения либо их обновлении до последних версий. Для разработчиков же важно включать поддержку Mixed DPI в свои приложения, используя современный функционал Qt, следя за развитием GTK+ и других библиотек. В итоге, X11 предоставляет широкий набор возможностей для работы с несколькими мониторами независимо от их DPI. Протокол и расширения не только позволяют определить и передать скорость пикселей для каждого экрана, но и создают условия для адаптивной отрисовки интерфейсов. Ограничения и проблемы чаще всего связаны не с самим сервером, а с поддержкой на стороне клиента и инструментальных наборов.
Понимание архитектуры X11 и её расширений, грамотная настройка серверных параметров с помощью инструментов типа xrandr поможет добиться максимально комфортного взаимодействия с множеством экранов, каждому из которых свойственно своё разрешение и плотность пикселей. В будущем можно ожидать, что развитие Wayland и улучшение поддержки DPI в популярных библиотеках сделают опыт работы с Mixed DPI ещё проще и удобнее, а пока главным звеном остаётся грамотное использование возможностей X11 и современных инструментов для настройки масштабирования.