diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2014-05-02 18:58:04 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2014-05-02 18:58:04 +0100 |
| commit | e83123de1f24667afbf52c78b9743e251bdef952 (patch) | |
| tree | 07b54b4259c49cb6ce2a7e61b83d7683cb7fd628 /src/buffer_utils.cc | |
| parent | 26dd21706edcb63459715dc4e1a078c2a0b9c0de (diff) | |
Add support for non-scrolling fifo buffers
Diffstat (limited to 'src/buffer_utils.cc')
| -rw-r--r-- | src/buffer_utils.cc | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/buffer_utils.cc b/src/buffer_utils.cc index 7e8f3da4..1ed1a836 100644 --- a/src/buffer_utils.cc +++ b/src/buffer_utils.cc @@ -22,16 +22,29 @@ CharCount get_column(const Buffer& buffer, return col; } -Buffer* create_fifo_buffer(String name, int fd) +Buffer* create_fifo_buffer(String name, int fd, bool scroll) { Buffer* buffer = new Buffer(std::move(name), Buffer::Flags::Fifo | Buffer::Flags::NoUndo); - auto watcher = new FDWatcher(fd, [buffer](FDWatcher& watcher) { + auto watcher = new FDWatcher(fd, [buffer, scroll](FDWatcher& watcher) { constexpr size_t buffer_size = 1024 * 16; char data[buffer_size]; ssize_t count = read(watcher.fd(), data, buffer_size); - buffer->insert(buffer->end()-1, count > 0 ? String(data, data+count) - : "*** kak: fifo closed ***\n"); + auto pos = buffer->end()-1; + + bool prevent_scrolling = pos == buffer->begin() and not scroll; + if (prevent_scrolling) + ++pos; + + buffer->insert(pos, count > 0 ? String(data, data+count) + : "*** kak: fifo closed ***\n"); + + if (prevent_scrolling) + { + buffer->erase(buffer->begin(), buffer->begin()+1); + buffer->insert(buffer->end(), "\n"); + } + if (count <= 0) { kak_assert(buffer->flags() & Buffer::Flags::Fifo); |
