From 1ac1aa943538ee1e77112d810b373fddecbeae29 Mon Sep 17 00:00:00 2001
From: Sebastião Guerra <sebastiao.luiz.guerra@gmail.com>
Date: Mon, 12 Oct 2026 09:51:12 -0300
Subject: Fix orphaned GStreamer playback helpers
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Sebastião Guerra <sebastiao.luiz.guerra@gmail.com>
---
 src/gstplayer.cpp       | 16 ++++++++++++++++
 src/kmplayerprocess.cpp | 13 +++++++------
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/src/gstplayer.cpp b/src/gstplayer.cpp
index 8f2449b..e213a4a 100644
--- a/src/gstplayer.cpp
+++ b/src/gstplayer.cpp
@@ -20,6 +20,11 @@
 #include <stdio.h>
 #include <string.h>
 #include <math.h>
+#ifdef __linux__
+#include <signal.h>
+#include <sys/prctl.h>
+#include <unistd.h>
+#endif
 #include <config.h>
 #include <dcopclient.h>
 #include <tqcstring.h>
@@ -994,6 +999,9 @@ protected:
 };
 
 int main(int argc, char **argv) {
+#ifdef __linux__
+    pid_t parent = getppid ();
+#endif
     if (!XInitThreads ()) {
         fprintf (stderr, "XInitThreads () failed\n");
         return 1;
@@ -1048,6 +1056,14 @@ int main(int argc, char **argv) {
         }
     }
 
+#ifdef __linux__
+    if (callback) {
+        if (prctl (PR_SET_PDEATHSIG, SIGTERM) < 0)
+            perror ("prctl (PR_SET_PDEATHSIG)");
+        if (getppid () != parent)
+            raise (SIGTERM);
+    }
+#endif
     DCOPClient dcopclient;
     dcopclient.registerAs ("kgstreamerplayer");
     Backend * backend = new Backend;
diff --git a/src/kmplayerprocess.cpp b/src/kmplayerprocess.cpp
index 1439b84..20c5b63 100644
--- a/src/kmplayerprocess.cpp
+++ b/src/kmplayerprocess.cpp
@@ -1746,34 +1746,35 @@ KDE_NO_CDTOR_EXPORT GStreamer::~GStreamer () {}
 
 TDE_NO_EXPORT bool GStreamer::ready (Viewer * viewer) {
     initProcess (viewer);
+    m_process->setUseShell (false);
     viewer->changeProtocol (QXEmbed::XPLAIN);
     m_request_seek = -1;
     fprintf (stderr, "kgstplayer -wid %lu", (unsigned long) widget ());
-    *m_process << "kgstplayer -wid " << TQString::number (widget ());
+    *m_process << "kgstplayer" << "-wid" << TQString::number (widget ());
 
     TQString strVideoDriver = TQString (m_settings->videodrivers[m_settings->videodriver].driver);
     if (!strVideoDriver.isEmpty ()) {
         fprintf (stderr, " -vo %s", strVideoDriver.lower().ascii());
-        *m_process << " -vo " << strVideoDriver.lower();
+        *m_process << "-vo" << strVideoDriver.lower();
     }
     TQString strAudioDriver = TQString (m_settings->audiodrivers[m_settings->audiodriver].driver);
     if (!strAudioDriver.isEmpty ()) {
         if (strAudioDriver.startsWith (TQString ("alsa")))
             strAudioDriver = TQString ("alsa");
         fprintf (stderr, " -ao %s", strAudioDriver.lower().ascii());
-        *m_process << " -ao " << strAudioDriver.lower();
+        *m_process << "-ao" << strAudioDriver.lower();
     }
     fprintf (stderr, " -cb %s", dcopName ().ascii());
-    *m_process << " -cb " << dcopName ();
+    *m_process << "-cb" << dcopName ();
     if (m_source)
         if (m_source->url ().url ().startsWith (TQString ("dvd://")) &&
                 !m_settings->dvddevice.isEmpty ()) {
             fprintf (stderr, " -dvd-device %s", m_settings->dvddevice.ascii ());
-            *m_process << " -dvd-device " << m_settings->dvddevice;
+            *m_process << "-dvd-device" << m_settings->dvddevice;
         } else if (m_source->url ().url ().startsWith (TQString ("vcd://")) &&
                 !m_settings->vcddevice.isEmpty ()) {
             fprintf (stderr, " -vcd-device %s", m_settings->vcddevice.ascii ());
-            *m_process << " -vcd-device " << m_settings->vcddevice;
+            *m_process << "-vcd-device" << m_settings->vcddevice;
         }
     fprintf (stderr, "\n");
     m_process->start (TDEProcess::NotifyOnExit, TDEProcess::All);
-- 
cgit v1.2.3

