Преглед изворни кода

LibWeb: Give MouseEvents the correct offsetX and offsetY values

Andreas Kling пре 5 година
родитељ
комит
55c845713a
2 измењених фајлова са 20 додато и 4 уклоњено
  1. 19 4
      Libraries/LibWeb/HtmlView.cpp
  2. 1 0
      Libraries/LibWeb/HtmlView.h

+ 19 - 4
Libraries/LibWeb/HtmlView.cpp

@@ -185,7 +185,8 @@ void HtmlView::mousemove_event(GUI::MouseEvent& event)
 #endif
                 is_hovering_link = true;
             }
-            const_cast<Node*>(node)->dispatch_event(MouseEvent::create("mousemove", 2, 3));
+            auto offset = compute_mouse_event_offset(event.position(), *result.layout_node);
+            const_cast<Node*>(node)->dispatch_event(MouseEvent::create("mousemove", offset.x(), offset.y()));
         }
         if (m_in_mouse_selection) {
             layout_root()->selection().set_end({ result.layout_node, result.index_in_node });
@@ -236,7 +237,8 @@ void HtmlView::mousedown_event(GUI::MouseEvent& event)
                     m_in_mouse_selection = true;
                 }
             }
-            const_cast<Node*>(node)->dispatch_event(MouseEvent::create("mousedown", 2, 3));
+            auto offset = compute_mouse_event_offset(event.position(), *result.layout_node);
+            const_cast<Node*>(node)->dispatch_event(MouseEvent::create("mousedown", offset.x(), offset.y()));
         }
     }
     if (hovered_node_changed)
@@ -251,8 +253,10 @@ void HtmlView::mouseup_event(GUI::MouseEvent& event)
 
     auto result = layout_root()->hit_test(to_content_position(event.position()));
     if (result.layout_node) {
-        if (auto* node = result.layout_node->node())
-            const_cast<Node*>(node)->dispatch_event(MouseEvent::create("mouseup", 2, 3));
+        if (auto* node = result.layout_node->node()) {
+            auto offset = compute_mouse_event_offset(event.position(), *result.layout_node);
+            const_cast<Node*>(node)->dispatch_event(MouseEvent::create("mouseup", offset.x(), offset.y()));
+        }
     }
 
     if (event.button() == GUI::MouseButton::Left) {
@@ -423,4 +427,15 @@ void HtmlView::did_scroll()
     main_frame().set_viewport_rect(visible_content_rect());
 }
 
+Gfx::Point HtmlView::compute_mouse_event_offset(const Gfx::Point& event_position, const LayoutNode& layout_node) const
+{
+    auto content_event_position = to_content_position(event_position);
+    auto top_left_of_layout_node = layout_node.box_type_agnostic_position();
+
+    return {
+        content_event_position.x() - static_cast<int>(top_left_of_layout_node.x()),
+        content_event_position.y() - static_cast<int>(top_left_of_layout_node.y())
+    };
+}
+
 }

+ 1 - 0
Libraries/LibWeb/HtmlView.h

@@ -78,6 +78,7 @@ private:
 
     void layout_and_sync_size();
     void dump_selection(const char* event_name);
+    Gfx::Point compute_mouse_event_offset(const Gfx::Point&, const LayoutNode&) const;
 
     RefPtr<Web::Frame> m_main_frame;