diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2014-11-04 13:55:56 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2014-11-04 23:51:22 +0000 |
| commit | c8ea2e78f9a926268836d5a1830cf7f39a1943d8 (patch) | |
| tree | 3e88f10d034b67e69c92fe97acd42a885f5c36bf /src/buffer_utils.cc | |
| parent | 549d28e5ab1538cb824af769ad4b7d5cb5febc00 (diff) | |
Reuse existing buffer when creating a fifo one
That way, client having this buffer already visible wont switch to
another one due to previous buffer getting deleted
Diffstat (limited to 'src/buffer_utils.cc')
| -rw-r--r-- | src/buffer_utils.cc | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/src/buffer_utils.cc b/src/buffer_utils.cc index c3dd755c..12ffae19 100644 --- a/src/buffer_utils.cc +++ b/src/buffer_utils.cc @@ -82,9 +82,30 @@ Buffer* create_buffer_from_data(StringView data, StringView name, Buffer* create_fifo_buffer(String name, int fd, bool scroll) { - Buffer* buffer = new Buffer(std::move(name), Buffer::Flags::Fifo | Buffer::Flags::NoUndo); + static ValueId s_fifo_watcher_id = ValueId::get_free_id(); - auto watcher = new FDWatcher(fd, [buffer, scroll](FDWatcher& watcher) { + Buffer* buffer = BufferManager::instance().get_buffer_ifp(name); + if (buffer) + { + buffer->flags() |= Buffer::Flags::NoUndo; + buffer->reload(std::vector<String>({"\n"_str}), 0); + } + else + buffer = new Buffer(std::move(name), Buffer::Flags::Fifo | Buffer::Flags::NoUndo); + + auto watcher_deleter = [buffer](FDWatcher* watcher) { + kak_assert(buffer->flags() & Buffer::Flags::Fifo); + close(watcher->fd()); + buffer->run_hook_in_own_context("BufCloseFifo", ""); + buffer->flags() &= ~Buffer::Flags::Fifo; + watcher->~FDWatcher(); + }; + + // capture a non static one to silence a warning. + ValueId fifo_watcher_id = s_fifo_watcher_id; + + std::unique_ptr<FDWatcher, decltype(watcher_deleter)> watcher( + new FDWatcher(fd, [buffer, scroll, fifo_watcher_id](FDWatcher& watcher) { constexpr size_t buffer_size = 2048; // if we read data slower than it arrives in the fifo, limiting the // iteration number allows us to go back go back to the event loop and @@ -122,26 +143,11 @@ Buffer* create_fifo_buffer(String name, int fd, bool scroll) select(fifo+1, &rfds, nullptr, nullptr, &tv) == 1); if (count <= 0) - { - kak_assert(buffer->flags() & Buffer::Flags::Fifo); - buffer->flags() &= ~Buffer::Flags::Fifo; - buffer->flags() &= ~Buffer::Flags::NoUndo; - close(fifo); - buffer->run_hook_in_own_context("BufCloseFifo", ""); - delete &watcher; - } - }); + buffer->values().erase(fifo_watcher_id); // will delete this + }), std::move(watcher_deleter)); - buffer->hooks().add_hook("BufClose", "", - [buffer, watcher](StringView, const Context&) { - // Check if fifo is still alive, else watcher is already dead - if (buffer->flags() & Buffer::Flags::Fifo) - { - close(watcher->fd()); - buffer->run_hook_in_own_context("BufCloseFifo", ""); - delete watcher; - } - }); + buffer->values()[fifo_watcher_id] = Value(std::move(watcher)); + buffer->flags() = Buffer::Flags::Fifo | Buffer::Flags::NoUndo; return buffer; } |
