Merge pull request #33967 from Calinou/add-os-is-window-focused

Add an `OS.is_window_focused()` getter
This commit is contained in:
Rémi Verschelde 2020-01-06 11:39:18 +01:00 committed by GitHub
commit 8454804972
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 50 additions and 5 deletions

View File

@ -400,6 +400,10 @@ bool _OS::is_window_always_on_top() const {
return OS::get_singleton()->is_window_always_on_top(); return OS::get_singleton()->is_window_always_on_top();
} }
bool _OS::is_window_focused() const {
return OS::get_singleton()->is_window_focused();
}
void _OS::set_borderless_window(bool p_borderless) { void _OS::set_borderless_window(bool p_borderless) {
OS::get_singleton()->set_borderless_window(p_borderless); OS::get_singleton()->set_borderless_window(p_borderless);
} }
@ -1226,6 +1230,7 @@ void _OS::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_window_maximized"), &_OS::is_window_maximized); ClassDB::bind_method(D_METHOD("is_window_maximized"), &_OS::is_window_maximized);
ClassDB::bind_method(D_METHOD("set_window_always_on_top", "enabled"), &_OS::set_window_always_on_top); ClassDB::bind_method(D_METHOD("set_window_always_on_top", "enabled"), &_OS::set_window_always_on_top);
ClassDB::bind_method(D_METHOD("is_window_always_on_top"), &_OS::is_window_always_on_top); ClassDB::bind_method(D_METHOD("is_window_always_on_top"), &_OS::is_window_always_on_top);
ClassDB::bind_method(D_METHOD("is_window_focused"), &_OS::is_window_focused);
ClassDB::bind_method(D_METHOD("request_attention"), &_OS::request_attention); ClassDB::bind_method(D_METHOD("request_attention"), &_OS::request_attention);
ClassDB::bind_method(D_METHOD("get_real_window_size"), &_OS::get_real_window_size); ClassDB::bind_method(D_METHOD("get_real_window_size"), &_OS::get_real_window_size);
ClassDB::bind_method(D_METHOD("center_window"), &_OS::center_window); ClassDB::bind_method(D_METHOD("center_window"), &_OS::center_window);

View File

@ -198,6 +198,7 @@ public:
virtual bool is_window_maximized() const; virtual bool is_window_maximized() const;
virtual void set_window_always_on_top(bool p_enabled); virtual void set_window_always_on_top(bool p_enabled);
virtual bool is_window_always_on_top() const; virtual bool is_window_always_on_top() const;
virtual bool is_window_focused() const;
virtual void request_attention(); virtual void request_attention();
virtual void center_window(); virtual void center_window();
virtual void move_window_to_foreground(); virtual void move_window_to_foreground();

View File

@ -222,6 +222,7 @@ public:
virtual bool is_window_maximized() const { return true; } virtual bool is_window_maximized() const { return true; }
virtual void set_window_always_on_top(bool p_enabled) {} virtual void set_window_always_on_top(bool p_enabled) {}
virtual bool is_window_always_on_top() const { return false; } virtual bool is_window_always_on_top() const { return false; }
virtual bool is_window_focused() const { return true; }
virtual void set_console_visible(bool p_enabled) {} virtual void set_console_visible(bool p_enabled) {}
virtual bool is_console_visible() const { return false; } virtual bool is_console_visible() const { return false; }
virtual void request_attention() {} virtual void request_attention() {}

View File

@ -655,6 +655,14 @@
Returns [code]true[/code] if the window should always be on top of other windows. Returns [code]true[/code] if the window should always be on top of other windows.
</description> </description>
</method> </method>
<method name="is_window_focused" qualifiers="const">
<return type="bool">
</return>
<description>
Returns [code]true[/code] if the window is currently focused.
[b]Note:[/b] Only implemented on desktop platforms. On other platforms, it will always return [code]true[/code].
</description>
</method>
<method name="kill"> <method name="kill">
<return type="int" enum="Error"> <return type="int" enum="Error">
</return> </return>

View File

