Implement screen_set_keep_on
for macOS
This commit is contained in:
parent
cf46ef42a9
commit
2f9be29c73
2 changed files with 26 additions and 0 deletions
|
@ -50,6 +50,7 @@
|
||||||
#import <ApplicationServices/ApplicationServices.h>
|
#import <ApplicationServices/ApplicationServices.h>
|
||||||
#import <CoreVideo/CoreVideo.h>
|
#import <CoreVideo/CoreVideo.h>
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <IOKit/pwr_mgt/IOPMLib.h>
|
||||||
|
|
||||||
#undef BitMap
|
#undef BitMap
|
||||||
#undef CursorShape
|
#undef CursorShape
|
||||||
|
@ -171,6 +172,8 @@ private:
|
||||||
|
|
||||||
HashMap<WindowID, WindowData> windows;
|
HashMap<WindowID, WindowData> windows;
|
||||||
|
|
||||||
|
IOPMAssertionID screen_keep_on_assertion = kIOPMNullAssertionID;
|
||||||
|
|
||||||
const NSMenu *_get_menu_root(const String &p_menu_root) const;
|
const NSMenu *_get_menu_root(const String &p_menu_root) const;
|
||||||
NSMenu *_get_menu_root(const String &p_menu_root);
|
NSMenu *_get_menu_root(const String &p_menu_root);
|
||||||
|
|
||||||
|
@ -299,6 +302,7 @@ public:
|
||||||
virtual float screen_get_max_scale() const override;
|
virtual float screen_get_max_scale() const override;
|
||||||
virtual Rect2i screen_get_usable_rect(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
|
virtual Rect2i screen_get_usable_rect(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
|
||||||
virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
|
virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
|
||||||
|
virtual void screen_set_keep_on(bool p_enable) override;
|
||||||
|
|
||||||
virtual Vector<int> get_window_list() const override;
|
virtual Vector<int> get_window_list() const override;
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
|
|
||||||
#include "tts_macos.h"
|
#include "tts_macos.h"
|
||||||
|
|
||||||
|
#include "core/config/project_settings.h"
|
||||||
#include "core/io/marshalls.h"
|
#include "core/io/marshalls.h"
|
||||||
#include "core/math/geometry_2d.h"
|
#include "core/math/geometry_2d.h"
|
||||||
#include "core/os/keyboard.h"
|
#include "core/os/keyboard.h"
|
||||||
|
@ -1891,6 +1892,20 @@ float DisplayServerMacOS::screen_get_refresh_rate(int p_screen) const {
|
||||||
return SCREEN_REFRESH_RATE_FALLBACK;
|
return SCREEN_REFRESH_RATE_FALLBACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DisplayServerMacOS::screen_set_keep_on(bool p_enable) {
|
||||||
|
if (screen_keep_on_assertion) {
|
||||||
|
IOPMAssertionRelease(screen_keep_on_assertion);
|
||||||
|
screen_keep_on_assertion = kIOPMNullAssertionID;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_enable) {
|
||||||
|
String app_name_string = ProjectSettings::get_singleton()->get("application/config/name");
|
||||||
|
NSString *name = [NSString stringWithUTF8String:(app_name_string.is_empty() ? "Godot Engine" : app_name_string.utf8().get_data())];
|
||||||
|
NSString *reason = @"Godot Engine running with display/window/energy_saving/keep_screen_on = true";
|
||||||
|
IOPMAssertionCreateWithDescription(kIOPMAssertPreventUserIdleDisplaySleep, (__bridge CFStringRef)name, (__bridge CFStringRef)reason, (__bridge CFStringRef)reason, nullptr, 0, nullptr, &screen_keep_on_assertion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Vector<DisplayServer::WindowID> DisplayServerMacOS::get_window_list() const {
|
Vector<DisplayServer::WindowID> DisplayServerMacOS::get_window_list() const {
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
|
@ -3266,9 +3281,16 @@ DisplayServerMacOS::DisplayServerMacOS(const String &p_rendering_driver, WindowM
|
||||||
RendererCompositorRD::make_current();
|
RendererCompositorRD::make_current();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
screen_set_keep_on(GLOBAL_DEF("display/window/energy_saving/keep_screen_on", true));
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayServerMacOS::~DisplayServerMacOS() {
|
DisplayServerMacOS::~DisplayServerMacOS() {
|
||||||
|
if (screen_keep_on_assertion) {
|
||||||
|
IOPMAssertionRelease(screen_keep_on_assertion);
|
||||||
|
screen_keep_on_assertion = kIOPMNullAssertionID;
|
||||||
|
}
|
||||||
|
|
||||||
// Destroy all windows.
|
// Destroy all windows.
|
||||||
for (HashMap<WindowID, WindowData>::Iterator E = windows.begin(); E;) {
|
for (HashMap<WindowID, WindowData>::Iterator E = windows.begin(); E;) {
|
||||||
HashMap<WindowID, WindowData>::Iterator F = E;
|
HashMap<WindowID, WindowData>::Iterator F = E;
|
||||||
|
|
Loading…
Reference in a new issue