LINUX.ORG.RU

GNOME теперь управляется через systemd, как реализовать подобное для другого WM?

 ,


1

3

У меня любовь всей жизни — WindowMaker, всегда к нему возвращаюсь. Он прекрасен своей простотой, а также тем, что примитивы использования у него взяли то лучшее, что есть в macOS (корни-то одни, если не в реализации, то в идее).

Раньше у меня для него был довольно обширный файл autostart, потому что сейчас надо быть аскетом с большим количеством денег, чтобы не пользоваться программами, затрагивающими сервисы GNOME.

Но потом я обзавелся Retina-дисплеями, и WindowMaker оказался к этому неготов.

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

Но теперь и гномьи сервисы (мне нужно от них управление клавиатурой, интерфейсом GTK-приложений, звуком, и кой-чего по-мелочи) изменились, и теперь более приспособлены к работе с systemd.

Я долго смотрел в конфиги, как это сделал гном, и мне вот непонятно ничегошеньки. Раньше мне казалось, что вот есть user.target, и он запускается в сессии. Оказалось, не все так просто, каким-то образом гномьи юниты запускаются только при старте гнома. Переключаюсь в другую сессию, и их там нет. Как система различает, какие таргеты включить вот прям щас? Как объяснить gdm, что вот сейчас я хочу другой набор, специально для WindowMaker?

Кастую @intelfx. Ненужнаторы могут идти в топку.

★★★★★

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

wants gdm.service?

anonymous
()

Но теперь и гномьи сервисы (мне нужно от них управление клавиатурой, интерфейсом GTK-приложений, звуком, и кой-чего по-мелочи) изменились, и теперь более приспособлены к работе с systemd.

elogind спасёт отца русской демократии...

У меня нет systemd, вместо него elogind и sysVinit, гном последний, всё что нужно стартует и работает. По сути elogind простая заглушка, выдающая приложению true на попытку что-то там попросить от systemd, при должной настройке всё работает как часы.

Но да, надо руками всё кропать, в gentoo есть конечно автомат, но я по старинке LFS'ом пользуюсь... http://www.picshare.ru/view/10425832/

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

Я думаю он хочет не отключить это, а включить в своем ВМ гномовские сервисы.

Im_not_a_robot ★★★★★
()

Но теперь и гномьи сервисы (мне нужно от них управление клавиатурой, интерфейсом GTK-приложений, звуком, и кой-чего по-мелочи) изменились, и теперь более приспособлены к работе с systemd.

не гномер, но про это написано здесь. В частности приводится пример, что

systemctl --user stop gsd-media-keys.target

приведет к остановке обработки глобальных хоткеев.

Lrrr ★★★★★
()

Я долго смотрел в конфиги, как это сделал гном, и мне вот непонятно ничегошеньки. Раньше мне казалось, что вот есть user.target, и он запускается в сессии. Оказалось, не все так просто, каким-то образом гномьи юниты запускаются только при старте гнома. Переключаюсь в другую сессию, и их там нет. Как система различает, какие таргеты включить вот прям щас? Как объяснить gdm, что вот сейчас я хочу другой набор, специально для WindowMaker?

Мы ведь говорим о том, как запускать куски гномовской сессии (которые начиная с GNOME 3.34 перекочевали под управление systemd --user) вне гномовской сессии?

Как ты написал, всё так и есть. Только не user.target, а default.target, и в нём действительно нет ничего GNOME-специфичного. Гномьи юниты запускаются «вручную» в процессе логина специальным промежуточным бинарником (т. е. GDM, вместо того чтобы тупо запустить иксы, выставить переменные окружения и экзекнуть Xsession, запускает специальный промежуточный бинарник, который дальше вручную стартует юниты в юзерском systemd и засыпает до выхода).

Если быть точнее, то при входе в гном GDM запускает процесс gnome-session (через враппер gdm-wayland-session, который не знаю зачем нужен). Это шелл-скрипт, который подготавливает переменные окружения (чтобы соблюсти семантику /etc/profile) и запускает gnome-session-binary, который по сути занимается оркестрацией этой сессии через systemd. Какие конкретно юниты и в каком порядке там запускаются — вот этого уже не знаю.

Там какой-то очень сложный граф вызовов с кучей таргетов, которые запускают друг друга, но если я правильно тебя понимаю, то тебя интересует в первую очередь gnome-session-initialized.target, который втягивает кучу gsd-*.target и по транзитивности gsd-*.service. Там много хардкода (например, gnome-session-intiialized.target не запустится без gnome-session.target, потому что Requisite, но ты можешь написать свой таргет и запускать его из своего самописного Xsession-скрипта.

А вообще что тебя интересует в конечном итоге?

В любом случае, ты можешь посмотреть на это всё сам:

systemd-analyze --user dot 'gnome-*' 'gsd-*' | grep -v 'color="red"' | dot -Tsvg > systemd-user-gnome.svg
firefox systemd-user-gnome.svg
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Ага, то есть я в windowmakerовом autostart могу тупо прописать запуск скрипта, в котором есть куча systemctl --user start, никакой другой магии особо нет?

(Таргет, содержащий другие таргеты — еще не магия имхо)

shimon ★★★★★
() автор топика

Запости скриншот, как закончишь, плз. Интересно посмотреть.

another ★★★★★
()

Самое трудное будет сделать так, чтобы все эти юниты гасились вместе с сессией. У меня сессии login прописаны как lingering.

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

Ага, то есть я в windowmakerовом autostart могу тупо прописать запуск скрипта, в котором есть куча systemctl –user start

Типа того.

никакой другой магии особо нет?

Ну, какое-то количество магии нужно, чтобы пробросить в systemd --user переменные окружения из profile и графической сессии (т. е. в простейшем случае в нужный момент стратегически позвать systemctl --user import-environment или эквивалент).

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

Самое трудное будет сделать так, чтобы все эти юниты гасились вместе с сессией. У меня сессии login прописаны как lingering.

О, древнее зло пробудилось.

Можно как-то так: https://github.com/intelfx/user-systemd-units/blob/master/xsession/Xsession#L25

Я когда-то давно (когда сидел на awesome) упарывался запихиванием в systemd --user всей юзерской сессии, включая куски кед и X-сервер. Но у меня был другой подход — я много усилий потратил на то, чтобы не делать пользовательскую сессию синглтоном и не оставлять после завершения сессии мусорных переменных.

А в гноме просто забили на это и тупо импортируют окружение из сессии (включая DISPLAY= и прочее) в глобальное окружение пользователя.

intelfx ★★★★★
()

Короче, каменный цветок получается, но наполовину.

В 2020 году ни один из -settings-daemon’ов не запустится без GNOME, MATE, или чего там еще. gsd- жестко завязаны на присутствие в системе работающего mutter, mate-settings-daemon же завязан, в свою очередь, на какой-нибудь общающийся по dbus менеджер сессии, совместимый с гномьим.

Ну то есть как — завязан.

Когда в mate-settings-daemon конфигурируешь, что у тебя интерфейс 200% по размеру, он пытается пнуть менеджер сеанса, чтобы тот установил переменные окружения и для программ на Qt, а такового, понимаете ли, нет. Ну, он тогда тупит и падает, не устанавливая прочие xsettings.

Приходится редактировать ~/.config/gtk-3.0/settings.ini, конфиг fontconfig (что более желательно, в принципе, так как у меня собственные представления о том, что должно быть под алиасами Sans, Serif и Monospace).

Ну и самое вкусное. Для всех программ, использующих хром, он же электрон, надо выставить атрибут «Emulate application icon», чтобы с ними можно было нормально работать.

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

Так, оно таки работает. Научился сегодня в опцию systemctl start --wait. Надо же.

Только наверняка ведь в несколько сеансов не сумеет.

shimon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.