1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 03:37:43 +00:00

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.
This commit is contained in:
thankyouverycool 2022-01-24 14:14:34 -05:00 committed by Andreas Kling
parent ac4583660b
commit aefe3ef539
2 changed files with 19 additions and 0 deletions

View file

@ -453,6 +453,10 @@ void Window::handle_key_event(KeyEvent& event)
focus_a_widget_if_possible(FocusSource::Keyboard); 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) if (m_focused_widget)
return m_focused_widget->dispatch_event(event, this); return m_focused_widget->dispatch_event(event, this);
if (m_main_widget) if (m_main_widget)
@ -732,6 +736,13 @@ void Window::set_main_widget(Widget* widget)
update(); 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) void Window::set_focused_widget(Widget* widget, FocusSource source)
{ {
if (m_focused_widget == widget) 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) if (!m_focused_widget && m_previously_focused_widget)
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) { if (previously_focused_widget) {
Core::EventLoop::current().post_event(*previously_focused_widget, make<FocusEvent>(Event::FocusOut, source)); Core::EventLoop::current().post_event(*previously_focused_widget, make<FocusEvent>(Event::FocusOut, source));
previously_focused_widget->update(); previously_focused_widget->update();

View file

@ -151,6 +151,10 @@ public:
return *widget; 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; } Widget* focused_widget() { return m_focused_widget; }
const Widget* focused_widget() const { return m_focused_widget; } const Widget* focused_widget() const { return m_focused_widget; }
void set_focused_widget(Widget*, FocusSource = FocusSource::Programmatic); void set_focused_widget(Widget*, FocusSource = FocusSource::Programmatic);
@ -265,6 +269,7 @@ private:
float m_opacity_when_windowless { 1.0f }; float m_opacity_when_windowless { 1.0f };
float m_alpha_hit_threshold { 0.0f }; float m_alpha_hit_threshold { 0.0f };
RefPtr<Widget> m_main_widget; RefPtr<Widget> m_main_widget;
WeakPtr<Widget> m_default_return_key_widget;
WeakPtr<Widget> m_focused_widget; WeakPtr<Widget> m_focused_widget;
WeakPtr<Widget> m_automatic_cursor_tracking_widget; WeakPtr<Widget> m_automatic_cursor_tracking_widget;
WeakPtr<Widget> m_hovered_widget; WeakPtr<Widget> m_hovered_widget;