Дисплеи с высокой плотностью пикселей уже давно не редкость. И для того, чтобы UI не выглядел слишком мелко, применяется масштабирование. В разных системах используются разные подходы и имеются различные возможности настроек. Но одно объединяет их все - безмерное количество кривизны, костылей и глюков. Посмотрим как на сегодняшний день обстоит ситуация в лагере Linux.
Цель первой части - обрисовать ситуацию с настройками масштабирования в системе из коробки, без лишних плясок с бубном - так, как ее видит обычный пользователь.
Десктопных окружений великое множество, проверить все займет огромное количество времени, поэтому критерии выбора такие - находится в активной разработке и не требует отдельной установки, т.е. идет в комплекте с каким-н дистрибутивом. Ну и конечно оно должно быть более мене известным, потому выбирал просто из перечня в таблице.
Дистрибутивы для обзора были использованы следующие: Ubuntu и Fedora для Gnome, openSUSE для KDE, Manjaro для XFCE, Debian для MATE, Mint для Cinnamon, Ubuntu для LXQt и Deepin с его одноименным окружением.
Gnome
Поддерживает независимые настройки масштабирования для каждого монитора.
Доступные коэффициенты рассчитываются в зависимости от разрешения монитора, для 4K возможны варианты от 100% до 400%, для FullHD - 100% и 200%.
Дробное масштабирование (Fractional scaling) поддерживается частично. Возможность установки дробного масштабирования в различных дистрибутивах либо присутствует в настройках дисплея (например в Ubuntu), либо скрыта (как в Fedora). Но даже если опция скрыта, включить этот режим можно с помощью команды
gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"
Доступные коэффициенты также рассчитываются в зависимости от разрешения монитора, для 4K возможны варианты от 100% до 400% с шагом 25%, для FullHD - от 100% до 225%.
Поскольку актуальная версия Gnome использует протокол Wayland, то для полноценной работы приложения должны поддерживать эту технологию. Для обычных X11 приложений написанных с использованием UI-фреймворков, которые не поддерживают Wayland используется реализация X Server под названием XWayland. К сожалению дробное масштабирование среди того что не поддерживается в режиме совместимости, в этом случае X11 приложения отрисовываются в 100% масштабе а затем просто растягиваются до необходимых размеров, даже если в этом режиме выбран целочисленный коэффициент. Когда то за подобное ругали Windows... лет десять назад.
Изменения настроек применяются сразу, log out не требуется.
KDE
Не поддерживает независимые настройки масштабирования для нескольких мониторов.
Дробное масштабирование поддерживается, доступные коэффициенты от 100% до 300% (не зависят от разрешения) с шагом 25%.
С ходу бросается в глаза что высота панели задач не меняется.
Изменения требуют сделать restart, по факту достаточно перелогиниться.
XFCE
Тут все плохо. Поддержка с виду как бы есть но лучше бы ее совсем не было, такое впечатление что код не то что не тестировали, а даже не запускали.
Независимые настройки для каждого монитора есть, также есть секретная опция Window Scaling в Appearance.
Дробное масштабирование с виду поддерживается, но теперь самое интересное - ставим в первом окне коэффициент 1.5x вместо 1x и… весь UI уменьшается. Причем чем больше коэффициент тем мельче будет UI
Взяв линейку легко выявить что все размеры не умножаются на scale factor, а делятся на него т.е. Вместо 150% получаем 66%, вместо 200% - 50% и.т.п. Что интересно, настройки позволяют указывать произвольное значение от 0.1 до 10.0 с шагом 0.1. Если указать значение меньше единицы то UI таки увеличится (например 0.7 даст примерно 143%), но размыто будет абсолютно все. Ситуацию немного улучшает секретная опция Window scale, там всего два варианта 1x и 2x, если выбрать 2x, то размер окон будет умножен на 2 и поделен на коэффициент из настроек дисплея. Тогда коэффициент 1.5 даст масштаб 133%, а коэффициент 2 сократится до 100% и в этом случае проще оставить везде единицы.
Применение настроек требует перелогиниться. Причем делать это придется видимо с клавиатуры, потому что кнопки на панели задач отваливаются (видно на первом скриншоте) и не реагируют на нажатия. Короче это не лучший выбор для дисплеев с высокой плотностью пикселей.
MATE
Не поддерживает независимые настройки масштабирования для нескольких мониторов.
Также нет гибкости выбора коэффициентов, только Regular (x1) или HiDPI (x2).
Среди настроек дисплея эту опцию искать бесполезно, она запрятана довольно далеко и неочевидно в System -> Preferences -> Look And Feel -> MATE Tweak.
Изменения применяются сразу.
Cinnamon
Поддерживает независимые настройки масштабирования для нескольких мониторов.
Поддерживает дробное масштабирование, эта опция помечена как experimental, но по умолчанию включена. Отключение дробного масштабирования отключит также и возможность независимой настройки для разных мониторов. Для дробного масштабирования диапазон настроек от 100% до 200% с шагом 25% независимо от разрешения монитора. При отключенном дробном масштабировании диапазон зависит от разрешения, так же как и на Gnome - от 100% до 400% для 4K и 100% и 200% для FullHD.
Изменения применяются сразу.
Из всех рассматриваемых окружений Cinnamon масштабирует наиболее адекватно, можно настроить например 150% для High-DPI монитора (мне например 200% слишком много), и оставить 100% для второго Low-DPI монитора, и это будет работать.
LXQt
Не поддерживает независимые настройки масштабирования для нескольких мониторов.
Настройки здесь снова бесполезно искать среди конфигурации дисплея, они запрятаны далеко. Можно указать дробный коэффициент - произвольное значение от 1.0 до 4.0 с точностью в два знака. Заголовки окон не масштабируются.
Применение изменений требует перелогиниться.
Deepin
Окружение используется в одноименном китайском дистрибутиве. До недавних пор не знал о его существовании, включил в список только потому что он фигурирует в таблице из Википедии, оказалось что по визуальному оформлению пожалуй один из лучших среди перечисленного.
Не поддерживает независимые настройки масштабирования для нескольких мониторов.
Дробное масштабирование поддерживается, доступные коэффициенты зависят от подключенных мониторов. Например если использовать только 4К то коэффициенты от 1.0 до 3.0 с шагом 0.25, а если в дополнение к 4К подключить FullHD, то доступные коэффициенты только 1.0 и 1.25.
Применение настроек требует перелогиниться.
Вывод
Могло бы быть и лучше.
Вторая часть будет о том, как программно определить системные настройки масштабирования из приложения. Поскольку в Linux нет единого API для этого, то зоопарк с этим творится еще похлеще.
Комментарии (18)
BDKey
10.11.2022 22:49я конечно не занимался ещё разработкой на линуксе, но сейчас вынужденно на нём сижу. И иногда такие ситуации бывают что мыло какое-то, теперь зато у меня такого не будет) Спасибо!
fk0
11.11.2022 01:48+1Linux -- это отнюдь не KDE, Gnome или что-то там ещё. Это Xorg и/или X11, или Wayland, хотя последнее ещё та поделка. И "увеличивать" ничего не нужно. Нужно уметь формировать изображения с нужным разрешением (DPI). В основном это касается шрифтов, битмапа используемого для курсора, размеров элементов GUI и иконок. Шрифты могут выводиться самим X-сервером, а могут через libfreetype, соответственно два разных места для настройки. Курсор приходится заменять. Иконки и размер GUI-элементов задаются в зависимости от тулкита. У Qt своё, у Gtk, своё, у старых тулкитов -- ресурсы. Многие вещи умеют масштабироваться относительно размера DPI, а последний задаётся в конфигурации X-сервера (и часто прибит гвоздями к 96dpi). Отдельный вопрос -- работа веб-браузеров, где в высоком DPI многое рендерится отвратительно. Там есть в about:config своя специальная настройка (что позволяет рендерить картинки как бы с меньшим DPI, а потом увеличивать, что там делается в шрифтами не представляю, т.к. увеличивать битмап отрендеренного шрифта так себе идея, а шрифты более крупного размера могут иметь непропорциональные метрики...)
Einherjar Автор
11.11.2022 10:53DPI это dots per Inch, inch - мера физической длины и для того чтобы хотя бы оперировать этим термином где либо, необходимо знать физические размеры того на чем выводится изображение. Хоть API для получения физических размеров монитора и есть (EDID), но гарантий что там будут корректные значения нет, например на виртуальной машине не получится их определить, поэтому везде приходится использовать относительные коэффициенты от 100% масштаба который во времена низких разрешений всех устраивал, и даже в конфигурации X-сервера если значение не прибито гвоздями к 96 то просто задается 96 умноженное на коэффициент указанный в настройках.
fk0
12.11.2022 01:48+1Никаких гарантий и не надо. Через опцию -dpi 100500 можно передать нужное разрешение иксам. Опцию нужно вписать в скрипт из /etc, который запускается из xdm. Можно в /etc/X11/xorg.conf вписать размеры монитора и разрешение и оно само вычислится. Проблема в том, что на самом деле чуть ли не с 80-х годов оно всё работало корректно (во всяком случае в 2000-м у меня в компе DPI соответствовал "хрустальному" монитору), и только в последнее десятилетие массово всё поломано. И тут (с появлением 4к мониторов) начинаются "открытия".
А да, ещё мониторы через EDID могут выдавать размеры свои неправильно, потому, что 4к монитор сделали, а микросхему для EDID взяли и тупо скопировали с какого-то мелкого монитора и вообще не заморачивались. На работе такой выдали. Собственно линейкой померял и вручную в конфиги вписал.
vtb_k
11.11.2022 01:55+1У меня в swaywm поддерживается и разное масштабирование и разная частота на разных мониторах
Jolt
11.11.2022 11:46да что-то я не понял, если Cinnamon на использует xorg, как они поддерживают независимые настройки масштабирования?
Einherjar Автор
11.11.2022 11:52Cinnamon на x11 делает это через xrandr, подробнее будет во второй части
Jolt
11.11.2022 11:59я как-то пытался сделать через xrandr на KDE независимое масштабирование, но помнится вышло так себе, работало но с костылями
fk0
12.11.2022 01:58Это смотрится отвратительно, когда пытаются масштабировать шрифы. Глаза сломать можно. Такое годится только для просмотров ютуба. Но действительно, xrandr так умеет в режиме дублирования картинки. Заметил случайно когда ноут к телеку подключил.
Не понимаю, как он это делает. Подразумевается видимо, что драйвер и видеокарта должны это уметь, и не всякая видимо умеет. В самих иксах ничего специального для такого нет же. В смысле если я подцеплю два моника через две разные карты -- так работать не будет же? Ну хорошо, для обычных окон что-то можно нахимичить софтово (блит 60 раз в секунду, условно), если есть 3д композитор то тоже можно, а если какое-нибудь окно с оверлеем -- что спрашивается делать? Впрочем непонятно и как оно может работать когда окно разорвано между двумя мониторями (на разных картах). И старые карты очевидно не умели. Ну типа S3 Trio. Те которые с видео выходом (на телек) были уже как-то умели.
fk0
12.11.2022 02:00Не рассмотрен вопрос поворота второго монитора на 90 градусов, или использования двух мониторов с разным порядком RGB и работы антиалиасинга в библиотеке libfreetype в такой ситуации. В том смысле что он работать не будет нормально никогда, потому, что это невозможно. Разве что переключить на градации серого. Но тогда при сравнении с виндами в последних шрифты более резкие и четкие. Как всегда. Блеск и нищета опенсоурса.
Einherjar Автор
12.11.2022 19:25Поворот скорее всего делается с помощью матриц трансформации в xrandr, идея интересная, спасибо проверю, если там окажется что то интересное, то упомяну во второй части. Разный порядок RGB меня пока не интересовал, эта статья следствие того что мне нужно научить приложение правильно масштабироваться на более менее адекватных конфигурациях распространенных дистрибутивов, т.к. используемый фреймворк не умеет сам это правильно делать.
arokettu
KDE под Wayland поддерживает разный масштаб для разных мониторов и размер панели при этом изменяется. Наверно вам стоило бы отдельно посмотреть под Wayland и X11 и другие десктопы
Einherjar Автор
Спасибо, проверю. Я смотрю в свежих версиях KDE+Wayland вроде добавили возможность отключить принудительное масштабирование Х11 приложений, и такого мыла как в гноме не должно быть.