mirror of https://github.com/godotengine/godot
[DisplayServer] Add method to check if native window is focused.
This commit is contained in:
parent
9c41c4ecb6
commit
28db3c7158
|
|
@ -1258,6 +1258,13 @@
|
||||||
Returns the V-Sync mode of the given window.
|
Returns the V-Sync mode of the given window.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="window_is_focused" qualifiers="const">
|
||||||
|
<return type="bool" />
|
||||||
|
<param index="0" name="window_id" type="int" default="0" />
|
||||||
|
<description>
|
||||||
|
Returns [code]true[/code] if the window specified by [param window_id] is focused.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="window_is_maximize_allowed" qualifiers="const">
|
<method name="window_is_maximize_allowed" qualifiers="const">
|
||||||
<return type="bool" />
|
<return type="bool" />
|
||||||
<param index="0" name="window_id" type="int" default="0" />
|
<param index="0" name="window_id" type="int" default="0" />
|
||||||
|
|
|
||||||
|
|
@ -453,6 +453,10 @@ void DisplayServerAndroid::window_move_to_foreground(DisplayServer::WindowID p_w
|
||||||
// Not supported on Android.
|
// 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 {
|
bool DisplayServerAndroid::window_can_draw(DisplayServer::WindowID p_window) const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -178,6 +178,7 @@ public:
|
||||||
|
|
||||||
virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override;
|
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 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;
|
virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -193,6 +193,7 @@ public:
|
||||||
|
|
||||||
virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override;
|
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 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;
|
virtual float screen_get_max_scale() const override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -562,6 +562,10 @@ void DisplayServerIOS::window_move_to_foreground(WindowID p_window) {
|
||||||
// Probably not supported for iOS
|
// Probably not supported for iOS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DisplayServerIOS::window_is_focused(WindowID p_window) const {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
float DisplayServerIOS::screen_get_max_scale() const {
|
float DisplayServerIOS::screen_get_max_scale() const {
|
||||||
return screen_get_scale(SCREEN_OF_MAIN_WINDOW);
|
return screen_get_scale(SCREEN_OF_MAIN_WINDOW);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2626,6 +2626,15 @@ void DisplayServerX11::window_move_to_foreground(WindowID p_window) {
|
||||||
XFlush(x11_display);
|
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 {
|
bool DisplayServerX11::window_can_draw(WindowID p_window) const {
|
||||||
//this seems to be all that is provided by X11
|
//this seems to be all that is provided by X11
|
||||||
return window_get_mode(p_window) != WINDOW_MODE_MINIMIZED;
|
return window_get_mode(p_window) != WINDOW_MODE_MINIMIZED;
|
||||||
|
|
|
||||||
|
|
@ -477,6 +477,7 @@ public:
|
||||||
virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override;
|
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 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;
|
virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,7 @@ public:
|
||||||
bool no_focus = false;
|
bool no_focus = false;
|
||||||
bool is_popup = false;
|
bool is_popup = false;
|
||||||
bool mpass = false;
|
bool mpass = false;
|
||||||
|
bool focused = false;
|
||||||
|
|
||||||
Rect2i parent_safe_rect;
|
Rect2i parent_safe_rect;
|
||||||
};
|
};
|
||||||
|
|
@ -390,6 +391,7 @@ public:
|
||||||
|
|
||||||
virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override;
|
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 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;
|
virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
bool DisplayServerMacOS::window_can_draw(WindowID p_window) const {
|
||||||
return window_get_mode(p_window) != WINDOW_MODE_MINIMIZED;
|
return window_get_mode(p_window) != WINDOW_MODE_MINIMIZED;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -314,6 +314,7 @@
|
||||||
|
|
||||||
[self windowDidResize:notification]; // Emit resize event, to ensure content is resized if the window was resized while it was hidden.
|
[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->set_last_focused_window(window_id);
|
||||||
ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_IN);
|
ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_IN);
|
||||||
}
|
}
|
||||||
|
|
@ -330,6 +331,7 @@
|
||||||
[(GodotButtonView *)wd.window_button_view displayButtons];
|
[(GodotButtonView *)wd.window_button_view displayButtons];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wd.focused = false;
|
||||||
ds->release_pressed_events();
|
ds->release_pressed_events();
|
||||||
ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_OUT);
|
ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_OUT);
|
||||||
}
|
}
|
||||||
|
|
@ -342,6 +344,7 @@
|
||||||
|
|
||||||
DisplayServerMacOS::WindowData &wd = ds->get_window(window_id);
|
DisplayServerMacOS::WindowData &wd = ds->get_window(window_id);
|
||||||
|
|
||||||
|
wd.focused = false;
|
||||||
ds->release_pressed_events();
|
ds->release_pressed_events();
|
||||||
ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_OUT);
|
ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_OUT);
|
||||||
}
|
}
|
||||||
|
|
@ -353,9 +356,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayServerMacOS::WindowData &wd = ds->get_window(window_id);
|
DisplayServerMacOS::WindowData &wd = ds->get_window(window_id);
|
||||||
|
if ([wd.window_object isKeyWindow]) {
|
||||||
ds->set_last_focused_window(window_id);
|
wd.focused = true;
|
||||||
ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_IN);
|
ds->set_last_focused_window(window_id);
|
||||||
|
ds->send_window_event(wd, DisplayServerMacOS::WINDOW_EVENT_FOCUS_IN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
||||||
|
|
@ -1073,6 +1073,10 @@ void DisplayServerWeb::window_move_to_foreground(WindowID p_window) {
|
||||||
// Not supported.
|
// Not supported.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DisplayServerWeb::window_is_focused(WindowID p_window) const {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool DisplayServerWeb::window_can_draw(WindowID p_window) const {
|
bool DisplayServerWeb::window_can_draw(WindowID p_window) const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -211,6 +211,7 @@ public:
|
||||||
|
|
||||||
virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override;
|
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 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;
|
virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
bool DisplayServerWindows::window_can_draw(WindowID p_window) const {
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -594,6 +594,7 @@ public:
|
||||||
|
|
||||||
virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override;
|
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 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;
|
virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -616,6 +616,8 @@ void Window::_update_from_window() {
|
||||||
void Window::_clear_window() {
|
void Window::_clear_window() {
|
||||||
ERR_FAIL_COND(window_id == DisplayServer::INVALID_WINDOW_ID);
|
ERR_FAIL_COND(window_id == DisplayServer::INVALID_WINDOW_ID);
|
||||||
|
|
||||||
|
bool had_focus = has_focus();
|
||||||
|
|
||||||
DisplayServer::get_singleton()->window_set_rect_changed_callback(Callable(), window_id);
|
DisplayServer::get_singleton()->window_set_rect_changed_callback(Callable(), window_id);
|
||||||
DisplayServer::get_singleton()->window_set_window_event_callback(Callable(), window_id);
|
DisplayServer::get_singleton()->window_set_window_event_callback(Callable(), window_id);
|
||||||
DisplayServer::get_singleton()->window_set_input_event_callback(Callable(), window_id);
|
DisplayServer::get_singleton()->window_set_input_event_callback(Callable(), window_id);
|
||||||
|
|
@ -638,7 +640,7 @@ void Window::_clear_window() {
|
||||||
window_id = DisplayServer::INVALID_WINDOW_ID;
|
window_id = DisplayServer::INVALID_WINDOW_ID;
|
||||||
|
|
||||||
// If closing window was focused and has a parent, return focus.
|
// If closing window was focused and has a parent, return focus.
|
||||||
if (focused && transient_parent) {
|
if (had_focus && transient_parent) {
|
||||||
transient_parent->grab_focus();
|
transient_parent->grab_focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1185,6 +1187,7 @@ void Window::_notification(int p_what) {
|
||||||
{
|
{
|
||||||
position = DisplayServer::get_singleton()->window_get_position(window_id);
|
position = DisplayServer::get_singleton()->window_get_position(window_id);
|
||||||
size = DisplayServer::get_singleton()->window_get_size(window_id);
|
size = DisplayServer::get_singleton()->window_get_size(window_id);
|
||||||
|
focused = DisplayServer::get_singleton()->window_is_focused(window_id);
|
||||||
}
|
}
|
||||||
_update_window_size(); // Inform DisplayServer of minimum and maximum size.
|
_update_window_size(); // Inform DisplayServer of minimum and maximum size.
|
||||||
_update_viewport_size(); // Then feed back to the viewport.
|
_update_viewport_size(); // Then feed back to the viewport.
|
||||||
|
|
@ -1762,6 +1765,9 @@ void Window::grab_focus() {
|
||||||
|
|
||||||
bool Window::has_focus() const {
|
bool Window::has_focus() const {
|
||||||
ERR_READ_THREAD_GUARD_V(false);
|
ERR_READ_THREAD_GUARD_V(false);
|
||||||
|
if (window_id != DisplayServer::INVALID_WINDOW_ID) {
|
||||||
|
return DisplayServer::get_singleton()->window_is_focused(window_id);
|
||||||
|
}
|
||||||
return focused;
|
return focused;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -716,6 +716,7 @@ void DisplayServer::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("window_request_attention", "window_id"), &DisplayServer::window_request_attention, DEFVAL(MAIN_WINDOW_ID));
|
ClassDB::bind_method(D_METHOD("window_request_attention", "window_id"), &DisplayServer::window_request_attention, DEFVAL(MAIN_WINDOW_ID));
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("window_move_to_foreground", "window_id"), &DisplayServer::window_move_to_foreground, DEFVAL(MAIN_WINDOW_ID));
|
ClassDB::bind_method(D_METHOD("window_move_to_foreground", "window_id"), &DisplayServer::window_move_to_foreground, DEFVAL(MAIN_WINDOW_ID));
|
||||||
|
ClassDB::bind_method(D_METHOD("window_is_focused", "window_id"), &DisplayServer::window_is_focused, DEFVAL(MAIN_WINDOW_ID));
|
||||||
ClassDB::bind_method(D_METHOD("window_can_draw", "window_id"), &DisplayServer::window_can_draw, DEFVAL(MAIN_WINDOW_ID));
|
ClassDB::bind_method(D_METHOD("window_can_draw", "window_id"), &DisplayServer::window_can_draw, DEFVAL(MAIN_WINDOW_ID));
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("window_set_transient", "window_id", "parent_window_id"), &DisplayServer::window_set_transient);
|
ClassDB::bind_method(D_METHOD("window_set_transient", "window_id", "parent_window_id"), &DisplayServer::window_set_transient);
|
||||||
|
|
|
||||||
|
|
@ -424,6 +424,7 @@ public:
|
||||||
|
|
||||||
virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) = 0;
|
virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) = 0;
|
||||||
virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) = 0;
|
virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) = 0;
|
||||||
|
virtual bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const = 0;
|
||||||
|
|
||||||
virtual void window_set_window_buttons_offset(const Vector2i &p_offset, WindowID p_window = MAIN_WINDOW_ID) {}
|
virtual void window_set_window_buttons_offset(const Vector2i &p_offset, WindowID p_window = MAIN_WINDOW_ID) {}
|
||||||
virtual Vector3i window_get_safe_title_margins(WindowID p_window = MAIN_WINDOW_ID) const { return Vector3i(); }
|
virtual Vector3i window_get_safe_title_margins(WindowID p_window = MAIN_WINDOW_ID) const { return Vector3i(); }
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,7 @@ public:
|
||||||
|
|
||||||
void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override {}
|
void window_request_attention(WindowID p_window = MAIN_WINDOW_ID) override {}
|
||||||
void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) override {}
|
void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID) override {}
|
||||||
|
bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const override { return true; };
|
||||||
|
|
||||||
bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override { return false; }
|
bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const override { return false; }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue