summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthankyouverycool <66646555+thankyouverycool@users.noreply.github.com>2022-01-24 14:14:34 -0500
committerAndreas Kling <kling@serenityos.org>2022-01-26 23:19:54 +0100
commitaefe3ef539dbdddcbe5d3a74ffb7c2b53b469027 (patch)
tree6e1f773756c3211b173646c3a75cde468c9fe82a
parentac4583660b2c7da33ac13b4733f993767bb08644 (diff)
downloadserenity-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.
-rw-r--r--Userland/Libraries/LibGUI/Window.cpp14
-rw-r--r--Userland/Libraries/LibGUI/Window.h5
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;