X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fqtui%2Fmainwin.cpp;h=122b47634e1201388c124f5b77fdf807ac9558e3;hb=0a1c1ff4f99a7eb53ff6cdd95ce5d7ac263e77d2;hp=5df3a1933b18209714acb7267a4e3cd2a156e3b3;hpb=9ea27e456f4163c37118f6dc34188809fc37d6d9;p=quassel.git diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 5df3a193..122b4763 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -28,6 +28,10 @@ # include #endif +#ifdef Q_WS_X11 +# include +#endif + #include "aboutdlg.h" #include "awaylogfilter.h" #include "awaylogview.h" @@ -64,7 +68,6 @@ #include "qtuiapplication.h" #include "qtuimessageprocessor.h" #include "qtuisettings.h" -#include "sessionsettings.h" #include "settingsdlg.h" #include "settingspagedlg.h" #include "systemtray.h" @@ -110,6 +113,10 @@ MainWin::MainWin(QWidget *parent) _titleSetter(this), _awayLog(0) { +#ifdef Q_WS_WIN + dwTickCount = 0; +#endif + QtUiSettings uiSettings; QString style = uiSettings.value("Style", QString()).toString(); if(!style.isEmpty()) { @@ -127,15 +134,10 @@ MainWin::MainWin(QWidget *parent) QtUiApplication* app = qobject_cast qApp; connect(app, SIGNAL(saveStateToSession(const QString&)), SLOT(saveStateToSession(const QString&))); connect(app, SIGNAL(saveStateToSessionSettings(SessionSettings&)), SLOT(saveStateToSessionSettings(SessionSettings&))); + connect(app, SIGNAL(aboutToQuit()), SLOT(aboutToQuit())); } void MainWin::init() { - QtUiSettings s; - if(s.value("MainWinSize").isValid()) - resize(s.value("MainWinSize").toSize()); - else - resize(QSize(800, 500)); - 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))); @@ -177,16 +179,15 @@ void MainWin::init() { QtUi::registerNotificationBackend(new KNotificationBackend(this)); #endif /* HAVE_KDE */ + setDisconnectedState(); // Disable menus and stuff + // restore mainwin state - restoreState(s.value("MainWinState").toByteArray()); + QtUiSettings s; + restoreStateFromSettings(s); // restore locked state of docks QtUi::actionCollection("General")->action("LockLayout")->setChecked(s.value("LockLayout", false).toBool()); - setDisconnectedState(); // Disable menus and stuff - - show(); - if(Quassel::runMode() != Quassel::Monolithic) { showCoreConnectionDlg(true); // autoconnect if appropriate } else { @@ -195,10 +196,40 @@ void MainWin::init() { } MainWin::~MainWin() { + +} + +void MainWin::aboutToQuit() { QtUiSettings s; - s.setValue("MainWinSize", size()); - s.setValue("MainWinPos", pos()); + saveStateToSettings(s); +} + +void MainWin::saveStateToSettings(UiSettings &s) { + s.setValue("MainWinSize", _normalSize); + s.setValue("MainWinPos", _normalPos); s.setValue("MainWinState", saveState()); + s.setValue("MainWinGeometry", saveGeometry()); + s.setValue("MainWinMinimized", isMinimized()); + s.setValue("MainWinHidden", _isHidden); +} + +void MainWin::restoreStateFromSettings(UiSettings &s) { + restoreGeometry(s.value("MainWinGeometry").toByteArray()); + if(isMaximized()) { + // restoreGeometry() fails if the windows was maximized, so we resize and position explicitly + resize(s.value("MainWinSize", QSize(800, 500)).toSize()); + move(s.value("MainWinPos").toPoint()); + } + + restoreState(s.value("MainWinState").toByteArray()); + + _isHidden = false; + if(s.value("MainWinHidden").toBool()) + hideToTray(); + else if(s.value("MainWinMinimized").toBool()) + showMinimized(); + else + show(); } void MainWin::updateIcon() { @@ -551,11 +582,6 @@ void MainWin::saveStatusBarStatus(bool enabled) { void MainWin::setupSystray() { _systemTray = new SystemTray(this); - -#ifndef Q_WS_MAC - connect(systemTray(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(systrayActivated(QSystemTrayIcon::ActivationReason))); -#endif - } void MainWin::setupToolBars() { @@ -583,18 +609,6 @@ void MainWin::setupToolBars() { #endif } -void MainWin::changeEvent(QEvent *event) { - if(event->type() == QEvent::WindowStateChange) { - if(windowState() & Qt::WindowMinimized) { - QtUiSettings s; - if(s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnMinimize").toBool()) { - hideToTray(); - event->accept(); - } - } - } -} - void MainWin::connectedToCore() { Q_CHECK_PTR(Client::bufferViewManager()); connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigAdded(int)), this, SLOT(addBufferView(int))); @@ -783,6 +797,28 @@ void MainWin::showShortcutsDlg() { } #endif +/********************************************************************************************************/ + +bool MainWin::event(QEvent *event) { + if(event->type() == QEvent::WindowActivate) + QtUi::closeNotifications(); + return QMainWindow::event(event); +} + +void MainWin::moveEvent(QMoveEvent *event) { + if(!(windowState() & Qt::WindowMaximized)) + _normalPos = event->pos(); + + event->ignore(); +} + +void MainWin::resizeEvent(QResizeEvent *event) { + if(!(windowState() & Qt::WindowMaximized)) + _normalSize = event->size(); + + event->ignore(); +} + void MainWin::closeEvent(QCloseEvent *event) { QtUiSettings s; QtUiApplication* app = qobject_cast qApp; @@ -796,10 +832,24 @@ void MainWin::closeEvent(QCloseEvent *event) { } } -void MainWin::systrayActivated(QSystemTrayIcon::ActivationReason activationReason) { - if(activationReason == QSystemTrayIcon::Trigger) { - toggleMinimizedToTray(); +void MainWin::changeEvent(QEvent *event) { + if(event->type() == QEvent::WindowStateChange) { + if(windowState() & Qt::WindowMinimized) { + QtUiSettings s; + if(s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnMinimize").toBool()) { + hideToTray(); + event->accept(); + return; + } + } } + +#ifdef Q_WS_WIN + else if(event->type() == QEvent::ActivationChange) + dwTickCount = GetTickCount(); // needed for toggleMinimizedToTray() +#endif + + event->ignore(); } void MainWin::hideToTray() { @@ -807,22 +857,50 @@ void MainWin::hideToTray() { qWarning() << Q_FUNC_INFO << "was called with no SystemTray available!"; return; } - clearFocus(); hide(); systemTray()->setIconVisible(); + _isHidden = true; } void MainWin::toggleMinimizedToTray() { +#ifdef Q_WS_WIN + // the problem is that we lose focus when the systray icon is activated + // and we don't know the former active window + // therefore we watch for activation event and use our stopwatch :) + // courtesy: KSystemTrayIcon + if(GetTickCount() - dwTickCount >= 300) + // we weren't active in the last 300ms -> activate + forceActivated(); + else + hideToTray(); + +#else + + if(!isVisible() || isMinimized()) + // restore + forceActivated(); + else + hideToTray(); + +#endif +} + +void MainWin::forceActivated() { +#ifdef Q_WS_X11 + // Bypass focus stealing prevention + QX11Info::setAppUserTime(QX11Info::appTime()); +#endif + if(windowState() & Qt::WindowMinimized) { // restore setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); - show(); - activateWindow(); - raise(); - } else { - setWindowState((windowState() & ~Qt::WindowActive) | Qt::WindowMinimized); - hideToTray(); } + + move(frameGeometry().topLeft()); // avoid placement policies + show(); + raise(); + activateWindow(); + _isHidden = false; } void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) { @@ -868,12 +946,6 @@ void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) { } } -bool MainWin::event(QEvent *event) { - if(event->type() == QEvent::WindowActivate) - QtUi::closeNotifications(); - return QMainWindow::event(event); -} - void MainWin::clientNetworkCreated(NetworkId id) { const Network *net = Client::network(id); QAction *act = new QAction(net->networkName(), this); @@ -976,6 +1048,7 @@ void MainWin::on_actionDebugLog_triggered() { logWidget->show(); } +// FIXME void MainWin::saveStateToSession(const QString &sessionId) { return; SessionSettings s(sessionId); @@ -985,6 +1058,7 @@ void MainWin::saveStateToSession(const QString &sessionId) { s.setValue("MainWinState", saveState()); } +// FIXME void MainWin::saveStateToSessionSettings(SessionSettings & s) { s.setValue("MainWinSize", size());