1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 04:58:13 +00:00

LibWeb: Allow inserting text at the cursor by typing characters :^)

This works everywhere right now, but it's obviously not going to stay
that way forever. :^)

Note that this does not advance the cursor correctly for whitespace
since the cursor is DOM-based and doesn't take whitespace collapsing
into account yet.
This commit is contained in:
Andreas Kling 2020-08-02 12:10:01 +02:00
parent 2c679d0c8b
commit bc299754f6
7 changed files with 35 additions and 0 deletions

View file

@ -28,6 +28,7 @@
#include <LibGUI/Window.h>
#include <LibJS/Runtime/Value.h>
#include <LibWeb/DOM/Document.h>
#include <LibWeb/DOM/Text.h>
#include <LibWeb/HTML/HTMLAnchorElement.h>
#include <LibWeb/HTML/HTMLIFrameElement.h>
#include <LibWeb/Layout/LayoutDocument.h>
@ -228,4 +229,22 @@ void EventHandler::dump_selection(const char* event_name) const
#endif
}
bool EventHandler::handle_keydown(KeyCode, unsigned, u32 code_point)
{
if (code_point && m_frame.cursor_position().is_valid() && is<DOM::Text>(*m_frame.cursor_position().node())) {
auto& text_node = downcast<DOM::Text>(*m_frame.cursor_position().node());
StringBuilder builder;
builder.append(text_node.data().substring_view(0, m_frame.cursor_position().offset()));
builder.append_codepoint(code_point);
builder.append(text_node.data().substring_view(m_frame.cursor_position().offset(), text_node.data().length() - m_frame.cursor_position().offset()));
text_node.set_data(builder.to_string());
// FIXME: This will advance the cursor incorrectly when inserting multiple whitespaces (DOM vs layout whitespace collapse difference.)
m_frame.set_cursor_position({ *m_frame.cursor_position().node(), m_frame.cursor_position().offset() + 1 });
// FIXME: This should definitely use incremental layout invalidation instead!
text_node.document().force_layout();
return true;
}
return true;
}
}