From cc178ab6fa3be2c06840e8afd49200bd60ae9368 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 12 Aug 2016 16:12:52 +0000 Subject: [PATCH] Create the splash screen before assigning the application name Even though the splash screen does not have a title it seems to interfere with JTAlert which enumerates window titles to identify WSJT-X instances. I'm not sure why this is necessary, but if it helps it should be benign. Ensure that the splash screen is hidden before any message boxes are shown, this is essential at startup if there is a stale lock file or rig control error. Be far less aggressive about bringing the splash screen to the top of the application window stack. This may cause the splash screen to be obscured on some platforms. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7025 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- main.cpp | 20 +++++++++++++++----- mainwindow.cpp | 19 ++++++++++++++----- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/main.cpp b/main.cpp index 3c966ea00..8e2708d8f 100644 --- a/main.cpp +++ b/main.cpp @@ -106,13 +106,9 @@ int main(int argc, char *argv[]) // instantiating QApplication so // that GUI has correct l18n - // Override programs executable basename as application name. - a.setApplicationName ("WSJT-X"); - a.setApplicationVersion (version ()); - bool multiple {false}; - QPixmap splash_pic {":/splash.png"}; QSplashScreen splash {splash_pic, Qt::WindowStaysOnTopHint}; + splash.setWindowTitle (QString {}); splash.showMessage ("

" + QString {"Alpha Release: WSJT-X v" + QCoreApplication::applicationVersion() + " " + revision ()}.simplified () + "

