LINUX.ORG.RU

Нормальное масштабирование в Xfce и GTK на экране с высоким DPI

 , ,


0

1

Имеется ноутбук с 16 дюймовым экраном 2560x1600 со свежеустановленной стабильной версией Debian 11 Bullseye.

Среда рабочего стола - Xfce.

По умолчанию все элементы графического интерфейса на экране мелкие.

Испробовал разные способы увеличения размера (см. ниже).
Ни один из способов не дал полностью удовлетворительного результата.
Какое масштабирование вы используете в Linux на экранах с большим DPI?
Буду рад любым рекомендациям, в том числе по смене дистрибутива и DE.

Вот какие способы я испробовал:

1) Задать в редакторе настроек «xsettings - Gtk - IconSizes» кастомные размеры иконок gtk-menu=24,24:gtk-button=24,24:panel-applications-menu=32,32:panel-directory-menu=32,32

Увеличить шрифт до 18 или указать размер шрифта 9 и DPI в 2 раза больше реального.

2) Указать размер шрифта 9 и включить в настройках «Внешний вид» масштабирование окон 2x.

3) Задать масштабирование (1.5x, 2x) в «Настройки - Дисплей».

Результаты:

Способ увеличения иконок в 1) как оказалось работал до версии GTK 3.10. Потом разработчики GTK решили, что нужно прекратить брать размеры иконок из «xsettings - Gtk - IconSizes». Теперь, как я понял, их предлагают увеличивать настройкой toolbar image, menu image { -gtk-icon-transform: scale(2.0); } в ~/.config/gtk-3.0/gtk.css. Но от этого иконки увеличиваются с потерей качества (размываются).

Способ 2) также портит иконки в меню xfce, файловом менеджере. А в GIMP масштабирование почему-то не применяется и в нём все мелкое.

Способ 3) вообще не работает, настройка масштабирования даже не сохраняется.

★★★

Последнее исправление: LinuxUser (всего исправлений: 1)

указать размер шрифта 9 и DPI в 2 раза больше реального…

В теории, DPI для того и придуман, что если указать реальный DPI, то масштабировать ничего не придется.

На практике, получилось как всегда…

andytux ★★★★★
()

Xfce же до сих пор частично на GTK2, тем более версия в Debian 11? — тогда HiDPI это боль.

В GNOME и KDE с этим должно быть куда лучше, но и чудес не ждите: GIMP и проч. GTK2-ПО спасёт разве что костыльная тема с в 2 раза увеличенными элементами.

