Browse Source

Merge pull request #63900 from bruvzg/macos_keep_on

Rémi Verschelde 3 years ago
parent
commit
ea98d284d9
2 changed files with 26 additions and 0 deletions
  1. 4 0
      platform/macos/display_server_macos.h
  2. 22 0
      platform/macos/display_server_macos.mm

+ 4 - 0
platform/macos/display_server_macos.h

@@ -50,6 +50,7 @@
 #import <ApplicationServices/ApplicationServices.h>
 #import <CoreVideo/CoreVideo.h>
 #import <Foundation/Foundation.h>
+#import <IOKit/pwr_mgt/IOPMLib.h>
 
 #undef BitMap
 #undef CursorShape
@@ -171,6 +172,8 @@ private:
 
 	HashMap<WindowID, WindowData> 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 @@ public:
 	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<int> get_window_list() const override;
 

+ 22 - 0
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 @@ float DisplayServerMacOS::screen_get_refresh_rate(int p_screen) const {
 	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 {
 	_THREAD_SAFE_METHOD_
 
@@ -3266,9 +3281,16 @@ DisplayServerMacOS::DisplayServerMacOS(const String &p_rendering_driver, WindowM
 		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<WindowID, WindowData>::Iterator E = windows.begin(); E;) {
 		HashMap<WindowID, WindowData>::Iterator F = E;