소스 검색

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.
Andreas Kling 3 년 전
부모
커밋
3e6aaa3520
1개의 변경된 파일18개의 추가작업 그리고 3개의 파일을 삭제
  1. 18 3
      Userland/Libraries/LibWeb/Page/EventHandler.cpp

+ 18 - 3
Userland/Libraries/LibWeb/Page/EventHandler.cpp

@@ -266,9 +266,24 @@ bool EventHandler::handle_mousedown(const Gfx::IntPoint& position, unsigned butt
         if (button == GUI::MouseButton::Primary) {
             auto result = layout_root()->hit_test(position, Layout::HitTestType::TextCursor);
             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 }, {} });
-                m_in_mouse_selection = true;
+
+                // See if we want to focus something.
+                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) {
             if (auto* page = m_browsing_context.page())