diff --git a/src/classes/PFourierCanvas.cpp b/src/classes/PFourierCanvas.cpp index 8c22e4ad..41fa254b 100644 --- a/src/classes/PFourierCanvas.cpp +++ b/src/classes/PFourierCanvas.cpp @@ -37,6 +37,7 @@ #include #include +#include "PFourier.h" #include "PFourierCanvas.h" #include "icons/musrFT_icon.xpm" diff --git a/src/include/PFourierCanvas.h b/src/include/PFourierCanvas.h index cab2f60d..65e1beb0 100644 --- a/src/include/PFourierCanvas.h +++ b/src/include/PFourierCanvas.h @@ -47,7 +47,12 @@ #include #include "PMusr.h" -#include "PFourier.h" + +// Only a forward declaration: PFourier.h pulls in fftw3.h, which would end up in +// the dictionary payload parsed by cling at run time. On macOS (SDK 26+) cling +// fails on its '#include ', which loses the interpreter info of +// PFourierCanvas and with it all its signal/slot connections. +class PFourier; // Canvas menu id's #define P_MENU_ID_FOURIER 10001 diff --git a/src/musredit_qt5/musredit/PTextEdit.cpp b/src/musredit_qt5/musredit/PTextEdit.cpp index f5ae5ad4..1148c49b 100644 --- a/src/musredit_qt5/musredit/PTextEdit.cpp +++ b/src/musredit_qt5/musredit/PTextEdit.cpp @@ -2807,8 +2807,14 @@ void PTextEdit::musrFT() if (dlg->exec() == QDialog::Accepted) { fMusrFTPrevCmd = dlg->getMusrFTOptions(); QProcess *proc = new QProcess(this); - proc->setStandardOutputFile("musrFT.log"); - proc->setStandardErrorFile("musrFT.log"); + // run musrFT in the directory of the msr-file. musredit started from the Finder/Dock + // has '/' as working directory, where the log-file cannot be written, and QProcess then + // refuses to start musrFT at all. + QFileInfo fi(*fFilenames.find(currentEditor())); + QString workDir = fi.exists() ? fi.absolutePath() : QDir::homePath(); + proc->setWorkingDirectory(workDir); + proc->setProcessChannelMode(QProcess::MergedChannels); + proc->setStandardOutputFile(workDir + "/musrFT.log"); QString cmd = fAdmin->getExecPath() + "/musrFT"; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); #if defined(Q_OS_DARWIN) @@ -2820,12 +2826,14 @@ void PTextEdit::musrFT() proc->start(cmd, fMusrFTPrevCmd); if (!proc->waitForStarted()) { // error handling - QString msg(tr("Could not execute the output command: ")+cmd[0]); + QString msg(tr("Could not execute the output command: ")+cmd+"\n"+proc->errorString()); QMessageBox::critical( nullptr, tr("Fatal error"), msg, tr("Quit") ); - return; + proc->deleteLater(); + } else { + connect(proc, SIGNAL(finished(int,QProcess::ExitStatus)), proc, SLOT(deleteLater())); } } diff --git a/src/musredit_qt6/musredit/PTextEdit.cpp b/src/musredit_qt6/musredit/PTextEdit.cpp index bf2e7882..f7bf95c8 100644 --- a/src/musredit_qt6/musredit/PTextEdit.cpp +++ b/src/musredit_qt6/musredit/PTextEdit.cpp @@ -2910,8 +2910,14 @@ void PTextEdit::musrFT() if (dlg->exec() == QDialog::Accepted) { fMusrFTPrevCmd = dlg->getMusrFTOptions(); QProcess *proc = new QProcess(this); - proc->setStandardOutputFile("musrFT.log"); - proc->setStandardErrorFile("musrFT.log"); + // run musrFT in the directory of the msr-file. musredit started from the Finder/Dock + // has '/' as working directory, where the log-file cannot be written, and QProcess then + // refuses to start musrFT at all. + QFileInfo fi(*fFilenames.find(currentEditor())); + QString workDir = fi.exists() ? fi.absolutePath() : QDir::homePath(); + proc->setWorkingDirectory(workDir); + proc->setProcessChannelMode(QProcess::MergedChannels); + proc->setStandardOutputFile(workDir + "/musrFT.log"); QString cmd = fAdmin->getExecPath() + "/musrFT"; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); #if defined(Q_OS_DARWIN) @@ -2923,9 +2929,11 @@ void PTextEdit::musrFT() proc->start(cmd, fMusrFTPrevCmd); if (!proc->waitForStarted()) { // error handling - QString msg(tr("Could not execute the output command: ")+cmd[0]); + QString msg(tr("Could not execute the output command: ")+cmd+"\n"+proc->errorString()); QMessageBox::critical( nullptr, tr("FATAL ERROR"), msg, QMessageBox::Close ); - return; + proc->deleteLater(); + } else { + connect(proc, SIGNAL(finished(int,QProcess::ExitStatus)), proc, SLOT(deleteLater())); } }