Система X11 уже много десятилетий служит основой для графических интерфейсов в мире Unix и Linux. Несмотря на свою древность, несмотря на многочисленные заявления об ограничениях и невозможностях современной работы с высокими разрешениями и различными DPI, X11 продолжает удивлять своими скрытыми возможностями. Одной из наиболее обсуждаемых тем является масштабирование — поддержка DPI, fractional scaling и оперативная адаптация к различным мониторам. Многие уверены, что X11 не создан для этих задач, что масштабирование там либо отсутствует, либо реализуется крайне неудобно и плохо работает. Однако практика показывает обратное.
Эксперименты с использованием современного OpenGL и расширений X11 позволяют добиться точного и корректного масштабирования элементов интерфейса вне зависимости от конфигурации мониторов. Интересно, что при таком подходе можно, например, отрисовать круг диаметром ровно две дюйма на экране любого размера и разрешения и добиться того, чтобы он оставался именно двухдюймовым при переносе окна между монитором ноутбука, настольным дисплеем и большим телевизором. Для понимания, как это возможно, необходимо взглянуть на детали работы с X11. Ключевым элементом здесь выступает взаимодействие с сервером X через расширение RandR (Resize and Rotate), которое позволяет получить точные данные о конфигурации каждого подключенного монитора. Именно с помощью XRRGetScreenResourcesCurrent и соответствующих структур XRROutputInfo и XRRCrtcInfo получается физический размер экрана в миллиметрах, его виртуальная ширина и координаты в общей виртуальной области рабочего стола.
Объединив эти данные, становится возможным вычислить отношение пикселей к миллиметрам для каждого экрана и, исходя из этого, определить корректный радиус круга в пикселях для заданного размера в дюймах. Такой подход требует внимательного программного кода, который реагирует на события изменения конфигурации окна (ConfigureNotify). Каждый раз, когда окно перемещается или масштабируется, программа проверяет, на каком мониторе оно находится, используя координаты с помощью массива screen_x и сравнивая их с размерами экранов. На основании этого выбирается правильный коэффициент масштабирования, и radius для OpenGL шейдера обновляется в реальном времени. Отрисовка круга с помощью OpenGL и фрагментного шейдера — еще одна яркая составляющая.
Шейдер вычисляет расстояние до центра круга и определяет, попадет ли конкретный фрагмент в рамки круга нужного радиуса. Такой подход позволяет не только плавно отрисовать контур, но и адаптировать толщину линии и даже зафиксировать цветовой эффект, создавая радужный круг, что, впрочем, является скорее эстетическим дополнением. Важно заметить, что для корректной визуализации масштабируемых элементов недостаточно лишь знать разрешение монитора. Физические размеры дисплея, указанные в миллиметрах, играют ключевую роль, так как без них невозможно вычислить реальное количество пикселей на единицу длины (DPI). Однако, как показали эксперименты, данные, получаемые через RandR, могут отличаться от реальных размеров устройства.
Так, в случае с 4K телевизором выяснилось, что заявленная на заводе ширина не совпадает с измеренной, что приводит к незначительным искажениям в отображении. Следовательно, для задач, требующих точного масштабирования, например, инженерных чертежей, требуется дополнительная калибровка и проверка параметров. Несмотря на сложности, главный вывод в том, что технологии X11 не являются непреодолимым ограничением для современных требований к масштабированию. Напротив, при умелом использовании современных расширений и возможностей OpenGL можно добиться отличного результата и гарантировать, что элементы интерфейса будут выглядеть одинаково на всех типах мониторов — будь то маленький экран ноутбука, большой настольный монитор высокой плотности пикселей или гигантский телевизор. Еще один любопытный момент, продемонстрированный на практике — возможность удаленного запуска и отображения программ, обрабатывающих масштабирование, даже с устройств с ограниченными ресурсами, например, с маршрутизатора.