Jelajahi Sumber

Merge pull request #39986 from reduz/app-inout-notification

Add a separate application focus/in notification
Rémi Verschelde 5 tahun lalu
induk
melakukan
5f2295f2df

+ 4 - 2
core/os/main_loop.cpp

@@ -48,8 +48,10 @@ void MainLoop::_bind_methods() {
 	BIND_CONSTANT(NOTIFICATION_WM_ABOUT);
 	BIND_CONSTANT(NOTIFICATION_CRASH);
 	BIND_CONSTANT(NOTIFICATION_OS_IME_UPDATE);
-	BIND_CONSTANT(NOTIFICATION_APP_RESUMED);
-	BIND_CONSTANT(NOTIFICATION_APP_PAUSED);
+	BIND_CONSTANT(NOTIFICATION_APPLICATION_RESUMED);
+	BIND_CONSTANT(NOTIFICATION_APPLICATION_PAUSED);
+	BIND_CONSTANT(NOTIFICATION_APPLICATION_FOCUS_IN);
+	BIND_CONSTANT(NOTIFICATION_APPLICATION_FOCUS_OUT);
 
 	ADD_SIGNAL(MethodInfo("on_request_permissions_result", PropertyInfo(Variant::STRING, "permission"), PropertyInfo(Variant::BOOL, "granted")));
 };

+ 4 - 2
core/os/main_loop.h

@@ -52,8 +52,10 @@ public:
 		NOTIFICATION_WM_ABOUT = 2011,
 		NOTIFICATION_CRASH = 2012,
 		NOTIFICATION_OS_IME_UPDATE = 2013,
-		NOTIFICATION_APP_RESUMED = 2014,
-		NOTIFICATION_APP_PAUSED = 2015,
+		NOTIFICATION_APPLICATION_RESUMED = 2014,
+		NOTIFICATION_APPLICATION_PAUSED = 2015,
+		NOTIFICATION_APPLICATION_FOCUS_IN = 2016,
+		NOTIFICATION_APPLICATION_FOCUS_OUT = 2017,
 	};
 
 	virtual void init();

+ 2 - 2
editor/editor_node.cpp

@@ -435,14 +435,14 @@ void EditorNode::_notification(int p_what) {
 			/* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */
 		} break;
 
