From: Manuel Nickschas Date: Tue, 14 Jul 2009 20:20:05 +0000 (+0200) Subject: Improve MainWindow state save/restore X-Git-Tag: 0.5-rc1~167 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=8c16bc6817aac177791686ac1a5ad8ee2d93410c Improve MainWindow state save/restore Rather than tracking the visibility manually, we now make sure that the window state is saved before the window is hidden, i.e. not in aboutToQuit() which is already too late for that. Instead of calling QApplication::quit(), we use our new slot MainWin::quit() which saves the window layout first. For KDEified Quassel, we now use KMainWindow's autosave feature rather than using QMainWindow::restoreState(). This might fix some issues with multiple desktops etc, though I haven't tested that. In any case it's cleaner as it saves additional properties (e.g. toolbar state). --- diff --git a/src/common/quassel.cpp b/src/common/quassel.cpp index 33b6cbd4..a43a707b 100644 --- a/src/common/quassel.cpp +++ b/src/common/quassel.cpp @@ -49,8 +49,12 @@ QStringList Quassel::_dataDirPaths; bool Quassel::_initialized = false; bool Quassel::DEBUG = false; QString Quassel::_coreDumpFileName; +Quassel *Quassel::_instance = 0; Quassel::Quassel() { + Q_ASSERT(!_instance); + _instance = this; + // We catch SIGTERM and SIGINT (caused by Ctrl+C) to graceful shutdown Quassel. signal(SIGTERM, handleSignal); signal(SIGINT, handleSignal); @@ -108,6 +112,10 @@ bool Quassel::init() { return true; } +void Quassel::quit() { + QCoreApplication::quit(); +} + //! Register our custom types with Qt's Meta Object System. /** This makes them available for QVariant and in signals/slots, among other things. * @@ -207,7 +215,10 @@ void Quassel::handleSignal(int sig) { case SIGTERM: case SIGINT: qWarning("%s", qPrintable(QString("Caught signal %1 - exiting.").arg(sig))); - QCoreApplication::quit(); + if(_instance) + _instance->quit(); + else + QCoreApplication::quit(); break; case SIGABRT: case SIGSEGV: diff --git a/src/common/quassel.h b/src/common/quassel.h index 53d9e0bf..4b9c5a91 100644 --- a/src/common/quassel.h +++ b/src/common/quassel.h @@ -106,6 +106,7 @@ public: protected: Quassel(); virtual bool init(); + virtual void quit(); inline void setRunMode(RunMode mode); inline void setDataDirPaths(const QStringList &paths); @@ -117,6 +118,7 @@ private: static void handleSignal(int signal); static void logBacktrace(const QString &filename); + static Quassel *_instance; static BuildInfo _buildInfo; static AbstractCliParser *_cliParser; static RunMode _runMode; diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index f31354c7..1e74e18d 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -133,13 +133,9 @@ MainWin::MainWin(QWidget *parent) updateIcon(); installEventFilter(new JumpKeyHandler(this)); - - QtUiApplication* app = qobject_cast qApp; - connect(app, SIGNAL(aboutToQuit()), SLOT(aboutToQuit())); } void MainWin::init() { - connect(QApplication::instance(), SIGNAL(aboutToQuit()), SLOT(saveLayout())); connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(clientNetworkCreated(NetworkId))); connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(clientNetworkRemoved(NetworkId))); connect(Client::messageModel(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), @@ -183,6 +179,10 @@ void MainWin::init() { setDisconnectedState(); // Disable menus and stuff +#ifdef HAVE_KDE + setAutoSaveSettings(); +#endif + // restore mainwin state QtUiSettings s; restoreStateFromSettings(s); @@ -201,9 +201,11 @@ MainWin::~MainWin() { } -void MainWin::aboutToQuit() { +void MainWin::quit() { QtUiSettings s; saveStateToSettings(s); + saveLayout(); + QApplication::quit(); } void MainWin::saveStateToSettings(UiSettings &s) { @@ -213,7 +215,11 @@ void MainWin::saveStateToSettings(UiSettings &s) { s.setValue("MainWinGeometry", saveGeometry()); s.setValue("MainWinMinimized", isMinimized()); s.setValue("MainWinMaximized", isMaximized()); - s.setValue("MainWinHidden", _isHidden); + s.setValue("MainWinHidden", !isVisible()); + +#ifdef HAVE_KDE + saveAutoSaveSettings(); +#endif } void MainWin::restoreStateFromSettings(UiSettings &s) { @@ -221,6 +227,7 @@ void MainWin::restoreStateFromSettings(UiSettings &s) { _normalPos = s.value("MainWinPos", pos()).toPoint(); bool maximized = s.value("MainWinMaximized", false).toBool(); +#ifndef HAVE_KDE restoreGeometry(s.value("MainWinGeometry").toByteArray()); if(maximized) { @@ -231,7 +238,10 @@ void MainWin::restoreStateFromSettings(UiSettings &s) { restoreState(s.value("MainWinState").toByteArray()); - _isHidden = false; +#else + move(_normalPos); +#endif + if(s.value("MainWinHidden").toBool()) hideToTray(); else if(s.value("MainWinMinimized").toBool()) @@ -270,7 +280,7 @@ void MainWin::setupActions() { coll->addAction("ConfigureNetworks", new Action(SmallIcon("configure"), tr("Configure &Networks..."), coll, this, SLOT(on_actionConfigureNetworks_triggered()))); coll->addAction("Quit", new Action(SmallIcon("application-exit"), tr("&Quit"), coll, - qApp, SLOT(quit()), tr("Ctrl+Q"))); + this, SLOT(quit()), tr("Ctrl+Q"))); // View coll->addAction("ConfigureBufferViews", new Action(tr("&Configure Buffer Views..."), coll, @@ -851,7 +861,7 @@ void MainWin::closeEvent(QCloseEvent *event) { event->ignore(); } else { event->accept(); - QApplication::quit(); + quit(); } } @@ -871,7 +881,6 @@ void MainWin::hideToTray() { } hide(); systemTray()->setIconVisible(); - _isHidden = true; } void MainWin::toggleMinimizedToTray() { @@ -913,7 +922,6 @@ void MainWin::forceActivated() { show(); raise(); activateWindow(); - _isHidden = false; } void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) { diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index c905e089..dd0459c5 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -91,6 +91,9 @@ class MainWin //! Bring window to front and focus it void forceActivated(); + //! Quit application + void quit(); + protected: void closeEvent(QCloseEvent *event); void changeEvent(QEvent *event); @@ -136,7 +139,6 @@ class MainWin void connectOrDisconnectFromNet(); void saveStatusBarStatus(bool enabled); - void aboutToQuit(); void loadLayout(); void saveLayout(); @@ -191,7 +193,6 @@ class MainWin QSize _normalSize; //!< Size of the non-maximized window QPoint _normalPos; //!< Position of the non-maximized window - bool _isHidden; #ifdef Q_WS_WIN DWORD dwTickCount; diff --git a/src/qtui/qtuiapplication.cpp b/src/qtui/qtuiapplication.cpp index 9d1b1bab..2aa17891 100644 --- a/src/qtui/qtuiapplication.cpp +++ b/src/qtui/qtuiapplication.cpp @@ -124,6 +124,10 @@ QtUiApplication::~QtUiApplication() { Client::destroy(); } +void QtUiApplication::quit() { + QtUi::mainWindow()->quit(); +} + void QtUiApplication::commitData(QSessionManager &manager) { Q_UNUSED(manager) _aboutToQuit = true; diff --git a/src/qtui/qtuiapplication.h b/src/qtui/qtuiapplication.h index 4d34683a..74788754 100644 --- a/src/qtui/qtuiapplication.h +++ b/src/qtui/qtuiapplication.h @@ -53,6 +53,9 @@ public: inline bool isAboutToQuit() const { return _aboutToQuit; } +protected: + virtual void quit(); + private: bool _aboutToQuit; };