CSD. Зачем и почему?

#Article #Linux #CSD #GNOME

В этой статье я развеиваю все мифы и опасения, касательно Client Side Decorations (CSD) и сравниваю эту технологию с Server Side Decorations (SSD). Разбор CSD будет в контексте графического окружения GNOME, но большая часть сказанного будет применима к любому CSD, не только в GNOME.

Что такое CSD?

Почти у всех приложений есть заголовок и рамка окна. Это, так называемые, декорации приложения. Помимо внешнего вида, декорации ещё и отвечают за то, как окно может менять размер и обновлять своё содержимое при перемещении. Декорации могут быть реализованы на стороне графического сервера (SSD — Server Side Decorations), а могут на стороне приложения (CSD — Client Side Decorations). При отрисовке на стороне клиента, у приложения есть контроль за содержимым декораций и приложение может позволить себе такие штуки, как headerbar — о чём далее и пойдёт речь.

Разница между titlebar и headerbar

Раньше было популярно делать приложения с titlebar: у приложения был заголовок окна, в котором располагались лишь элементы управления окном и название окна. Часто под заголовком окна располагалось меню с выпадающими списками.

Приложение с классическим titlebar

Приложение с классическим titlebar

Позже появилась концепция headerbar — разработчики поняли, что вместо бесполезного названия окна, можно поместить в заголовок окна полезные элементы — вкладки, кнопки и прочее. Когда используют headerbar, меню с выпадающими списками обычно является дурным тоном.

Приложение с headerbar

Приложение с headerbar

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

Самые частые комбинации вышеописанных технологий: titlebar+SSD и headerbar+CSD. Хотя ничего не мешает использовать titlebar с CSD. Обратите внимание, что headerbar и кнопки управления окном внутри тела приложения возможны только при работе CSD!

Преимущества, которые даёт CSD

Отказ от titlebar экономит вертикальное пространство

Firefox 92. Слева классический заголовок, а справа — headerbar. Кто в здравом уме согласится потратить столько места ради названия окна и кнопки закрытия?

Зачем Blender titlebar? В названии нет ничего полезного, а кнопку закрытия можно поместить в само приложение.

А в заголовке окна Apostrophe много полезных кнопок. Благодаря headerbar, полезная площадь окна не простаивает.

Многие приложения лучше выглядят без titlebar

Вот так выглядит Slack на Ubuntu. Electron не умеет в CSD на Linux, поэтому это так ужасно.

Вот так выглядит Slack в Ubuntu 16.04. Electron не умеет в CSD на Linux, поэтому это так ужасно.

А вот так выглядит Slack на macOS. Electron отрисовывает CSD на macOS и это выглядит намного лучше.

А вот так выглядит Slack на macOS. Electron отрисовывает CSD на macOS и это выглядит намного лучше.

В новом GNOME Text Editor тема отвечает за всё: цветовую палитру приложения, цветовую схему текста в редакторе и цвет заголовка окна. Выглядит очень круто:

Мифы и заблуждения о CSD/headerbar

Некоторые приложения выглядят инородно без SSD.

Очень часто приводят аргумент, что на Wayland сессии GNOME не поддерживает SSD, из-за чего некоторые приложения отрисовывают рамку окна, внешне отличную от стандартной. Но в чём смысл одинаковых заголовков окон для всех приложений в системе, если сами приложения выглядят (UI) и ощущаются (UX) по-разному?

Сравните сами:

Telegram без CSD. Самый худший вариант.

Telegram без CSD. Самый худший вариант.

Telegram с CSD. Уже лучше.

Telegram с CSD. Уже лучше.

А так мог бы выглядеть Telegram, если бы разработчики нормально реализовали CSD.

А так мог бы выглядеть Telegram, если бы разработчики нормально реализовали CSD и использовали headerbar.

