О Wayland

2021-03-07

Всё началось с того как я купил первый Asus Zenbook. У него был FullHD экран (то есть 1920 на 1080 пикселей) запихнутый в 13.3 дюйма. Это примерно 165 точек на дюйм. В 1.7 раза больше, чем когда-то стандартные в Windows 96 dpi. Так началась для меня эпоха HiDPI.

Во всех ОС с HiDPI (aka Retina display) справляются одинаковым способом. Масштабируют изображение.

Тут есть много нюансов. Растровые изображения нужно либо выбирать побольше (если они есть), либо растягивать (с потерей чёткости). Всяческие иконки это, чаще всего, тоже растровые изображения. Векторные изображения стоит рендерить в соответствующем большем разрешении. Шрифты у нас векторные, их прямо обязательно нужно отрисовывать в большем разрешении. Собственно, ради этого, смотреть на красивые шрифты, и стоит заморачиваться с HiDPI.

А ещё приложения рисуют только своё окно. А декорации окон, панельки и прочее рисует уже ОС. Само приложение может использовать различные тулкиты для отрисовки. И этих тулкитов довольно много, и они весьма разные, особенно в Linux. И всем этим ребятам нужно правильно сказать, какое масштабирование мы тут используем.

Соответственно, поддержка HiDPI в ОС определяется тем, какие варианты масштабирования поддерживаются. И насколько хорошо поддерживаются. И насколько хорошо живут в этих условиях разные тулкиты.

Настройки масштабирования в MacOS

В те стародавние времена более-менее нормально работало только целое масштабирование. То бишь, увеличиваем всё в 2 (а не в 1.7) раза. На 13 дюймовом дисплее всё становится красиво, но несколько крупновато.

Проблема усугубляется необходимостью подключать внешний монитор. Который тоже FullHD, но на 23 дюймах. Получаются стандартные 96 dpi.

Имеем два монитора, оба разрешением 1920 на 1080 пикселей. Но один 13.3 дюйма, а другой 23 дюйма. 165 ppi vs 96 ppi.

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

Тогда я остановился на варианте без масштабирования. А чтобы 13 дюймовым экраном можно было пользоваться, я просто слегка увеличил шрифты. Как правило, при использовании двух мониторов, на экране ноутбука у меня живут только всякие чаты. Вот у них шрифт и увеличил. Да, менюшки и панельки мелковаты, но вполне удобно. Зато всё помещается. Ну а 23 дюймовый монитор выглядит как обычно.

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

Вот тогда я начал присматриваться к Wayland. Потому что там обещали разное масштабирование для разных мониторов. И, в общем-то, не обманули. Однако, в KDE это дело завезли значительно позже. А заработало это нормально только совсем недавно.

Wayland — это альтернатива X Window. Призванная всё упростить и исправить фатальные недостатки. Вот уже почти десять лет как активно внедряется во все дистрибутивы Linux. Внедряется, внедряется, но все никак окончательно внедрится не может.

Сравнение архитектур Wayland и X11

Какие такие фатальные недостатки?

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

Когда-то X создавался для того, чтобы приложения могли рисовать на удалённом дисплее. В протоколе есть примитивы рисования, вроде рисования линий. Но сейчас современные тулкиты (те самые тулкиты, GTK и Qt в первую очередь) предпочитают отрисовывать все эти кнопочки интерфейса в локальном буфере, а на X сервер отправляют уже готовое растровое изображение. В таком варианте использования все возможности X становятся излишними.

X11 предоставляет сетевую прозрачность. Это значит, что экран, клавиатура и мышь могут находиться на одном компьютере, где запущен X сервер, а само графическое приложение, X клиент, может быть запущено на другом компьютере. X клиент подключается к X серверу и рисует там. Но, вместо команд рисования, наши GTK и Qt будут передавать по сети большие картинки. А для этого есть более эффективные протоколы. Тот же VNC или SPICE. Так что сетевая прозрачность X в настоящее время не востребована.

Вот Wayland и есть полный пересмотр и упрощение того, что нужно для отрисовки GUI. Тут нет сетевой прозрачности, нет возможности рисования. Зато есть изоляция приложений.

В Wayland приложение просто рисует свой интерфейс в некоей прямоугольной области заданного размера, в окне. Как это уже и делают GTK и Qt. Далее вступает в работу так называемый композитор. Другое приложение, которое собирает все картинки других приложений, пририсовывает к ним рамки и формирует то, что видит пользователь. И всё это с использованием OpenGL, то есть с аппаратным ускорением всякого масштабирования и прозрачности. Как уже давно делают и под X менеджеры окон популярных DE. Собственно, в KDE именно менеджер окон KWin и выступает в роли композитора Wayland.

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

