macos_appnap.mm raw
1 // Copyright (c) 2011-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #include "macos_appnap.h"
6
7 #include <AvailabilityMacros.h>
8 #include <Foundation/NSProcessInfo.h>
9 #include <Foundation/Foundation.h>
10
11 class CAppNapInhibitor::CAppNapImpl
12 {
13 public:
14 ~CAppNapImpl()
15 {
16 if(activityId)
17 enableAppNap();
18 }
19
20 void disableAppNap()
21 {
22 if (!activityId)
23 {
24 @autoreleasepool {
25 const NSActivityOptions activityOptions =
26 NSActivityUserInitiatedAllowingIdleSystemSleep &
27 ~(NSActivitySuddenTerminationDisabled |
28 NSActivityAutomaticTerminationDisabled);
29
30 id processInfo = [NSProcessInfo processInfo];
31 if ([processInfo respondsToSelector:@selector(beginActivityWithOptions:reason:)])
32 {
33 activityId = [processInfo beginActivityWithOptions: activityOptions reason:@"Temporarily disable App Nap for bitcoin-qt."];
34 [activityId retain];
35 }
36 }
37 }
38 }
39
40 void enableAppNap()
41 {
42 if(activityId)
43 {
44 @autoreleasepool {
45 id processInfo = [NSProcessInfo processInfo];
46 if ([processInfo respondsToSelector:@selector(endActivity:)])
47 [processInfo endActivity:activityId];
48
49 [activityId release];
50 activityId = nil;
51 }
52 }
53 }
54
55 private:
56 NSObject* activityId;
57 };
58
59 CAppNapInhibitor::CAppNapInhibitor() : impl(new CAppNapImpl()) {}
60
61 CAppNapInhibitor::~CAppNapInhibitor() = default;
62
63 void CAppNapInhibitor::disableAppNap()
64 {
65 impl->disableAppNap();
66 }
67
68 void CAppNapInhibitor::enableAppNap()
69 {
70 impl->enableAppNap();
71 }
72