Упаковка WM
Упаковка оконных менеджеров (WM)
История
- Версия 1.0 (с бранча 5.0)
- Версия 1.1 (добавлен пункт о backgrounds)
- Версия 2.0 (с бранча 10) [Вынесена на обсуждение] (добавлена поддержка /usr/share/xsessions; поддержка /etc/X11/wmsession.d оставлена на переходный период)
Интеграция с менеджером сессий (*dm)
Для интеграции с менеджерами сессий оконный менеджер должен иметь <name>.desktop файл в /usr/share/xsessions для поддержки сессий XDG (Freedesktop). Подробнее см. разделы ниже.
На переходный период (до выхода нового бранча, в котором все менеджеры сессий (*dm) поддерживают только сессии XDG) поддержку генератора сессий из /etc/X11/wmsession.d рекомендуется оставить в имеющихся пакетах. В новых пакетах ее добавлять не обязательно.
Поддержка сессий XDG (Freedesktop)
Для интеграции с менеджерами сессий, соответствующих стандарту Freedesktop, оконный менеджер должен иметь <name>.desktop файл в /usr/share/xsessions для поддержки сессий XDG (Freedesktop), а пиктограммы, указанные в <name>.desktop файле, должны быть проинсталлированы в соответствии с IconPathsPolicy.
<name>.desktop файл должен в основном соответствовать требованиям Desktop Entry Specification, в частности, иметь заголовок
[Desktop Entry] Type=Application
Должны быть указаны поля
Name=имя Название менеджера окон Icon=имя Имя иконке, используемой для отображения этого WM Comment=описание Небольшое описание этого оконного менеджера, которое поможет сомневающемуся пользователю Exec=путь Путь к исполняемому файлу, вызываемому менеджером сессий
В поле
TryExec=/path/to/executive
можно указать исполняемый файл, при отсутствии которого, или при отсутствии у этого файла прав на исполнение, desktop файл игнорируется. Это полезно, если исполняемый файл и desktop файл находятся в разных пакетах rpm.
Однако нужно помнить, что Desktop Entry Specification описывает desktop файлы приложений в /usr/share/applications. desktop файл в в /usr/share/xsessions является отдельным типом desktop файлов, отличным от desktop файлов приложений в /usr/share/applications.
Основные отличия для desktop файлов xsessions :
- ряд полей, таких, как поле Categories= указывать не нужно.
- существует необязательное поле
DesktopNames=<name>;
или, к примеру, DesktopNames=<name>;KDE; из которой Freedesktop совместимые DM берут значение для переменной окружения $XDG_CURRENT_DESKTOP.
Например, В /usr/share/xsessions/gnome-classic.desktop используется DesktopNames=GNOME-Classic;GNOME; Это значение в меню Freedesktop используется для полей OnlyShowIn=, NotShowIn=. В частности, в DesktopNames= могут использоваться несколько имен, что позволит Freedesktop совместимым WM/DE, в частности, показывать в своем Freedesktop-ном меню приложения с OnlyShowIn= для другого DE.
Однако если WM/DE как-то завязан на значение переменной окружения $XDG_CURRENT_DESKTOP, то в таком случае лучше явно дополнительно установить значение XDG_CURRENT_DESKTOP в скрипте запуска WM/DE, поскольку в настоящее время далеко не все DM Freedesktop совместимы и умеют устанавливать XDG_CURRENT_DESKTOP (WDM,SLiM,..).
Если WM/DE поддерживает полноценное меню стандарта Freedesktop, то можно добавлять в desktop файл поле DesktopNames=<name>; Внимание: не используйте desktop-file-validate для desktop файлов с поле DesktopNames.
см. подробнее
- https://github.com/lumina-desktop/lumina/issues/520
- https://bugs.freedesktop.org/show_bug.cgi?id=85938
- https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/1554878
Пиктограмма(ы) WM должна быть проинсталлирована в соответствии с IconPathsPolicy и иметь то же имя, что и пиктограмма, указанная в поле Icon=. Должна быть как минимум одна пиктограмма png или svg. Желателен набор пиктограм как для больших, так и для малых размеров. К примеру, lightdm-gtk-greeter отображает пиктограммы в размере 16x16, для wm-select удобнее 64x64, 48x48 или svg.
Таким образом, для поддержки оконным менеджером сессий XDG, мы должны добавить в наш spec-файл следующие строчки (пример для Fluxbox):
%install ... mkdir -p %buildroot%_datadir/xsessions/ cat >"%buildroot%_datadir/xsessions/%name.desktop" <<__EOF__ [Desktop Entry] Name=Fluxbox Comment=Very small and fast window manger Comment[ru]=Маленький и быстрый оконный менеджер Icon=fluxbox TryExec=/usr/bin/fluxbox Exec=startfluxbox Type=Application DesktopNames=Fluxbox; Keywords=launch;Fluxbox;desktop;session; __EOF__ ... %files %_datadir/xsessions/%name.desktop
Этот файл необязательно создавать в spec-файле. Можно создать его отдельно и добавить в спек только следующие строчки:
SourceN: %name.desktop ... %install install -pD -m 644 %SOURCEN %buildroot%_datadir/xsessions/%name.desktop ... %files %_datadir/xsessions/%name.desktop
Поддержка генератора сессий из /etc/X11/wmsession.d
Современные менеджеры сессий переходят на стандарты Freedesktop. Планируется, что в следующем стабильном бранче (p11?) поддержка /etc/X11/wmsession.d/ устареет.
Ранее каждый менеджер сессий имел свой конфигурационный файл, в котором были перечислены все установленные оконные менеджеры. При запуске он читает их из своего конфигурационного файла и отображает пользователю. Для того, чтобы облегчить труд мейнтейнеров оконных менеджеров, в ALT Linux добавление/удаление записи об оконном менеджере в конфигурационные файлы менеджеров сессий (к примеру, WDM) происходит автоматически, при наличии в пакете оконного менеджера файла в директории /etc/X11/wmsession.d.
Этот файл должен называться /etc/X11/wmsession.d/NNname, где 'NN' — двухзначный приоритет оконного менеджера (числа от 0 до 9 должны предваряться нулём), 'name' — название оконного менеджера. Пример: /etc/X11/wmsession.d/04IceWM
Формат файла с информацией о WM следующий:
NAME=имя Название менеджера окон ICON=абсолютный путь Путь к иконке, используемой для отображения этого WM DESC=описание Небольшое описание этого оконного менеджера, которое поможет сомневающемуся пользователю EXEC=путь Путь к исполняемому файлу, вызываемому менеджером сессий SCRIPT: exec путь Этот параметр нужен для совместимости
Пиктограмма(ы) WM должна быть проинсталлирована в соответствии с IconPathsPolicy. Должна быть как минимум одна пиктограмма xpm, png, или svg. рекомендуется 64x64 в /usr/share/icons/hicolor/64x64/apps (обсуждение). Допускается 48x48 в /usr/share/icons/hicolor/48x48/apps .
В поле ICON= должен быть указан полный путь к этой пиктограмме с расширением. Пиктограммы других размеров и типов (png и svg) можно устанавливать как дополнительные, т.е. расположенные согласно IconPathsPolicy и имеющие то же имя, что и пиктограмма, указанная в поле ICON=.
Таким образом, чтобы информация о новом оконном менеджере стала известна скрипту update_wms, мы должны добавить в наш spec-файл следующие строчки (пример для Fluxbox):
%install ... mkdir -p %buildroot%_sysconfdir/X11/wmsession.d cat >"%buildroot%_sysconfdir/X11/wmsession.d/07%name" <<__EOF__ NAME=Fluxbox ICON=%iconsdir/hicolor/64x64/apps/%name.xpm DESC=Light and fast window manager EXEC=%bindir/%name SCRIPT: exec %bindir/%name __EOF__ ... %files %config %_sysconfdir/X11/wmsession.d/*
Этот файл необязательно создавать в spec-файле. Можно создать его отдельно и добавить в спек только следующие строчки:
SourceN: %name.wmsession ... %install install -pD -m 644 %SOURCEN %buildroot%_sysconfdir/X11/wmsession.d/07%name ... %files %config %_sysconfdir/X11/wmsession.d/*
Регистрация файлов в X11/wmsession.d/ осуществляется программой /usr/sbin/update_wms из пакета xinitrc. Это делается автоматически, с помощью filetrigger-а в пакете xinitrc. Никаких специальных действий для этого проводить не нужно.
Ранее, до 4.1/branch включительно, для этой цели использовались макросы %update_wms/%clean_wms в %post/postun. Эти макросы устарели, и их необходимо удалять, так как удаление мусора из %post/postun несколько повышает скорость установки дистрибутива в целом.
Упаковка Freedesktop-совместимого WM
Зависимости на общие утилиты freedesktop
Согласно стандарту freedesktop.org, Freedesktop-совместимые WM должны пользоваться общесистемными БД, создаваемые утилитами
- update-mime-database (пакет shared-mime-info),
- update-desktop-database (пакет desktop-file-utils).
С другой стороны, пакеты с WM-специфическими ресурсами не должны иметь зависимостей на desktop-file-utils / shared-mime-info. (Обоснование: пакеты (тот же mutt), работающие на без-X-овом сервере, могут иметь .desktop файлы, при этом на без-X-овом сервере зависимость на desktop-file-utils явно избыточна.)
Однако зависимости на shared-mime-info/desktop-file-utils должны где-то оставаться, иначе эти утилиты вообще ставиться не будут.
Эти списки зависимостей потенциально открыты: по мере развития стандарта в нем могут добавиться новые приложения, новые версии WM начнут поддерживать эти приложения и т.д. Для удобства сопровождения списки зависимостей для Freedesktop-совместимых WM оформлены в пакет wm-common-freedesktop.
Поэтому WM (оконные менеджеры) и DE, удовлетворяющие стандарту freedesktop, должны иметь либо
Requires: wm-common-freedesktop
(вытягивает по зависимостям требуемый стандартом список утилит) либо
Requires: shared-mime-info desktop-file-utils ... (явное перечисление списка утилит)
Рекомендуется использовать wm-common-freedesktop, чтобы случайно не пропустить в будущем нужную утилиту.
Упаковка WM, не удовлетворяющего стандарту Freedesktop
Масштабирование пиктограмм
Если WM не поддерживает масштабирование пиктограмм (древние ископаемые WM), то рекомендуется добавить в зависимости
Requires: wm-common-pixmap-scaler
Этот пакет автоматически генерирует из пиктограмм большого размера пиктограммы уменьшенного размера в %_miconsdir/ (16x16) и %_niconsdir/ (32x32).
Генерация меню
Если WM не поддерживает напрямую freedesktop menu, то WM должен предоставить в /etc/menu-methods/<WMname> метод для генерации своего меню из общесистемного меню.
Примеры можно посмотреть в Сизифе и в руководстве к пакету menu.
Зависимость на пакет menu добавлять не обязательно, она будет получена автоматически по наличию файла /etc/menu-methods/<WMname>.
Порядок поиска пиктограмм для меню
Расположение пиктограмм в ALT Linux, согласно IconPathsPolicy, совместимо со стандартом freedesktop.org.
Если WM является Freedesktop-совместимым, то он уже настроен.
Иначе правильно настроенный оконный менеджер должен искать пиктограммы в следующем порядке:
- если он поддерживает SVG, то сначала в /usr/share/icons/<theme>/scalable/apps и в /usr/share/icons/hicolor/scalable/apps,
- если он поддерживает темы, то затем в /usr/share/icons/<theme>/<SIZExSIZE>/apps.
- затем в любом случае смотрит /usr/share/icons/hicolor/<SIZExSIZE>/apps, где по выбору <SIZExSIZE> это одно из 16х16, 32х32 и 48х48 по выбору.
- если оконный менеджер поддерживает масштабирование иконок, то затем смотрит в /usr/share/icons/<theme>/48х48/apps, и в /usr/share/icons/hicolor/48х48/apps (минимально гарантированная пиктограмма).
- если оконный менеджер поддерживает масштабирование иконок, то дополнительно смотрим в /usr/share/icons/ и в /usr/share/pixmaps для совместимости с пакетами, которые бросают пиктограммы куда попало.
- /usr/share/icons - это старое стандартное положение иконок в ALT, /usr/share/pixmaps - чисто GNOME. Добавить можно обе.
Указанный алгоритм настройки оконных менеджеров, не поддерживающих freedesktop menu, упрощён для условий ALT Linux. Подробный алгоритм выписан на standards.freedesktop.org.
Где прописывать пути поиска пиктограмм
Для оконных менеджеров, не поддерживающих напрямую freedesktop menu, есть 2 возможности: список путей в оконном менеджере (если в нем есть такая возможность) и список путей в соответствующем методе для menu-methods.
Разберём это на примере IceWM. IceWM поддерживает список путей в оконном менеджере, поэтому пути прописываем в параметре IconPath конфигурации.
IceWM не поддерживает напрямую freedesktop menu, но функцию findicon для menu-methods можно взять попроще:
function findicon($filename, $defaulticon)= \ ifeqelse($filename, , $defaulticon, replace(replace($filename, ".xpm",), ".png",))
Если бы IceWM не поддерживал список путей, то их пришлось бы вбивать в findicon наподобие следующего (размер пиктограмм 16x16):
function findicon($filename, $defaulticon)= \ ifeqelse($filename, , $defaulticon, \ ifelsefile($filename, $filename, \ ifelsefile(«/usr/share/icons/hicolor/16x16/apps/» $filename, «/usr/share/icons/default.kde/16x16/apps/» $filename, \ ifelsefile(«/usr/share/icons/hicolor/48x48/apps/» $filename, «/usr/share/icons/default.kde/32x32/apps/» $filename, \ ifelsefile(«/usr/share/icons/hicolor/32x32/apps/» $filename, «/usr/share/icons/hicolor/16x16/apps/» $filename, \ ifelsefile(«/usr/share/icons/slick/16x16/apps/» $filename, ifelsefile(«/usr/share/pixmaps/» $filename, «/usr/share/pixmaps/» $filename, \ $defaulticon)))))))\
В качестве ALT Linux специфики в menu есть функция locate_icon( $size , $icon_name ) , возвращающая /полный/путь/к/{16,32,48}/файлу/$icon_name.{png,xpm}
Интеграция с системными темами branding-*
background по умолчанию
Рекомендуется выставлять в настройках оконному менеджеру wallpaper по умолчению как
/usr/share/design/current/backgrounds/xdm.png
Чтобы файл /usr/share/design/current/backgrounds/xdm.png существовал бы в файловой системе, надо добавить в зависимости
Requires: design-graphics