Проблема снова усугубилась с появлением у меня нового Zenbook. Теперь на тех же 13.3 дюймах разместились 3200х1800 пикселей. Почти 4K (точнее, QHD+ или WQXGA+). Это порядка 276 точек на дюйм. И нового монитора. 27 дюймов. 3840х2160 пикселей, полноценный 4K. Почти те самые 165 точек на дюйм, что были на 13 дюймовом FullHD.

Ну вот дайте мне обратно FullHD экран на Zenbook, и будет всё почти идеально. Но нет.

С тех пор в иксах появилось дробное масштабирование. Но не появилось разного масштабирования на разных мониторах. Полагаю, уже никогда не появится.

Конфигурация дисплеев в X

Я поставил не 200%, а 175%. Хорошо. Так же комфортно, как и без масштабирования. Шрифты везде — загляденье.

Текст в IntelliJ IDEA в X

Из неприятного только: не масштабируются панели. Приходится им выставлять большущие размеры в реальных пикселях.

Возможно, это глюк Latte Dock. У него много глюков. Иногда тормозит и постоянно жрёт много памяти (в моей конфигурации). Но зато только он может (наконец-то!) изобразить глобальное меню, замещаемое на заголовок окна, в верхней панели, как оно было в (светлой памяти) Unity. Ну и сам док у него работает заметно адекватнее штатного, особенно в случае двух мониторов.

Не масштабируются иконки в GTK приложениях, остаются маленькими. Кажется, это можно починить. Ведь этот показатель масштабирования тупо передаётся в приложения через переменные окружения. Конечно же разные для разных тулкитов. Что-то KDE не до конца добавляет.

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

Переключатель в KDE

А что Wayland?

Wayland есть, и в нём действительно можно выставить разное масштабирование для разных мониторов. Можно даже сделать так, чтобы окна на разных экранах физически были почти одинакового размера. Это получается где-то 200% масштабирование на маленьком экране и 125% на большом. Но я от этого так отвык, что окна привычного размера на экране ноутбука на большом мониторе кажутся слишком мелкими. Так что я, когда экспериментирую с Wayland, ставлю масштабирование 200% на маленьком экране, а 175% на большом.

Одинаковый размер окон на двух дисплеях

Настройки большого монитора в Wayland

Настройки маленького монитора в Wayland

Размеры панелей и курсора мыши в Wayland нужно уменьшить. Они масштабируются правильно. Даже по-разному на разных экранах. Курсор мыши, кстати, тоже масштабируется и выглядит очень «пиксельно», и умудряется менять масштаб между разными окнами. Это раздражает.

Субъективно Wayland в HiDPI немного поотзывчивее, чем X11. Первые несколько минут. Это хорошо. Но не всегда и не везде. Это плохо.

В Wayland в KDE многое починили за последний год. Нормально заработал Latte Dock и глобальное меню, вернулись почти все настройки (а устройства ввода в Wayland ведь работают совсем по-другому). Вон, даже скриншоты произвольного прямоугольника на экране в Spectacle завезли. Но есть две вещи, которые делают мой переезд на Wayland пока невозможным.

Wayland в HiDPI и KDE мылит окна. Нет, родные приложения KDE и Qt выглядят просто прекрасно. Шрифты великолепны, всё чётенько и красивенько. А вот GTK приложения, у которых нет родной поддержки Wayland, выглядят «мыльно».

Мыло текста в Wayland в IntelliJ IDEA

Дело в том, что для старых приложений, которые умеют только X11, запускается прослойка XWayland. По сути, для приложения запускается свой X сервер, куда оно рисует. А уже вывод этого сервера Wayland композитор помещает в Wayland окно. И вот в KDE XWayland запускается с масштабированием 100%, а уже KWin растягивает это окно до более высокого разрешения. То есть приложение рисует себя под низкое разрешение, а потом, через OpenGL, изображение апскейлится до большего разрешения. Отсюда и возникает премерзкое «мыло». Говорят, в GNOME такого нет, хотя там тоже используется XWayland.

Как работает XWayland

В Chrome недавно добавили родную поддержку Wayland. Если запустить chrome или chromium с ключами --enable-features=UseOzonePlatform --ozone-platform=wayland, то мыло пропадёт. Ozone — это новый слой абстракции перед оборудованием в Chromium, который умеет и X11, и Wayland. Получается, сам Chrome починить можно. Но что делать с многочисленными Electron приложениями?

