7 June 2015

HiDPI в Linux

Desktop environments
HiDPI
Aqua Mine

Введение

После многолетнего доминирования дисплеев с высокой плотностью пикселей на мобильных устройствах, данная тенденция наконец-то дошла и до лаптопов с десктопами. По моему мнению, производители не ставили HiDPI-матрицы в основном из-за слабой поддержки DPI, отличных от 96, в Windows. К счастью, ситуация заметно улучшилась с выходом Windows 8 с Modern UI, хотя в десктопном режиме все еще далеко не идеальная — люди до сих пор жалуются на 3200×1800 при 13.3" в лаптопах и сомневаются о покупке 4K UHD 23.8"-монитора.

DPI и Linux

Возможность установки произвольного значения DPI появилась еще во времена Xfree86, но следует понимать, что это просто значение, которое ничего не делает само по себе. Его считывают и используют программы и компоненты, которые и принимают решение, каким образом отразить изменение DPI на экране. Если текст следует установленному значению DPI в 95% случаев (спасибо xft!), то размер элементов зависит от используемого окружения рабочего стола и тулкитов, на которых написаны приложения.

GTK+ 3-приложения поддерживают как целочисленный скейлинг элементов и дробный скейлинг шрифтов, так и изменение DPI на лету, без перезапуска приложений. Скейлингом элементов управляет переменная окружения GDK_SCALE, а скейлингом шрифтов — GDK_DPI_SCALE.
По умолчанию, шрифты скейлятся вместе с элементами. Таким образом, при DPI 96 и GDK_SCALE=2, вы получите шрифт, словно он с DPI 192. Чтобы отменить скейлинг шрифтов, достаточно установить переменную окружения GDK_DPI_SCALE в 0.5 (для GDK_SCALE=2).
Qt4 не умеет скейлить элементы. Для применения нового значения DPI требуется перезапуск приложения.
Qt5, начиная с версии 5.4, поддерживает целочисленный скейлинг элементов через переменную окружения QT_DEVICE_PIXEL_RATIO. DPI менять на лету нельзя, как и в Qt4, но работы в этом направлении ведутся и будут доступны с релизом Qt 5.6, как и скейлинг на каждый монитор отдельно.
WxWidgets-приложения ведут себя так же, как GTK+ 3, только не поддерживают скейлинг элементов.

Я попытался выяснить, какие DE можно комфортно использовать с HiDPI-мониторами. Тестирование проводилось на лаптопе с 12.5" 1366×768 (125 DPI) с подключенным внешним 23.8"-монитором с разрешением 3840×2160 (185 DPI).

Gnome 3



Поддержка высокой плотности пикселей в Gnome 3 реализована путем двойного скейлинга всех элементов и шрифтов, т.е. технически DPI устанавливается в значение 192. Явно задать другой DPI можно следующей командой:
gsettings set org.gnome.settings-daemon.plugins.xsettings overrides 
   "{ 'Gdk/WindowScalingFactor':<2>, 'Gdk/UnscaledDPI':<189440> }"

Где 189440 = 185 * 1024. И не забудьте про GDK_DPI_SCALE!
Все элементы интерфейса DE выглядят замечательно, стандартные приложения тоже. Поддержки скейлинга на каждый монитор отдельно нет.

Cinnamon



Так как Cinnamon написан с использованием GTK+ 3, поддержка HiDPI у него реализована примерно так же, как у Gnome 3: двойное увеличение элементов, шрифтов. Все выглядит так же хорошо, так и в случае Gnome 3. Как вы можете заметить, единственное приложение на скриншоте, которое выглядит мелко — VLC, он написан на Qt4. Поддержка скейлинга на каждый монитор также отсутствует.

KDE 5



Большинство KDE-приложений, написанных на QtQuick, умеют работать с любым DPI. Как таковая кнопка для включения HiDPI-режима отсутствует, но при установки значения DPI в 185 не только шрифты, но и элементы автоматически увеличиваются. По какой-то причине, из Plasma 2 убрали возможность ресайза многих вылезающих меню, например, главного меню запуска приложений Kicker, или диалога выбора сети апплета NetworkManager. Это вносит неудобства и несколько портит впечатление от DE, но, к счастью, есть обходные пути. Некоторые приложения, например, файловый менеджер Dolphin, все еще полноценно не портированы на Qt5, поэтому выглядят хуже, чем могли бы при использовании Qt5.
Возможность использования разных DPI на разных мониторах отсутствует. Что ж, ждем Qt 5.6.
На скриншоте вы можете видеть прекрасный баг видеоподсистемы DRI3, которая задействована в Fedora 22 по умолчанию — скриншотер KSnapshot снял свой собственный диалог сохранения.

Mate



Mate поддерживает установку произвольного значения DPI. Скейлинга как такового нет, но многие приложения поддерживают работу с произвольным DPI, хоть и местами едут. Иконки не масштабируются. Хороший выбор для владельцев мониторов с граничным значением DPI, когда целочисленный скейлинг не подходит. Скейлинга на каждый монитор отдельно нет.

Unity



Unity — единственная среда рабочего стола, которая поддерживает скейлинг на каждый монитор отдельно. К сожалению, скейлятся только элементы самой DE (левая и верхняя панель, главное меню), но не приложения, что практически не дает какой-то реальной пользы. Вместо указания DPI, Unity предлагает выбрать коэффициент масштабирования, исходя из базового значения DPI в 96. Я установил ползунок в значение 1.75, задав таким образом DPI 168.
В целом, ситуация напоминает Gnome 3, что неудивительно, ведь Unity тоже написан на GTK+ 3.

Есть ли жизнь с двумя мониторами?

Хоть ни один из тулкитов и DE не поддерживает работу с мониторами с разной плотностью пикселей, и все выглядит либо слишком крупно, либо слишком мелко, существует возможность скейлинга каждого монитора отдельно средствами X11. Это позволяет без особых проблем вывести не слишком требовательную к качеству отображения картинку, например, при кратковременном подключении ноутбука к проектору.
Для осуществления такого скейлинга, нам нужно установить виртуальное повышенное разрешение на дисплее с меньшим DPI и уменьшить его до оригинального разрешения средствами X11:

xrandr --output LVDS1 --pos 0x0 --scale 2x2 --fb 6572x2160
xrandr --output DP1 --scale 1x1 --pos 2732x0

где 2x2 — коэффициент скейлинга по горизонтали и вертикали, а 6572 = 1366*2 + 3840 — сумма горизонтального разрешения обоих мониторов с учетом скейлинга.



Заключение

Если у вас используется только один монитор, с двойной (192 DPI) или тройной (288 DPI) плотностью пикселей, то можете использовать практически любой современный DE и приложения без особых проблем. Если же у вас какое-то граничное значение DPI, для которого не подходит целочисленный скейлинг (150, 240), либо же если вы часто используете два монитора, только один из которых с высокой плотностью пикселей, то придется страдать и использовать скейлинг средствами X11, смотря на размытые шрифты. Остается надеется, что с приходом Qt 5.6 ситуация изменится в лучшую сторону, а там и GTK+ 3 подтянется.

Полезности

xsettingsd — применение DPI без перезапуска GTK+ 3-приложений из не-Gnome окружения
Используем высокие разрешения на неподдерживающих их видеокартах
Tags:hidpilinuxcinnamonkde 5plasma 5gnomemateunity
Hubs: Desktop environments
+49
61.8k 143
Comments 57
Popular right now