Add a separate application focus/in notification out from Window focus notification.

This commit is contained in:
Juan Linietsky 2020-06-29 20:47:18 -03:00
parent 27605769c4
commit 438c380458
20 changed files with 65 additions and 35 deletions

View File

@ -48,8 +48,10 @@ void MainLoop::_bind_methods() {
BIND_CONSTANT(NOTIFICATION_WM_ABOUT); BIND_CONSTANT(NOTIFICATION_WM_ABOUT);
BIND_CONSTANT(NOTIFICATION_CRASH); BIND_CONSTANT(NOTIFICATION_CRASH);
BIND_CONSTANT(NOTIFICATION_OS_IME_UPDATE); BIND_CONSTANT(NOTIFICATION_OS_IME_UPDATE);
BIND_CONSTANT(NOTIFICATION_APP_RESUMED); BIND_CONSTANT(NOTIFICATION_APPLICATION_RESUMED);
BIND_CONSTANT(NOTIFICATION_APP_PAUSED); 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"))); ADD_SIGNAL(MethodInfo("on_request_permissions_result", PropertyInfo(Variant::STRING, "permission"), PropertyInfo(Variant::BOOL, "granted")));
}; };

View File

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

View File

@ -435,14 +435,14 @@ void EditorNode::_notification(int p_what) {
/* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */ /* DO NOT LOAD SCENES HERE, WAIT FOR FILE SCANNING AND REIMPORT TO COMPLETE */
} break; } break;
case NOTIFICATION_WM_FOCUS_IN: { case NOTIFICATION_APPLICATION_FOCUS_IN: {
// Restore the original FPS cap after focusing back on the editor // 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"))); 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(); EditorFileSystem::get_singleton()->scan_changes();
} break; } 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 // 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"))); OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/unfocused_low_processor_mode_sleep_usec")));
} break; } break;

View File

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

View File

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

View File

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

View File

@ -338,7 +338,7 @@ void ShaderEditor::_menu_option(int p_option) {
} }
void ShaderEditor::_notification(int p_what) { 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(); _check_for_external_edit();
} }
} }

View File

@ -200,7 +200,7 @@ void ShaderFileEditor::_update_options() {
} }
void ShaderFileEditor::_notification(int p_what) { 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()) { if (is_visible_in_tree() && shader_file.is_valid()) {
_update_options(); _update_options();
} }

View File

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

View File

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

View File

@ -457,7 +457,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_onRendererResumed(JNI
return; return;
if (os_android->get_main_loop()) { 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; return;
if (os_android->get_main_loop()) { 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);
} }
} }
} }

View File

@ -1790,6 +1790,12 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
// Restore mouse mode // Restore mouse mode
_set_mouse_mode_impl(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; break;
} }
case WM_KILLFOCUS: { case WM_KILLFOCUS: {
@ -1805,6 +1811,19 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
} }
touch_state.clear(); 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; break;
} }
case WM_ACTIVATE: // Watch For Window Activate Message case WM_ACTIVATE: // Watch For Window Activate Message

View File

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

View File

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

View File

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

View File

