Дисплеи с высокой плотностью пикселей уже давно не редкость. И для того, чтобы UI не выглядел слишком мелко, применяется масштабирование. В разных системах используются разные подходы и имеются различные возможности настроек. Но одно объединяет их все - безмерное количество кривизны, костылей и глюков. Посмотрим как на сегодняшний день обстоит ситуация в лагере Linux.

Цель первой части - обрисовать ситуацию с настройками масштабирования в системе из коробки, без лишних плясок с бубном - так, как ее видит обычный пользователь.

Десктопных окружений великое множество, проверить все займет огромное количество времени, поэтому критерии выбора такие - находится в активной разработке и не требует отдельной установки, т.е. идет в комплекте с каким-н дистрибутивом. Ну и конечно оно должно быть более мене известным, потому выбирал просто из перечня в таблице.

Дистрибутивы для обзора были использованы следующие: Ubuntu и Fedora для Gnome, openSUSE для KDE, Manjaro для XFCE, Debian для MATE, Mint для Cinnamon, Ubuntu для LXQt и Deepin с его одноименным окружением.

Gnome

Поддерживает независимые настройки масштабирования для каждого монитора.

Окно настроек Settings -> Displays
Окно настроек Settings -> Displays

Доступные коэффициенты рассчитываются в зависимости от разрешения монитора, для 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

System Settings -> Display and Monitor
System Settings -> Display and Monitor

Не поддерживает независимые настройки масштабирования для нескольких мониторов.

Дробное масштабирование поддерживается, доступные коэффициенты от 100% до 300% (не зависят от разрешения) с шагом 25%.

С ходу бросается в глаза что высота панели задач не меняется.

Изменения требуют сделать restart, по факту достаточно перелогиниться.

XFCE

Тут все плохо. Поддержка с виду как бы есть но лучше бы ее совсем не было, такое впечатление что код не то что не тестировали, а даже не запускали.

Settings -> Display
Settings -> Display
Settings -> Appearance
Settings -> Appearance

Независимые настройки для каждого монитора есть, также есть секретная опция Window Scaling в Appearance.

Дробное масштабирование с виду поддерживается, но теперь самое интересное - ставим в первом окне коэффициент 1.5x вместо 1x и… весь UI уменьшается. Причем чем больше коэффициент тем мельче будет UI

Вот так выглядит масштаб 2x на 15'' 4K экране ноутбука
Вот так выглядит масштаб 2x на 15'' 4K экране ноутбука

Взяв линейку легко выявить что все размеры не умножаются на 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.

Изменения применяются сразу.

System -> Preferences -> Look And Feel -> MATE Tweak
System -> Preferences -> Look And Feel -> MATE Tweak

Cinnamon

System Settings -> Hardware -> Display
System Settings -> Hardware -> Display

Поддерживает независимые настройки масштабирования для нескольких мониторов.

Поддерживает дробное масштабирование, эта опция помечена как experimental, но по умолчанию включена. Отключение дробного масштабирования отключит также и возможность независимой настройки для разных мониторов. Для дробного масштабирования диапазон настроек от 100% до 200% с шагом 25% независимо от разрешения монитора. При отключенном дробном масштабировании диапазон зависит от разрешения, так же как и на Gnome - от 100% до 400% для 4K и 100% и 200% для FullHD.

Изменения применяются сразу.

System Settings -> Hardware -> Display
System Settings -> Hardware -> Display

Из всех рассматриваемых окружений Cinnamon масштабирует наиболее адекватно, можно настроить например 150% для High-DPI монитора (мне например 200% слишком много), и оставить 100% для второго Low-DPI монитора, и это будет работать.

LXQt

Preferences -> LXQt Settings -> Session Settings
Preferences -> LXQt Settings -> Session Settings

Не поддерживает независимые настройки масштабирования для нескольких мониторов.

Настройки здесь снова бесполезно искать среди конфигурации дисплея, они запрятаны далеко. Можно указать дробный коэффициент - произвольное значение от 1.0 до 4.0 с точностью в два знака. Заголовки окон не масштабируются.