" @@ -131,6 +127,10 @@ int main(int argc, char *argv[]) splash.show (); a.processEvents (); + // Override programs executable basename as application name. + a.setApplicationName ("WSJT-X"); + a.setApplicationVersion (version ()); + #if QT_VERSION >= 0x050200 QCommandLineParser parser; parser.setApplicationDescription ("\nJT65A & JT9 Weak Signal Communications Program."); @@ -149,6 +149,7 @@ int main(int argc, char *argv[]) if (!parser.parse (a.arguments ())) { + splash.hide (); MessageBox::critical_message (nullptr, a.translate ("main", "Command line error"), parser.errorText ()); return -1; } @@ -156,11 +157,13 @@ int main(int argc, char *argv[]) { if (parser.isSet (help_option)) { + splash.hide (); MessageBox::information_message (nullptr, a.translate ("main", "Command line help"), parser.helpText ()); return 0; } else if (parser.isSet (version_option)) { + splash.hide (); MessageBox::information_message (nullptr, a.translate ("main", "Application version"), a.applicationVersion ()); return 0; } @@ -169,6 +172,7 @@ int main(int argc, char *argv[]) QStandardPaths::setTestModeEnabled (parser.isSet (test_option)); // support for multiple instances running from a single installation + bool multiple {false}; if (parser.isSet (rig_option) || parser.isSet (test_option)) { auto temp_name = parser.value (rig_option); @@ -203,6 +207,7 @@ int main(int argc, char *argv[]) { if (QLockFile::LockFailedError == instance_lock.error ()) { + splash.hide (); auto button = MessageBox::query_message (nullptr , a.translate ("main", "Another instance may be running") , a.translate ("main", "try to remove stale lock file?") @@ -221,6 +226,7 @@ int main(int argc, char *argv[]) default: throw std::runtime_error {"Multiple instances must have unique rig names"}; } + splash.show (); } } #endif @@ -239,6 +245,7 @@ int main(int argc, char *argv[]) if (!temp_dir.mkpath (unique_directory) || !temp_dir.cd (unique_directory)) { + splash.hide (); MessageBox::critical_message (nullptr, a.translate ("main", "Failed to create a temporary directory"), a.translate ("main", "Path: \"%1\"").arg (temp_dir.absolutePath ())); @@ -246,6 +253,7 @@ int main(int argc, char *argv[]) } if (!temp_dir.isReadable () || !(temp_ok = QTemporaryFile {temp_dir.absoluteFilePath ("test")}.open ())) { + splash.hide (); auto button = MessageBox::critical_message (nullptr, a.translate ("main", "Failed to create a usable temporary directory"), a.translate ("main", "Another application may be locking the directory"), @@ -255,6 +263,7 @@ int main(int argc, char *argv[]) { throw std::runtime_error {"Failed to create a usable temporary directory"}; } + splash.show (); temp_dir.cdUp (); // revert to parent as this one is no good } } @@ -294,6 +303,7 @@ int main(int argc, char *argv[]) if(!mem_jt9.attach()) { if (!mem_jt9.create(sizeof(struct dec_data))) { + splash.hide (); MessageBox::critical_message (nullptr, a.translate ("main", "Shared memory error"), a.translate ("main", "Unable to create shared memory segment")); throw std::runtime_error {"Shared memory error"}; diff --git a/mainwindow.cpp b/mainwindow.cpp index 53751aaa1..577f5ab71 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -871,7 +871,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, void MainWindow::splash_done () { - m_splash->close (); + m_splash && m_splash->close (); } void MainWindow::on_the_minute () @@ -1321,10 +1321,16 @@ void MainWindow::fastSink(qint64 frames) } void MainWindow::showSoundInError(const QString& errorMsg) -{MessageBox::critical_message (this, tr ("Error in Sound Input"), errorMsg);} +{ + if (m_splash && m_splash->isVisible ()) m_splash->hide (); + MessageBox::critical_message (this, tr ("Error in Sound Input"), errorMsg); +} void MainWindow::showSoundOutError(const QString& errorMsg) -{MessageBox::critical_message (this, tr ("Error in Sound Output"), errorMsg);} +{ + if (m_splash && m_splash->isVisible ()) m_splash->hide (); + MessageBox::critical_message (this, tr ("Error in Sound Output"), errorMsg); +} void MainWindow::showStatusMessage(const QString& statusMsg) {statusBar()->showMessage(statusMsg);} @@ -1613,6 +1619,7 @@ void MainWindow::statusChanged() << ui->rptSpinBox->value() << ";" << m_modeTx << endl; f.close(); } else { + if (m_splash && m_splash->isVisible ()) m_splash->hide (); MessageBox::warning_message (this, tr ("Status File Error") , tr ("Cannot open \"%1\" for writing: %2") .arg (f.fileName ()).arg (f.errorString ())); @@ -1756,6 +1763,7 @@ void MainWindow::subProcessFailed (QProcess * process, int exit_code, QProcess:: if (argument.contains (' ')) argument = '"' + argument + '"'; arguments << argument; } + if (m_splash && m_splash->isVisible ()) m_splash->hide (); MessageBox::critical_message (this, tr ("Subprocess Error") , tr ("Subprocess failed with exit code %1") .arg (exit_code) @@ -1777,6 +1785,7 @@ void MainWindow::subProcessError (QProcess * process, QProcess::ProcessError) if (argument.contains (' ')) argument = '"' + argument + '"'; arguments << argument; } + if (m_splash && m_splash->isVisible ()) m_splash->hide (); MessageBox::critical_message (this, tr ("Subprocess error") , tr ("Running: %1\n%2") .arg (process->program () + ' ' + arguments.join (' ')) @@ -2563,8 +2572,6 @@ void MainWindow::guiUpdate() double txDuration; QString rt; - if (m_splash && m_splash->isVisible ()) m_splash->raise (); - if(m_TRperiod==0) m_TRperiod=60; txDuration=0.0; if(m_modeTx=="JT4") txDuration=1.0 + 207.0*2520/11025.0; // JT4 @@ -4870,6 +4877,7 @@ void MainWindow::rigFailure (QString const& reason) } else { + if (m_splash && m_splash->isVisible ()) m_splash->hide (); m_rigErrorMessageBox.setDetailedText (reason); // don't call slot functions directly to avoid recursion @@ -5382,6 +5390,7 @@ void MainWindow::postWSPRDecode (bool is_new, QStringList parts) void MainWindow::networkError (QString const& e) { + if (m_splash && m_splash->isVisible ()) m_splash->hide (); if (MessageBox::Retry == MessageBox::warning_message (this, tr ("Network Error") , tr ("Error: %1\nUDP server %2:%3") .arg (e)