From 637d306a243e83c797f4a818cb0342d9af564843 Mon Sep 17 00:00:00 2001
From: dec05eba <dec05eba@protonmail.com>
Date: Fri, 19 Jul 2024 22:08:04 +0200
Subject: Stop recording when pipewire target window is closed or when pressing
 close in the desktop environments record button

---
 include/pipewire.h   |  4 ++++
 src/capture/kms.c    | 11 +----------
 src/capture/portal.c | 13 ++-----------
 src/pipewire.c       | 12 ++++++++++++
 4 files changed, 19 insertions(+), 21 deletions(-)

diff --git a/include/pipewire.h b/include/pipewire.h
index 2e22ccc..2a0b134 100644
--- a/include/pipewire.h
+++ b/include/pipewire.h
@@ -68,6 +68,9 @@ typedef struct {
     gsr_pipewire_data_version server_version;
     gsr_pipewire_video_info video_info;
     gsr_pipewire_dmabuf_data dmabuf_data;
+
+    bool started;
+    bool stopped;
 } gsr_pipewire;
 
 /*
@@ -79,5 +82,6 @@ bool gsr_pipewire_init(gsr_pipewire *self, int pipewire_fd, uint32_t pipewire_no
 void gsr_pipewire_deinit(gsr_pipewire *self);
 
 bool gsr_pipewire_map_texture(gsr_pipewire *self, unsigned int texture_id, unsigned int cursor_texture_id, gsr_pipewire_region *region, gsr_pipewire_region *cursor_region, int *plane_fd);
+bool gsr_pipewire_recording_stopped(gsr_pipewire *self);
 
 #endif /* GSR_PIPEWIRE_H */
diff --git a/src/capture/kms.c b/src/capture/kms.c
index 3e66bdb..f522df3 100644
--- a/src/capture/kms.c
+++ b/src/capture/kms.c
@@ -25,9 +25,6 @@ typedef struct {
 
 typedef struct {
     gsr_capture_kms_params params;
-
-    bool should_stop;
-    bool stop_is_error;
     
     gsr_kms_client kms_client;
     gsr_kms_response kms_response;
@@ -477,13 +474,7 @@ static int gsr_capture_kms_capture(gsr_capture *cap, AVFrame *frame, gsr_color_c
 }
 
 static bool gsr_capture_kms_should_stop(gsr_capture *cap, bool *err) {
-    gsr_capture_kms *cap_kms = cap->priv;
-    if(cap_kms->should_stop) {
-        if(err)
-            *err = cap_kms->stop_is_error;
-        return true;
-    }
-
+    (void)cap;
     if(err)
         *err = false;
     return false;
diff --git a/src/capture/portal.c b/src/capture/portal.c
index 5af5163..aa73cd0 100644
--- a/src/capture/portal.c
+++ b/src/capture/portal.c
@@ -15,9 +15,6 @@
 typedef struct {
     gsr_capture_portal_params params;
 
-    bool should_stop;
-    bool stop_is_error;
-
     unsigned int input_texture_id;
     unsigned int cursor_texture_id;
 
@@ -328,16 +325,10 @@ static int gsr_capture_portal_capture(gsr_capture *cap, AVFrame *frame, gsr_colo
 }
 
 static bool gsr_capture_portal_should_stop(gsr_capture *cap, bool *err) {
-    gsr_capture_portal *cap_portal = cap->priv;
-    if(cap_portal->should_stop) {
-        if(err)
-            *err = cap_portal->stop_is_error;
-        return true;
-    }
-
+    gsr_capture_portal *self = cap->priv;
     if(err)
         *err = false;
-    return false;
+    return gsr_pipewire_recording_stopped(&self->pipewire);
 }
 
 static void gsr_capture_portal_capture_end(gsr_capture *cap, AVFrame *frame) {
diff --git a/src/pipewire.c b/src/pipewire.c
index 985a80a..1828f90 100644
--- a/src/pipewire.c
+++ b/src/pipewire.c
@@ -246,6 +246,14 @@ static void on_param_changed_cb(void *user_data, uint32_t id, const struct spa_p
 static void on_state_changed_cb(void *user_data, enum pw_stream_state old, enum pw_stream_state state, const char *error) {
     (void)old;
     gsr_pipewire *self = user_data;
+    if(state == PW_STREAM_STATE_STREAMING)
+        self->started = true;
+
+    if(self->started && state == PW_STREAM_STATE_PAUSED) {
+        self->started = false;
+        self->stopped = true;
+    }
+
     fprintf(stderr, "gsr info: pipewire: stream %p state: \"%s\" (error: %s)\n",
          (void*)self->stream, pw_stream_state_as_string(state),
          error ? error : "none");
@@ -627,3 +635,7 @@ bool gsr_pipewire_map_texture(gsr_pipewire *self, unsigned int texture_id, unsig
     pthread_mutex_unlock(&self->mutex);
     return true;
 }
+
+bool gsr_pipewire_recording_stopped(gsr_pipewire *self) {
+    return self->stopped;
+}
-- 
cgit v1.2.3-70-g09d2