summaryrefslogtreecommitdiff
path: root/src/buffer_utils.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-05-02 18:58:04 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-05-02 18:58:04 +0100
commite83123de1f24667afbf52c78b9743e251bdef952 (patch)
tree07b54b4259c49cb6ce2a7e61b83d7683cb7fd628 /src/buffer_utils.cc
parent26dd21706edcb63459715dc4e1a078c2a0b9c0de (diff)
Add support for non-scrolling fifo buffers
Diffstat (limited to 'src/buffer_utils.cc')
-rw-r--r--src/buffer_utils.cc21
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);