From 410b9b56fa876b19a1d8a27589528fa7a2449670 Mon Sep 17 00:00:00 2001
From: Felix Gerking <felix.gerking@garz-fricke.com>
Date: Thu, 28 Jul 2022 15:43:10 +0200
Subject: [PATCH] Config:systemd: Invoke systemd notify when the compositor is
 ready

Now the compositor calls systemd notify READY=1 when surfaces can be
created. This allows the use of a systemd notify type start script.

BCS 746-000824
---
 multiscreen-compositor/config.cpp                 | 7 +++++++
 multiscreen-compositor/config.h                   | 1 +
 multiscreen-compositor/multiscreen-compositor.pro | 3 +++
 multiscreen-compositor/qml/main.qml               | 9 +++++++++
 4 files changed, 20 insertions(+)

diff --git a/multiscreen-compositor/config.cpp b/multiscreen-compositor/config.cpp
index 5ddc26c..58fca3f 100644
--- a/multiscreen-compositor/config.cpp
+++ b/multiscreen-compositor/config.cpp
@@ -3,6 +3,7 @@
 #include <QDebug>
 #include <QRegularExpression>
 #include <QFile>
+#include <systemd/sd-daemon.h>
 
 void Config::setRotation(const QString &str)
 {
@@ -76,3 +77,9 @@ inline bool Config::rotationIsValid(const QString * rotation )
     QStringList validRotations = {"0", "90", "180", "270"};
     return validRotations.contains(*rotation);
 }
+
+void Config::notifyCompositorReady()
+{
+    qDebug() << "Notify systemd that the compositor is ready";
+    sd_notify(false, "READY=1");
+}
diff --git a/multiscreen-compositor/config.h b/multiscreen-compositor/config.h
index 610c8c6..d73cdf8 100644
--- a/multiscreen-compositor/config.h
+++ b/multiscreen-compositor/config.h
@@ -12,6 +12,7 @@ public:
 
     void setRotation(const QString &str);
     QString rotation() const;
+    Q_INVOKABLE void notifyCompositorReady();
 private:
     QString m_rotation;
     static const QRegularExpression findRotation;
diff --git a/multiscreen-compositor/multiscreen-compositor.pro b/multiscreen-compositor/multiscreen-compositor.pro
index bf35ffd..ef4d3be 100644
--- a/multiscreen-compositor/multiscreen-compositor.pro
+++ b/multiscreen-compositor/multiscreen-compositor.pro
@@ -13,6 +13,9 @@ HEADERS += \
     message-server.h \
     message-serverconnection.h
 
+LIBS += \
+    -lsystemd
+
 OTHER_FILES = \
     qml/main.qml \
 
diff --git a/multiscreen-compositor/qml/main.qml b/multiscreen-compositor/qml/main.qml
index e7be840..b3cd503 100644
--- a/multiscreen-compositor/qml/main.qml
+++ b/multiscreen-compositor/qml/main.qml
@@ -110,6 +110,15 @@ WaylandCompositor {
         onIviSurfaceCreated: handleIviSurfaceCreated(iviSurface)
     }
 
+    // =============================================
+    // We need to notify systemd when the compositor
+    // is ready to create surfaces
+    // =============================================
+    onCreatedChanged: {
+        if (created === true) {
+            config.notifyCompositorReady();
+        }
+    }
 
     onSurfaceRequested: {
        console.log("Surface requested", client, id, version);
-- 
GitLab