Browse Source

LibWeb: Improving cursor behavior in editable DOM nodes

This patch makes two modifications to improve the behavior of cursors in
editable DOM nodes, such as HTML tags with the contenteditable
attribute.

When the cursor blink cycle is reset in an editable DOM node, a repaint
should be initiated. For this, set_needs_display() needs to be called on
the layout node. Previously, the cursor blink cycle would not reset
properly and moving the cursor with the arrow keys did not feel
intuitive.

Furthermore, this modifies one of the conditions necessary to actually
paint the cursor, which previously prevented it from being painted when
at the end of a text node, after all the text present.
Max Wipfli 4 years ago
parent
commit
08d09c4afb

+ 2 - 1
Userland/Libraries/LibWeb/Layout/TextNode.cpp

@@ -86,7 +86,8 @@ void TextNode::paint_cursor_if_needed(PaintContext& context, const LineBoxFragme
     if (frame().cursor_position().node() != &dom_node())
         return;
 
-    if (!(frame().cursor_position().offset() >= (unsigned)fragment.start() && frame().cursor_position().offset() < (unsigned)(fragment.start() + fragment.length())))
+    // NOTE: This checks if the cursor is before the start or after the end of the fragment. If it is at the end, after all text, it should still be painted.
+    if (frame().cursor_position().offset() < (unsigned)fragment.start() || frame().cursor_position().offset() > (unsigned)(fragment.start() + fragment.length()))
         return;
 
     if (!fragment.layout_node().dom_node() || !fragment.layout_node().dom_node()->is_editable())

+ 1 - 0
Userland/Libraries/LibWeb/Page/Frame.cpp

@@ -62,6 +62,7 @@ void Frame::reset_cursor_blink_cycle()
 {
     m_cursor_blink_state = true;
     m_cursor_blink_timer->restart();
+    m_cursor_position.node()->layout_node()->set_needs_display();
 }
 
 bool Frame::is_focused_frame() const