diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index 15e27bfb..62f3e6cf 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -37,3 +37,4 @@ if(BUILD_MAN_PAGES) endif() add_subdirectory(themes) add_subdirectory(translations) +add_subdirectory(systemd) diff --git a/data/systemd/CMakeLists.txt b/data/systemd/CMakeLists.txt new file mode 100644 index 00000000..7c919de1 --- /dev/null +++ b/data/systemd/CMakeLists.txt @@ -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) \ No newline at end of file diff --git a/data/systemd/dde-fake-session-initialized.target b/data/systemd/dde-fake-session-initialized.target new file mode 100644 index 00000000..d6859c46 --- /dev/null +++ b/data/systemd/dde-fake-session-initialized.target @@ -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 diff --git a/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-am.service b/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-am.service new file mode 100644 index 00000000..2f99ed54 --- /dev/null +++ b/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-am.service @@ -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 diff --git a/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-desktop.service b/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-desktop.service new file mode 100644 index 00000000..219fea88 --- /dev/null +++ b/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-desktop.service @@ -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 diff --git a/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-im.service b/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-im.service new file mode 100644 index 00000000..4fe3a806 --- /dev/null +++ b/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-im.service @@ -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 \ No newline at end of file diff --git a/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-polkit-agent.service b/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-polkit-agent.service new file mode 100644 index 00000000..97d4a973 --- /dev/null +++ b/data/systemd/dde-fake-session-initialized.target.wants/fake-dde-polkit-agent.service @@ -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 diff --git a/data/systemd/dde-fake-session-initialized.target.wants/fake-dde.service b/data/systemd/dde-fake-session-initialized.target.wants/fake-dde.service new file mode 100644 index 00000000..6298ec5e --- /dev/null +++ b/data/systemd/dde-fake-session-initialized.target.wants/fake-dde.service @@ -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 diff --git a/data/systemd/dde-fake-session.target b/data/systemd/dde-fake-session.target new file mode 100644 index 00000000..78c905db --- /dev/null +++ b/data/systemd/dde-fake-session.target @@ -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 \ No newline at end of file diff --git a/src/treeland/treeland-fake-session/fake-session.cpp b/src/treeland/treeland-fake-session/fake-session.cpp index 7178506c..b0ea3401 100644 --- a/src/treeland/treeland-fake-session/fake-session.cpp +++ b/src/treeland/treeland-fake-session/fake-session.cpp @@ -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(); }