Skip to content

Commit 1bb7662

Browse files
committed
Refactor the sleep suppress. Rearrange some options.
1 parent 3c0ddd8 commit 1bb7662

File tree

7 files changed

+100
-117
lines changed

7 files changed

+100
-117
lines changed

SerialPrograms/Source/CommonFramework/Environment/SystemSleep.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@
1313
#include "SystemSleep_Apple.tpp"
1414
#else
1515
namespace PokemonAutomation{
16-
SystemSleepController(){}
17-
~SystemSleepController(){}
18-
void push_screen_on(){}
19-
void pop_screen_on(){}
20-
void push_no_sleep(){}
21-
void pop_no_sleep(){}
16+
SystemSleepController& SystemSleepController::instance(){
17+
static SystemSleepController controller;
18+
return controller;
19+
}
2220
}
2321
#endif
2422

SerialPrograms/Source/CommonFramework/Environment/SystemSleep.h

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,31 +26,25 @@ namespace PokemonAutomation{
2626
// Useful for running some programs like PokemonSV_VideoFastCodeEntry that require
2727
// the screen to be constantly on.
2828
class SystemSleepController{
29-
SystemSleepController();
30-
~SystemSleepController();
29+
protected:
30+
virtual ~SystemSleepController() = default;
31+
SystemSleepController() = default;
3132

3233
public:
33-
static SystemSleepController& instance(){
34-
static SystemSleepController controller;
35-
return controller;
36-
}
34+
static SystemSleepController& instance();
3735

3836
// Push: Add a request for this type of sleep-disable.
3937
// Pop: Remove a request for this type of sleep-disable.
4038
// The sleep-disable will be active as long as there is at least one
4139
// request is active for that type.
4240

4341
// Keep the screen on and prevent sleep.
44-
void push_screen_on();
45-
void pop_screen_on();
42+
virtual void push_screen_on(){}
43+
virtual void pop_screen_on(){}
4644

4745
// Allow the screen to turn off, but don't sleep.
48-
void push_no_sleep();
49-
void pop_no_sleep();
50-
51-
private:
52-
struct InternalController;
53-
std::unique_ptr<InternalController> m_data;
46+
virtual void push_no_sleep(){}
47+
virtual void pop_no_sleep(){}
5448
};
5549

5650

SerialPrograms/Source/CommonFramework/Environment/SystemSleep_Apple.tpp

Lines changed: 40 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -14,49 +14,66 @@ namespace PokemonAutomation{
1414

1515

1616

17-
struct SystemSleepController::InternalController{
18-
//public:
19-
InternalController();
20-
~InternalController();
17+
class AppleSleepController : public SystemSleepController{
18+
public:
19+
virtual ~AppleSleepController(){
20+
std::lock_guard<std::mutex> lg(m_lock);
21+
m_screen_on_requests = 0;
22+
m_no_sleep_requests = 0;
23+
update_state();
24+
}
25+
virtual void push_screen_on() override{
26+
std::lock_guard<std::mutex> lg(m_lock);
27+
m_screen_on_requests++;
28+
update_state();
29+
}
30+
virtual void pop_screen_on() override{
31+
std::lock_guard<std::mutex> lg(m_lock);
32+
m_screen_on_requests--;
33+
update_state();
34+
}
35+
virtual void push_no_sleep() override{
36+
std::lock_guard<std::mutex> lg(m_lock);
37+
m_no_sleep_requests++;
38+
update_state();
39+
}
40+
virtual void pop_no_sleep() override{
41+
std::lock_guard<std::mutex> lg(m_lock);
42+
m_no_sleep_requests--;
43+
update_state();
44+
}
2145

46+
47+
private:
2248
// Disable/Enable screen saver and OS sleep.
2349
// Return whether the setting is successful.
2450
bool prevent_sleep(bool prevent);
25-
2651
void update_state();
2752

28-
//private:
2953
bool disable_sleep();
3054
bool enable_sleep();
3155

32-
IOReturn m_prevention_succeeded;
33-
IOPMAssertionID m_session_id;
56+
IOReturn m_prevention_succeeded = kIOReturnError;
57+
IOPMAssertionID m_session_id = 0;
3458

35-
36-
std::mutex lock;
37-
size_t screen_on_requests = 0;
38-
size_t no_sleep_requests = 0;
59+
std::mutex m_lock;
60+
size_t m_screen_on_requests = 0;
61+
size_t m_no_sleep_requests = 0;
3962
};
4063

4164

4265
// Code from https://stackoverflow.com/questions/5596319/how-to-programmatically-prevent-a-mac-from-going-to-sleep/8461182#8461182
4366

44-
SystemSleepController::InternalController::InternalController()
45-
: m_prevention_succeeded(kIOReturnError), m_session_id(0) {}
4667

47-
SystemSleepController::InternalController::~InternalController(){
48-
enable_sleep();
49-
}
50-
51-
bool SystemSleepController::InternalController::prevent_sleep(bool prevent){
68+
bool AppleSleepController::prevent_sleep(bool prevent){
5269
if (prevent){
5370
return disable_sleep();
5471
}else{
5572
return enable_sleep();
5673
}
5774
}
5875

59-
bool SystemSleepController::InternalController::disable_sleep(){
76+
bool AppleSleepController::disable_sleep(){
6077
if (m_prevention_succeeded == kIOReturnSuccess){
6178
return true;
6279
}
@@ -81,7 +98,7 @@ bool SystemSleepController::InternalController::disable_sleep(){
8198
return true;
8299
}
83100

84-
bool SystemSleepController::InternalController::enable_sleep(){
101+
bool AppleSleepController::enable_sleep(){
85102
if (m_prevention_succeeded == kIOReturnSuccess){
86103
IOPMAssertionRelease(m_session_id);
87104
m_session_id = 0;
@@ -93,47 +110,16 @@ bool SystemSleepController::InternalController::enable_sleep(){
93110

94111

95112

96-
void SystemSleepController::InternalController::update_state(){
113+
void AppleSleepController::update_state(){
97114
// Must call under lock.
98115

99116
// TODO: Distiguish these two.
100-
prevent_sleep(screen_on_requests > 0 || no_sleep_requests > 0);
117+
prevent_sleep(m_screen_on_requests > 0 || m_no_sleep_requests > 0);
101118
}
102119

103120

104121

105122

106-
SystemSleepController::SystemSleepController()
107-
: m_data(new InternalController())
108-
{}
109-
SystemSleepController::~SystemSleepController(){
110-
std::lock_guard<std::mutex> lg(m_data->lock);
111-
m_data->screen_on_requests = 0;
112-
m_data->no_sleep_requests = 0;
113-
m_data->update_state();
114-
}
115-
void SystemSleepController::push_screen_on(){
116-
std::lock_guard<std::mutex> lg(m_data->lock);
117-
m_data->screen_on_requests++;
118-
m_data->update_state();
119-
}
120-
void SystemSleepController::pop_screen_on(){
121-
std::lock_guard<std::mutex> lg(m_data->lock);
122-
m_data->screen_on_requests--;
123-
m_data->update_state();
124-
}
125-
void SystemSleepController::push_no_sleep(){
126-
std::lock_guard<std::mutex> lg(m_data->lock);
127-
m_data->no_sleep_requests++;
128-
m_data->update_state();
129-
}
130-
void SystemSleepController::pop_no_sleep(){
131-
std::lock_guard<std::mutex> lg(m_data->lock);
132-
m_data->no_sleep_requests--;
133-
m_data->update_state();
134-
}
135-
136-
137123

138124

139125

SerialPrograms/Source/CommonFramework/Environment/SystemSleep_Windows.tpp

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,42 @@
1313
namespace PokemonAutomation{
1414

1515

16-
struct SystemSleepController::InternalController{
17-
std::mutex lock;
18-
size_t screen_on_requests = 0;
19-
size_t no_sleep_requests = 0;
16+
class WindowsSleepController : public SystemSleepController{
17+
public:
18+
virtual ~WindowsSleepController(){
19+
std::lock_guard<std::mutex> lg(m_lock);
20+
m_screen_on_requests = 0;
21+
m_no_sleep_requests = 0;
22+
update_state();
23+
}
24+
virtual void push_screen_on() override{
25+
std::lock_guard<std::mutex> lg(m_lock);
26+
m_screen_on_requests++;
27+
update_state();
28+
}
29+
virtual void pop_screen_on() override{
30+
std::lock_guard<std::mutex> lg(m_lock);
31+
m_screen_on_requests--;
32+
update_state();
33+
}
34+
virtual void push_no_sleep() override{
35+
std::lock_guard<std::mutex> lg(m_lock);
36+
m_no_sleep_requests++;
37+
update_state();
38+
}
39+
virtual void pop_no_sleep() override{
40+
std::lock_guard<std::mutex> lg(m_lock);
41+
m_no_sleep_requests--;
42+
update_state();
43+
}
2044

45+
private:
2146
void update_state(){
2247
// SetThreadExecutionState(ES_CONTINUOUS) only lasts as long as the
2348
// thread is alive. So we redispatch to the main thread.
2449
queue_on_main_thread([
25-
screen_on_requests = screen_on_requests,
26-
no_sleep_requests = no_sleep_requests
50+
screen_on_requests = m_screen_on_requests,
51+
no_sleep_requests = m_no_sleep_requests
2752
]{
2853
EXECUTION_STATE flags = ES_CONTINUOUS;
2954
if (screen_on_requests > 0){
@@ -44,42 +69,22 @@ struct SystemSleepController::InternalController{
4469
}
4570
});
4671
}
47-
};
4872

73+
private:
74+
std::mutex m_lock;
75+
size_t m_screen_on_requests = 0;
76+
size_t m_no_sleep_requests = 0;
77+
};
4978

5079

51-
SystemSleepController::SystemSleepController()
52-
: m_data(new InternalController())
53-
{}
54-
SystemSleepController::~SystemSleepController(){
55-
std::lock_guard<std::mutex> lg(m_data->lock);
56-
m_data->screen_on_requests = 0;
57-
m_data->no_sleep_requests = 0;
58-
m_data->update_state();
59-
}
60-
void SystemSleepController::push_screen_on(){
61-
std::lock_guard<std::mutex> lg(m_data->lock);
62-
m_data->screen_on_requests++;
63-
m_data->update_state();
64-
}
65-
void SystemSleepController::pop_screen_on(){
66-
std::lock_guard<std::mutex> lg(m_data->lock);
67-
m_data->screen_on_requests--;
68-
m_data->update_state();
69-
}
70-
void SystemSleepController::push_no_sleep(){
71-
std::lock_guard<std::mutex> lg(m_data->lock);
72-
m_data->no_sleep_requests++;
73-
m_data->update_state();
74-
}
75-
void SystemSleepController::pop_no_sleep(){
76-
std::lock_guard<std::mutex> lg(m_data->lock);
77-
m_data->no_sleep_requests--;
78-
m_data->update_state();
80+
SystemSleepController& SystemSleepController::instance(){
81+
static WindowsSleepController controller;
82+
return controller;
7983
}
8084

8185

8286

8387

8488

89+
8590
}

SerialPrograms/Source/CommonFramework/GlobalSettingsPanel.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ GlobalSettings::~GlobalSettings(){
100100
}
101101
GlobalSettings::GlobalSettings()
102102
: BatchOption(LockMode::LOCK_WHILE_RUNNING)
103+
, CHECK_FOR_UPDATES(
104+
"<b>Check for Updates:</b><br>Automatically check for updates.",
105+
LockMode::UNLOCK_WHILE_RUNNING,
106+
true
107+
)
103108
, SEND_ERROR_REPORTS(
104109
"<b>Send Error Reports:</b><br>"
105110
"Send error reports to the " + PROGRAM_NAME + " server to help them resolve issues and improve the program.",
@@ -118,11 +123,6 @@ GlobalSettings::GlobalSettings()
118123
LockMode::UNLOCK_WHILE_RUNNING,
119124
true
120125
)
121-
, CHECK_FOR_UPDATES(
122-
"<b>Check for Updates:</b><br>Automatically check for updates.",
123-
LockMode::UNLOCK_WHILE_RUNNING,
124-
true
125-
)
126126
, WINDOW_SIZE(
127127
"Window Size:",
128128
"Set the size of the window. Takes effect immediately.<br>"
@@ -231,10 +231,10 @@ GlobalSettings::GlobalSettings()
231231
"", ""
232232
)
233233
{
234+
PA_ADD_OPTION(CHECK_FOR_UPDATES);
234235
PA_ADD_OPTION(SEND_ERROR_REPORTS);
235236
PA_ADD_OPTION(STATS_FILE);
236237
PA_ADD_OPTION(ALL_STATS);
237-
PA_ADD_OPTION(CHECK_FOR_UPDATES);
238238
PA_ADD_OPTION(WINDOW_SIZE);
239239
PA_ADD_OPTION(THEME);
240240
#ifdef PA_ENABLE_SLEEP_SUPPRESS

SerialPrograms/Source/CommonFramework/GlobalSettingsPanel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ class GlobalSettings : public BatchOption, private ConfigOption::Listener{
8282
virtual void value_changed(void* object) override;
8383

8484
public:
85+
BooleanCheckBoxOption CHECK_FOR_UPDATES;
8586
BooleanCheckBoxOption SEND_ERROR_REPORTS;
8687

8788
StringOption STATS_FILE;
8889
BooleanCheckBoxOption ALL_STATS;
89-
BooleanCheckBoxOption CHECK_FOR_UPDATES;
9090

9191
ResolutionOption WINDOW_SIZE;
9292
ThemeSelectorOption THEME;

SerialPrograms/Source/CommonFramework/Options/Environment/SleepSuppressOption.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ SleepSuppressOptions::~SleepSuppressOptions(){
3131
}
3232
SleepSuppressOptions::SleepSuppressOptions()
3333
: GroupOption(
34-
"Suppress Screensaver/Sleep",
34+
"Suppress Screensaver/Sleep:",
3535
LockMode::UNLOCK_WHILE_RUNNING,
3636
false, true
3737
)

0 commit comments

Comments
 (0)