diff options
-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; |