diff options
Diffstat (limited to 'platform')
| -rw-r--r-- | platform/android/display_server_android.cpp | 4 | ||||
| -rw-r--r-- | platform/android/display_server_android.h | 1 | ||||
| -rw-r--r-- | platform/ios/display_server_ios.h | 1 | ||||
| -rw-r--r-- | platform/ios/display_server_ios.mm | 4 | ||||
| -rw-r--r-- | platform/linuxbsd/x11/display_server_x11.cpp | 9 | ||||
| -rw-r--r-- | platform/linuxbsd/x11/display_server_x11.h | 1 | ||||
| -rw-r--r-- | platform/macos/display_server_macos.h | 2 | ||||
| -rw-r--r-- | platform/macos/display_server_macos.mm | 9 | ||||
| -rw-r--r-- | platform/macos/godot_window_delegate.mm | 11 | ||||
| -rw-r--r-- | platform/web/display_server_web.cpp | 4 | ||||
| -rw-r--r-- | platform/web/display_server_web.h | 1 | ||||
| -rw-r--r-- | platform/windows/display_server_windows.cpp | 9 | ||||
| -rw-r--r-- | platform/windows/display_server_windows.h | 1 |
13 files changed, 54 insertions, 3 deletions
diff --git a/platform/android/display_server_android.cpp b/platform/android/display_server_android.cpp index 4d9a49c35c..f02b292868 100644 --- a/platform/android/display_server_android.cpp +++ b/platform/android/display_server_android.cpp @@ -453,6 +453,10 @@ void DisplayServerAndroid::window_move_to_foreground(DisplayServer::WindowID p_w // Not supported on Android. } +bool DisplayServerAndroid::window_is_focused(WindowID p_window) const { + return true; +} + bool DisplayServerAndroid::window_can_draw(DisplayServer::WindowID p_window) const { return true; } diff --git a/platform/android/display_server_android.h b/platform/android/display_server_android.h index ad1cbddb08..e0ad2cb916 100644 --- a/platform/android/display_server_android.h +++ b/platform/android/display_server_android.h @@ -178,6 +178,7 @@ public: virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) override; + virtual bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const override; virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override; diff --git a/platform/ios/display_server_ios.h b/platform/ios/display_server_ios.h index b29bdeec62..da16449c61 100644 --- a/platform/ios/display_server_ios.h +++ b/platform/ios/display_server_ios.h @@ -193,6 +193,7 @@ public: virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) override; + virtual bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const override; virtual float screen_get_max_scale() const override; diff --git a/platform/ios/display_server_ios.mm b/platform/ios/display_server_ios.mm index bfb09b6861..7d91274a0c 100644 --- a/platform/ios/display_server_ios.mm +++ b/platform/ios/display_server_ios.mm @@ -562,6 +562,10 @@ void DisplayServerIOS::window_move_to_foreground(WindowID p_window) { // Probably not supported for iOS } +bool DisplayServerIOS::window_is_focused(WindowID p_window) const { + return true; +} + float DisplayServerIOS::screen_get_max_scale() const { return screen_get_scale(SCREEN_OF_MAIN_WINDOW); } diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp index 83b6fb7628..a607e26ac5 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -2626,6 +2626,15 @@ void DisplayServerX11::window_move_to_foreground(WindowID p_window) { XFlush(x11_display); } +bool DisplayServerX11::window_is_focused(WindowID p_window) const { + _THREAD_SAFE_METHOD_ + + ERR_FAIL_COND_V(!windows.has(p_window), false); + const WindowData &wd = windows[p_window]; + + return wd.focused; +} + bool DisplayServerX11::window_can_draw(WindowID p_window) const { //this seems to be all that is provided by X11 return window_get_mode(p_window) != WINDOW_MODE_MINIMIZED; diff --git a/platform/linuxbsd/x11/display_server_x11.h b/platform/linuxbsd/x11/display_server_x11.h index 176a1ffb9a..180362923b 100644 --- a/platform/linuxbsd/x11/display_server_x11.h +++ b/platform/linuxbsd/x11/display_server_x11.h @@ -477,6 +477,7 @@ public: virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) override; + virtual bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const override; virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override; diff --git a/platform/macos/display_server_macos.h b/platform/macos/display_server_macos.h index 5944cc8abd..93fa93b259 100644 --- a/platform/macos/display_server_macos.h +++ b/platform/macos/display_server_macos.h @@ -117,6 +117,7 @@ public: bool no_focus = false; bool is_popup = false; bool mpass = false; + bool focused = false; Rect2i parent_safe_rect; }; @@ -390,6 +391,7 @@ public: virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) override; + virtual bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const override; virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override; diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm index b77715d648..a0a851b7dc 100644 --- a/platform/macos/display_server_macos.mm +++ b/platform/macos/display_server_macos.mm @@ -3075,6 +3075,15 @@ void DisplayServerMacOS::window_move_to_foreground(WindowID p_window) { } } +bool DisplayServerMacOS::window_is_focused(WindowID p_window) const { + _THREAD_SAFE_METHOD_ + + ERR_FAIL_COND_V(!windows.has(p_window), false); + const WindowData &wd = windows[p_window]; + + return wd.focused; +} + bool DisplayServerMacOS::window_can_draw(WindowID p_window) const { return window_get_mode(p_window) != WINDOW_MODE_MINIMIZED; } diff --git a/platform/macos/godot_window_delegate.mm b/platform/macos/godot_window_delegate.mm index df971c5139..1c6dbb1981 100644 --- a/platform/macos/godot_window_delegate.mm +++ b/platform/macos/godot_window_delegate.mm @@ -314,6 +314,7 @@ [self windowDidResize:notification]; // Emit resize event, to ensure content is resized if the window was resized while it was hidden. + wd.focused = true; ds->set_last_focused_window(window_id); ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_IN); } @@ -330,6 +331,7 @@ [(GodotButtonView *)wd.window_button_view displayButtons]; } + wd.focused = false; ds->release_pressed_events(); ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_OUT); } @@ -342,6 +344,7 @@ DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); + wd.focused = false; ds->release_pressed_events(); ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_OUT); } @@ -353,9 +356,11 @@ } DisplayServerMacOS::WindowData &wd = ds->get_window(window_id); - - ds->set_last_focused_window(window_id); - ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_IN); + if ([wd.window_object isKeyWindow]) { + wd.focused = true; + ds->set_last_focused_window(window_id); + ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_IN); + } } @end diff --git a/platform/web/display_server_web.cpp b/platform/web/display_server_web.cpp index 6cb56b404f..951ce110e0 100644 --- a/platform/web/display_server_web.cpp +++ b/platform/web/display_server_web.cpp @@ -1073,6 +1073,10 @@ void DisplayServerWeb::window_move_to_foreground(WindowID p_window) { // Not supported. } +bool DisplayServerWeb::window_is_focused(WindowID p_window) const { + return true; +} + bool DisplayServerWeb::window_can_draw(WindowID p_window) const { return true; } diff --git a/platform/web/display_server_web.h b/platform/web/display_server_web.h index 3b03b102cd..a4fd75f33b 100644 --- a/platform/web/display_server_web.h +++ b/platform/web/display_server_web.h @@ -211,6 +211,7 @@ public: virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) override; + virtual bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const override; virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override; diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index fc208eb4bb..ea93c47ec5 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -1615,6 +1615,15 @@ void DisplayServerWindows::window_move_to_foreground(WindowID p_window) { } } +bool DisplayServerWindows::window_is_focused(WindowID p_window) const { + _THREAD_SAFE_METHOD_ + + ERR_FAIL_COND_V(!windows.has(p_window), false); + const WindowData &wd = windows[p_window]; + + return wd.window_focused; +} + bool DisplayServerWindows::window_can_draw(WindowID p_window) const { _THREAD_SAFE_METHOD_ diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index ae2cd4e8b5..7228de7d31 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -594,6 +594,7 @@ public: virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) override; + virtual bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const override; virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override; |