И как избавиться от мыла в IntelliJ IDEA — моём основном рабочем инструменте, куда я смотрю более 60% времени, когда я за компьютером, я не знаю. Непонятно, что случится быстрее, родная поддержка Wayland в Swing или JavaFX, или исправление работы XWayland в KDE. Это я намекаю на то, что баги в поддержке Wayland исправляют обычно долго.

WM_CLASS у Chrome

Вторая проблема связана с классом окна.

У меня в доке висят значочки для веб приложений. Это обычные сайты, но для них Chrome запускается в отдельном окне, а в главном меню есть нужный пункт, который и можно закрепить в доке. Давным-давно Chrome сам позволял делать такие ярлыки. Но потом эту фичу куда-то задевали. Но сама возможность запускать сайты в отдельном окне никуда не делась. Я даже навострился создавать правильные .desktop файлы для этого. С помощью специально обученного скрипта.

Таким образом я запускаю Gmail, DevDocs и ещё пару приложений по мелочи.

Ключевым моментом здесь является задание WM_CLASS у окна. Это класс окна для менеджера окон. У окон веб приложений должен быть отдельный уникальный класс, отличный от класса окна самого Chrome. Тогда окна будут корректно отображаться и группироваться на панели задач или в доке. Этот WM_CLASS имеет прямое отношение к протоколу X. В Wayland его, по-видимому, просто нет.

В результате в Wayland отдельные ярлык и иконка для запуска в доке есть. А запускаешь приложение, и появляется ещё одно окно Chrome. Технически так оно и есть, да. Но я хочу, чтобы подсветилась иконка веб приложения в доке. Иначе какой в этом смысл?

Неправильные значки в доке

Милый минтовый Web App Manager работает подобным же образом. Он тоже создаёт .desktop ярлыки. И под Wayland тоже открывается окно Chrome, а не веб приложения.

Пока Wayland не готов для постоянного использования. По крайней мере, для меня. Если с «мылом», я верю, рано или поздно справятся, то что делать с веб приложениями? Надо искать альтернативный подход.

Ну и всё ещё слишком много более мелких глюков.

Похоже, Spectacle в HiDPI Wayland мылит скриншоты. Возможно, он делает и правильно, изображения получаются приемлемого разрешения. А то в X11 получаются скриншоты пиксель в пиксель, а это слишком много для веба. В вебе ведь HiDPI не завезли. Точнее, браузер масштабирует все картинки согласно тому самому коэффициенту масштабирования. И скриншоты с HiDPI дисплея приходится уменьшать, чтобы браузер их потом увеличил, если страницу будут просматривать на HiDPI мониторе. От этого тоже возникает «мыло». С редактированием изображений в HiDPI вообще иногда есть проблемы.

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

Полноценных настроек тачпада нет, и он не отключается при подключении мыши. Похоже, в Wayland нет полноценного драйвера для тачпадов Synaptics. Вероятно, нормальной поддержки планшетов Wacom тоже нет. Полагаю, для очень многих пользователей это критично.

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

Wayland, HiDPI и KDE? Выберите два. Три вместе — пока невозможно.

Жду улучшений. Избавление от «мыла» в GTK приложениях. Решение вопроса веб приложений. Полноценной поддержки тачпада.

UPD 2021-03-20

Wayland для работы с устройствами ввода использует (как правило) библиотеку libinput. Её же по умолчанию использует и X Server. Эта библиотека умеет тачпады Synaptics и планшеты Wacom. Однако, для X есть и отдельные драйверы ввода, которые вроде как предоставляют больше возможностей для тонкой настройки.

Сложность в том, что у libinput нет своего стандартного конфига и стандартной утилиты настройки. В X это конфиги X сервера и утилита xinput. В Wayland все настройки отданы на волю конкретного композитора, которые в разных DE разные. В KDE под Wayland таки есть настройки для тачпадов. Но (сейчас) нет настроек для планшетов Wacom.

Приложение Upwork не умеет делать скриншоты под Wayland. Похоже, что протокол создания скриншотов, то есть доступа к итоговому изображению, которое видит пользователь, у разных композиторов разный. А KDE (точнее, KWin) — не самый популярный композитор.

Jetbrains начали перенос платформы IntelliJ на JDK17. Это значит, что скоро в IDEA появится родная поддержка Wayland.

В Chrome всё же сохранилась возможность создавать ярлыки для веб приложений (меню More tools...Create shortcut...). Однако, под Linux у этих окон не используется родная декорация. Некрасиво. И да, всё сводится к тем же .desktop файлам и не работает правильно в Wayland.