Применение изменений требует перелогиниться.

Deepin

Control center -> Display
Control center -> Display

Окружение используется в одноименном китайском дистрибутиве. До недавних пор не знал о его существовании, включил в список только потому что он фигурирует в таблице из Википедии, оказалось что по визуальному оформлению пожалуй один из лучших среди перечисленного.

Не поддерживает независимые настройки масштабирования для нескольких мониторов.

Дробное масштабирование поддерживается, доступные коэффициенты зависят от подключенных мониторов. Например если использовать только 4К то коэффициенты от 1.0 до 3.0 с шагом 0.25, а если в дополнение к 4К подключить FullHD, то доступные коэффициенты только 1.0 и 1.25.

Применение настроек требует перелогиниться.

Вывод

Могло бы быть и лучше.

Вторая часть будет о том, как программно определить системные настройки масштабирования из приложения. Поскольку в Linux нет единого API для этого, то зоопарк с этим творится еще похлеще.

Комментарии (18)


  1. arokettu
    10.11.2022 22:41
    +2

    KDE под Wayland поддерживает разный масштаб для разных мониторов и размер панели при этом изменяется. Наверно вам стоило бы отдельно посмотреть под Wayland и X11 и другие десктопы


    1. Einherjar Автор
      12.11.2022 19:17

      Спасибо, проверю. Я смотрю в свежих версиях KDE+Wayland вроде добавили возможность отключить принудительное масштабирование Х11 приложений, и такого мыла как в гноме не должно быть.


  1. BDKey
    10.11.2022 22:49

    я конечно не занимался ещё разработкой на линуксе, но сейчас вынужденно на нём сижу. И иногда такие ситуации бывают что мыло какое-то, теперь зато у меня такого не будет) Спасибо!


  1. Chelidonium
    10.11.2022 22:54

    60 Hz это VGA на минималках, а все возможности частот не использовались


  1. Gnuava
    11.11.2022 00:15

    Также можно почитать хоть и старую, но актуальную статью с Хабра - настраивал по ней.


  1. fk0
    11.11.2022 01:48
    +1

    Linux -- это отнюдь не KDE, Gnome или что-то там ещё. Это Xorg и/или X11, или Wayland, хотя последнее ещё та поделка. И "увеличивать" ничего не нужно. Нужно уметь формировать изображения с нужным разрешением (DPI). В основном это касается шрифтов, битмапа используемого для курсора, размеров элементов GUI и иконок. Шрифты могут выводиться самим X-сервером, а могут через libfreetype, соответственно два разных места для настройки. Курсор приходится заменять. Иконки и размер GUI-элементов задаются в зависимости от тулкита. У Qt своё, у Gtk, своё, у старых тулкитов -- ресурсы. Многие вещи умеют масштабироваться относительно размера DPI, а последний задаётся в конфигурации X-сервера (и часто прибит гвоздями к 96dpi). Отдельный вопрос -- работа веб-браузеров, где в высоком DPI многое рендерится отвратительно. Там есть в about:config своя специальная настройка (что позволяет рендерить картинки как бы с меньшим DPI, а потом увеличивать, что там делается в шрифтами не представляю, т.к. увеличивать битмап отрендеренного шрифта так себе идея, а шрифты более крупного размера могут иметь непропорциональные метрики...)


    1. funca
      11.11.2022 03:42

      В иксах уже много лет живёт настройка Xft.dpi и xrandr. Но поддержка тщательно поломана на уровне тулкитов и отдельных приложений https://wiki.archlinux.org/title/HiDPI .


      1. Einherjar Автор
        11.11.2022 10:09

        Xft.dpi может банально отсутствовать. Об этом во второй части.


    1. Einherjar Автор
      11.11.2022 10:53

      DPI это dots per Inch, inch - мера физической длины и для того чтобы хотя бы оперировать этим термином где либо, необходимо знать физические размеры того на чем выводится изображение. Хоть API для получения физических размеров монитора и есть (EDID), но гарантий что там будут корректные значения нет, например на виртуальной машине не получится их определить, поэтому везде приходится использовать относительные коэффициенты от 100% масштаба который во времена низких разрешений всех устраивал, и даже в конфигурации X-сервера если значение не прибито гвоздями к 96 то просто задается 96 умноженное на коэффициент указанный в настройках.


      1. fk0
        12.11.2022 01:48
        +1

        Никаких гарантий и не надо. Через опцию -dpi 100500 можно передать нужное разрешение иксам. Опцию нужно вписать в скрипт из /etc, который запускается из xdm. Можно в /etc/X11/xorg.conf вписать размеры монитора и разрешение и оно само вычислится. Проблема в том, что на самом деле чуть ли не с 80-х годов оно всё работало корректно (во всяком случае в 2000-м у меня в компе DPI соответствовал "хрустальному" монитору), и только в последнее десятилетие массово всё поломано. И тут (с появлением 4к мониторов) начинаются "открытия".

        А да, ещё мониторы через EDID могут выдавать размеры свои неправильно, потому, что 4к монитор сделали, а микросхему для EDID взяли и тупо скопировали с какого-то мелкого монитора и вообще не заморачивались. На работе такой выдали. Собственно линейкой померял и вручную в конфиги вписал.


  1. vtb_k
    11.11.2022 01:55
    +1

    У меня в swaywm поддерживается и разное масштабирование и разная частота на разных мониторах


  1. Jolt
    11.11.2022 11:46

    да что-то я не понял, если Cinnamon на использует xorg, как они поддерживают независимые настройки масштабирования?


    1. Einherjar Автор
      11.11.2022 11:52

      Cinnamon на x11 делает это через xrandr, подробнее будет во второй части


      1. Jolt
        11.11.2022 11:59

        я как-то пытался сделать через xrandr на KDE независимое масштабирование, но помнится вышло так себе, работало но с костылями


      1. fk0
        12.11.2022 01:58

        Это смотрится отвратительно, когда пытаются масштабировать шрифы. Глаза сломать можно. Такое годится только для просмотров ютуба. Но действительно, xrandr так умеет в режиме дублирования картинки. Заметил случайно когда ноут к телеку подключил.

        Не понимаю, как он это делает. Подразумевается видимо, что драйвер и видеокарта должны это уметь, и не всякая видимо умеет. В самих иксах ничего специального для такого нет же. В смысле если я подцеплю два моника через две разные карты -- так работать не будет же? Ну хорошо, для обычных окон что-то можно нахимичить софтово (блит 60 раз в секунду, условно), если есть 3д композитор то тоже можно, а если какое-нибудь окно с оверлеем -- что спрашивается делать? Впрочем непонятно и как оно может работать когда окно разорвано между двумя мониторями (на разных картах). И старые карты очевидно не умели. Ну типа S3 Trio. Те которые с видео выходом (на телек) были уже как-то умели.


  1. event1
    11.11.2022 19:56

    Мопед не мой, но для Plasma существует библиотека disman, работающая вместе с KDisplay. Разработчики утверждают, что она масштабирует автоматически и как надо.


  1. fk0
    12.11.2022 02:00

    Не рассмотрен вопрос поворота второго монитора на 90 градусов, или использования двух мониторов с разным порядком RGB и работы антиалиасинга в библиотеке libfreetype в такой ситуации. В том смысле что он работать не будет нормально никогда, потому, что это невозможно. Разве что переключить на градации серого. Но тогда при сравнении с виндами в последних шрифты более резкие и четкие. Как всегда. Блеск и нищета опенсоурса.


    1. Einherjar Автор
      12.11.2022 19:25

      Поворот скорее всего делается с помощью матриц трансформации в xrandr, идея интересная, спасибо проверю, если там окажется что то интересное, то упомяну во второй части. Разный порядок RGB меня пока не интересовал, эта статья следствие того что мне нужно научить приложение правильно масштабироваться на более менее адекватных конфигурациях распространенных дистрибутивов, т.к. используемый фреймворк не умеет сам это правильно делать.