Упаковка WM: различия между версиями

Материал из ALT Linux Wiki
 
(не показаны 54 промежуточные версии 7 участников)
Строка 1: Строка 1:
{{DraftPolicy
{{span|font-size: 180%|Упаковка оконных менеджеров (WM), cред рабочего стола (DE),
|responsible=IgorVlasenko
других графических сеансов работы.}}
{{Policy
|responsible=Игорь Власенко
|since_branch=5.0
|metabug=
|metabug=
}}
}}
{{Викифицировать}}
{{Викифицировать}}


== Упаковка оконных менеджеров (WM) ==
== История ==
* Версия 1.0 (с бранча 5.0)
* Версия 1.1 (добавлен пункт о backgrounds)
* Версия 2.0 (с бранча 10). <!-- Принята. [https://lists.altlinux.org/pipermail/devel/2021-October/215680.html обсуждение] --> (добавлена поддержка {{path|/usr/share/xsessions}}; поддержка {{path|/etc/X11/wmsession.d}} оставлена на переходный период). [https://bugzilla.altlinux.org/41271 metabug]
 
== Интеграция с менеджером сессий (*dm) ==
 
Для интеграции с менеджерами сессий оконный менеджер должен иметь <name>.desktop файл в {{path|/usr/share/xsessions}} для поддержки сессий XDG (Freedesktop). Подробнее см. разделы ниже.
 
На переходный период (до выхода нового бранча, в котором все менеджеры сессий (*dm) поддерживают только сессии XDG)
поддержку генератора сессий из {{path|/etc/X11/wmsession.d}} рекомендуется оставить в имеющихся пакетах.
В новых пакетах ее добавлять не обязательно.
 
=== Поддержка сессий XDG (Freedesktop) ===
 
Для интеграции с менеджерами сессий, соответствующих стандарту Freedesktop, оконный менеджер должен иметь <session-name>.desktop файл в {{path|/usr/share/xsessions}} для поддержки сессий XDG (Freedesktop).
 
Подробнее см. [[Упаковка_WM#Требования_к_desktop_файлу]]
 
 
Рекомендуется установить пиктограмму (набор пиктограмм) для <session-name>.desktop файла и указывать в <session-name>.desktop файле имя этой пиктограммы (набора пиктограмм).
 
Подробнее см. [[Упаковка_WM#Требования_к_пиктограммам]]
 
==== Требования к desktop файлу ====
<name>.desktop файл должен в основном соответствовать требованиям
[https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html Desktop Entry Specification],
в частности, иметь заголовок
<pre>
[Desktop Entry]
Type=Application
</pre>
Должны быть указаны поля
<pre>
Name=имя
Название менеджера окон
Icon=имя
Имя иконке, используемой для отображения этого WM
Comment=описание
Небольшое описание этого оконного менеджера, которое поможет сомневающемуся пользователю
Exec=путь
Путь к исполняемому файлу, вызываемому менеджером сессий
</pre>
В поле <pre>TryExec=/path/to/executive</pre> можно указать исполняемый файл, при отсутствии которого, или при отсутствии у этого файла прав на исполнение, desktop файл игнорируется. Это полезно, если исполняемый файл и desktop файл находятся в разных пакетах rpm.
 
==== Замечания по типам desktop файлов ====
 
По своей сути, desktop файлы для xsessions являются отдельным подтипом desktop файлов, поэтому для них было бы логично ввести явный отдельный тип наподобие <tt>Type=XSession</tt>. Однако уже исторически сложилась практика указывать для них <tt>Type=Application</tt>.
 
Таким образом, desktop файлы с <tt>Type=Application</tt> можно разделить на 3 подтипа:
* desktop файлы для меню WM/DE из {{path|/usr/share/applications}}.
* desktop файлы автозапуска приложений  при старте WM/DE из {{path|/etc/xdg/autostart}}.
* desktop файлы для выбора xsession {{path|/usr/share/xsessions}}.
 
Описание в [https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html Desktop Entry Specification] и программа {{prg|desktop-file-validate}} в основном ориентированы на первый тип – desktop файлы для меню.
 
==== Отличия desktop файла для xsessions ====
 
Основные отличия для desktop файлов xsessions :
* ряд полей, таких, как поле <tt>Categories=</tt> указывать не нужно.
* desktop файл может содержать дополнительную секцию <tt>[Window Manager]</tt>.
* Есть разные необязательные поля для DM, к примеру X-LightDM-DesktopName=.
* существует необязательное поле <tt>DesktopNames=<NAME>;</tt> или, к примеру, <tt>DesktopNames=NAME;KDE;</tt>.
 
==== Поле DesktopNames= desktop файла ====
 
В соответствии с [https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#recognized-keys Desktop Entry Specification], Freedesktop совместимые Display Managers берут из поля <tt>DesktopNames=</tt> значение для переменной окружения $XDG_CURRENT_DESKTOP. Пример: из
DesktopNames=NAME;KDE;
будет выставлено значение переменной
XDG_CURRENT_DESKTOP=NAME:KDE
 
Если WM/DE поддерживает полноценное меню стандарта Freedesktop, то можно добавлять в desktop файл поле DesktopNames=<name>;
 
Для ряда современных DE их DesktopNames зарезервированы в стандарте: [https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html#onlyshowin-registry onlyshowin-registry] и, как правило, уже указаны в их .desktop файле.
 
Значения из DesktopNames в меню Freedesktop используются для полей OnlyShowIn=, NotShowIn=.
В частности, в DesktopNames= могут использоваться несколько имен, что позволит Freedesktop совместимым меню приложений показывать в своем меню приложения с OnlyShowIn= для другого DE.
 
Например, в {{path|/usr/share/xsessions/gnome-classic.desktop}} <tt>DesktopNames=GNOME-Classic;GNOME;</tt> используется, чтобы приложения с OnlyShowIn=GNOME показывались и в сеансе GNOME-Classic.
 
Поэтому для WM и DE, которые используют меню стандарта freedesktop (встроенное, или через стороннее приложение) и не зарезервированы в стандарте [https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html#onlyshowin-registry onlyshowin-registry] рекомендуется использовать в <tt>DesktopNames=</tt> свое ИМЯ В ВЕРХНЕМ РЕГИСТРЕ. Пример: <tt>Name=SomeWM</tt> но <tt>DesktopNames=SOMEWM;</tt>.
 
Если есть желание видеть в меню скрытые приложения (с OnlyShowIn=) других DE, можно добавить имена этих DE.
 
Для WM и DE, которые используют собственное legacy меню, можно указывать <tt>DesktopNames=Old;</tt> или вообще ничего не указывать.
 
Также переменная XDG_CURRENT_DESKTOP используется некоторыми приложениями (к примеру, firefox).
 
Если приложения в самом WM/DE как-то завязаны на значение переменной окружения $XDG_CURRENT_DESKTOP,
то в таком случае лучше явно дополнительно установить значение XDG_CURRENT_DESKTOP в скрипте запуска WM/DE,
поскольку в настоящее время далеко не все DM Freedesktop совместимы и умеют устанавливать XDG_CURRENT_DESKTOP (WDM,SLiM,..).
 
'''Внимание:''' поддержка поля DesktopNames появилась только в {{pkg|desktop-file-utils}} ≥ 0.26-alt2. Используйте {{prg|desktop-file-validate}} для desktop файлов с полем DesktopNames с осторожностью.
 
см. подробнее
* [https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html#onlyshowin-registry https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html#onlyshowin-registry]
* [https://github.com/joewing/jwm/issues/443 https://github.com/joewing/jwm/issues/443]
* [https://github.com/lumina-desktop/lumina/issues/520 https://github.com/lumina-desktop/lumina/issues/520]
* [https://bugs.freedesktop.org/show_bug.cgi?id=85938 https://bugs.freedesktop.org/show_bug.cgi?id=85938]
* [https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/1554878 https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/1554878]
 
==== Требования к пиктограммам ====
 
Пиктограмма(ы) WM должна быть проинсталлирована в {{path|/usr/share/icons/hicolor/*/apps/*}}
и иметь то же имя, что и пиктограмма, указанная в поле Icon=.
Должна быть как минимум одна пиктограмма png, xpm или svg.
Желателен набор пиктограм как для больших, так и для малых размеров.
К примеру, lightdm-gtk-greeter отображает пиктограммы в размере 16x16,
для wm-select удобнее 64x64, 48x48 или svg.
 
Соответствующие спецификации:
* [https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html icon-theme-spec] c
* [[IconPathsPolicy]]
 
==== Пример для spec файла ====
 
Таким образом, для поддержки оконным менеджером сессий XDG, мы должны добавить в наш spec-файл следующие строчки (пример для Fluxbox):


=== Интеграция с менеджером сессий (*dm) ===
%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=%name
Exec=start%name
Type=Application
DesktopNames=Fluxbox;
Keywords=launch;Fluxbox;desktop;session;
__EOF__
...
%files
%_datadir/xsessions/%name.desktop


Каждый менеджер сессий имеет свой конфигурационный файл, в котором перечислены все установленные оконные менеджеры. При запуске он читает их из своего конфигурационного файла и отображает пользователю. Для того, чтобы облегчить труд майнтейнеров оконных менеджеров, в Sisyphus / ALT Linux добавление/удаление записи об оконном менеджере в конфигурационные файлы менеджеров сессий (поддерживаются KDM, GDM и WDM) происходит автоматически, при наличии в пакете оконного менеджера файла в директории {{path|/etc/X11/wmsession.d}}.
Этот файл необязательно создавать в spec-файле. Можно создать его отдельно и добавить в спек только следующие строчки:
 
<pre>SourceN: %name.desktop
...
%install
install -pD -m 644 %SOURCEN %buildroot%_datadir/xsessions/%name.desktop
...
%files
%_datadir/xsessions/%name.desktop</pre>
 
=== Поддержка генератора сессий из /etc/X11/wmsession.d ===
 
Современные менеджеры сессий переходят на стандарты Freedesktop. Планируется, что в следующем стабильном бранче (p11?) поддержка {{path|/etc/X11/wmsession.d/}} устареет.
 
Ранее каждый менеджер сессий имел свой конфигурационный файл, в котором были перечислены все установленные оконные менеджеры. При запуске он читает их из своего конфигурационного файла и отображает пользователю. Для того, чтобы облегчить труд мейнтейнеров оконных менеджеров, в ALT Linux добавление/удаление записи об оконном менеджере в конфигурационные файлы менеджеров сессий (к примеру, WDM) происходит автоматически, при наличии в пакете оконного менеджера файла в директории {{path|/etc/X11/wmsession.d}}.


Этот файл должен называться <tt>/etc/X11/wmsession.d/NNname</tt>, где 'NN' — двухзначный приоритет оконного менеджера (числа от 0 до 9 должны предваряться нулём), 'name' — название оконного менеджера. Пример: {{path|/etc/X11/wmsession.d/04IceWM}}
Этот файл должен называться <tt>/etc/X11/wmsession.d/NNname</tt>, где 'NN' — двухзначный приоритет оконного менеджера (числа от 0 до 9 должны предваряться нулём), 'name' — название оконного менеджера. Пример: {{path|/etc/X11/wmsession.d/04IceWM}}
Строка 17: Строка 167:
<pre>NAME=имя
<pre>NAME=имя
   Название менеджера окон
   Название менеджера окон
ICON=путь
ICON=абсолютный путь с расширением
   Путь к иконке, используемой для отображения этого WM
   Путь к иконке, используемой для отображения этого WM
DESC=описание
DESC=описание
Строка 26: Строка 176:
   exec путь
   exec путь
   Этот параметр нужен для совместимости</pre>
   Этот параметр нужен для совместимости</pre>
Пиктограмма(ы) WM должна быть проинсталлирована в соответствии с [[IconPathsPolicy]].
Должна быть как минимум одна пиктограмма xpm, png, или svg.
рекомендуется 64x64 в /usr/share/icons/hicolor/64x64/apps ([http://lists.altlinux.org/pipermail/devel/2009-March/168005.html обсуждение]).
Допускается 48x48 в /usr/share/icons/hicolor/48x48/apps .
В поле ICON= должен быть указан полный путь к этой пиктограмме с расширением.
Пиктограммы других размеров и типов (png и svg) можно устанавливать как дополнительные, т.е. расположенные согласно [[IconPathsPolicy]]
и имеющие то же имя, что и пиктограмма, указанная в поле ICON=.


Таким образом, чтобы информация о новом оконном менеджере стала известна скрипту update_wms, мы должны добавить в наш spec-файл следующие строчки (пример для Fluxbox):
Таким образом, чтобы информация о новом оконном менеджере стала известна скрипту update_wms, мы должны добавить в наш spec-файл следующие строчки (пример для Fluxbox):
Строка 34: Строка 193:
   cat >"%buildroot%_sysconfdir/X11/wmsession.d/07%name" <<__EOF__
   cat >"%buildroot%_sysconfdir/X11/wmsession.d/07%name" <<__EOF__
   NAME=Fluxbox
   NAME=Fluxbox
   ICON=%iconsdir/%name.xpm
   ICON=%iconsdir/hicolor/64x64/apps/%name.xpm
   DESC=Light and fast window manager
   DESC=Light and fast window manager
   EXEC=%bindir/%name
   EXEC=%bindir/%name
Строка 43: Строка 202:
   %files
   %files
   %config %_sysconfdir/X11/wmsession.d/*</pre>
   %config %_sysconfdir/X11/wmsession.d/*</pre>
:
Этот файл необязательно создавать в spec-файле. Можно создать его отдельно и добавить в спек только следующие строчки:
Этот файл необязательно создавать в spec-файле. Можно создать его отдельно и добавить в спек только следующие строчки:


Строка 54: Строка 212:
%config %_sysconfdir/X11/wmsession.d/*</pre>
%config %_sysconfdir/X11/wmsession.d/*</pre>


=== Упаковка Freedesktop-совместимого WM  ===
Регистрация файлов в {{path|X11/wmsession.d/}} осуществляется программой {{prg|/usr/sbin/update_wms}}
из пакета {{pkg|xinitrc}}. Это делается автоматически, с помощью filetrigger-а в пакете {{pkg|xinitrc}}.
Никаких специальных действий для этого проводить не нужно.


==== Зависимости на общие утилиты freedesktop. ====
Ранее, до 4.1/branch включительно, для этой цели использовались макросы %update_wms/%clean_wms в %post/postun.
Эти макросы устарели, и их необходимо удалять, так как удаление мусора из %post/postun несколько повышает скорость установки дистрибутива в целом.


Согласно стандарту freedesktop.org, Freedesktop-совместимые WM
== Упаковка Freedesktop-совместимого WM ==
должны пользоваться общесистемными БД, создаваемые утилитами


update-mime-database (пакет shared-mime-info),
=== Зависимости на общие утилиты freedesktop ===
update-desktop-database (пакет desktop-file-utils).
Согласно стандарту freedesktop.org, Freedesktop-совместимые WM должны уметь пользоваться общесистемными БД, создаваемые утилитами
* {{prg|update-mime-database}} (пакет {{pkg|shared-mime-info}}),
* {{prg|update-desktop-database}} (пакет {{pkg|desktop-file-utils}}).


С другой стороны, пакеты с WM-специфическими ресурсами
С другой стороны, пакеты с WM-специфическими ресурсами не должны иметь зависимостей на desktop-file-utils / shared-mime-info. (Обоснование: пакеты (тот же mutt), работающие на без-X-овом сервере, могут иметь .desktop файлы, при этом на без-X-овом сервере зависимость на desktop-file-utils явно избыточна.)
не должны иметь зависимостей на на desktop-file-utils / shared-mime-info.
(Обоснование: пакеты (тот же mutt) работающие на без-X-овом сервере,
могут иметь .desktop файлы. при этом на без-X-овом сервере
зависимость на desktop-file-utils явно избыточна.)


Однако зависимости на shared-mime-info/desktop-file-utils должны где-то
Однако зависимости на shared-mime-info/desktop-file-utils должны где-то оставаться, иначе эти утилиты вообще ставиться не будут.
оставаться, иначе эти утилиты вообще ставиться не будут.


Эти списки зависимостей потенциально открыты:  
Эти списки зависимостей потенциально открыты: по мере развития стандарта в нем могут добавиться новые приложения,
по мере развития стандарта, в нем могут добавиться новые приложения,
новые версии WM начнут поддерживать эти приложения и т.д.
новые версии WM он начнут их поддерживать и т.д.
Для удобства сопровождения списки зависимостей для Freedesktop-совместимых WM оформлены в пакет wm-common-freedesktop.
Для удобства сопровождения списки зависимостей для Freedesktop-совместимых WM  
оформлены в пакет wm-common-freedesktop.


Поэтому WM (оконные менеджеры) и DE, удоволетворяющие стандарту freedesktop,  
Поэтому WM (оконные менеджеры) и DE, удовлетворяющие стандарту freedesktop, ''должны'' иметь либо  
'''должны''' иметь  
либо  
  Requires: wm-common-freedesktop
  Requires: wm-common-freedesktop
(вытягивает по зависимостям требуемый стандартом список утилит)
(вытягивает по зависимостям требуемый стандартом список утилит) либо
либо
  Requires: shared-mime-info desktop-file-utils ... (явное перечисление списка утилит)
  Requires: shared-mime-info desktop-file-utils ... (явное перечисление списка утилит)


Рекомендуется использовать wm-common-freedesktop, чтобы случайно не пропустить в будущем нужную утилиту.
Рекомендуется использовать wm-common-freedesktop, чтобы случайно не пропустить в будущем нужную утилиту.


=== Упаковка  WM, не удоволетворяющего стандарту Freedesktop ===
== Упаковка  WM, не удовлетворяющего стандарту Freedesktop ==
 
==== Масштабирование пиктограмм ====


Если WM не поддерживает масштабирование пиктограмм (древние ископаемые WM)
=== Масштабирование пиктограмм ===
то рекомендуется добавить в зависимости  
Если WM не поддерживает масштабирование пиктограмм (древние ископаемые WM), то рекомендуется добавить в зависимости  
  Requires: wm-common-pixmap-scaler
  Requires: wm-common-pixmap-scaler
Этот пакет автоматически генерирует из пиктограмм большого размера  
Этот пакет автоматически генерирует из пиктограмм большого размера пиктограммы уменьшенного размера в %_miconsdir/ (16x16) и %_niconsdir/ (32x32).
пиктограммы уменьшенного размера в %_miconsdir/ (16x16) и %_niconsdir/ (32x32).


==== Генерация меню ====
=== Генерация меню ===
 
Если WM не поддерживает напрямую freedesktop menu, то WM должен предоставить в {{path|/etc/menu-methods/<WMname>}}
Если WM не поддерживает напрямую freedesktop menu, то  
WM должен предоставить в {{path|/etc/menu-methods/<WMname>}}
метод для генерации своего меню из общесистемного меню.
метод для генерации своего меню из общесистемного меню.


Примеры можно посмотреть в Сизифе и в руководстве к пакету menu.
Примеры можно посмотреть в Сизифе и в руководстве к пакету menu.


Зависимость на пакет menu добавлять не обязательно, она будет
Зависимость на пакет menu добавлять не обязательно, она будет получена автоматически по наличию файла {{path|/etc/menu-methods/<WMname>}}.
получена автоматически по наличию файла {{path|/etc/menu-methods/<WMname>}}.


==== Порядок поиска пиктограмм для меню ====
=== Порядок поиска пиктограмм для меню ===
 
Расположение пиктограмм в ALT Linux, согласно [[IconPathsPolicy]], совместимо со стандартом [http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html freedesktop.org].
Расположение пиктограмм в ALT Linux, согласно [[IconPathsPolicy]],  
совместимо со стандартом freedesktop.org.
((http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html)).


Если WM является Freedesktop-совместимым, то он уже настроен.
Если WM является Freedesktop-совместимым, то он уже настроен.


Иначе правильно настроенный оконный менеджер
Иначе правильно настроенный оконный менеджер должен искать пиктограммы в следующем порядке:
должен искать пиктограммы в следующем порядке:
* если он поддерживает SVG, то сначала в {{path|/usr/share/icons/<theme>/scalable/apps}} и в {{path|/usr/share/icons/hicolor/scalable/apps}},
* если он поддерживает темы, то затем в {{path|/usr/share/icons/<theme>/<SIZExSIZE>/apps}}.
* затем в любом случае смотрит {{path|/usr/share/icons/hicolor/<SIZExSIZE>/apps}}, где по выбору <SIZExSIZE> это одно из {{path|16х16}}, {{path|32х32}} и {{path|48х48}} по выбору.
* если оконный менеджер поддерживает масштабирование иконок, то затем смотрит в {{path|/usr/share/icons/<theme>/48х48/apps}}, и в {{path|/usr/share/icons/hicolor/48х48/apps}} (минимально гарантированная пиктограмма).
* если оконный менеджер поддерживает масштабирование иконок, то дополнительно смотрим в {{path|/usr/share/icons/}} и в {{path|/usr/share/pixmaps}} для совместимости с пакетами, которые бросают пиктограммы куда попало.
*: /usr/share/icons - это старое стандартное положение иконок в ALT, /usr/share/pixmaps - чисто GNOME. Добавить можно обе.


если он поддерживает SVG, то сначала в
<div style="display: inline; color: red;">Замечание:</div>
/usr/share/icons/<theme>/scalable/apps.
Указанный алгоритм настройки оконных менеджеров, не поддерживающих freedesktop menu, упрощён для условий ALT Linux. Подробный алгоритм выписан на [http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html standards.freedesktop.org].
и в /usr/share/icons/hicolor/scalable/apps,


если он поддерживает темы, то затем в
=== Где прописывать пути поиска пиктограмм ===
/usr/share/icons/<theme>/<SIZExSIZE>/apps.
Для оконных менеджеров, не поддерживающих напрямую freedesktop menu, есть 2 возможности: список путей в оконном менеджере (если в нем есть такая возможность) и список путей в соответствующем методе для menu-methods.


Затем в любом случае смотрит
Разберём это на примере [[IceWM]].
/usr/share/icons/hicolor/<SIZExSIZE>/apps,
IceWM поддерживает список путей в оконном менеджере, поэтому пути прописываем в параметре [[IconPath]] конфигурации.
где по выбору <SIZExSIZE> это одно из 16х16, 32х32 и 48х48 по выбору.


Если оконный менеджер поддерживает масштабирование иконок, то затем
IceWM не поддерживает напрямую freedesktop menu, но функцию findicon для menu-methods можно взять попроще:
смотрит в /usr/share/icons/<theme>/48х48/apps, и в
/usr/share/icons/hicolor/48х48/apps (минимально гарантированная
пиктограмма).


Если оконный менеджер поддерживает масштабирование иконок, то
<pre>function findicon($filename, $defaulticon)= \
дополнительно смотрим в /usr/share/icons/ и в /usr/share/pixmaps
    ifeqelse($filename, , $defaulticon, replace(replace($filename, ".xpm",), &quot;.png&quot;,))
для совместимости с пакетами, которые бросают пиктограммы куда попало.
</pre>
&gt; /usr/share/icons - это старое стандартное положение иконок в ALT &gt; /usr/share/pixmaps - чисто GNOME &gt; Добавить можно обе.  
Если бы IceWM не поддерживал список путей, то их пришлось бы вбивать в findicon наподобие следующего (размер пиктограмм 16x16):
 
<pre>function findicon($filename, $defaulticon)= \
<div style="display: inline; color: red;">Замечание:</div>
    ifeqelse($filename, , $defaulticon, \
Указанный алгоритм настройки оконных менеджеров, не поддерживающих freedesktop menu,  
    ifelsefile($filename, $filename, \
упрощен для условий [[AltLinux|AltLinux]]. Подробный алгоритм выписан на
    ifelsefile(«/usr/share/icons/hicolor/16x16/apps/» $filename, «/usr/share/icons/default.kde/16x16/apps/» $filename, \
[http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html].
    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)))))))\</pre>


==== Где прописывать пути поиска пиктограмм ====
  В качестве ALT Linux специфики в menu есть функция locate_icon( $size , $icon_name ) ,
  возвращающая /полный/путь/к/{16,32,48}/файлу/$icon_name.{png,xpm}


Для оконных менеджеров, не поддерживающих напрямую freedesktop menu,
== Интеграция с системными темами branding-* ==
есть 2 возможности: список путей в оконном менеджере
=== background по умолчанию ===
(если в нем есть такая возможность) и список путей в
соответствующем методе для menu-methods.


Разберем это на примере [[IceWM|IceWM]].
В качестве фонового изображения (wallpaper/background) рекомендуется использовать
[[IceWM|IceWM]] поддерживает список путей в оконном менеджере,
/usr/share/design/current/backgrounds/default.png
поэтому пути прописываем в параметре [[IconPath|IconPath]] конфигурации.


[[IceWM|IceWM]] не поддерживает напрямую freedesktop menu,
который выставлять
но функцию findicon для menu-methods можно взять попроще:
* в настройках рабочего стола (если он есть)
* или в настройках фонового изображения оконного менеджера (если они есть)
* или явно загружать при старте {{path|/usr/share/design/current/backgrounds/default.png}} в корневое окно сторонней утилитой.
пример:
display -window root -geometry '-0-0' -resize `xdpyinfo  | grep -oP 'dimensions:\s+\K\S+'` /usr/share/design/current/backgrounds/default.png


function findicon($filename, $defaulticon)= \
Чтобы файл {{path|/usr/share/design/current/backgrounds/default.png}}
    ifeqelse($filename, , $defaulticon, replace(replace($filename, ".xpm",), &quot;.png&quot;,))
существовал бы в файловой системе, надо добавить в зависимости
 
Requires: design-graphics
Если бы 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)))))))\

Текущая версия от 15:10, 7 декабря 2021

Упаковка оконных менеджеров (WM), cред рабочего стола (DE), других графических сеансов работы.

Stamp90cw.png
Действующая политика Sisyphus

Политика действует, начиная со стабильного бранча 5.0 и выше.

Ответственный за проведение политики в жизнь — Игорь Власенко.


42px-Wikitext-ru.svg.png
Эту статью следует викифицировать.


История

  • Версия 1.0 (с бранча 5.0)
  • Версия 1.1 (добавлен пункт о backgrounds)
  • Версия 2.0 (с бранча 10). (добавлена поддержка /usr/share/xsessions; поддержка /etc/X11/wmsession.d оставлена на переходный период). metabug

Интеграция с менеджером сессий (*dm)

Для интеграции с менеджерами сессий оконный менеджер должен иметь <name>.desktop файл в /usr/share/xsessions для поддержки сессий XDG (Freedesktop). Подробнее см. разделы ниже.

На переходный период (до выхода нового бранча, в котором все менеджеры сессий (*dm) поддерживают только сессии XDG) поддержку генератора сессий из /etc/X11/wmsession.d рекомендуется оставить в имеющихся пакетах. В новых пакетах ее добавлять не обязательно.

Поддержка сессий XDG (Freedesktop)

Для интеграции с менеджерами сессий, соответствующих стандарту Freedesktop, оконный менеджер должен иметь <session-name>.desktop файл в /usr/share/xsessions для поддержки сессий XDG (Freedesktop).

Подробнее см. Упаковка_WM#Требования_к_desktop_файлу


Рекомендуется установить пиктограмму (набор пиктограмм) для <session-name>.desktop файла и указывать в <session-name>.desktop файле имя этой пиктограммы (набора пиктограмм).

Подробнее см. Упаковка_WM#Требования_к_пиктограммам

Требования к desktop файлу

<name>.desktop файл должен в основном соответствовать требованиям Desktop Entry Specification, в частности, иметь заголовок

 [Desktop Entry]
 Type=Application

Должны быть указаны поля

Name=имя
 Название менеджера окон
Icon=имя
 Имя иконке, используемой для отображения этого WM
Comment=описание
 Небольшое описание этого оконного менеджера, которое поможет сомневающемуся пользователю
Exec=путь
 Путь к исполняемому файлу, вызываемому менеджером сессий

В поле

TryExec=/path/to/executive

можно указать исполняемый файл, при отсутствии которого, или при отсутствии у этого файла прав на исполнение, desktop файл игнорируется. Это полезно, если исполняемый файл и desktop файл находятся в разных пакетах rpm.

Замечания по типам desktop файлов

По своей сути, desktop файлы для xsessions являются отдельным подтипом desktop файлов, поэтому для них было бы логично ввести явный отдельный тип наподобие Type=XSession. Однако уже исторически сложилась практика указывать для них Type=Application.

Таким образом, desktop файлы с Type=Application можно разделить на 3 подтипа:

  • desktop файлы для меню WM/DE из /usr/share/applications.
  • desktop файлы автозапуска приложений при старте WM/DE из /etc/xdg/autostart.
  • desktop файлы для выбора xsession /usr/share/xsessions.

Описание в Desktop Entry Specification и программа desktop-file-validate в основном ориентированы на первый тип – desktop файлы для меню.

Отличия desktop файла для xsessions

Основные отличия для desktop файлов xsessions :

  • ряд полей, таких, как поле Categories= указывать не нужно.
  • desktop файл может содержать дополнительную секцию [Window Manager].
  • Есть разные необязательные поля для DM, к примеру X-LightDM-DesktopName=.
  • существует необязательное поле DesktopNames=<NAME>; или, к примеру, DesktopNames=NAME;KDE;.

Поле DesktopNames= desktop файла

В соответствии с Desktop Entry Specification, Freedesktop совместимые Display Managers берут из поля DesktopNames= значение для переменной окружения $XDG_CURRENT_DESKTOP. Пример: из

DesktopNames=NAME;KDE;

будет выставлено значение переменной

XDG_CURRENT_DESKTOP=NAME:KDE

Если WM/DE поддерживает полноценное меню стандарта Freedesktop, то можно добавлять в desktop файл поле DesktopNames=<name>;

Для ряда современных DE их DesktopNames зарезервированы в стандарте: onlyshowin-registry и, как правило, уже указаны в их .desktop файле.

Значения из DesktopNames в меню Freedesktop используются для полей OnlyShowIn=, NotShowIn=. В частности, в DesktopNames= могут использоваться несколько имен, что позволит Freedesktop совместимым меню приложений показывать в своем меню приложения с OnlyShowIn= для другого DE.

Например, в /usr/share/xsessions/gnome-classic.desktop DesktopNames=GNOME-Classic;GNOME; используется, чтобы приложения с OnlyShowIn=GNOME показывались и в сеансе GNOME-Classic.

Поэтому для WM и DE, которые используют меню стандарта freedesktop (встроенное, или через стороннее приложение) и не зарезервированы в стандарте onlyshowin-registry рекомендуется использовать в DesktopNames= свое ИМЯ В ВЕРХНЕМ РЕГИСТРЕ. Пример: Name=SomeWM но DesktopNames=SOMEWM;.

Если есть желание видеть в меню скрытые приложения (с OnlyShowIn=) других DE, можно добавить имена этих DE.

Для WM и DE, которые используют собственное legacy меню, можно указывать DesktopNames=Old; или вообще ничего не указывать.

Также переменная XDG_CURRENT_DESKTOP используется некоторыми приложениями (к примеру, firefox).

Если приложения в самом WM/DE как-то завязаны на значение переменной окружения $XDG_CURRENT_DESKTOP, то в таком случае лучше явно дополнительно установить значение XDG_CURRENT_DESKTOP в скрипте запуска WM/DE, поскольку в настоящее время далеко не все DM Freedesktop совместимы и умеют устанавливать XDG_CURRENT_DESKTOP (WDM,SLiM,..).

Внимание: поддержка поля DesktopNames появилась только в desktop-file-utils ≥ 0.26-alt2. Используйте desktop-file-validate для desktop файлов с полем DesktopNames с осторожностью.

см. подробнее

Требования к пиктограммам

Пиктограмма(ы) WM должна быть проинсталлирована в /usr/share/icons/hicolor/*/apps/* и иметь то же имя, что и пиктограмма, указанная в поле Icon=. Должна быть как минимум одна пиктограмма png, xpm или svg. Желателен набор пиктограм как для больших, так и для малых размеров. К примеру, lightdm-gtk-greeter отображает пиктограммы в размере 16x16, для wm-select удобнее 64x64, 48x48 или svg.

Соответствующие спецификации:

Пример для spec файла

Таким образом, для поддержки оконным менеджером сессий 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=%name
Exec=start%name
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/background) рекомендуется использовать

/usr/share/design/current/backgrounds/default.png

который выставлять

  • в настройках рабочего стола (если он есть)
  • или в настройках фонового изображения оконного менеджера (если они есть)
  • или явно загружать при старте /usr/share/design/current/backgrounds/default.png в корневое окно сторонней утилитой.

пример:

display -window root -geometry '-0-0' -resize `xdpyinfo  | grep -oP 'dimensions:\s+\K\S+'` /usr/share/design/current/backgrounds/default.png

Чтобы файл /usr/share/design/current/backgrounds/default.png существовал бы в файловой системе, надо добавить в зависимости

Requires: design-graphics