Обратите внимание, с каждым скриншотом всё меньше в пустую потраченного пространства. В варианте без CSD, заголовок хоть и имеет цвет как у нативных приложений (тема Adwaita), но совершенно не сочетается с внешним видом Telegram: используется другой цвет (это особенно хорошо видно, если в приложении светлая тема, а в системе тёмная или наоборот), в самом Telegram тема не выглядит как Adwaita, анимации другие, как и расположение элементов интерфейса. Нет никакого смысла в идентичных заголовках между приложениями, если сами приложения написаны по разным гайдлайнам и сильно разнятся по вопросам UI/UX. У вас никогда не будет полной консистентности внешнего вида приложений и пользовательского опыта. Всегда будет хотя бы одно нужное приложение на другом тулките: Qt, Electron, FLTK, EFL, SixtyFPS, ImGui, Motif, etc. Поэтому и нет смысла гнаться за одинаковыми заголовками окна для всех приложений в системе.

Разработчики GNOME форсируют CSD, банально не поддерживая протокол xdg-decorations на Wayland

На самом деле, любое приложение, поддерживающее Wayland, обязано поддерживать CSD и учитывать, что Wayland-композитор может не поддерживать SSD (протокол xdg-decorations). Потому что xdg-decorations является опциональным протоколом[^1] и его запросто может не быть на IoT устройствах (киоски, информационные стенды, банкоматы, etc.); игровых консолях (Steam Deck), планшетах (JingPad A1, PineTab) и смартфонах (Librem 5, PinePhone).

Из портативных композиторов, xdg-decorations не поддерживается как минимум в Mir из Ubuntu Touch — используется в смартфонах и планшетах, и ещё в двух он прилетает бонусом из-за использования wlroots, но не используется для согласования SSD: gamescopeкомпозитор для портативной сессии Steam Deck и Phoc из Phosh — используется во многих дистрибутивах для смартфонов и дефолт для Librem 5. Среди десктопных композиторов ситуация аналогичная, SSD далеко не стандарт: Mutter (GNOME WM), Weston и Enlightenment не поддерживают протокол xdg-decorations. Кто-то скажет: Какая разница, что все эти композиторы не поддерживают SSD, ведь KWin и wlroots её поддерживают! Ну, не поддерживающих композиторов явно больше, как по количеству, так и по доле рынка: Steam Deck планирует разойтись сотнями тысяч экземпляров, если не миллионами, GNOME самое популярное DE в Linux (пруф раз, пруф два (см. Main Findings)), а Weston используется не только в качестве референсного Wayland-композитора, но и в качестве композитора для WSLg.

Алсо, если приложение не поддерживает Wayland и работает через X11, то XWayland в GNOME вполне себе поддерживает SSD. Таким образом, для устаревших приложений не ломается совместимость.

Исходя из этих фактов, разработчики GNOME не видят смысла поддерживать SSD для Wayland приложений в GNOME: CSD позволяет делать и titlebar, и headerbar (который обычно лучше выглядит), а ещё разработчикам не надо тратить, пусть и минимальные, но дополнительные ресурсы на поддержку SSD в Wayland. Если какое-то приложение заявляет о поддержке Wayland, но не реализует CSD, то баг именно в приложении, потому что SSD необязателен для Wayland, а вот CSD очень даже обязателен[^1].

[^1]: XDG decoration. A client can use this protocol to request being decorated by a supporting compositor. If compositor and client do not negotiate the use of a server-side decoration using this protocol, clients continue to self-decorate as they see fit.

Пропадает название окна, из-за чего трудно ориентироваться

Тут уже всё сильно зависит от графического окружения, в GNOME такой проблемы нет:

  1. Есть Overview (Обзор), в котором очень легко ориентироваться по миниатюрам окон.
  2. В GNOME очень грамотная реализация переключения между окнами. Alt+Tab/Super+Tab переключает между открытыми приложениями, а Alt+`/Super+` переключает между окнами одного приложения и показывает их заголовки.

