summaryrefslogtreecommitdiff
path: root/src/buffer_utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer_utils.cc')
-rw-r--r--src/buffer_utils.cc65
1 files changed, 25 insertions, 40 deletions
diff --git a/src/buffer_utils.cc b/src/buffer_utils.cc
index 6a66b000..a4fb639b 100644
--- a/src/buffer_utils.cc
+++ b/src/buffer_utils.cc
@@ -1,6 +1,7 @@
#include "buffer_utils.hh"
#include "buffer_manager.hh"
+#include "coord.hh"
#include "event_manager.hh"
#include "file.hh"
#include "selection.hh"
@@ -165,7 +166,7 @@ void reload_file_buffer(Buffer& buffer)
buffer.flags() &= ~Buffer::Flags::New;
}
-Buffer* create_fifo_buffer(String name, int fd, Buffer::Flags flags, bool scroll)
+Buffer* create_fifo_buffer(String name, int fd, Buffer::Flags flags, AutoScroll scroll)
{
static ValueId fifo_watcher_id = get_free_value_id();
@@ -185,7 +186,7 @@ Buffer* create_fifo_buffer(String name, int fd, Buffer::Flags flags, bool scroll
struct FifoWatcher : FDWatcher
{
- FifoWatcher(int fd, Buffer& buffer, bool scroll)
+ FifoWatcher(int fd, Buffer& buffer, AutoScroll scroll)
: FDWatcher(fd, FdEvents::Read, EventMode::Normal,
[](FDWatcher& watcher, FdEvents, EventMode mode) {
if (mode == EventMode::Normal)
@@ -214,7 +215,7 @@ Buffer* create_fifo_buffer(String name, int fd, Buffer::Flags flags, bool scroll
bool closed = false;
size_t loop = 0;
char data[buffer_size];
- BufferCoord insert_coord = m_buffer.back_coord();
+ Optional<BufferCoord> insert_begin;
const int fifo = fd();
{
@@ -232,17 +233,27 @@ Buffer* create_fifo_buffer(String name, int fd, Buffer::Flags flags, bool scroll
auto pos = m_buffer.back_coord();
const bool is_first = pos == BufferCoord{0,0};
- if (not m_scroll and (is_first or m_had_trailing_newline))
+ if ((m_scroll == AutoScroll::No and (is_first or m_had_trailing_newline))
+ or (m_scroll == AutoScroll::NotInitially and is_first))
pos = m_buffer.next(pos);
- pos = m_buffer.insert(pos, StringView(data, data+count)).end;
+ auto inserted_range = m_buffer.insert(pos, StringView(data, data+count));
+ if (not insert_begin)
+ insert_begin = inserted_range.begin;
+ pos = inserted_range.end;
bool have_trailing_newline = (data[count-1] == '\n');
- if (not m_scroll)
+ if (m_scroll != AutoScroll::Yes)
{
if (is_first)
+ {
m_buffer.erase({0,0}, m_buffer.next({0,0}));
- else if (not m_had_trailing_newline and have_trailing_newline)
+ --insert_begin->line;
+ if (m_scroll == AutoScroll::NotInitially and have_trailing_newline)
+ m_buffer.insert(m_buffer.end_coord(), "\n");
+ }
+ else if (m_scroll == AutoScroll::No and
+ not m_had_trailing_newline and have_trailing_newline)
m_buffer.erase(m_buffer.prev(pos), pos);
}
m_had_trailing_newline = have_trailing_newline;
@@ -250,17 +261,21 @@ Buffer* create_fifo_buffer(String name, int fd, Buffer::Flags flags, bool scroll
while (++loop < max_loop and fd_readable(fifo));
}
- if (insert_coord != m_buffer.back_coord())
+ if (insert_begin)
+ {
+ auto insert_back = (m_had_trailing_newline and m_scroll == AutoScroll::No)
+ ? m_buffer.back_coord() : m_buffer.prev(m_buffer.back_coord());
m_buffer.run_hook_in_own_context(
Hook::BufReadFifo,
- selection_to_string(ColumnType::Byte, m_buffer, {insert_coord, m_buffer.back_coord()}));
+ selection_to_string(ColumnType::Byte, m_buffer, {*insert_begin, insert_back}));
+ }
if (closed)
m_buffer.values().erase(fifo_watcher_id); // will delete this
}
Buffer& m_buffer;
- bool m_scroll;
+ AutoScroll m_scroll;
bool m_had_trailing_newline = false;
};
@@ -271,36 +286,6 @@ Buffer* create_fifo_buffer(String name, int fd, Buffer::Flags flags, bool scroll
return buffer;
}
-void write_to_debug_buffer(StringView str)
-{
- if (not BufferManager::has_instance())
- {
- write(2, str);
- write(2, "\n");
- return;
- }
-
- constexpr StringView debug_buffer_name = "*debug*";
- // Try to ensure we keep an empty line at the end of the debug buffer
- // where the user can put its cursor to scroll with new messages
- const bool eol_back = not str.empty() and str.back() == '\n';
- if (Buffer* buffer = BufferManager::instance().get_buffer_ifp(debug_buffer_name))
- {
- buffer->flags() &= ~Buffer::Flags::ReadOnly;
- auto restore = on_scope_end([buffer] { buffer->flags() |= Buffer::Flags::ReadOnly; });
-
- buffer->insert(buffer->back_coord(), eol_back ? str : str + "\n");
- }
- else
- {
- String line = str + (eol_back ? "\n" : "\n\n");
- create_buffer_from_string(
- debug_buffer_name.str(), Buffer::Flags::NoUndo | Buffer::Flags::Debug | Buffer::Flags::ReadOnly,
- line);
- }
-}
-
-
auto to_string(Buffer::HistoryId id)
{
using Result = decltype(to_string(size_t{}));