Skip to content

DPI scaling and custom UI scaling (RU)

Vadim Ushakov edited this page May 1, 2023 · 10 revisions

(Sorry, no english translation at the moment.)

Указанные фичи должны быть реализованы к релизу 2.26

Общее описание

Реализованное API позволяет независимо масштабировать следующее в зависимости от особенностей дисплея и потребностей пользователя:

  • Размеры "геометрии" пользовательского интерфейса, то есть размеры виджетов, окон и т.п.
  • Размеры иконок в пользовательском интерфейсе.
  • Размеры "тонких элементов" в пользовательском интерфейсе, таких как линии, рамки, обводки и т.п.
  • Размеры шрифтов в пользовательском интерфейсе.
  • Размеры при представлении данных в виде WYSIWYG, когда картинка на экране должна иметь заданные физические размеры.

Для кода приложений

Геометрия окон

Класс GdkScreen предоставляет функции, позволяющие преобразовать пиксельные размеры из условных "традиционных" величин (рассчитанных на мониторы с 96 DPI) в актуальные для данного экрана размеры:

gint    gdk_screen_apply_ui_scale_for_int(GdkScreen *screen, GdkUiScaleType scale_type, gint unscaled_value);
gdouble gdk_screen_apply_ui_scale_for_double(GdkScreen *screen, GdkUiScaleType scale_type, gdouble unscaled_value);

Это масштабирование может выполняться:

  • с учетом DPI;
  • с учётом заданных пользователем множителей;
  • с учётом иных факторов, которые могут быть добавлены в будущем.

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

Размеры шрифтов и WYSIWYG-представлений

Следующая функция объявлена устаревшей и не должна использоваться в новом коде:

gdouble gdk_screen_get_resolution (GdkScreen *screen);

Вместо неё вводится две новые функции:

gdouble gdk_screen_get_resolution_for_ui_fonts (GdkScreen *screen);
gdouble gdk_screen_get_resolution_for_wysiwyg_representation (GdkScreen *screen);

Первая функция выступает в качестве замены gdk_screen_get_resolution() для рендеринга шрифтов UI, таких как кнопки и пункты меню.

Вторая функция выступает в качестве замены gdk_screen_get_resolution() для рендеринга представлений, которые должны иметь заданные физические размеры. Например, для рендеринга страницы A4 в текстовом процессоре в масштабе 100% таким образом, чтобы физические размеры на экране максимально соответствовали размерам, полученным при выводе на печать.

Любые рассчеты размеров, которые должны соответствовать некоторым физическим размерам на экране, следует проводить с использованием значения, возвращенного функцией gdk_screen_get_resolution_for_wysiwyg_representation().

Результат, возвращаемый вызовом gdk_screen_get_resolution(), совпадает либо с первой функцией, либо со второй, в зависимости от настроек совместимости, заданных пользователем.

Размеры иконок

Размеры иконок, возвращаемые вызовом gtk_icon_size_lookup_for_settings(), уже отмасштабированы в соответствии настройками масштабирования, заданными параметром settings.

Размеры иконок, возвращаемые вызовом gtk_icon_size_lookup(), уже отмасштабированы в соответствии с настройками для дефолтного экрана.

В подавляющем большинстве случаев результат вызова gtk_icon_size_lookup() вернёт корректный результат, поскольку run-time конфигурации со множественными GdkScreen вряд ли встречаются на практике.

Для обеспечения абсолютной теоретической корректности кода следует заменить вызовы gtk_icon_size_lookup() на вызовы gtk_icon_size_lookup_for_settings(), передавая туда GtkSettings от требуемого GdkScreen.

Если приложение использует иконки с размерами, полученными в обход указанных функций, оно должно перемасштабировать их самостоятельно при помощи вызова gdk_screen_apply_ui_scale_for_int() с параметром scale_type равным GDK_UI_SCALE_ICONS.

Размеры , определяемые темой оформления

TODO: document me!

Для пользователя

TODO: document me!