(Сам пользуюсь GNOME на 14" 2880×1800 с 2× масштабированием, и кроме GTK2 (из которого только Anydesk) всё хорошо.)

Rootlexx ★★★★★
()
Ответ на: комментарий от Rootlexx

и проч. GTK2-ПО спасёт разве что костыльная тема с в 2 раза увеличенными элементами.

Значит надо чинить…

Слушай, так а в чем проблема с gtk2? Интерфейс состоит из иконок и шрифта, так? Иконки меняются в конфиге, а шрифт уже и так масштабируется с учётом DPI. Тему можно сменить на плоскоту типа Адвайты, чтобы не париться с масштабированием кастомных элементов темы.

Какие еще проблемы возникают?

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

Слушай, так а в чем проблема с gtk2?

Нужна трансляция координатного поля, чтобы при коэффициенте масштабирования, скажем, 2× устанавливаемые в пикселях параметры виджетов получали умножение их на 2, пиксельные изображения растягивались, но при этом элементы, для которых доступно более высокое разрешение (шрифты, SVG, некоторые иконки, …), отрисовывались нативно. Чтобы это всё работало нормально, тулкит должен быть изначально построен с учётом масштабирования.

Т.е. если в приложении задана ширина боковой панели в 140 пикселей, то это тоже должно умножаться на заданный коэффициент.

Удачи заставить GTK2 вести себя корректно хотя бы в подавляющем большинстве случаев.

Rootlexx ★★★★★
()
Ответ на: комментарий от Rootlexx

Нужна трансляция координатного поля, чтобы при коэффициенте масштабирования, скажем, 2× устанавливаемые в пикселях параметры виджетов получали умножение их на 2, пиксельные изображения растягивались, но при этом элементы, для которых доступно более высокое разрешение (шрифты, SVG, некоторые иконки, …), отрисовывались нативно.

«Нужна»? Это неверная постановка задачи. Типичная проблема XY.

Нужно, чтобы тулкит масштабировал UI с учётом DPI. А как это будет реализовано - другой вопрос.

Удачи заставить GTK2 вести себя корректно хотя бы в подавляющем большинстве случаев.

Так он и так уже ведёт себя корректно в «подавляющем большинстве случаев». Я тут посмотрел несколько приложений. Не масштабируются или элементы, которым приложение вручную задало размеры без учёта DPI, или отдельные элементы темы, у которых рассчёт был в пикселях опять же без учёта DPI.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

Ты сам перечислил несколько мест, где нужно поменять. В этом и проблема.

Хотя, «в чистом gtk2», DPI нормально работает, достаточно изменить только его. Например, Убунту 10.04, gtk2. Никаких gtk3 еще не существовало. Для масштабирования я устанавливаю DPI. А вот когда смесь разных версий gtk, то тут «кто в лес, кто по дрова».

andytux ★★★★★
()
Ответ на: комментарий от wandrien

Нужно, чтобы тулкит масштабировал UI с учётом DPI. А как это будет реализовано - другой вопрос.

«Нужно, чтобы в мире не было войн, голода и болезней. А как это будет реализовано — другой вопрос.» В реализации-то вся соль!

Пытаться решить через тему значит ограничиться лишь тем подмножеством элементов, которыми тема способна управлять. Если приложение, например, рисует график векторными примитивами, то что тут сделает тема?

Так он и так уже ведёт себя корректно в «подавляющем большинстве случаев». Я тут посмотрел несколько приложений. Не масштабируются или элементы, которым приложение вручную задало размеры без учёта DPI, или отдельные элементы темы, у которых рассчёт был в пикселях опять же без учёта DPI.

В моём словаре это не «подавляющее большинство случаев». Впрочем, дело ваше. Раз вы добились столь впечатляющего результата, то лучше помогите автору.

Rootlexx ★★★★★
()
Ответ на: комментарий от andytux

Ты сам перечислил несколько мест, где нужно поменять. В этом и проблема.

Это разве ж проблема. Вот когда для железки дров нет - это проблема. А это решаемые мелочи.

Хотя, «в чистом gtk2», DPI нормально работает, достаточно изменить только его. Например, Убунту 10.04, gtk2. Никаких gtk3 еще не существовало. Для масштабирования я устанавливаю DPI. А вот когда смесь разных версий gtk, то тут «кто в лес, кто по дрова».

Ну так DPI и есть корректный способ масштабировать UI под дисплей. Наплодили костылей, понимаешь.

wandrien ★★
()
Ответ на: комментарий от wandrien

Так он и так уже ведёт себя корректно в «подавляющем большинстве случаев».

Последний раз когда я запускал Audacity на GTK+ на 4K-мониторе, он выглядел вот так:

https://web.archive.org/web/20170729011122if_/http://wiki.audacityteam.org/w/images/4/4b/Audacity_gtk2_4k.png

Не масштабируются или элементы, которым приложение вручную задало размеры без учёта DPI, или отдельные элементы темы, у которых рассчёт был в пикселях опять же без учёта DPI.

Так в этом-то то и главная проблема и сложность задачи. Потому что все пишут с оглядкой на «У меня на моём мониторе выглядит норм? Остальное ваши проблемы!». Именно поэтому всякие там разработчики Windows и разработчики Qt вот уже как минимум лет десять решают эту сложнейшую задачу с поддержкой современных HiDPI мониторов кодом существующих приложений так, чтобы всё было максимально удобоваримо:

Qt-разрабы, кстати, два или три раза переписывали свои HiDPI скейлеры. Кстати, заметь как разработчики Windows подошли к реализации HiDPI в WinAPI. Благодаря их труду софт под винду написанный чуть ли не до выхода самой первой версии X11, запускается на современом HiDPI мониторе и имеет отличную поддержку всех его современных фич: векторные шрифты c Grayscale-сглаживанием, корректная трансформация всех координат, корректный скейлинг и… никакого мыла!

Демонстрация уровня поддержки обратной совместимости WinAPI, которая недостижима для любого Linux’ового графического тулкита. Этот уровень мог быть достижим буть GTK+ или какой-нибудь Xaw стандартным графическим тулкитом Linux с измальства и будь у нас сейчас просто GTK+ с поддержкой современных фич, а не GTK+1, GTK+2, GTK+3, Gtk4 и на горизонте Gtk5 и все с поломанной обратной совместимостью между собой.

Вот и не повезло Linux-десктопу. Иксовые тулкиты протухли ещё в прошлом тысячелетии и сгнили, сегодня никто не добавит в них поддержку Gray-scale шрифтов, которые так прекрасно смотрятся на HiDPI-матрицах, а GTK+ начали писать люди которые любят сломать API/ABI но не могут объяснить каким образом это облегчило им поддержку кода и где все новые фичи которые они не могли внедрить не ломая код.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Audacity

Это приложение на wxWidgets.

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

Если бы на том ноуте у меня были приложения на gtk2, а не винда, то они и то выглядели бы лучше.

Весь стек кода UI должен работать с учётом DPI.

В винде проприетарные приложения и библиотеки исправить нельзя. Ну а нам что мешает?

А вообще сейчас создам новую тему, чтобы тут не флудить.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

А вообще сейчас создам новую тему, чтобы тут не флудить.

Да это уже было сто раз обсосано.

В винде проприетарные приложения и библиотеки исправить нельзя. Ну а нам что мешает?

Вот в том-то и смех, что в винде проприетарные приложения и библиотеки поправили вкорячив в WinAPI поддержку HiDPI, а в Linux не смогли это сделать даже для Qt 4 и GTK+2 на которых тонна ПО осталась.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Вот в том-то и смех, что в винде проприетарные приложения и библиотеки поправили вкорячив в WinAPI поддержку HiDPI

Это работает только для кода, который использует чисто вот эти самые встроенные виджеты.

Если там своя отрисовка, то всё превращается в мыло. Например, MS Office 2007 на Win10.

а в Linux не смогли это сделать даже для Qt 4 и GTK+2 на которых тонна ПО осталась.

Ну так давай сделаем? Руки вроде есть. Задача не выглядит как работы на год.

wandrien ★★
()

Постоянно с этой фигнёй сталкиваюсь, поскольку стар уже, и зрение падает. Универсального рецепта нет, но, внезапно - у firefox, например, есть такое - CTRL+«+». Увеличивает размер шрифта на странице. Очень удобно, кстати...

Измени разрешение десктопа, делов-то... Не , ну я понимаю всё, но в играх, обычно, разрешение самостоятельное, от десктопа не зависит.

cadaber ★★
()
Ответ на: комментарий от cadaber

Не знаю, как там в firefox…

Но вот пишу с Оперы столетней давности. И сколько помню, пользуюсь Ctrl+«+». Помимо этого, здесь легко включается свой стиль. И вот передо мной крупный, хорошо различимый шрифт, крупный интерфейс, а не мелкая серо-блеклость ЛОР-а.

Увеличил шрифт, это еще полбеды. Нередко встречается, левая и правая части страницы заняты «мусором», увеличил шрифт, а строка по ширине не помещается и не собирается переноситься на другую строку. Прокручивай вдоль…

И с интерфейсом, горе-дизайнеры насоздают мелкой, но размашистой и немастшабируемой «красоты». Увеличиваешь шрифт, а оно на экране не помещается, но все остается столь-же мелким.

andytux ★★★★★
()

У меня выглядит так.

Scale = 1x
Тема Matcha с гитхаба, в ней для xfwm дополнительные варианты резрешений.

~/.config/gtk-3.0/gtk.css:

.xfce4-panel wnck-pager {
    font-family: Roboto;
    font-size: 14px;
    font-stretch: condensed;
    font-weight: normal;
}

#whiskermenu-button label {
    font-weight: bold;
}