@ -121,6 +121,7 @@ public:
bool maximized; bool maximized;
bool zoomed; bool zoomed;
bool resizable; bool resizable;
bool window_focused;
Size2 window_size; Size2 window_size;
Rect2 restore_rect; Rect2 restore_rect;
@ -274,6 +275,7 @@ public:
virtual bool is_window_maximized() const; virtual bool is_window_maximized() const;
virtual void set_window_always_on_top(bool p_enabled); virtual void set_window_always_on_top(bool p_enabled);
virtual bool is_window_always_on_top() const; virtual bool is_window_always_on_top() const;
virtual bool is_window_focused() const;
virtual void request_attention(); virtual void request_attention();
virtual String get_joy_guid(int p_device) const; virtual String get_joy_guid(int p_device) const;

View File

@ -393,9 +393,6 @@ static Vector2 get_mouse_pos(NSPoint locationInWindow, CGFloat backingScaleFacto
} }
- (void)windowDidBecomeKey:(NSNotification *)notification { - (void)windowDidBecomeKey:(NSNotification *)notification {
//_GodotInputWindowFocus(window, GL_TRUE);
//_GodotPlatformSetCursorMode(window, window->cursorMode);
if (OS_OSX::singleton->get_main_loop()) { if (OS_OSX::singleton->get_main_loop()) {
get_mouse_pos( get_mouse_pos(
[OS_OSX::singleton->window_object mouseLocationOutsideOfEventStream], [OS_OSX::singleton->window_object mouseLocationOutsideOfEventStream],
@ -404,25 +401,31 @@ static Vector2 get_mouse_pos(NSPoint locationInWindow, CGFloat backingScaleFacto
OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN);
} }
OS_OSX::singleton->window_focused = true;
} }
- (void)windowDidResignKey:(NSNotification *)notification { - (void)windowDidResignKey:(NSNotification *)notification {
//_GodotInputWindowFocus(window, GL_FALSE);
//_GodotPlatformSetCursorMode(window, Godot_CURSOR_NORMAL);
if (OS_OSX::singleton->get_main_loop()) if (OS_OSX::singleton->get_main_loop())
OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT);
OS_OSX::singleton->window_focused = false;
} }
- (void)windowDidMiniaturize:(NSNotification *)notification { - (void)windowDidMiniaturize:(NSNotification *)notification {
OS_OSX::singleton->wm_minimized(true); OS_OSX::singleton->wm_minimized(true);
if (OS_OSX::singleton->get_main_loop()) if (OS_OSX::singleton->get_main_loop())
OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT);
OS_OSX::singleton->window_focused = false;
}; };
- (void)windowDidDeminiaturize:(NSNotification *)notification { - (void)windowDidDeminiaturize:(NSNotification *)notification {
OS_OSX::singleton->wm_minimized(false); OS_OSX::singleton->wm_minimized(false);
if (OS_OSX::singleton->get_main_loop()) if (OS_OSX::singleton->get_main_loop())
OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN);
OS_OSX::singleton->window_focused = true;
}; };
@end @end
@ -2607,6 +2610,10 @@ bool OS_OSX::is_window_always_on_top() const {
return [window_object level] == NSFloatingWindowLevel; return [window_object level] == NSFloatingWindowLevel;
} }
bool OS_OSX::is_window_focused() const {
return window_focused;
}
void OS_OSX::request_attention() { void OS_OSX::request_attention() {
[NSApp requestUserAttention:NSCriticalRequest]; [NSApp requestUserAttention:NSCriticalRequest];
@ -3059,6 +3066,7 @@ OS_OSX::OS_OSX() {
window_size = Vector2(1024, 600); window_size = Vector2(1024, 600);
zoomed = false; zoomed = false;
resizable = false; resizable = false;
window_focused = true;
Vector<Logger *> loggers; Vector<Logger *> loggers;
loggers.push_back(memnew(OSXTerminalLogger)); loggers.push_back(memnew(OSXTerminalLogger));

View File

@ -352,12 +352,14 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE) { if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE) {
main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN);
window_focused = true;
alt_mem = false; alt_mem = false;
control_mem = false; control_mem = false;
shift_mem = false; shift_mem = false;
} else { // WM_INACTIVE } else { // WM_INACTIVE
input->release_pressed_events(); input->release_pressed_events();
main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT);
window_focused = false;
alt_mem = false; alt_mem = false;
}; };
@ -2095,6 +2097,11 @@ bool OS_Windows::is_window_always_on_top() const {
return video_mode.always_on_top; return video_mode.always_on_top;
} }
bool OS_Windows::is_window_focused() const {
return window_focused;
}
void OS_Windows::set_console_visible(bool p_enabled) { void OS_Windows::set_console_visible(bool p_enabled) {
if (console_visible == p_enabled) if (console_visible == p_enabled)
return; return;
@ -3372,6 +3379,7 @@ OS_Windows::OS_Windows(HINSTANCE _hInstance) {
meta_mem = false; meta_mem = false;
minimized = false; minimized = false;
was_maximized = false; was_maximized = false;
window_focused = true;
console_visible = IsWindowVisible(GetConsoleWindow()); console_visible = IsWindowVisible(GetConsoleWindow());
//Note: Functions for pen input, available on Windows 8+ //Note: Functions for pen input, available on Windows 8+

View File

@ -274,6 +274,7 @@ protected:
bool maximized; bool maximized;
bool minimized; bool minimized;
bool borderless; bool borderless;
bool window_focused;
bool console_visible; bool console_visible;
bool was_maximized; bool was_maximized;
@ -322,6 +323,7 @@ public:
virtual bool is_window_maximized() const; virtual bool is_window_maximized() const;
virtual void set_window_always_on_top(bool p_enabled); virtual void set_window_always_on_top(bool p_enabled);
virtual bool is_window_always_on_top() const; virtual bool is_window_always_on_top() const;
virtual bool is_window_focused() const;
virtual void set_console_visible(bool p_enabled); virtual void set_console_visible(bool p_enabled);
virtual bool is_console_visible() const; virtual bool is_console_visible() const;
virtual void request_attention(); virtual void request_attention();

View File

@ -1684,6 +1684,10 @@ bool OS_X11::is_window_always_on_top() const {
return current_videomode.always_on_top; return current_videomode.always_on_top;
} }
bool OS_X11::is_window_focused() const {
return window_focused;
}
void OS_X11::set_borderless_window(bool p_borderless) { void OS_X11::set_borderless_window(bool p_borderless) {
if (get_borderless_window() == p_borderless) if (get_borderless_window() == p_borderless)
@ -2276,6 +2280,8 @@ void OS_X11::process_xevents() {
minimized = false; minimized = false;
window_has_focus = true; window_has_focus = true;
main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN);
window_focused = true;
if (mouse_mode_grab) { if (mouse_mode_grab) {
// Show and update the cursor if confined and the window regained focus. // Show and update the cursor if confined and the window regained focus.
if (mouse_mode == MOUSE_MODE_CONFINED) if (mouse_mode == MOUSE_MODE_CONFINED)
@ -2303,6 +2309,7 @@ void OS_X11::process_xevents() {
window_has_focus = false; window_has_focus = false;
input->release_pressed_events(); input->release_pressed_events();
main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT);
window_focused = false;
if (mouse_mode_grab) { if (mouse_mode_grab) {
//dear X11, I try, I really try, but you never work, you do whathever you want. //dear X11, I try, I really try, but you never work, you do whathever you want.
@ -3497,6 +3504,7 @@ OS_X11::OS_X11() {
xi.last_relative_time = 0; xi.last_relative_time = 0;
layered_window = false; layered_window = false;
minimized = false; minimized = false;
window_focused = true;
xim_style = 0L; xim_style = 0L;
mouse_mode = MOUSE_MODE_VISIBLE; mouse_mode = MOUSE_MODE_VISIBLE;
} }

View File

@ -195,6 +195,7 @@ class OS_X11 : public OS_Unix {
int video_driver_index; int video_driver_index;
bool maximized; bool maximized;
bool window_focused;
//void set_wm_border(bool p_enabled); //void set_wm_border(bool p_enabled);
void set_wm_fullscreen(bool p_enabled); void set_wm_fullscreen(bool p_enabled);
void set_wm_above(bool p_enabled); void set_wm_above(bool p_enabled);
@ -284,6 +285,7 @@ public:
virtual bool is_window_maximized() const; virtual bool is_window_maximized() const;
virtual void set_window_always_on_top(bool p_enabled); virtual void set_window_always_on_top(bool p_enabled);
virtual bool is_window_always_on_top() const; virtual bool is_window_always_on_top() const;
virtual bool is_window_focused() const;
virtual void request_attention(); virtual void request_attention();
virtual void set_borderless_window(bool p_borderless); virtual void set_borderless_window(bool p_borderless);