diff options
Diffstat (limited to 'Userland/Libraries/LibGUI')
-rw-r--r-- | Userland/Libraries/LibGUI/TextEditor.cpp | 27 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/TextEditor.h | 1 |
2 files changed, 28 insertions, 0 deletions
diff --git a/Userland/Libraries/LibGUI/TextEditor.cpp b/Userland/Libraries/LibGUI/TextEditor.cpp index b75d851b10..3236d3c5fc 100644 --- a/Userland/Libraries/LibGUI/TextEditor.cpp +++ b/Userland/Libraries/LibGUI/TextEditor.cpp @@ -1512,6 +1512,33 @@ bool TextEditor::write_to_file(Core::File& file) return true; } +ErrorOr<void> TextEditor::write_to_file(Core::Stream::File& file) +{ + off_t file_size = 0; + if (line_count() == 1 && line(0).is_empty()) { + // Truncate to zero. + } else { + // Compute the final file size and ftruncate() to make writing fast. + // FIXME: Remove this once the kernel is smart enough to do this instead. + for (size_t i = 0; i < line_count(); ++i) + file_size += line(i).length(); + file_size += line_count(); + } + + TRY(file.truncate(file_size)); + + if (file_size == 0) { + // A size 0 file doesn't need a data copy. + } else { + for (size_t i = 0; i < line_count(); ++i) { + TRY(file.write(line(i).to_utf8().bytes())); + TRY(file.write("\n"sv.bytes())); + } + } + document().set_unmodified(); + return {}; +} + DeprecatedString TextEditor::text() const { return document().text(); diff --git a/Userland/Libraries/LibGUI/TextEditor.h b/Userland/Libraries/LibGUI/TextEditor.h index fe51519593..f5586d000b 100644 --- a/Userland/Libraries/LibGUI/TextEditor.h +++ b/Userland/Libraries/LibGUI/TextEditor.h @@ -131,6 +131,7 @@ public: void replace_all_text_without_resetting_undo_stack(StringView text); bool write_to_file(DeprecatedString const& path); bool write_to_file(Core::File&); + ErrorOr<void> write_to_file(Core::Stream::File&); bool has_selection() const { return m_selection.is_valid(); } DeprecatedString selected_text() const; size_t number_of_words() const; |