Chris@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@0: Chris@0: /* Chris@0: Sonic Visualiser Chris@0: An audio file viewer and annotation editor. Chris@0: Centre for Digital Music, Queen Mary, University of London. Chris@0: This file copyright 2006 Chris Cannam. Chris@0: Chris@0: This program is free software; you can redistribute it and/or Chris@0: modify it under the terms of the GNU General Public License as Chris@0: published by the Free Software Foundation; either version 2 of the Chris@0: License, or (at your option) any later version. See the file Chris@0: COPYING included with this distribution for more information. Chris@0: */ Chris@0: Chris@0: #include "MainWindow.h" Chris@0: Chris@1: #include "system/System.h" Chris@1: #include "system/Init.h" Chris@0: #include "base/TempDirectory.h" Chris@0: #include "base/PropertyContainer.h" Chris@0: #include "base/Preferences.h" Chris@0: Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: #include Chris@5: #include Chris@7: #include Chris@11: #include Chris@0: Chris@0: #include Chris@0: #include Chris@0: Chris@0: //!!! catch trappable signals, cleanup temporary directory etc Chris@0: //!!! check for crap left over from previous run Chris@0: Chris@0: static QMutex cleanupMutex; Chris@0: Chris@0: static void Chris@0: signalHandler(int /* signal */) Chris@0: { Chris@0: // Avoid this happening more than once across threads Chris@0: Chris@0: cleanupMutex.lock(); Chris@0: std::cerr << "signalHandler: cleaning up and exiting" << std::endl; Chris@0: TempDirectory::getInstance()->cleanup(); Chris@0: exit(0); // without releasing mutex Chris@0: } Chris@0: Chris@11: class SVApplication : public QApplication Chris@11: { Chris@11: public: Chris@11: SVApplication(int argc, char **argv) : Chris@11: QApplication(argc, argv), Chris@11: m_mainWindow(0) { } Chris@11: virtual ~SVApplication() { } Chris@11: Chris@11: void setMainWindow(MainWindow *mw) { m_mainWindow = mw; } Chris@11: void releaseMainWindow() { m_mainWindow = 0; } Chris@11: Chris@11: virtual void commitData(QSessionManager &manager) { Chris@11: if (!m_mainWindow) return; Chris@11: bool mayAskUser = manager.allowsInteraction(); Chris@11: bool success = m_mainWindow->commitData(mayAskUser); Chris@11: manager.release(); Chris@11: if (!success) manager.cancel(); Chris@11: } Chris@11: Chris@11: protected: Chris@11: MainWindow *m_mainWindow; Chris@11: }; Chris@11: Chris@0: int Chris@0: main(int argc, char **argv) Chris@0: { Chris@11: SVApplication application(argc, argv); Chris@0: Chris@46: QStringList args = application.arguments(); Chris@46: Chris@0: signal(SIGINT, signalHandler); Chris@0: signal(SIGTERM, signalHandler); Chris@0: Chris@0: #ifndef Q_WS_WIN32 Chris@0: signal(SIGHUP, signalHandler); Chris@0: signal(SIGQUIT, signalHandler); Chris@0: #endif Chris@0: Chris@0: svSystemSpecificInitialisation(); Chris@0: Chris@46: bool audioOutput = true; Chris@46: if (args.contains("--no-audio")) audioOutput = false; Chris@46: Chris@6: QApplication::setOrganizationName("sonic-visualiser"); Chris@5: QApplication::setOrganizationDomain("sonicvisualiser.org"); Chris@6: QApplication::setApplicationName("sonic-visualiser"); Chris@5: Chris@7: QApplication::setWindowIcon(QIcon(":icons/waveform.png")); Chris@7: Chris@0: QString language = QLocale::system().name(); Chris@0: Chris@0: QTranslator qtTranslator; Chris@0: QString qtTrName = QString("qt_%1").arg(language); Chris@0: std::cerr << "Loading " << qtTrName.toStdString() << "..." << std::endl; Chris@0: qtTranslator.load(qtTrName); Chris@0: application.installTranslator(&qtTranslator); Chris@0: Chris@0: QTranslator svTranslator; Chris@0: QString svTrName = QString("sonic-visualiser_%1").arg(language); Chris@0: std::cerr << "Loading " << svTrName.toStdString() << "..." << std::endl; Chris@0: svTranslator.load(svTrName, ":i18n"); Chris@0: application.installTranslator(&svTranslator); Chris@0: Chris@0: // Permit size_t and PropertyName to be used as args in queued signal calls Chris@0: qRegisterMetaType("size_t"); Chris@0: qRegisterMetaType("PropertyContainer::PropertyName"); Chris@0: Chris@46: MainWindow gui(audioOutput); Chris@11: application.setMainWindow(&gui); Chris@0: Chris@0: QDesktopWidget *desktop = QApplication::desktop(); Chris@0: QRect available = desktop->availableGeometry(); Chris@0: Chris@0: int width = available.width() * 2 / 3; Chris@0: int height = available.height() / 2; Chris@0: if (height < 450) height = available.height() * 2 / 3; Chris@0: if (width > height * 2) width = height * 2; Chris@0: Chris@5: QSettings settings; Chris@5: settings.beginGroup("MainWindow"); Chris@5: QSize size = settings.value("size", QSize(width, height)).toSize(); Chris@5: gui.resize(size); Chris@5: if (settings.contains("position")) { Chris@5: gui.move(settings.value("position").toPoint()); Chris@5: } Chris@5: settings.endGroup(); Chris@5: Chris@0: gui.show(); Chris@0: Chris@46: QString path; Chris@46: for (QStringList::iterator i = args.begin(); i != args.end(); ++i) { Chris@46: if (i == args.begin()) continue; Chris@46: if (!i->startsWith('-')) { Chris@46: path = *i; Chris@46: break; Chris@46: } Chris@46: } Chris@46: Chris@46: if (!path.isEmpty()) { Chris@0: bool success = false; Chris@0: if (path.endsWith(".sv")) { Chris@0: success = gui.openSessionFile(path); Chris@0: } Chris@0: if (!success) { Chris@0: success = gui.openSomeFile(path); Chris@0: } Chris@0: if (!success) { Chris@0: QMessageBox::critical(&gui, QMessageBox::tr("Failed to open file"), Chris@0: QMessageBox::tr("File \"%1\" could not be opened").arg(path)); Chris@0: } Chris@0: } Chris@0: Chris@0: int rv = application.exec(); Chris@0: std::cerr << "application.exec() returned " << rv << std::endl; Chris@0: Chris@0: cleanupMutex.lock(); Chris@0: TempDirectory::getInstance()->cleanup(); Chris@11: application.releaseMainWindow(); Chris@5: Chris@0: return rv; Chris@0: }