Skip to content

Commit e14cc8f

Browse files
committed
gui: macOS, do not process dock icon actions during shutdown
As the 'QMenuBar' is created without a parent window in MacOS, the app crashes when the user presses the shutdown button and, right after it, triggers any action in the menu bar. This happens because the QMenuBar is manually deleted in the BitcoinGUI destructor but the events attached to it children actions are not disconnected, so QActions events such us the 'QMenu::aboutToShow' could try to access null pointers. Instead of guarding every single QAction pointer inside the QMenu::aboutToShow slot, or manually disconnecting all registered events in the destructor, we can check if a shutdown was requested and discard the event. The 'node' field is a ref whose memory is held by the main application class, so it is safe to use here. Events are disconnected prior destructing the main application object. Furthermore, the 'MacDockIconHandler::dockIconClicked' signal can make the app crash during shutdown for the very same reason. The 'show()' call triggers the 'QApplication::focusWindowChanged' event, which is connected to the 'minimize_action' QAction, which is also part of the app menu bar, which could no longer exist.
1 parent 238d29a commit e14cc8f

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

src/qt/bitcoingui.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -864,6 +864,7 @@ void BitcoinGUI::createTrayIconMenu()
864864
// Note: On macOS, the Dock icon is used to provide the tray's functionality.
865865
MacDockIconHandler* dockIconHandler = MacDockIconHandler::instance();
866866
connect(dockIconHandler, &MacDockIconHandler::dockIconClicked, [this] {
867+
if (m_node.shutdownRequested()) return; // nothing to show, node is shutting down.
867868
show();
868869
activateWindow();
869870
});
@@ -875,6 +876,8 @@ void BitcoinGUI::createTrayIconMenu()
875876
// See https://bugreports.qt.io/browse/QTBUG-91697
876877
trayIconMenu.get(), &QMenu::aboutToShow,
877878
[this, show_hide_action, send_action, receive_action, sign_action, verify_action, options_action, node_window_action, quit_action] {
879+
if (m_node.shutdownRequested()) return; // nothing to do, node is shutting down.
880+
878881
if (show_hide_action) show_hide_action->setText(
879882
(!isHidden() && !isMinimized() && !GUIUtil::isObscured(this)) ?
880883
tr("&Hide") :

0 commit comments

Comments
 (0)