.xfce4-panel .tasklist .toggle {
    padding-left: 8px;
    padding-right: 8px;
}

Для нормального интерфейса огнелиса userchrome.css:

:root {
 --tab-toolbar-navbar-overlap: 0px !important;
 --tab-min-height: 50px !important;
}

:root #tabbrowser-tabs {
 --tab-min-height: 44px !important;
}

#TabsToolbar {height: 50px !important;}

#nav-bar {
      height: 50px !important;
}

#urlbar {
  height: 40px !important;
  margin-top: 0px !important;
  margin-bottom: -2px !important;
}

#personal-bookmarks .bookmark-item > .toolbarbutton-text {
    font-size: 18px !important;
    margin-left: 4px !important;
    margin-right: 4px !important;
}

#personal-bookmarks .bookmark-item > .toolbarbutton-icon {
    height: 18px !important;
    width: 18px !important;
    margin-left: 4px !important;
}
dmitry237 ★★★
()
Последнее исправление: dmitry237 (всего исправлений: 2)

2) Указать размер шрифта 9 и включить в настройках «Внешний вид» масштабирование окон 2x.

Это в теории должно работать, но на деле получается фигня. И шрифты в линуксе тоже масштабируются как-то неправильно, становятся слишком вытянутыми и тонкими. В результате, я спрятал новомодный ноут в шкаф и сижу на старом с dpi=100. Или есть другой вариант, стать виндузятником. Но это слишком хардкорно.