-		case NOTIFICATION_WM_FOCUS_IN: {
+		case NOTIFICATION_APPLICATION_FOCUS_IN: {
 			// Restore the original FPS cap after focusing back on the editor
 			OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec")));
 
 			EditorFileSystem::get_singleton()->scan_changes();
 		} break;
 
-		case NOTIFICATION_WM_FOCUS_OUT: {
+		case NOTIFICATION_APPLICATION_FOCUS_OUT: {
 			// Set a low FPS cap to decrease CPU/GPU usage while the editor is unfocused
 			OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/unfocused_low_processor_mode_sleep_usec")));
 		} break;

+ 1 - 1
editor/editor_plugin_settings.cpp

@@ -39,7 +39,7 @@
 #include "scene/gui/margin_container.h"
 
 void EditorPluginSettings::_notification(int p_what) {
-	if (p_what == NOTIFICATION_WM_FOCUS_IN) {
+	if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN) {
 		update_plugins();
 	} else if (p_what == Node::NOTIFICATION_READY) {
 		plugin_config_dialog->connect_compat("plugin_ready", EditorNode::get_singleton(), "_on_plugin_ready");

+ 2 - 2
editor/editor_spin_slider.cpp

@@ -182,8 +182,8 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) {
 }
 
 void EditorSpinSlider::_notification(int p_what) {
-	if (p_what == NOTIFICATION_WM_FOCUS_OUT ||
-			p_what == NOTIFICATION_WM_FOCUS_IN ||
+	if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_OUT ||
+			p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN ||
 			p_what == NOTIFICATION_EXIT_TREE) {
 		if (grabbing_spinner) {
 			grabber->hide();

+ 1 - 1
editor/plugins/script_editor_plugin.cpp

@@ -1337,7 +1337,7 @@ void ScriptEditor::_notification(int p_what) {
 			editor->disconnect("stop_pressed", callable_mp(this, &ScriptEditor::_editor_stop));
 		} break;
 
-		case NOTIFICATION_WM_FOCUS_IN: {
+		case NOTIFICATION_WM_WINDOW_FOCUS_IN: {
 			_test_script_times_on_disk();
 			_update_modified_scripts_for_external_editor();
 		} break;

+ 1 - 1
editor/plugins/shader_editor_plugin.cpp

@@ -338,7 +338,7 @@ void ShaderEditor::_menu_option(int p_option) {
 }
 
 void ShaderEditor::_notification(int p_what) {
-	if (p_what == NOTIFICATION_WM_FOCUS_IN) {
+	if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN) {
 		_check_for_external_edit();
 	}
 }

+ 1 - 1
editor/plugins/shader_file_editor_plugin.cpp

@@ -200,7 +200,7 @@ void ShaderFileEditor::_update_options() {
 }
 
 void ShaderFileEditor::_notification(int p_what) {
-	if (p_what == NOTIFICATION_WM_FOCUS_IN) {
+	if (p_what == NOTIFICATION_WM_WINDOW_FOCUS_IN) {
 		if (is_visible_in_tree() && shader_file.is_valid()) {
 			_update_options();
 		}

+ 1 - 1
editor/plugins/texture_region_editor_plugin.cpp

@@ -780,7 +780,7 @@ void TextureRegionEditor::_notification(int p_what) {
 				_update_autoslice();
 			}
 		} break;
-		case NOTIFICATION_WM_FOCUS_IN: {
+		case NOTIFICATION_WM_WINDOW_FOCUS_IN: {
 			// This happens when the user leaves the Editor and returns,
 			// they could have changed the textures, so the cache is cleared.
 			cache_map.clear();

+ 2 - 2
modules/gdnative/nativescript/nativescript.cpp

@@ -1853,7 +1853,7 @@ void NativeReloadNode::_notification(int p_what) {
 #ifdef TOOLS_ENABLED
 
 	switch (p_what) {
-		case NOTIFICATION_WM_FOCUS_OUT: {
+		case NOTIFICATION_APPLICATION_FOCUS_OUT: {
 			if (unloaded) {
 				break;
 			}
@@ -1887,7 +1887,7 @@ void NativeReloadNode::_notification(int p_what) {
 
 		} break;
 
-		case NOTIFICATION_WM_FOCUS_IN: {
+		case NOTIFICATION_APPLICATION_FOCUS_IN: {
 			if (!unloaded) {
 				break;
 			}

+ 2 - 2
platform/android/java_godot_lib_jni.cpp

@@ -457,7 +457,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_onRendererResumed(JNI
 		return;
 
 	if (os_android->get_main_loop()) {
-		os_android->get_main_loop()->notification(MainLoop::NOTIFICATION_APP_RESUMED);
+		os_android->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_RESUMED);
 	}
 }
 
@@ -466,7 +466,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_onRendererPaused(JNIE
 		return;
 
 	if (os_android->get_main_loop()) {
-		os_android->get_main_loop()->notification(MainLoop::NOTIFICATION_APP_PAUSED);
+		os_android->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_PAUSED);
 	}
 }
 }

+ 19 - 0
platform/windows/display_server_windows.cpp

@@ -1790,6 +1790,12 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
 			// Restore mouse mode
 			_set_mouse_mode_impl(mouse_mode);
 
+			if (!app_focused) {
+				if (OS::get_singleton()->get_main_loop()) {
+					OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_FOCUS_IN);
+				}
+				app_focused = true;
+			}
 			break;
 		}
 		case WM_KILLFOCUS: {
@@ -1805,6 +1811,19 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
 			}
 			touch_state.clear();
 
+			bool self_steal = false;
+			HWND new_hwnd = (HWND)wParam;
+			if (IsWindow(new_hwnd)) {
+				self_steal = true;
+			}
+
+			if (!self_steal) {
+				if (OS::get_singleton()->get_main_loop()) {
+					OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_FOCUS_OUT);
+				}
+				app_focused = false;
+			}
+
 			break;
 		}
 		case WM_ACTIVATE: // Watch For Window Activate Message

+ 1 - 0
platform/windows/display_server_windows.h

@@ -317,6 +317,7 @@ private:
 	int pressrc;
 	HINSTANCE hInstance; // Holds The Instance Of The Application
 	String rendering_driver;
+	bool app_focused = false;
 
 	struct WindowData {
 		HWND hWnd;

+ 2 - 2
scene/gui/line_edit.cpp

@@ -688,12 +688,12 @@ void LineEdit::_notification(int p_what) {
 			update_placeholder_width();
 			update();
 		} break;
-		case NOTIFICATION_WM_FOCUS_IN: {
+		case NOTIFICATION_WM_WINDOW_FOCUS_IN: {
 			window_has_focus = true;
 			draw_caret = true;
 			update();
 		} break;
-		case NOTIFICATION_WM_FOCUS_OUT: {
+		case NOTIFICATION_WM_WINDOW_FOCUS_OUT: {
 			window_has_focus = false;
 			draw_caret = false;
 			update();

+ 2 - 2
scene/gui/text_edit.cpp

@@ -603,12 +603,12 @@ void TextEdit::_notification(int p_what) {
 			_update_wrap_at();
 			syntax_highlighting_cache.clear();
 		} break;
-		case NOTIFICATION_WM_FOCUS_IN: {
+		case NOTIFICATION_WM_WINDOW_FOCUS_IN: {
 			window_has_focus = true;
 			draw_caret = true;
 			update();
 		} break;
-		case NOTIFICATION_WM_FOCUS_OUT: {
+		case NOTIFICATION_WM_WINDOW_FOCUS_OUT: {
 			window_has_focus = false;
 			draw_caret = false;
 			update();

+ 6 - 4
scene/main/node.cpp

@@ -2857,8 +2857,8 @@ void Node::_bind_methods() {
 
 	BIND_CONSTANT(NOTIFICATION_WM_MOUSE_ENTER);
 	BIND_CONSTANT(NOTIFICATION_WM_MOUSE_EXIT);
-	BIND_CONSTANT(NOTIFICATION_WM_FOCUS_IN);
-	BIND_CONSTANT(NOTIFICATION_WM_FOCUS_OUT);
+	BIND_CONSTANT(NOTIFICATION_WM_WINDOW_FOCUS_IN);
+	BIND_CONSTANT(NOTIFICATION_WM_WINDOW_FOCUS_OUT);
 	BIND_CONSTANT(NOTIFICATION_WM_CLOSE_REQUEST);
 	BIND_CONSTANT(NOTIFICATION_WM_GO_BACK_REQUEST);
 	BIND_CONSTANT(NOTIFICATION_WM_SIZE_CHANGED);
@@ -2867,8 +2867,10 @@ void Node::_bind_methods() {
 	BIND_CONSTANT(NOTIFICATION_WM_ABOUT);
 	BIND_CONSTANT(NOTIFICATION_CRASH);
 	BIND_CONSTANT(NOTIFICATION_OS_IME_UPDATE);
-	BIND_CONSTANT(NOTIFICATION_APP_RESUMED);
-	BIND_CONSTANT(NOTIFICATION_APP_PAUSED);
+	BIND_CONSTANT(NOTIFICATION_APPLICATION_RESUMED);
+	BIND_CONSTANT(NOTIFICATION_APPLICATION_PAUSED);
+	BIND_CONSTANT(NOTIFICATION_APPLICATION_FOCUS_IN);
+	BIND_CONSTANT(NOTIFICATION_APPLICATION_FOCUS_OUT);
 
 	BIND_ENUM_CONSTANT(PAUSE_MODE_INHERIT);
 	BIND_ENUM_CONSTANT(PAUSE_MODE_STOP);

+ 6 - 4
scene/main/node.h

@@ -243,8 +243,8 @@ public:
 
 		NOTIFICATION_WM_MOUSE_ENTER = 1002,
 		NOTIFICATION_WM_MOUSE_EXIT = 1003,
-		NOTIFICATION_WM_FOCUS_IN = 1004,
-		NOTIFICATION_WM_FOCUS_OUT = 1005,
+		NOTIFICATION_WM_WINDOW_FOCUS_IN = 1004,
+		NOTIFICATION_WM_WINDOW_FOCUS_OUT = 1005,
 		NOTIFICATION_WM_CLOSE_REQUEST = 1006,
 		NOTIFICATION_WM_GO_BACK_REQUEST = 1007,
 		NOTIFICATION_WM_SIZE_CHANGED = 1008,
@@ -255,8 +255,10 @@ public:
 		NOTIFICATION_WM_ABOUT = MainLoop::NOTIFICATION_WM_ABOUT,
 		NOTIFICATION_CRASH = MainLoop::NOTIFICATION_CRASH,
 		NOTIFICATION_OS_IME_UPDATE = MainLoop::NOTIFICATION_OS_IME_UPDATE,
-		NOTIFICATION_APP_RESUMED = MainLoop::NOTIFICATION_APP_RESUMED,
-		NOTIFICATION_APP_PAUSED = MainLoop::NOTIFICATION_APP_PAUSED
+		NOTIFICATION_APPLICATION_RESUMED = MainLoop::NOTIFICATION_APPLICATION_RESUMED,
+		NOTIFICATION_APPLICATION_PAUSED = MainLoop::NOTIFICATION_APPLICATION_PAUSED,
+		NOTIFICATION_APPLICATION_FOCUS_IN = MainLoop::NOTIFICATION_APPLICATION_FOCUS_IN,
+		NOTIFICATION_APPLICATION_FOCUS_OUT = MainLoop::NOTIFICATION_APPLICATION_FOCUS_OUT
 
 	};
 

+ 5 - 3
scene/main/scene_tree.cpp

@@ -587,9 +587,11 @@ void SceneTree::_notification(int p_notification) {
 		case NOTIFICATION_OS_IME_UPDATE:
 		case NOTIFICATION_WM_ABOUT:
 		case NOTIFICATION_CRASH:
-		case NOTIFICATION_APP_RESUMED:
-		case NOTIFICATION_APP_PAUSED: {
-			get_root()->propagate_notification(p_notification);
+		case NOTIFICATION_APPLICATION_RESUMED:
+		case NOTIFICATION_APPLICATION_PAUSED:
+		case NOTIFICATION_APPLICATION_FOCUS_IN:
+		case NOTIFICATION_APPLICATION_FOCUS_OUT: {
+			get_root()->propagate_notification(p_notification); //pass these to nodes, since they are mirrored
 		} break;
 
 		default:

+ 1 - 1
scene/main/viewport.cpp

@@ -815,7 +815,7 @@ void Viewport::_notification(int p_what) {
 
 		} break;
 		case NOTIFICATION_WM_MOUSE_EXIT:
-		case NOTIFICATION_WM_FOCUS_OUT: {
+		case NOTIFICATION_WM_WINDOW_FOCUS_OUT: {
 			_drop_physics_mouseover();
 
 			if (gui.mouse_focus && !gui.forced_mouse_focus) {

+ 2 - 2
scene/main/window.cpp

@@ -316,13 +316,13 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) {
 		} break;
 		case DisplayServer::WINDOW_EVENT_FOCUS_IN: {
 			focused = true;
-			_propagate_window_notification(this, NOTIFICATION_WM_FOCUS_IN);
+			_propagate_window_notification(this, NOTIFICATION_WM_WINDOW_FOCUS_IN);
 			emit_signal("focus_entered");
 
 		} break;
 		case DisplayServer::WINDOW_EVENT_FOCUS_OUT: {
 			focused = false;
-			_propagate_window_notification(this, NOTIFICATION_WM_FOCUS_OUT);
+			_propagate_window_notification(this, NOTIFICATION_WM_WINDOW_FOCUS_OUT);
 			emit_signal("focus_exited");
 		} break;
 		case DisplayServer::WINDOW_EVENT_CLOSE_REQUEST: {