Hello community, here is the log from the commit of package kalarm for openSUSE:Factory checked in at 2017-03-16 09:37:03 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kalarm (Old) and /work/SRC/openSUSE:Factory/.kalarm.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kalarm" Thu Mar 16 09:37:03 2017 rev:4 rq:478128 version:16.12.3 Changes: -------- --- /work/SRC/openSUSE:Factory/kalarm/kalarm.changes 2017-02-14 00:47:00.793992991 +0100 +++ /work/SRC/openSUSE:Factory/.kalarm.new/kalarm.changes 2017-03-16 09:37:04.372663281 +0100 @@ -1,0 +2,13 @@ +Thu Mar 9 12:35:05 CET 2017 - [email protected] + +- Update to 16.12.3 + * New bugfix release + * For more details please see: + * https://www.kde.org/announcements/announce-applications-16.12.3.php +- Changes since 16.12.2: + * Bug 376209: Make command options --edit-new-* work + * Update version number + * Bug 374520: Fix not showing main window if re-activated + + +------------------------------------------------------------------- Old: ---- kalarm-16.12.2.tar.xz New: ---- kalarm-16.12.3.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kalarm.spec ++++++ --- /var/tmp/diff_new_pack.RVqmiB/_old 2017-03-16 09:37:04.872592493 +0100 +++ /var/tmp/diff_new_pack.RVqmiB/_new 2017-03-16 09:37:04.876591927 +0100 @@ -17,10 +17,10 @@ Name: kalarm -Version: 16.12.2 +Version: 16.12.3 Release: 0 %define kf5_version 5.26.0 -# Latest stable Applications (e.g. 16.08 in KA, but 16.12.2 in KUA) +# Latest stable Applications (e.g. 16.08 in KA, but 16.12.3 in KUA) %{!?_kapp_version: %global _kapp_version %(echo %{version}| awk -F. '{print $1"."$2}')} Summary: Personal Alarm Scheduler License: GPL-2.0 ++++++ kalarm-16.12.2.tar.xz -> kalarm-16.12.3.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kalarm-16.12.2/CMakeLists.txt new/kalarm-16.12.3/CMakeLists.txt --- old/kalarm-16.12.2/CMakeLists.txt 2017-02-05 20:37:07.000000000 +0100 +++ new/kalarm-16.12.3/CMakeLists.txt 2017-02-19 21:32:10.000000000 +0100 @@ -32,7 +32,7 @@ endif() -set(KDEPIM_VERSION_NUMBER "5.4.2") +set(KDEPIM_VERSION_NUMBER "5.4.3") set(KDEPIM_VERSION "${KDEPIM_VERSION_NUMBER}${KDEPIM_DEV_VERSION}") set(AKONADI_MIMELIB_VERSION "5.4.0") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kalarm-16.12.2/Changelog new/kalarm-16.12.3/Changelog --- old/kalarm-16.12.2/Changelog 2017-02-05 20:37:07.000000000 +0100 +++ new/kalarm-16.12.3/Changelog 2017-02-19 21:32:10.000000000 +0100 @@ -1,6 +1,11 @@ KAlarm Change Log -=== Version 2.11.13 --- 29 January 2017 === +=== Version 2.11.14 --- 19 February 2017 === ++ Fix not showing main window if activated again while already running with --tray [Bug 374520] ++ Fix --help, --version and option errors not being reported if KAlarm is already running. ++ Make command options --edit-new-* work [KDE Bug 376209] + +=== Version 2.11.13 (KDE Applications 16.12.2) --- 29 January 2017 === + Fix system tray icon used for "some alarms disabled" + Improved system tray icons (requires Plasma 5.9) [KDE Bug 362631] + Don't show misleading "Failed to update alarm" if command alarm fails [KDE Bug 375615] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kalarm-16.12.2/src/commandoptions.cpp new/kalarm-16.12.3/src/commandoptions.cpp --- old/kalarm-16.12.2/src/commandoptions.cpp 2017-02-05 20:37:07.000000000 +0100 +++ new/kalarm-16.12.3/src/commandoptions.cpp 2017-02-19 21:32:10.000000000 +0100 @@ -1,7 +1,7 @@ /* * commandoptions.cpp - extract command line options * Program: kalarm - * Copyright © 2001-2016 by David Jarvie <[email protected]> + * Copyright © 2001-2017 by David Jarvie <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,15 +38,27 @@ bool convInterval(const QString& timeParam, KARecurrence::Type&, int& timeInterval, bool allowMonthYear = false); } -CommandOptions* CommandOptions::mInstance = Q_NULLPTR; -QCommandLineParser* CommandOptions::mParser = Q_NULLPTR; -QVector<QCommandLineOption*> CommandOptions::mOptions(Num_Options, Q_NULLPTR); -QStringList CommandOptions::mExecArguments; +CommandOptions* CommandOptions::mFirstInstance = Q_NULLPTR; -void CommandOptions::setError(const QString& error) +CommandOptions::CommandOptions() + : mParser(Q_NULLPTR), + mOptions(Num_Options, Q_NULLPTR), + mCommand(NONE), + mEditActionSet(false), + mRecurrence(Q_NULLPTR), + mRepeatCount(0), + mRepeatInterval(0), + mLateCancel(0), + mBgColour(Preferences::defaultBgColour()), + mFgColour(Preferences::defaultFgColour()), + mReminderMinutes(0), + mAudioVolume(-1), + mFromID(0), + mFlags(KAEvent::DEFAULT_FONT), + mDisableAll(false) { - if (mError.isEmpty()) - mError = error; + if (!mFirstInstance) + mFirstInstance = this; } /****************************************************************************** @@ -221,13 +233,13 @@ QStringLiteral("[message]")); // Check for any options which eat up all following arguments. - QStringList arguments; + mNonExecArguments.clear(); for (int i = 0; i < args.size(); ++i) { const QString arg = args[i]; if (arg == QStringLiteral("--nofork")) continue; // Ignore debugging option - arguments << arg; + mNonExecArguments << arg; if (arg == optionName(EXEC) || arg == optionName(EXEC, true) || arg == optionName(EXEC_DISPLAY) || arg == optionName(EXEC_DISPLAY, true)) { @@ -239,31 +251,35 @@ mExecArguments << args[i]; } } -qCDebug(KALARM_LOG) << arguments; - return arguments; + return mNonExecArguments; } -void CommandOptions::process() +void CommandOptions::parse() { - if (!mInstance) - mInstance = new CommandOptions(); + if (!mParser->parse(mNonExecArguments)) + { + setError(mParser->errorText()); + return; + } + if (mParser->isSet(QStringLiteral("help"))) + { + mCommand = EXIT; + mError = mParser->helpText(); + return; + } + if (mParser->isSet(QStringLiteral("version"))) + { + mCommand = EXIT; + mError = QCoreApplication::applicationName() + QStringLiteral(" ") + QCoreApplication::applicationVersion(); + return; + } } -CommandOptions::CommandOptions() - : mCommand(NONE), - mEditActionSet(false), - mRecurrence(Q_NULLPTR), - mRepeatCount(0), - mRepeatInterval(0), - mLateCancel(0), - mBgColour(Preferences::defaultBgColour()), - mFgColour(Preferences::defaultFgColour()), - mReminderMinutes(0), - mAudioVolume(-1), - mFromID(0), - mFlags(KAEvent::DEFAULT_FONT), - mDisableAll(false) +void CommandOptions::process() { + if (mCommand == CMD_ERROR || mCommand == EXIT) + return; + #ifndef NDEBUG if (mParser->isSet(*mOptions[TEST_SET_TIME])) { @@ -684,15 +700,19 @@ } if (!mError.isEmpty()) - { - printError(mError); - mCommand = CMD_ERROR; - } + setError(mError); +} + +void CommandOptions::setError(const QString& errmsg) +{ + qCWarning(KALARM_LOG) << errmsg; + mCommand = CMD_ERROR; + if (mError.isEmpty()) + mError = errmsg + i18nc("@info:shell", "\nUse --help to get a list of available command line options.\n"); } void CommandOptions::printError(const QString& errmsg) { -qCDebug(KALARM_LOG)<<"ERROR====================="; // Note: we can't use mArgs->usage() since that also quits any other // running 'instances' of the program. std::cerr << errmsg.toLocal8Bit().data() @@ -754,7 +774,7 @@ return (n < args.size()) ? args[n] : QString(); } -QString CommandOptions::optionName(Option opt, bool shortName) +QString CommandOptions::optionName(Option opt, bool shortName) const { if (opt == Opt_Message) return QStringLiteral("message"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kalarm-16.12.2/src/commandoptions.h new/kalarm-16.12.3/src/commandoptions.h --- old/kalarm-16.12.2/src/commandoptions.h 2017-02-05 20:37:07.000000000 +0100 +++ new/kalarm-16.12.3/src/commandoptions.h 2017-02-19 21:32:10.000000000 +0100 @@ -1,7 +1,7 @@ /* * commandoptions.h - extract command line options * Program: kalarm - * Copyright © 2001-2016 by David Jarvie <[email protected]> + * Copyright © 2001-2017 by David Jarvie <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -43,6 +43,7 @@ { CMD_ERROR, // error in command line options NONE, // no command + EXIT, // print outputText() and exit TRAY, // --tray TRIGGER_EVENT, // --triggerEvent CANCEL_EVENT, // --cancelEvent @@ -52,9 +53,11 @@ NEW, // --file, --exec-display, --exec, --mail, message LIST // --list }; - static QStringList setOptions(QCommandLineParser*, const QStringList& args); - static void process(); - static CommandOptions* instance() { return mInstance; } + QStringList setOptions(QCommandLineParser*, const QStringList& args); + static CommandOptions* firstInstance() { return mFirstInstance; } + CommandOptions(); + void parse(); + void process(); Command command() const { return mCommand; } QString commandName() const { return optionName(mCommandOpt); } EventId eventId() const { return mEventId; } @@ -78,6 +81,7 @@ uint fromID() const { return mFromID; } KAEvent::Flags flags() const { return mFlags; } bool disableAll() const { return mDisableAll; } + QString outputText() const { return mError; } #ifndef NDEBUG KDateTime simulationTime() const { return mSimulationTime; } #endif @@ -132,22 +136,22 @@ Opt_Message // special value representing "message" }; - explicit CommandOptions(); bool checkCommand(Option, Command, EditAlarmDlg::Type = EditAlarmDlg::NO_TYPE); - inline void setError(const QString& error); + void setError(const QString& error); void setErrorRequires(Option opt, Option opt2, Option opt3 = Num_Options); void setErrorParameter(Option); void setErrorIncompatible(Option opt1, Option opt2); void checkEditType(EditAlarmDlg::Type type, Option opt) { checkEditType(type, EditAlarmDlg::NO_TYPE, opt); } void checkEditType(EditAlarmDlg::Type, EditAlarmDlg::Type, Option); - static QString arg(int n); - static QString optionName(Option, bool shortName = false); + QString arg(int n); + QString optionName(Option, bool shortName = false) const; - static CommandOptions* mInstance; // the unique instance - static QCommandLineParser* mParser; - static QVector<QCommandLineOption*> mOptions; // all possible command line options - static QStringList mExecArguments; // arguments for --exec or --exec-display + static CommandOptions* mFirstInstance; // the first instance + QCommandLineParser* mParser; + QVector<QCommandLineOption*> mOptions; // all possible command line options + QStringList mNonExecArguments; // arguments except for --exec or --exec-display parameters + QStringList mExecArguments; // arguments for --exec or --exec-display QString mError; // error message Command mCommand; // the selected command Option mCommandOpt; // option for the selected command diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kalarm-16.12.2/src/kalarm.h new/kalarm-16.12.3/src/kalarm.h --- old/kalarm-16.12.2/src/kalarm.h 2017-02-05 20:37:07.000000000 +0100 +++ new/kalarm-16.12.3/src/kalarm.h 2017-02-19 21:32:10.000000000 +0100 @@ -24,7 +24,7 @@ #undef QT3_SUPPORT #define VERSION_SUFFIX "-5" -#define KALARM_VERSION "2.11.13" VERSION_SUFFIX +#define KALARM_VERSION "2.11.14" VERSION_SUFFIX #define KALARM_NAME "KAlarm" #define KALARM_DBUS_SERVICE "org.kde.kalarm" // D-Bus service name of KAlarm application diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kalarm-16.12.2/src/kalarmapp.cpp new/kalarm-16.12.3/src/kalarmapp.cpp --- old/kalarm-16.12.2/src/kalarmapp.cpp 2017-02-05 20:37:07.000000000 +0100 +++ new/kalarm-16.12.3/src/kalarmapp.cpp 2017-02-19 21:32:10.000000000 +0100 @@ -24,7 +24,6 @@ #include "alarmcalendar.h" #include "alarmlistview.h" #include "alarmtime.h" -#include "autoqpointer.h" #include "commandoptions.h" #include "dbushandler.h" #include "editdlgtypes.h" @@ -122,11 +121,6 @@ KAlarm::setTestModeConditions(); #endif - // Make this a unique application. - KDBusService* s = new KDBusService(KDBusService::Unique, this); - connect(this, &KAlarmApp::aboutToQuit, s, &KDBusService::deleteLater); - connect(s, &KDBusService::activateRequested, this, &KAlarmApp::activate); - setQuitOnLastWindowClosed(false); Preferences::self(); // read KAlarm configuration if (!Preferences::noAutoStart()) @@ -324,16 +318,29 @@ /****************************************************************************** * Called for a unique QApplication when a new instance of the application is * started. +* Reply: exit code (>= 0), or -1 to continue execution. +* If exit code >= 0, 'outputText' holds text to output before terminating. +*/ +void KAlarmApp::activateByDBus(const QStringList& args, const QString& workingDirectory) +{ + activateInstance(args, workingDirectory, nullptr); +} + +/****************************************************************************** +* Called to start a new instance of the application. +* Reply: exit code (>= 0), or -1 to continue execution. +* If exit code >= 0, 'outputText' holds text to output before terminating. */ -void KAlarmApp::activate(const QStringList& args, const QString& workingDirectory) +int KAlarmApp::activateInstance(const QStringList& args, const QString& workingDirectory, QString* outputText) { Q_UNUSED(workingDirectory) qCDebug(KALARM_LOG); + if (outputText) + outputText->clear(); if (mFatalError) { quitFatal(); -// return 1; - return; + return 1; } // The D-Bus call to activate a subsequent instance of KAlarm may not supply @@ -348,25 +355,65 @@ QCommandLineParser parser; KAboutData::applicationData().setupCommandLine(&parser); parser.setApplicationDescription(QApplication::applicationDisplayName()); - const QStringList newArgs = CommandOptions::setOptions(&parser, fixedArgs); - parser.process(newArgs); + CommandOptions* options = new CommandOptions; + const QStringList newArgs = options->setOptions(&parser, fixedArgs); + options->parse(); KAboutData::applicationData().processCommandLine(&parser); ++mActiveCount; int exitCode = 0; // default = success static bool firstInstance = true; bool dontRedisplay = false; - if (!firstInstance || !isSessionRestored()) + CommandOptions::Command command = CommandOptions::NONE; + bool processOptions = (!firstInstance || !isSessionRestored()); + if (processOptions) { - CommandOptions::process(); - CommandOptions* options = CommandOptions::instance(); // fetch command line options + options->process(); #ifndef NDEBUG if (options->simulationTime().isValid()) KAlarm::setSimulatedSystemTime(options->simulationTime()); #endif - CommandOptions::Command command = options->command(); + command = options->command(); if (options->disableAll()) setAlarmsEnabled(false); // disable alarm monitoring + + // Handle options which exit with a terminal message, before + // making the application a unique application, since a + // unique application won't output to the terminal if another + // instance is already running. + switch (command) + { + case CommandOptions::CMD_ERROR: + if (outputText) + { + *outputText = options->outputText(); + delete options; + return 1; + } + mReadOnly = true; // don't need write access to calendars + exitCode = 1; + break; + case CommandOptions::EXIT: + if (outputText) + { + *outputText = options->outputText(); + delete options; + return 0; + } + exitCode = -1; + break; + default: + break; + } + } + + // Make this a unique application. + KDBusService* s = new KDBusService(KDBusService::Unique, this); + connect(this, &KAlarmApp::aboutToQuit, s, &KDBusService::deleteLater); + connect(s, &KDBusService::activateRequested, this, &KAlarmApp::activateByDBus); + + if (processOptions) + { switch (command) { case CommandOptions::TRIGGER_EVENT: @@ -424,10 +471,7 @@ exitCode = 1; else { - // Use AutoQPointer to guard against crash on application exit while - // the dialogue is still open. It prevents double deletion (both on - // deletion of parent, and on return from this function). - AutoQPointer<EditAlarmDlg> editDlg = EditAlarmDlg::create(false, options->editType()); + EditAlarmDlg* editDlg = EditAlarmDlg::create(false, options->editType(), MainWindow::mainMainWindow()); if (options->alarmTime().isValid()) editDlg->setTime(options->alarmTime()); if (options->recurrence()) @@ -492,6 +536,10 @@ case EditAlarmDlg::NO_TYPE: break; } + // Execute the edit dialogue. Note that if no other instance of KAlarm is + // running, this new instance will not exit after the dialogue is closed. + // This is deliberate, since exiting would mean that KAlarm wouldn't + // trigger the new alarm. KAlarm::execNewAlarmDlg(editDlg); } break; @@ -501,7 +549,13 @@ if (!initCheck()) exitCode = 1; else + { + // Execute the edit dialogue. Note that if no other instance of KAlarm is + // running, this new instance will not exit after the dialogue is closed. + // This is deliberate, since exiting would mean that KAlarm wouldn't + // trigger the new alarm. KAlarm::editNewAlarm(options->templateName()); + } break; case CommandOptions::NEW: @@ -537,19 +591,23 @@ exitCode = 1; else { - MainWindow* win = MainWindow::create(); - if (command == CommandOptions::TRAY) - win->setWindowState(win->windowState() | Qt::WindowMinimized); - win->show(); + if (mTrayWindow && mTrayWindow->assocMainWindow() && !mTrayWindow->assocMainWindow()->isVisible()) + mTrayWindow->showAssocMainWindow(); + else + { + MainWindow* win = MainWindow::create(); + if (command == CommandOptions::TRAY) + win->setWindowState(win->windowState() | Qt::WindowMinimized); + win->show(); + } } break; - - case CommandOptions::CMD_ERROR: - mReadOnly = true; // don't need write access to calendars - exitCode = 1; + default: break; } } + if (options != CommandOptions::firstInstance()) + delete options; // If this is the first time through, redisplay any alarm message windows // from last time. @@ -579,12 +637,12 @@ // Quit the application if this was the last/only running "instance" of the program. // Executing 'return' doesn't work very well since the program continues to // run if no windows were created. - quitIf(exitCode); + quitIf(exitCode >= 0 ? exitCode : 0); // Check whether the KDE time zone daemon is running (but don't hold up initialisation) QTimer::singleShot(0, this, &KAlarmApp::checkKtimezoned); -// return exitCode; + return -1; // continue executing the application instance } void KAlarmApp::checkKtimezoned() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kalarm-16.12.2/src/kalarmapp.h new/kalarm-16.12.3/src/kalarmapp.h --- old/kalarm-16.12.2/src/kalarmapp.h 2017-02-05 20:37:07.000000000 +0100 +++ new/kalarm-16.12.3/src/kalarmapp.h 2017-02-19 21:32:10.000000000 +0100 @@ -56,6 +56,8 @@ bool wantShowInSystemTray() const; bool alarmsEnabled() const { return mAlarmsEnabled; } bool korganizerEnabled() const { return mKOrganizerEnabled; } + int activate(const QStringList& args, const QString& workingDirectory, QString& outputText) + { return activateInstance(args, workingDirectory, &outputText); } bool restoreSession(); bool quitIf() { return quitIf(0); } void doQuit(QWidget* parent); @@ -92,7 +94,7 @@ QString dbusList(); public Q_SLOTS: - void activate(const QStringList& args, const QString& workingDirectory); + void activateByDBus(const QStringList& args, const QString& workingDirectory); void processQueue(); void setAlarmsEnabled(bool); void purgeNewArchivedDefault(const Akonadi::Collection&); @@ -168,6 +170,7 @@ KAlarmApp(int& argc, char** argv); bool initialise(); + int activateInstance(const QStringList& args, const QString& workingDirectory, QString* outputText); bool initCheck(bool calendarOnly = false, bool waitForCollection = false, Akonadi::Collection::Id = -1); bool quitIf(int exitCode, bool force = false); bool checkSystemTray(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kalarm-16.12.2/src/main.cpp new/kalarm-16.12.3/src/main.cpp --- old/kalarm-16.12.2/src/main.cpp 2017-02-05 20:37:07.000000000 +0100 +++ new/kalarm-16.12.3/src/main.cpp 2017-02-19 21:32:10.000000000 +0100 @@ -31,6 +31,7 @@ #include <QDir> #include <QScopedPointer> +#include <iostream> #include <stdlib.h> #define PROGRAM_NAME "kalarm" @@ -41,7 +42,7 @@ // before libraries unload, to avoid crashes during clean-up. QScopedPointer<KAlarmApp> app(KAlarmApp::create(argc, argv)); - QStringList args = app->arguments(); + const QStringList args = app->arguments(); app->setAttribute(Qt::AA_UseHighDpiPixmaps, true); app->setAttribute(Qt::AA_EnableHighDpiScaling); @@ -58,7 +59,17 @@ qCDebug(KALARM_LOG) << "initialising"; - app->activate(args, QDir::currentPath()); + QString outputText; + int exitCode = app->activate(args, QDir::currentPath(), outputText); + if (exitCode >= 0) + { + if (exitCode > 0) + std::cout << qPrintable(outputText) << std::endl; + else + std::cerr << qPrintable(outputText) << std::endl; + exit(exitCode); + } + app->restoreSession(); return app->exec(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kalarm-16.12.2/src/traywindow.cpp new/kalarm-16.12.3/src/traywindow.cpp --- old/kalarm-16.12.2/src/traywindow.cpp 2017-02-05 20:37:07.000000000 +0100 +++ new/kalarm-16.12.3/src/traywindow.cpp 2017-02-19 21:32:10.000000000 +0100 @@ -233,6 +233,19 @@ } /****************************************************************************** +* Show the associated main window. +*/ +void TrayWindow::showAssocMainWindow() +{ + if (mAssocMainWindow) + { + mAssocMainWindow->show(); + mAssocMainWindow->raise(); + mAssocMainWindow->activateWindow(); + } +} + +/****************************************************************************** * A left click displays the KAlarm main window. */ void TrayWindow::slotActivateRequested() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kalarm-16.12.2/src/traywindow.h new/kalarm-16.12.3/src/traywindow.h --- old/kalarm-16.12.2/src/traywindow.h 2017-02-05 20:37:07.000000000 +0100 +++ new/kalarm-16.12.3/src/traywindow.h 2017-02-19 21:32:10.000000000 +0100 @@ -1,7 +1,7 @@ /* * traywindow.h - the KDE system tray applet * Program: kalarm - * Copyright © 2002-2012 by David Jarvie <[email protected]> + * Copyright © 2002-2017 by David Jarvie <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,6 +45,7 @@ void removeWindow(MainWindow*); MainWindow* assocMainWindow() const { return mAssocMainWindow; } void setAssocMainWindow(MainWindow* win) { mAssocMainWindow = win; } + void showAssocMainWindow(); Q_SIGNALS: void deleted();
