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.cc35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/buffer_utils.cc b/src/buffer_utils.cc
index af61cb19..7e8f3da4 100644
--- a/src/buffer_utils.cc
+++ b/src/buffer_utils.cc
@@ -1,5 +1,7 @@
#include "buffer_utils.hh"
+#include "event_manager.hh"
+
namespace Kakoune
{
@@ -20,4 +22,37 @@ CharCount get_column(const Buffer& buffer,
return col;
}
+Buffer* create_fifo_buffer(String name, int fd)
+{
+ Buffer* buffer = new Buffer(std::move(name), Buffer::Flags::Fifo | Buffer::Flags::NoUndo);
+
+ auto watcher = new FDWatcher(fd, [buffer](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");
+ if (count <= 0)
+ {
+ kak_assert(buffer->flags() & Buffer::Flags::Fifo);
+ buffer->flags() &= ~Buffer::Flags::Fifo;
+ buffer->flags() &= ~Buffer::Flags::NoUndo;
+ close(watcher.fd());
+ delete &watcher;
+ }
+ });
+
+ buffer->hooks().add_hook("BufClose", "",
+ [buffer, watcher](const String&, const Context&) {
+ // Check if fifo is still alive, else watcher is already dead
+ if (buffer->flags() & Buffer::Flags::Fifo)
+ {
+ close(watcher->fd());
+ delete watcher;
+ }
+ });
+
+ return buffer;
+}
+
}