From 2f9be29c73dec490671725a9d003dd158c0e47f2 Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Thu, 4 Aug 2022 10:38:26 +0300 Subject: [PATCH] Implement `screen_set_keep_on` for macOS --- platform/macos/display_server_macos.h | 4 ++++ platform/macos/display_server_macos.mm | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/platform/macos/display_server_macos.h b/platform/macos/display_server_macos.h index 41031ec81be0..65f9a3d4b803 100644 --- a/platform/macos/display_server_macos.h +++ b/platform/macos/display_server_macos.h @@ -50,6 +50,7 @@ #import #import #import +#import #undef BitMap #undef CursorShape @@ -171,6 +172,8 @@ class DisplayServerMacOS : public DisplayServer { HashMap windows; + IOPMAssertionID screen_keep_on_assertion = kIOPMNullAssertionID; + const NSMenu *_get_menu_root(const String &p_menu_root) const; NSMenu *_get_menu_root(const String &p_menu_root); @@ -299,6 +302,7 @@ class DisplayServerMacOS : public DisplayServer { virtual float screen_get_max_scale() 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 void screen_set_keep_on(bool p_enable) override; virtual Vector get_window_list() const override; diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm index b9bc182dded2..2f5efae69ea5 100644 --- a/platform/macos/display_server_macos.mm +++ b/platform/macos/display_server_macos.mm @@ -39,6 +39,7 @@ #include "tts_macos.h" +#include "core/config/project_settings.h" #include "core/io/marshalls.h" #include "core/math/geometry_2d.h" #include "core/os/keyboard.h" @@ -1891,6 +1892,20 @@ 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 DisplayServerMacOS::get_window_list() const { _THREAD_SAFE_METHOD_ @@ -3266,9 +3281,16 @@ Point2i window_position( RendererCompositorRD::make_current(); } #endif + + screen_set_keep_on(GLOBAL_DEF("display/window/energy_saving/keep_screen_on", true)); } DisplayServerMacOS::~DisplayServerMacOS() { + if (screen_keep_on_assertion) { + IOPMAssertionRelease(screen_keep_on_assertion); + screen_keep_on_assertion = kIOPMNullAssertionID; + } + // Destroy all windows. for (HashMap::Iterator E = windows.begin(); E;) { HashMap::Iterator F = E;