From c72478ab012db3c241949454d6ecd2087488e76b Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Thu, 16 May 2024 06:33:13 +0300 Subject: [PATCH] kinit: check the process exit code on state change for flexibility Signed-off-by: Ivailo Monev --- kinit/klauncher_adaptor.cpp | 65 +++++++++++++++++++------------------ kinit/klauncher_adaptor.h | 8 +++-- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/kinit/klauncher_adaptor.cpp b/kinit/klauncher_adaptor.cpp index 3445570c..27e066e4 100644 --- a/kinit/klauncher_adaptor.cpp +++ b/kinit/klauncher_adaptor.cpp @@ -77,6 +77,7 @@ KLauncherProcess::KLauncherProcess(QObject *parent) : QProcess(parent), m_kstartupinfo(nullptr), m_startuptimer(nullptr), + m_window(0), m_temp(false) { connect( @@ -90,16 +91,21 @@ KLauncherProcess::~KLauncherProcess() removeTemp(m_temp, m_args); } -void KLauncherProcess::setupStartup(const QString &appexe, const KService::Ptr kservice, - const qint64 timeout, const bool temp, const QStringList &args) +void KLauncherProcess::setupProcess(const QString &appexe, const QStringList &args, + const quint64 window, const KService::Ptr kservice, + const qint64 timeout, const bool temp) { Q_ASSERT(m_kstartupinfoid.none() == true); + m_appexe = appexe; + m_args = args; + m_window = window; + m_temp = temp; QByteArray startupwmclass; if (KRun::checkStartupNotify(kservice.data(), &startupwmclass)) { m_kstartupinfoid.initId(KStartupInfo::createNewStartupId()); kDebug() << "setting up ASN for" << kservice->entryPath() << m_kstartupinfoid.id(); m_kstartupinfodata.setHostname(); - m_kstartupinfodata.setBin(QFileInfo(appexe).fileName()); + m_kstartupinfodata.setBin(QFileInfo(m_appexe).fileName()); m_kstartupinfodata.setDescription(i18n("Launching %1", kservice->name())); m_kstartupinfodata.setIcon(kservice->icon()); m_kstartupinfodata.setApplicationId(kservice->entryPath()); @@ -109,20 +115,34 @@ void KLauncherProcess::setupStartup(const QString &appexe, const KService::Ptr k QProcess::setProcessEnvironment(processenv); sendSIStart(timeout); } else { - kDebug() << "no ASN for" << appexe; + kDebug() << "no ASN for" << m_appexe; } - m_temp = temp; - m_args = args; } void KLauncherProcess::slotProcessStateChanged(QProcess::ProcessState state) { - kDebug() << "process state changed" << this << state; + kDebug() << "process state changed" << m_appexe << state; if (state == QProcess::Starting && !m_kstartupinfoid.none()) { m_kstartupinfodata.addPid(QProcess::pid()); sendSIChange(); - } else if (state == QProcess::NotRunning && !m_kstartupinfoid.none()) { - sendSIFinish(); + } else if (state == QProcess::NotRunning) { + if (!m_kstartupinfoid.none()) { + sendSIFinish(); + } + if (exitCode() != 0) { + kError() << "finished with error" << m_appexe; + const QByteArray processerror = readAllStandardError(); + if (processerror.isEmpty()) { + showError(i18n("Application exited abnormally: %1", m_appexe), m_window); + } else { + KMessageBox::detailedErrorWId( + static_cast(m_window), + i18n("Application exited abnormally: %1", m_appexe), + QString::fromLocal8Bit(processerror.constData(), processerror.size()) + ); + } + } + deleteLater(); } } @@ -135,14 +155,14 @@ void KLauncherProcess::slotStartupRemoved(const KStartupInfoId &kstartupinfoid, kDebug() << "startup removed" << kstartupinfoid.id() << m_kstartupinfoid.id(); if (kstartupinfoid.id() == m_kstartupinfoid.id() || kstartupinfodata.is_pid(QProcess::pid())) { - kDebug() << "startup done for process" << this; + kDebug() << "startup done for process" << m_appexe; sendSIFinish(); } } void KLauncherProcess::slotStartupTimeout() { - kWarning() << "timed out while waiting for process" << this; + kWarning() << "timed out while waiting for process" << m_appexe; sendSIFinish(); } @@ -173,7 +193,7 @@ void KLauncherProcess::sendSIChange() if (m_kstartupinfoid.none()) { return; } - kDebug() << "sending ASN change for" << m_kstartupinfodata.bin(); + kDebug() << "sending ASN change for" << m_appexe; KStartupInfo::sendChange(m_kstartupinfoid, m_kstartupinfodata); } @@ -182,7 +202,7 @@ void KLauncherProcess::sendSIFinish() if (m_kstartupinfoid.none()) { return; } - kDebug() << "sending ASN finish for" << m_kstartupinfodata.bin(); + kDebug() << "sending ASN finish for" << m_appexe; KStartupInfo::sendFinish(m_kstartupinfoid, m_kstartupinfodata); m_kstartupinfoid = KStartupInfoId(); m_kstartupinfodata = KStartupInfoData(); @@ -435,7 +455,6 @@ void KLauncherAdaptor::slotProcessFinished(int exitcode) KLauncherProcess* process = qobject_cast(sender()); kDebug() << "process finished" << process << exitcode; m_processes.removeOne(process); - process->deleteLater(); } QString KLauncherAdaptor::findExe(const QString &app) const @@ -502,7 +521,7 @@ bool KLauncherAdaptor::startProgram(const QString &app, const QStringList &args, } process->setProcessEnvironment(processenv); process->setWorkingDirectory(workdir); - process->setupStartup(appexe, kservice, timeout, temp, args); + process->setupProcess(appexe, args, window, kservice, timeout, temp); kDebug() << "starting" << appexe << args << envs << workdir; process->start(appexe, args); while (process->state() == QProcess::Starting) { @@ -516,22 +535,6 @@ bool KLauncherAdaptor::startProgram(const QString &app, const QStringList &args, showError(i18n("Could not start the application: %1", app), window); return false; } - if (process->state() == QProcess::NotRunning && process->exitCode() != 0) { - kError() << "started but finished with error" << appexe; - const QByteArray processerror = process->readAllStandardError(); - m_processes.removeOne(process); - process->deleteLater(); - if (processerror.isEmpty()) { - showError(i18n("Application exited abnormally: %1", app), window); - } else { - KMessageBox::detailedErrorWId( - static_cast(window), - i18n("Application exited abnormally: %1", app), - QString::fromLocal8Bit(processerror.constData(), processerror.size()) - ); - } - return false; - } kDebug() << "started" << appexe; connect(process, SIGNAL(finished(int)), this, SLOT(slotProcessFinished(int))); return true; diff --git a/kinit/klauncher_adaptor.h b/kinit/klauncher_adaptor.h index 1f7ae99a..cb3b39a3 100644 --- a/kinit/klauncher_adaptor.h +++ b/kinit/klauncher_adaptor.h @@ -35,8 +35,8 @@ public: explicit KLauncherProcess(QObject *parent); ~KLauncherProcess(); - void setupStartup(const QString &appexe, const KService::Ptr kservice, const qint64 timeout, - const bool temp, const QStringList &args); + void setupProcess(const QString &appexe, const QStringList &args, const quint64 window, + const KService::Ptr kservice, const qint64 timeout, const bool temp); private Q_SLOTS: void slotProcessStateChanged(QProcess::ProcessState state); @@ -54,8 +54,10 @@ private: QTimer* m_startuptimer; KStartupInfoId m_kstartupinfoid; KStartupInfoData m_kstartupinfodata; - bool m_temp; + QString m_appexe; QStringList m_args; + quint64 m_window; + bool m_temp; }; // Adaptor class for interface org.kde.KLauncher