diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2014-04-29 21:37:11 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2014-04-29 21:37:11 +0100 |
| commit | 479c067a4096f440398f531c11e4eae802ffe7c9 (patch) | |
| tree | 438cccc0a9b173e039bae5da34468135ad09f43e /src/buffer_utils.cc | |
| parent | f68394668174492caa599442e9f7bd344a84d9d8 (diff) | |
Add support for running Kakoune with redirected stdin
Will read to a *stdin* fifo buffer
Diffstat (limited to 'src/buffer_utils.cc')
| -rw-r--r-- | src/buffer_utils.cc | 35 |
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; +} + } |