Пропадает возможность перетащить окно или воспользоваться контекстным действием по ПКМ

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

  1. Контекстное меню у окна в GNOME вызывается сочетанием клавиш Alt+Space.
  2. Некоторые CSD приложения перетаскиваются за любую часть окна, как, например, Clapper.
  3. Окна в GNOME перетаскиваются зажатием клавиши Super и удержанием левой кнопки мыши. И для этого даже не надо быть наведённым на заголовок окна! Чем меньше приходится мышевозить — тем лучше.

CSD заставляет разработчиков переходить на headerbar, либо убирать заголовок окна вовсе

Бред. Вот, например, Inkscape на GNOME Wayland с CSD+titlebar

Вот, например, Inkscape на GNOME Wayland с CSD+titlebar

CSD вынуждает разработчиков приложений писать лишний код

Любой современный тулкит (GTK3, GTK4, Qt5, Qt6, SDL2, etc.), кроме Electron, поддерживает CSD на Linux. В Electron работа над поддержкой CSD для Wayland ведётся, хотя всё равно Electron приложения пока что не поддерживают Wayland полноценно и работают через XWayland.

Для тех, кто не использует ни один из этих тулкитов есть библиотека libdecor, которая позволяет с лёгкостью добавить CSD.

Отказ mpv поддерживать CSD

Разработчик mpv (wm4) высказывался резко негативно по поводу CSD, а потом бац и mpv умеет в CSD:

mpv с CSD. И кнопки управления окном в стиле mpv

mpv с CSD. И кнопки управления окном в стиле mpv

Вообще, история с mpv и wm4 (создатель mpv) весьма забавная. Сначала, wm4 добавил коммит в mpv, который завершал работу mpv на GNOME с сообщением об ошибке. Потом сменил завершение на простое предупреждение пользователя, что “на GNOME что-то может пойти не так”. А потом его выгнали из собственного проекта. Выгнали его, конечно, не конкретно за изначальный коммит для GNOME, а скорее за то, что он был очень негативной личностью. Оригинальный аккаунт wm4 на GitHub уже удалён, чем воспользовались тролли, которые создали фейковый аккаунт. Похоже, он был редкостным мудаком:

Элитка ненавидит Haskell

Элитка ненавидит Haskell

Nuff said. Жаль, что этот аккаунт — фейк.

Nuff said. Жаль, что этот аккаунт — фейк.

Из-за CSD нарушается общий UX ресайза окон

Это единственный реальный минус, который несёт в себе CSD. На плечи разработчиков тулкитов ложится задача правильно реализовать ресайз окон, чтобы он был удобен для пользователя. И проблема в том, в разных тулкитах ресайз окон реализован по-разному: разные зоны чувствительности, плавность анимаций и прочее. В идеале, должна быть общая договорённость между тулкитами (HIG, стайлгайды) как реализовывать ресайз для CSD, но мир неидеален и такой договорённости нет. В любом случае это не столь существенный минус, на фоне всех плюсов, что привносит CSD.

А что у других ОС?

Windows

В графической системе Windows нет понятия клиента и сервера, но если сторить аналогию, то в Windows всё-таки CSD. Нативные тулкиты разной степени свежести: Win32 (WM_NCPAINT) и UWP (ApplicationViewTitleBar) рисуют свои декорации для окон. Microsoft старается использовать headerbar в своих новых приложениях.

CSD с headerbar в Windows 11

CSD с headerbar в Windows 11

macOS

В macOS помимо CSD, headerbar'ы во все поля для дефолтных приложений.

CSD с headerbar в macOS Monterey

CSD с headerbar в macOS Monterey

Заключение

CSD — хороший тренд в построении графических интерфейсов для настольных компьютеров. Приложения становятся красивее и компактнее. CSD уже во всех мейнстримных ОС и с каждым годом становится всё популярнее. А попытка отрицать CSD — банальный страх перемен и привязанность к своим привычкам.

Полезные ссылки