summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibGUI/TextDocument.cpp5
-rw-r--r--Userland/Libraries/LibGUI/TextEditor.cpp32
2 files changed, 23 insertions, 14 deletions
diff --git a/Userland/Libraries/LibGUI/TextDocument.cpp b/Userland/Libraries/LibGUI/TextDocument.cpp
index 986c4cd308..3c1836184e 100644
--- a/Userland/Libraries/LibGUI/TextDocument.cpp
+++ b/Userland/Libraries/LibGUI/TextDocument.cpp
@@ -79,6 +79,11 @@ void TextDocument::set_text(const StringView& text)
add_line(i);
}
add_line(i);
+
+ // Don't show the file's trailing newline as an actual new line.
+ if (line_count() > 1 && line(line_count() - 1).is_empty())
+ m_lines.take_last();
+
m_client_notifications_enabled = true;
for (auto* client : m_clients)
diff --git a/Userland/Libraries/LibGUI/TextEditor.cpp b/Userland/Libraries/LibGUI/TextEditor.cpp
index 93dc5d13f2..1005098f2b 100644
--- a/Userland/Libraries/LibGUI/TextEditor.cpp
+++ b/Userland/Libraries/LibGUI/TextEditor.cpp
@@ -1060,19 +1060,25 @@ bool TextEditor::write_to_file(const String& path)
ScopeGuard fd_guard = [fd] { close(fd); };
- // Compute the final file size and ftruncate() to make writing fast.
- // FIXME: Remove this once the kernel is smart enough to do this instead.
off_t file_size = 0;
- for (size_t i = 0; i < line_count(); ++i)
- file_size += line(i).length();
- file_size += line_count() - 1;
+ 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();
+ }
- int rc = ftruncate(fd, file_size);
- if (rc < 0) {
+ if (ftruncate(fd, file_size) < 0) {
perror("ftruncate");
return false;
}
+ if (file_size == 0)
+ return true;
+
for (size_t i = 0; i < line_count(); ++i) {
auto& line = this->line(i);
if (line.length()) {
@@ -1083,13 +1089,11 @@ bool TextEditor::write_to_file(const String& path)
return false;
}
}
- if (i != line_count() - 1) {
- char ch = '\n';
- ssize_t nwritten = write(fd, &ch, 1);
- if (nwritten != 1) {
- perror("write");
- return false;
- }
+ char ch = '\n';
+ ssize_t nwritten = write(fd, &ch, 1);
+ if (nwritten != 1) {
+ perror("write");
+ return false;
}
}