Use the buffer manager to delete buffer, throw when a client is inserting
This commit is contained in:
parent
441f9a69ef
commit
9999e5698d
|
@ -37,8 +37,6 @@ void BufferManager::unregister_buffer(Buffer& buffer)
|
||||||
{
|
{
|
||||||
if (*it == &buffer)
|
if (*it == &buffer)
|
||||||
{
|
{
|
||||||
if (ClientManager::has_instance())
|
|
||||||
ClientManager::instance().ensure_no_client_uses_buffer(buffer);
|
|
||||||
m_buffers.erase(it);
|
m_buffers.erase(it);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -46,6 +44,27 @@ void BufferManager::unregister_buffer(Buffer& buffer)
|
||||||
kak_assert(false);
|
kak_assert(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BufferManager::delete_buffer(Buffer& buffer)
|
||||||
|
{
|
||||||
|
for (auto it = m_buffers.begin(); it != m_buffers.end(); ++it)
|
||||||
|
{
|
||||||
|
if (*it == &buffer)
|
||||||
|
{
|
||||||
|
if (ClientManager::has_instance())
|
||||||
|
ClientManager::instance().ensure_no_client_uses_buffer(buffer);
|
||||||
|
delete it->get();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
kak_assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BufferManager::delete_buffer_if_exists(const String& name)
|
||||||
|
{
|
||||||
|
if (Buffer* buf = get_buffer_ifp(name))
|
||||||
|
delete_buffer(*buf);
|
||||||
|
}
|
||||||
|
|
||||||
Buffer* BufferManager::get_buffer_ifp(const String& name)
|
Buffer* BufferManager::get_buffer_ifp(const String& name)
|
||||||
{
|
{
|
||||||
for (auto& buf : m_buffers)
|
for (auto& buf : m_buffers)
|
||||||
|
|
|
@ -22,6 +22,9 @@ public:
|
||||||
void register_buffer(Buffer& buffer);
|
void register_buffer(Buffer& buffer);
|
||||||
void unregister_buffer(Buffer& buffer);
|
void unregister_buffer(Buffer& buffer);
|
||||||
|
|
||||||
|
void delete_buffer(Buffer& buffer);
|
||||||
|
void delete_buffer_if_exists(const String& name);
|
||||||
|
|
||||||
iterator begin() const { return m_buffers.cbegin(); }
|
iterator begin() const { return m_buffers.cbegin(); }
|
||||||
iterator end() const { return m_buffers.cend(); }
|
iterator end() const { return m_buffers.cend(); }
|
||||||
size_t count() const { return m_buffers.size(); }
|
size_t count() const { return m_buffers.size(); }
|
||||||
|
|
|
@ -138,6 +138,10 @@ void ClientManager::ensure_no_client_uses_buffer(Buffer& buffer)
|
||||||
if (&client->context().buffer() != &buffer)
|
if (&client->context().buffer() != &buffer)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (client->context().editor().is_editing())
|
||||||
|
throw runtime_error("client '" + client->name + "' is inserting in '" +
|
||||||
|
buffer.display_name() + '\'');
|
||||||
|
|
||||||
// change client context to edit the first buffer which is not the
|
// change client context to edit the first buffer which is not the
|
||||||
// specified one. As BufferManager stores buffer according to last
|
// specified one. As BufferManager stores buffer according to last
|
||||||
// access, this selects a sensible buffer to display.
|
// access, this selects a sensible buffer to display.
|
||||||
|
|
|
@ -52,7 +52,7 @@ Buffer* open_fifo(const String& name , const String& filename, Context& context)
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
throw runtime_error("unable to open " + filename);
|
throw runtime_error("unable to open " + filename);
|
||||||
|
|
||||||
delete BufferManager::instance().get_buffer_ifp(name);
|
BufferManager::instance().delete_buffer_if_exists(name);
|
||||||
|
|
||||||
Buffer* buffer = new Buffer(name, Buffer::Flags::Fifo | Buffer::Flags::NoUndo);
|
Buffer* buffer = new Buffer(name, Buffer::Flags::Fifo | Buffer::Flags::NoUndo);
|
||||||
|
|
||||||
|
@ -234,7 +234,7 @@ void delete_buffer(const CommandParameters& params, Context& context)
|
||||||
if (manager.count() == 1)
|
if (manager.count() == 1)
|
||||||
throw runtime_error("buffer " + buffer.name() + " is the last one");
|
throw runtime_error("buffer " + buffer.name() + " is the last one");
|
||||||
|
|
||||||
delete &buffer;
|
manager.delete_buffer(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Group>
|
template<typename Group>
|
||||||
|
|
|
@ -133,8 +133,7 @@ Buffer* create_buffer_from_file(String filename)
|
||||||
const char* data = (const char*)mmap(nullptr, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
const char* data = (const char*)mmap(nullptr, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||||
auto cleanup = on_scope_end([&]{ munmap((void*)data, st.st_size); close(fd); });
|
auto cleanup = on_scope_end([&]{ munmap((void*)data, st.st_size); close(fd); });
|
||||||
|
|
||||||
if (Buffer* buffer = BufferManager::instance().get_buffer_ifp(filename))
|
BufferManager::instance().delete_buffer_if_exists(filename);
|
||||||
delete buffer;
|
|
||||||
|
|
||||||
const char* pos = data;
|
const char* pos = data;
|
||||||
bool crlf = false;
|
bool crlf = false;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user