@ -2857,8 +2857,8 @@ void Node::_bind_methods() {
BIND_CONSTANT(NOTIFICATION_WM_MOUSE_ENTER); BIND_CONSTANT(NOTIFICATION_WM_MOUSE_ENTER);
BIND_CONSTANT(NOTIFICATION_WM_MOUSE_EXIT); BIND_CONSTANT(NOTIFICATION_WM_MOUSE_EXIT);
BIND_CONSTANT(NOTIFICATION_WM_FOCUS_IN); BIND_CONSTANT(NOTIFICATION_WM_WINDOW_FOCUS_IN);
BIND_CONSTANT(NOTIFICATION_WM_FOCUS_OUT); BIND_CONSTANT(NOTIFICATION_WM_WINDOW_FOCUS_OUT);
BIND_CONSTANT(NOTIFICATION_WM_CLOSE_REQUEST); BIND_CONSTANT(NOTIFICATION_WM_CLOSE_REQUEST);
BIND_CONSTANT(NOTIFICATION_WM_GO_BACK_REQUEST); BIND_CONSTANT(NOTIFICATION_WM_GO_BACK_REQUEST);
BIND_CONSTANT(NOTIFICATION_WM_SIZE_CHANGED); BIND_CONSTANT(NOTIFICATION_WM_SIZE_CHANGED);
@ -2867,8 +2867,10 @@ void Node::_bind_methods() {
BIND_CONSTANT(NOTIFICATION_WM_ABOUT); BIND_CONSTANT(NOTIFICATION_WM_ABOUT);
BIND_CONSTANT(NOTIFICATION_CRASH); BIND_CONSTANT(NOTIFICATION_CRASH);
BIND_CONSTANT(NOTIFICATION_OS_IME_UPDATE); BIND_CONSTANT(NOTIFICATION_OS_IME_UPDATE);
BIND_CONSTANT(NOTIFICATION_APP_RESUMED); BIND_CONSTANT(NOTIFICATION_APPLICATION_RESUMED);
BIND_CONSTANT(NOTIFICATION_APP_PAUSED); 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_INHERIT);
BIND_ENUM_CONSTANT(PAUSE_MODE_STOP); BIND_ENUM_CONSTANT(PAUSE_MODE_STOP);

View File

@ -243,8 +243,8 @@ public:
NOTIFICATION_WM_MOUSE_ENTER = 1002, NOTIFICATION_WM_MOUSE_ENTER = 1002,
NOTIFICATION_WM_MOUSE_EXIT = 1003, NOTIFICATION_WM_MOUSE_EXIT = 1003,
NOTIFICATION_WM_FOCUS_IN = 1004, NOTIFICATION_WM_WINDOW_FOCUS_IN = 1004,
NOTIFICATION_WM_FOCUS_OUT = 1005, NOTIFICATION_WM_WINDOW_FOCUS_OUT = 1005,
NOTIFICATION_WM_CLOSE_REQUEST = 1006, NOTIFICATION_WM_CLOSE_REQUEST = 1006,
NOTIFICATION_WM_GO_BACK_REQUEST = 1007, NOTIFICATION_WM_GO_BACK_REQUEST = 1007,
NOTIFICATION_WM_SIZE_CHANGED = 1008, NOTIFICATION_WM_SIZE_CHANGED = 1008,
@ -255,8 +255,10 @@ public:
NOTIFICATION_WM_ABOUT = MainLoop::NOTIFICATION_WM_ABOUT, NOTIFICATION_WM_ABOUT = MainLoop::NOTIFICATION_WM_ABOUT,
NOTIFICATION_CRASH = MainLoop::NOTIFICATION_CRASH, NOTIFICATION_CRASH = MainLoop::NOTIFICATION_CRASH,
NOTIFICATION_OS_IME_UPDATE = MainLoop::NOTIFICATION_OS_IME_UPDATE, NOTIFICATION_OS_IME_UPDATE = MainLoop::NOTIFICATION_OS_IME_UPDATE,
NOTIFICATION_APP_RESUMED = MainLoop::NOTIFICATION_APP_RESUMED, NOTIFICATION_APPLICATION_RESUMED = MainLoop::NOTIFICATION_APPLICATION_RESUMED,
NOTIFICATION_APP_PAUSED = MainLoop::NOTIFICATION_APP_PAUSED 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
}; };

View File

@ -587,9 +587,11 @@ void SceneTree::_notification(int p_notification) {
case NOTIFICATION_OS_IME_UPDATE: case NOTIFICATION_OS_IME_UPDATE:
case NOTIFICATION_WM_ABOUT: case NOTIFICATION_WM_ABOUT:
case NOTIFICATION_CRASH: case NOTIFICATION_CRASH:
case NOTIFICATION_APP_RESUMED: case NOTIFICATION_APPLICATION_RESUMED:
case NOTIFICATION_APP_PAUSED: { case NOTIFICATION_APPLICATION_PAUSED:
get_root()->propagate_notification(p_notification); 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; } break;
default: default:

View File

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

View File

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