diff options
author | thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> | 2022-01-24 14:14:34 -0500 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-01-26 23:19:54 +0100 |
commit | aefe3ef539dbdddcbe5d3a74ffb7c2b53b469027 (patch) | |
tree | 6e1f773756c3211b173646c3a75cde468c9fe82a /Userland/Libraries | |
parent | ac4583660b2c7da33ac13b4733f993767bb08644 (diff) | |
download | serenity-aefe3ef539dbdddcbe5d3a74ffb7c2b53b469027.zip |
LibGUI: Allow Windows to set a default return key widget
The default return key widget takes precendence when dispatching
return key events with the exception of focused buttons.
Diffstat (limited to 'Userland/Libraries')
-rw-r--r-- | Userland/Libraries/LibGUI/Window.cpp | 14 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/Window.h | 5 |
2 files changed, 19 insertions, 0 deletions
diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp index 539fc680c2..6042ec3ed5 100644 --- a/Userland/Libraries/LibGUI/Window.cpp +++ b/Userland/Libraries/LibGUI/Window.cpp @@ -453,6 +453,10 @@ void Window::handle_key_event(KeyEvent& event) focus_a_widget_if_possible(FocusSource::Keyboard); } + if (m_default_return_key_widget && event.key() == Key_Return) + if (!m_focused_widget || !is<Button>(m_focused_widget.ptr())) + return default_return_key_widget()->dispatch_event(event, this); + if (m_focused_widget) return m_focused_widget->dispatch_event(event, this); if (m_main_widget) @@ -732,6 +736,13 @@ void Window::set_main_widget(Widget* widget) update(); } +void Window::set_default_return_key_widget(Widget* widget) +{ + if (m_default_return_key_widget == widget) + return; + m_default_return_key_widget = widget; +} + void Window::set_focused_widget(Widget* widget, FocusSource source) { if (m_focused_widget == widget) @@ -743,6 +754,9 @@ void Window::set_focused_widget(Widget* widget, FocusSource source) if (!m_focused_widget && m_previously_focused_widget) m_focused_widget = m_previously_focused_widget; + if (m_default_return_key_widget && m_default_return_key_widget->on_focus_change) + m_default_return_key_widget->on_focus_change(m_default_return_key_widget->is_focused(), source); + if (previously_focused_widget) { Core::EventLoop::current().post_event(*previously_focused_widget, make<FocusEvent>(Event::FocusOut, source)); previously_focused_widget->update(); diff --git a/Userland/Libraries/LibGUI/Window.h b/Userland/Libraries/LibGUI/Window.h index dffb0adaa9..e75a14cbb7 100644 --- a/Userland/Libraries/LibGUI/Window.h +++ b/Userland/Libraries/LibGUI/Window.h @@ -151,6 +151,10 @@ public: return *widget; } + Widget* default_return_key_widget() { return m_default_return_key_widget; } + Widget const* default_return_key_widget() const { return m_default_return_key_widget; } + void set_default_return_key_widget(Widget*); + Widget* focused_widget() { return m_focused_widget; } const Widget* focused_widget() const { return m_focused_widget; } void set_focused_widget(Widget*, FocusSource = FocusSource::Programmatic); @@ -265,6 +269,7 @@ private: float m_opacity_when_windowless { 1.0f }; float m_alpha_hit_threshold { 0.0f }; RefPtr<Widget> m_main_widget; + WeakPtr<Widget> m_default_return_key_widget; WeakPtr<Widget> m_focused_widget; WeakPtr<Widget> m_automatic_cursor_tracking_widget; WeakPtr<Widget> m_hovered_widget; |