mirror of
https://github.com/godotengine/godot.git
synced 2024-11-29 15:42:29 +00:00
Merge pull request #39986 from reduz/app-inout-notification
Add a separate application focus/in notification
This commit is contained in:
commit
5f2295f2df
@ -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")));
|
||||
};
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
};
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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) {
|
||||
|
@ -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: {
|
||||
|
Loading…
Reference in New Issue
Block a user