LibWeb: Update focus target when handling mousedown events

If the mousedown event hits something with is_focusable()==true,
we now update the document's focused element *instead* of placing the
text cursor at the focusable element.

This allows you to begin editing input elements by clicking them.

This feels very hackish and we'll need to come up with something nicer.
This commit is contained in:
Andreas Kling 2022-02-06 19:28:09 +01:00
commit 3e6aaa3520
Notes: sideshowbarker 2024-07-17 19:41:39 +09:00

View file

@ -266,9 +266,24 @@ bool EventHandler::handle_mousedown(const Gfx::IntPoint& position, unsigned butt
if (button == GUI::MouseButton::Primary) { if (button == GUI::MouseButton::Primary) {
auto result = layout_root()->hit_test(position, Layout::HitTestType::TextCursor); auto result = layout_root()->hit_test(position, Layout::HitTestType::TextCursor);
if (result.layout_node && result.layout_node->dom_node()) { if (result.layout_node && result.layout_node->dom_node()) {
m_browsing_context.set_cursor_position(DOM::Position(*result.layout_node->dom_node(), result.index_in_node));
layout_root()->set_selection({ { result.layout_node, result.index_in_node }, {} }); // See if we want to focus something.
m_in_mouse_selection = true; bool did_focus_something = false;
for (auto candidate = node; candidate; candidate = candidate->parent()) {
if (candidate->is_focusable()) {
document->set_focused_element(verify_cast<DOM::Element>(candidate.ptr()));
did_focus_something = true;
break;
}
}
// If we didn't focus anything, place the document text cursor at the mouse position.
// FIXME: This is all rather strange. Find a better solution.
if (!did_focus_something) {
m_browsing_context.set_cursor_position(DOM::Position(*result.layout_node->dom_node(), result.index_in_node));
layout_root()->set_selection({ { result.layout_node, result.index_in_node }, {} });
m_in_mouse_selection = true;
}
} }
} else if (button == GUI::MouseButton::Secondary) { } else if (button == GUI::MouseButton::Secondary) {
if (auto* page = m_browsing_context.page()) if (auto* page = m_browsing_context.page())