Skip to content

Commit

Permalink
Force app exit if session manager signals a shutdown.
Browse files Browse the repository at this point in the history
Resolves #3410.

Additionally, "fix" main window toggling behaviour when
clicking the tray icon while the window is visible, but
not in focus (e.g. hidden by other windows). On platforms
other than Windows, the window is now brought to the front
if it does not already have focus or is toggled otherwise.
  • Loading branch information
phoerious committed Oct 25, 2019
1 parent 8c8c181 commit ee8378b
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 35 deletions.
37 changes: 15 additions & 22 deletions src/gui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,10 +142,6 @@ MainWindow* getMainWindow()

MainWindow::MainWindow()
: m_ui(new Ui::MainWindow())
, m_trayIcon(nullptr)
, m_appExitCalled(false)
, m_appExiting(false)
, m_lastFocusOutTime(0)
{
g_MainWindow = this;

Expand Down Expand Up @@ -990,31 +986,29 @@ void MainWindow::toggleUsernamesHidden()

void MainWindow::closeEvent(QCloseEvent* event)
{
// ignore double close events (happens on macOS when closing from the dock)
if (m_appExiting) {
event->accept();
return;
}

// Don't ignore close event when the app is hidden to tray.
// This can occur when the OS issues close events on shutdown.
if (config()->get("GUI/MinimizeOnClose").toBool() && !isHidden() && !m_appExitCalled) {
// Ignore event and hide to tray if this is not an actual close
// request by the system's session manager.
if (config()->get("GUI/MinimizeOnClose").toBool() && !m_appExitCalled && !isHidden() && !qApp->isSavingSession()) {
event->ignore();
hideWindow();
return;
}

bool accept = saveLastDatabases();

if (accept) {
m_appExiting = true;
m_appExiting = saveLastDatabases();
if (m_appExiting) {
saveWindowInformation();

event->accept();
QApplication::quit();
} else {
event->ignore();
return;
}

m_appExitCalled = false;
event->ignore();
}

void MainWindow::changeEvent(QEvent* event)
Expand Down Expand Up @@ -1208,15 +1202,14 @@ void MainWindow::processTrayIconTrigger()
toggleWindow();
} else if (m_trayIconTriggerReason == QSystemTrayIcon::Trigger
|| m_trayIconTriggerReason == QSystemTrayIcon::MiddleClick) {
// Toggle window if hidden
// If on windows, check if focus switched within the last second because
// clicking the tray icon removes focus from main window
// If on Linux or macOS, check if the window is active
if (isHidden()
// Toggle window if is not in front.
#ifdef Q_OS_WIN
|| (Clock::currentSecondsSinceEpoch() - m_lastFocusOutTime) <= 1) {
// If on Windows, check if focus switched within the last second because
// clicking the tray icon removes focus from main window.
if (isHidden() || (Clock::currentSecondsSinceEpoch() - m_lastFocusOutTime) <= 1) {
#else
|| windowHandle()->isActive()) {
// If on Linux or macOS, check if the window has focus.
if (hasFocus() || isHidden() || windowHandle()->isActive()) {
#endif
toggleWindow();
} else {
Expand Down
26 changes: 13 additions & 13 deletions src/gui/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,24 +144,24 @@ private slots:

const QScopedPointer<Ui::MainWindow> m_ui;
SignalMultiplexer m_actionMultiplexer;
QAction* m_clearHistoryAction;
QAction* m_searchWidgetAction;
QMenu* m_entryContextMenu;
QActionGroup* m_lastDatabasesActions;
QActionGroup* m_copyAdditionalAttributeActions;
InactivityTimer* m_inactivityTimer;
InactivityTimer* m_touchIDinactivityTimer;
QPointer<QAction> m_clearHistoryAction;
QPointer<QAction> m_searchWidgetAction;
QPointer<QMenu> m_entryContextMenu;
QPointer<QActionGroup> m_lastDatabasesActions;
QPointer<QActionGroup> m_copyAdditionalAttributeActions;
QPointer<InactivityTimer> m_inactivityTimer;
QPointer<InactivityTimer> m_touchIDinactivityTimer;
int m_countDefaultAttributes;
QSystemTrayIcon* m_trayIcon;
ScreenLockListener* m_screenLockListener;
QPointer<QSystemTrayIcon> m_trayIcon;
QPointer<ScreenLockListener> m_screenLockListener;
QPointer<SearchWidget> m_searchWidget;

Q_DISABLE_COPY(MainWindow)

bool m_appExitCalled;
bool m_appExiting;
bool m_contextMenuFocusLock;
uint m_lastFocusOutTime;
bool m_appExitCalled = false;
bool m_appExiting = false;
bool m_contextMenuFocusLock = false;
uint m_lastFocusOutTime = 0;
QTimer m_trayIconTriggerTimer;
QSystemTrayIcon::ActivationReason m_trayIconTriggerReason;
};
Expand Down

0 comments on commit ee8378b

Please sign in to comment.