[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.
|
||||
</description>
|
||||
</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">
|
||||
<return type="bool" />
|
||||
<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.
|
||||
}
|
||||
|
||||
bool DisplayServerAndroid::window_is_focused(WindowID p_window) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DisplayServerAndroid::window_can_draw(DisplayServer::WindowID p_window) const {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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_
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -616,6 +616,8 @@ void Window::_update_from_window() {
|
|||
void Window::_clear_window() {
|
||||
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_window_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;
|
||||
|
||||
// If closing window was focused and has a parent, return focus.
|
||||
if (focused && transient_parent) {
|
||||
if (had_focus && transient_parent) {
|
||||
transient_parent->grab_focus();
|
||||
}
|
||||
|
||||
|
@ -1185,6 +1187,7 @@ void Window::_notification(int p_what) {
|
|||
{
|
||||
position = DisplayServer::get_singleton()->window_get_position(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_viewport_size(); // Then feed back to the viewport.
|
||||
|
@ -1762,6 +1765,9 @@ void Window::grab_focus() {
|
|||
|
||||
bool Window::has_focus() const {
|
||||
ERR_READ_THREAD_GUARD_V(false);
|
||||
if (window_id != DisplayServer::INVALID_WINDOW_ID) {
|
||||
return DisplayServer::get_singleton()->window_is_focused(window_id);
|
||||
}
|
||||
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_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_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_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 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_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; }
|
||||
|
||||
|
|
Loading…
Reference in New Issue