Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: use systemd start #116

Merged
merged 1 commit into from
Jan 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions data/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,4 @@ if(BUILD_MAN_PAGES)
endif()
add_subdirectory(themes)
add_subdirectory(translations)
add_subdirectory(systemd)
28 changes: 28 additions & 0 deletions data/systemd/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
macro(install_symlink filepath wantsdir)
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/link/${wantsdir}/)
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_INSTALL_PREFIX}/lib/systemd/user/${filepath} ${PROJECT_BINARY_DIR}/link/${wantsdir}/${filepath})
install(FILES ${PROJECT_BINARY_DIR}/link/${wantsdir}/${filepath} DESTINATION lib/systemd/user/${wantsdir}/)
endmacro(install_symlink)

set(SERVICES
dde-fake-session-initialized.target
dde-fake-session.target
)
install(FILES ${SERVICES} DESTINATION lib/systemd/user/)

install(DIRECTORY DESTINATION lib/systemd/user/dde-fake-session-initialized.target.wants/)
set(DDE_SESSION_INITIALIZED_WANTS
dde-fake-session-initialized.target.wants/fake-dde-desktop.service
dde-fake-session-initialized.target.wants/fake-dde.service
dde-fake-session-initialized.target.wants/fake-dde-polkit-agent.service
dde-fake-session-initialized.target.wants/fake-dde-am.service
dde-fake-session-initialized.target.wants/fake-dde-im.service
)

install(FILES ${DDE_SESSION_PRE_WANTS} DESTINATION lib/systemd/user/)
install(FILES ${DDE_SESSION_INITIALIZED_WANTS} DESTINATION lib/systemd/user/)
install_symlink(fake-dde-desktop.service dde-fake-session-initialized.target.wants)
install_symlink(fake-dde.service dde-fake-session-initialized.target.wants)
install_symlink(fake-dde-polkit-agent.service dde-fake-session-initialized.target.wants)
install_symlink(fake-dde-am.service dde-fake-session-initialized.target.wants)
install_symlink(fake-dde-im.service dde-fake-session-initialized.target.wants)
10 changes: 10 additions & 0 deletions data/systemd/dde-fake-session-initialized.target
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[Unit]
Description=dde-fake-session-initialized target, task to initialize the desktop environment.
OnFailureJobMode=replace-irreversibly
DefaultDependencies=no
RefuseManualStart=yes
RefuseManualStop=yes

Requisite=dde-fake-session.target
PartOf=dde-fake-session.target
Before=dde-fake-session.target
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[Unit]
Description=Deepin Application Manager
RefuseManualStart=no
RefuseManualStop=no
StartLimitBurst=3
CollectMode=inactive-or-failed

Requisite=dde-fake-session-initialized.target
PartOf=dde-fake-session-initialized.target
Before=dde-fake-session-initialized.target

[Service]
Type=simple
ExecStart=/usr/bin/dde-application-manager
Environment=QT_LOGGING_RULES="*.debug=false"
# turn off PrivateUser to prevent AM can't access some directory. eg. "/persistent/linglong"
PrivateUsers=false
Slice=session.slice
Restart=always
RestartSec=500ms
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[Unit]
Description=dde-desktop service
RefuseManualStart=no
RefuseManualStop=no
StartLimitBurst=3
CollectMode=inactive-or-failed

Requisite=dde-fake-session-initialized.target
PartOf=dde-fake-session-initialized.target
Before=dde-fake-session-initialized.target

Requires=dbus.socket
After=dbus.socket

[Service]
Type=simple
ExecStart=/usr/bin/dde-desktop
TimeoutStartSec=infinity
Slice=session.slice
Restart=on-failure
RestartSec=1s
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[Unit]
Description=deepin input method daemon service
RefuseManualStart=no
RefuseManualStop=no
# Limit startup frequency more than the default
StartLimitIntervalSec=15s
StartLimitBurst=3

[Service]
Type=simple
ExecStart=/usr/bin/dim
SuccessExitStatus=1
Slice=session.slice
Restart=on-failure
RestartSec=1s
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[Unit]
Description=dde-polkit-agent service
RefuseManualStart=no
RefuseManualStop=no
StartLimitBurst=3
CollectMode=inactive-or-failed

Requisite=dde-fake-session-initialized.target
PartOf=dde-fake-session-initialized.target
Before=dde-fake-session-initialized.target

[Service]
Type=simple
ExecStart=/usr/lib/polkit-1-dde/dde-polkit-agent
TimeoutStartSec=infinity
Slice=session.slice
Restart=on-failure
RestartSec=500ms
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
[Unit]
Description=dde service
RefuseManualStart=no
RefuseManualStop=no
StartLimitBurst=3
CollectMode=inactive-or-failed

Requisite=dde-fake-session-initialized.target
PartOf=dde-fake-session-initialized.target
Before=dde-fake-session-initialized.target

Requires=dbus.socket
After=dbus.socket

Wants=fake-dde-am.service
After=fake-dde-am.service

[Service]
Type=simple
ExecStart=/usr/bin/dde-shell -C DDE
TimeoutStartSec=infinity
Slice=session.slice
Restart=on-failure
RestartSec=1s
9 changes: 9 additions & 0 deletions data/systemd/dde-fake-session.target
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[Unit]
Description=dde-fake-session target
DefaultDependencies=no

BindsTo=graphical-session.target
Before=graphical-session.target

Requires=dde-fake-session-initialized.target
After=dde-fake-session-initialized.target
34 changes: 14 additions & 20 deletions src/treeland/treeland-fake-session/fake-session.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,30 +271,24 @@ FakeSession::FakeSession(int argc, char* argv[])
});

emit m_shortcutManager->activeChanged();

QProcess::startDetached("dde-shell", {"-p", "org.deepin.ds.dock"});

QDBusInterface systemd("org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager");
systemd.call("UnsetEnvironment", QStringList{"DISPLAY", "WAYLAND_DISPLAY", "XDG_SESSION_TYPE"});
systemd.call("SetEnvironment", QStringList{
QString("DISPLAY=%1").arg(qgetenv("DISPLAY")),
QString("WAYLAND_DISPLAY=%1").arg(qgetenv("WAYLAND_DISPLAY")),
QString("XDG_SESSION_TYPE=%1").arg(qgetenv("XDG_SESSION_TYPE")),
QString("XDG_CURRENT_DESKTOP=%1").arg(qgetenv("XDG_CURRENT_DESKTOP")),
}
);

if (!QProcess::startDetached("dim")) {
qDebug() << "Failed to start deepin input method";
}

if (!QProcess::startDetached("dde-application-manager")) {
qDebug() << "Filed to start deepin application manager";
}
}

int main (int argc, char *argv[]) {
FakeSession helper(argc, argv);

QTimer::singleShot(0, &helper, [&helper] {
QDBusInterface systemd("org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager");
systemd.call("UnsetEnvironment", QStringList{"DISPLAY", "WAYLAND_DISPLAY", "XDG_SESSION_TYPE"});
systemd.call("SetEnvironment", QStringList{
QString("DISPLAY=%1").arg(qgetenv("DISPLAY")),
QString("WAYLAND_DISPLAY=%1").arg(qgetenv("WAYLAND_DISPLAY")),
QString("XDG_SESSION_TYPE=%1").arg(qgetenv("XDG_SESSION_TYPE")),
QString("XDG_CURRENT_DESKTOP=%1").arg(qgetenv("XDG_CURRENT_DESKTOP")),
}
);

systemd.call("StartUnit", "dde-fake-session.target", "replace");
});

return helper.exec();
}