macOS: disable AppNap during sync
Signed-off-by: Alexey Ivanov <alexey.ivanes@gmail.com>
This commit is contained in:
parent
f6df989842
commit
1e0f3c4499
6 changed files with 116 additions and 4 deletions
|
@ -97,9 +97,6 @@
|
||||||
<key>NSHighResolutionCapable</key>
|
<key>NSHighResolutionCapable</key>
|
||||||
<string>True</string>
|
<string>True</string>
|
||||||
|
|
||||||
<key>LSAppNapIsDisabled</key>
|
|
||||||
<string>True</string>
|
|
||||||
|
|
||||||
<key>NSRequiresAquaSystemAppearance</key>
|
<key>NSRequiresAquaSystemAppearance</key>
|
||||||
<string>True</string>
|
<string>True</string>
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,8 @@ QT_MOC_CPP = \
|
||||||
|
|
||||||
BITCOIN_MM = \
|
BITCOIN_MM = \
|
||||||
qt/macdockiconhandler.mm \
|
qt/macdockiconhandler.mm \
|
||||||
qt/macnotificationhandler.mm
|
qt/macnotificationhandler.mm \
|
||||||
|
qt/macos_appnap.mm
|
||||||
|
|
||||||
QT_MOC = \
|
QT_MOC = \
|
||||||
qt/bitcoin.moc \
|
qt/bitcoin.moc \
|
||||||
|
@ -205,6 +206,7 @@ BITCOIN_QT_H = \
|
||||||
qt/intro.h \
|
qt/intro.h \
|
||||||
qt/macdockiconhandler.h \
|
qt/macdockiconhandler.h \
|
||||||
qt/macnotificationhandler.h \
|
qt/macnotificationhandler.h \
|
||||||
|
qt/macos_appnap.h \
|
||||||
qt/modaloverlay.h \
|
qt/modaloverlay.h \
|
||||||
qt/networkstyle.h \
|
qt/networkstyle.h \
|
||||||
qt/notificator.h \
|
qt/notificator.h \
|
||||||
|
|
|
@ -211,6 +211,10 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const PlatformStyle *_platformSty
|
||||||
connect(progressBar, &GUIUtil::ClickableProgressBar::clicked, this, &BitcoinGUI::showModalOverlay);
|
connect(progressBar, &GUIUtil::ClickableProgressBar::clicked, this, &BitcoinGUI::showModalOverlay);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
m_app_nap_inhibitor = new CAppNapInhibitor;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
BitcoinGUI::~BitcoinGUI()
|
BitcoinGUI::~BitcoinGUI()
|
||||||
|
@ -223,6 +227,7 @@ BitcoinGUI::~BitcoinGUI()
|
||||||
if(trayIcon) // Hide tray icon, as deleting will let it linger until quit (on Ubuntu)
|
if(trayIcon) // Hide tray icon, as deleting will let it linger until quit (on Ubuntu)
|
||||||
trayIcon->hide();
|
trayIcon->hide();
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
|
delete m_app_nap_inhibitor;
|
||||||
delete appMenuBar;
|
delete appMenuBar;
|
||||||
MacDockIconHandler::cleanup();
|
MacDockIconHandler::cleanup();
|
||||||
#endif
|
#endif
|
||||||
|
@ -786,6 +791,11 @@ void BitcoinGUI::openOptionsDialogWithTab(OptionsDialog::Tab tab)
|
||||||
|
|
||||||
void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool header)
|
void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool header)
|
||||||
{
|
{
|
||||||
|
// Disabling macOS App Nap on initial sync, disk and reindex operations.
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
(m_node.isInitialBlockDownload() || m_node.getReindex() || m_node.getImporting()) ? m_app_nap_inhibitor->disableAppNap() : m_app_nap_inhibitor->enableAppNap();
|
||||||
|
#endif
|
||||||
|
|
||||||
if (modalOverlay)
|
if (modalOverlay)
|
||||||
{
|
{
|
||||||
if (header)
|
if (header)
|
||||||
|
|
|
@ -20,6 +20,10 @@
|
||||||
#include <QPoint>
|
#include <QPoint>
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
|
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
#include <qt/macos_appnap.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
class ClientModel;
|
class ClientModel;
|
||||||
|
@ -143,6 +147,10 @@ private:
|
||||||
HelpMessageDialog* helpMessageDialog = nullptr;
|
HelpMessageDialog* helpMessageDialog = nullptr;
|
||||||
ModalOverlay* modalOverlay = nullptr;
|
ModalOverlay* modalOverlay = nullptr;
|
||||||
|
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
CAppNapInhibitor* m_app_nap_inhibitor = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Keep track of previous number of blocks, to detect progress */
|
/** Keep track of previous number of blocks, to detect progress */
|
||||||
int prevBlocks = 0;
|
int prevBlocks = 0;
|
||||||
int spinnerFrame = 0;
|
int spinnerFrame = 0;
|
||||||
|
|
24
src/qt/macos_appnap.h
Normal file
24
src/qt/macos_appnap.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// Copyright (c) 2011-2018 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#ifndef BITCOIN_QT_MACOS_APPNAP_H
|
||||||
|
#define BITCOIN_QT_MACOS_APPNAP_H
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
class CAppNapInhibitor final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit CAppNapInhibitor();
|
||||||
|
~CAppNapInhibitor();
|
||||||
|
|
||||||
|
void disableAppNap();
|
||||||
|
void enableAppNap();
|
||||||
|
|
||||||
|
private:
|
||||||
|
class CAppNapImpl;
|
||||||
|
std::unique_ptr<CAppNapImpl> impl;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BITCOIN_QT_MACOS_APPNAP_H
|
71
src/qt/macos_appnap.mm
Normal file
71
src/qt/macos_appnap.mm
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
// Copyright (c) 2011-2018 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include "macos_appnap.h"
|
||||||
|
|
||||||
|
#include <AvailabilityMacros.h>
|
||||||
|
#include <Foundation/NSProcessInfo.h>
|
||||||
|
#include <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
class CAppNapInhibitor::CAppNapImpl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
~CAppNapImpl()
|
||||||
|
{
|
||||||
|
if(activityId)
|
||||||
|
enableAppNap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void disableAppNap()
|
||||||
|
{
|
||||||
|
if (!activityId)
|
||||||
|
{
|
||||||
|
@autoreleasepool {
|
||||||
|
const NSActivityOptions activityOptions =
|
||||||
|
NSActivityUserInitiatedAllowingIdleSystemSleep &
|
||||||
|
~(NSActivitySuddenTerminationDisabled |
|
||||||
|
NSActivityAutomaticTerminationDisabled);
|
||||||
|
|
||||||
|
id processInfo = [NSProcessInfo processInfo];
|
||||||
|
if ([processInfo respondsToSelector:@selector(beginActivityWithOptions:reason:)])
|
||||||
|
{
|
||||||
|
activityId = [processInfo beginActivityWithOptions: activityOptions reason:@"Temporarily disable App Nap for bitcoin-qt."];
|
||||||
|
[activityId retain];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void enableAppNap()
|
||||||
|
{
|
||||||
|
if(activityId)
|
||||||
|
{
|
||||||
|
@autoreleasepool {
|
||||||
|
id processInfo = [NSProcessInfo processInfo];
|
||||||
|
if ([processInfo respondsToSelector:@selector(endActivity:)])
|
||||||
|
[processInfo endActivity:activityId];
|
||||||
|
|
||||||
|
[activityId release];
|
||||||
|
activityId = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
NSObject* activityId;
|
||||||
|
};
|
||||||
|
|
||||||
|
CAppNapInhibitor::CAppNapInhibitor() : impl(new CAppNapImpl()) {}
|
||||||
|
|
||||||
|
CAppNapInhibitor::~CAppNapInhibitor() = default;
|
||||||
|
|
||||||
|
void CAppNapInhibitor::disableAppNap()
|
||||||
|
{
|
||||||
|
impl->disableAppNap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAppNapInhibitor::enableAppNap()
|
||||||
|
{
|
||||||
|
impl->enableAppNap();
|
||||||
|
}
|
Loading…
Reference in a new issue