bread
()
Ответ на: комментарий от EXL

Благодаря их труду софт под винду написанный чуть ли не до выхода самой первой версии X11, запускается на современом HiDPI мониторе

Ага, запускается, только разглядеть ничего нельзя пока разрешение хотя бы в2 раза не уменьшишь.

grem ★★★★★
()
Ответ на: комментарий от EXL

А чего там вкорячивать? В винапи сроду было разделено понятие логических точек и физических точек т.к. один и тот же GDI API используют и для рисования на экране и для печати на принтере. Не все программисты поняли различие и можно встретить криво масштабирующиеся приложения, но в основном все ок

cobold ★★★★★
()
Ответ на: комментарий от friedrich

В свежем гноме достаточно одним нажатием увеличить масштаб до 200%

Мне даже нажимать ничего не пришлось: 2x активировалось автоматически, включая и экран входа.

Rootlexx ★★★★★
()
Последнее исправление: Rootlexx (всего исправлений: 1)

Вообщем, намучился я с поиском решения. Перепробовал LinuxMint и Manjaro с разными DE: Xfce, KDE, Cinnamon.

Наиболее приемлемо работает Manjaro с Xfce и масштабированием 2x.
При этом остались проблемы:

  1. размытие иконок в переключалке рабочих столов;
  2. за разумное время не удалось настроить Inkscape до вменяемого состояния - у него элементы интерфейса занимают слишком много места (например: у всех кнопок слишком большие поля, а панель «Заливка и обводка» занимает треть ширины экрана);
  3. дисплейный менеджер lightdm ни в какую не хочет масштабировать все шрифты: имя пользователя остаётся мелким;
  4. почему-то в lightdm не работает переключение раскладки, которое я сделал по официальной инструкции командой localectl --no-convert set-x11-keymap ru,us pc104 , grp:caps_toggle

Я уже был готов с этим смириться и донастраивать потихоньку всё потом, но оказалось есть более существенная проблема:
настраиваемый ноутбук (а это IdeaPad 5 Pro 16ARH7, про который я писал, что купил, в соседнем посте) нормально не засыпает.
Точнее так: с проприетарными драйверами на встроенную AMD-шную видеокарту после засыпания не просыпается (включается подсветка, но экран чёрный), а с открытыми - просыпается, но когда спит, подсветка экрана продолжает гореть.
Данная проблема не решена ни в одном из готовых ядер из репозиториев дистрибутивов.
Вроде на эту проблему есть патч, но, по моему глубокому убеждению, пользователь не должен заниматься сборкой ядра.

Как это ни печально, но пришлось поставить Windows.
Никнейм менять не планирую, так как ноут настраивал для жены :)

Жаль, что GNU/Linux ещё не готов для HiDPI экранов, а при покупке девайсов нужно заранее тщательно выяснять всё ли будет нормально работать в Linux.

LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser

дисплейный менеджер lightdm ни в какую не хочет масштабировать все шрифты: имя пользователя остаётся мелким;

Более-менее только с Adwaita. Шрифты нормальные, со само окно ввода логина-пароля мелкое.

$ cat /etc/lightdm/lightdm-gtk-greeter.conf
[greeter]
theme-name = Adwaita-dark
icon-theme-name = elementary
cursor-theme-name = Adwaita
greeter-hide-users = true
background = /usr/share/backgrounds/lightdm.png
font-name = Roboto 15
active-monitor = 0
xft-antialias = true
xft-dpi = 115
xft-hintstyle = slight
xft-rgba = rgb
indicators = ~clock;~spacer;~session;~power
hide-user-image = true
dmitry237 ★★★
()

Я DPI указываю везде, где только можно:

  1. Xft.dpi: 144 в Xresources (которые потом надо вручную подгрузить с помощью xrdb -load)
  2. xrandr --output XXX --dpi 144
  3. в аргументах X-сервера в xserverrc можно добавить -dpi, обычно лежит в /etc/X11/xinit
fumanchez
()
Ответ на: комментарий от EXL

Благодаря их труду софт под винду написанный чуть ли не до выхода самой первой версии X11, запускается на современом HiDPI мониторе и имеет отличную поддержку всех его современных фич: векторные шрифты c Grayscale-сглаживанием, корректная трансформация всех координат, корректный скейлинг и… никакого мыла!

Ну не правда же! Даже для .NET приложений, довольно свежих, пока не включишь в настройках чтобы масштабирование работало - нифига не работает. Т.е. пока разраб не пересоберет с корректной настройкой, само не заработает. Также и для MFC приложений, пока в InitInstance не выставишь, что приложение DpiAware, хрен что будет масштабироваться. А это опять же требует перекомпиляции. Ещё с манифестами что-то мудрить надо было тоже.

Loki13 ★★★★★
()
Ответ на: комментарий от LinuxUser

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

Про готовность GNU/Linux к HiDPI.
Меня вполне устраивало отсутствие масштабирования: с 2012 года использую 27 дюймовый монитор с 2560x1440. Не сказать что прям HiDPI, но с настройками по умолчанию всё было слегка мелкое.
Достаточно было увеличить размер шрифта по умолчанию и иконок, задать масштаб в браузере 125%.
До сих пор на компьютере подключённом к этому монитору стоит Debian 10, в котором этих настроек достаточно.

Но разработчики GTK 3 решили запретить изменять размер иконок через xfconf (xsettings → Gtk → IconSizes), а в замен предлагают увеличивать настройкой toolbar image, menu image { -gtk-icon-transform: scale(2.0); } в ~/.config/gtk-3.0/gtk.css из-за чего иконки получаются размытыми.
Зачем было это ломать?

LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser

27 дюймовый монитор с 2560x1440

Не сказать что прям HiDPI

Это 108.79 DPI… Это же считай почти как 96. То есть, не HiDPI совсем.

По теме: Хорошо, что с DPI почти повезло, можно скейлить ровно в 2 раза, а не в полтора. По своему опыту скажу, что минимум уродства и глюков на HiDPI в Linux сейчас можно получить на обычной (гномовской) Ubuntu под иксами. Предлагаю, протестить этот вариант, выставить Displays -> Scale в 200% и через Gnome Tweaks, вероятно, немного убавить размер шрифта в системе. Можно попробовать значения, отличные от 200%, но тогда масштабирование будет происходить через даунсэмплинг и это может вызвать разного рода глюки.

С Inkscape, к сожалению, помочь не могу, сам страдаю от этой проблемы и прячу панель на F12, когда не нужна.

zezic ★★★★
()
Ответ на: комментарий от LinuxUser

Достаточно было увеличить размер шрифта по умолчанию и иконок

С шрифтом понятно, но иконки… Что с ними не так, у меня на 2560х1600, 16 дюймов, иконки не размыты и нормального размера. И зачем вообще масштабировать через gtk.css? Есть же штатная настройка в Display.

dmitry237 ★★★
()