/ src / qt / macos_appnap.mm
macos_appnap.mm
 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  }