From 5440d31f995d9143e4f14a343a41aaab227ffbad Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Tue, 11 Oct 2016 00:45:05 +0100 Subject: [PATCH] Only create a default *scratch* when we dont have any non debug buffers Fixes #852 Closes #856 --- src/buffer_manager.cc | 12 ++++++++++++ src/buffer_manager.hh | 2 ++ src/client_manager.cc | 2 +- src/main.cc | 30 ++++++++++++------------------ 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc index 03f2424e..bc88a752 100644 --- a/src/buffer_manager.cc +++ b/src/buffer_manager.cc @@ -45,6 +45,9 @@ Buffer* BufferManager::create_buffer(String name, Buffer::Flags flags, auto& buffer = *m_buffers.front(); buffer.on_registered(); + if (contains(m_buffer_trash, &buffer)) + throw runtime_error("Buffer got removed during its creation"); + return &buffer; } @@ -82,6 +85,15 @@ Buffer& BufferManager::get_buffer(StringView name) return *res; } +Buffer& BufferManager::get_first_buffer() +{ + if (not contains_that(m_buffers, [](const std::unique_ptr& p) + { return not (p->flags() & Buffer::Flags::Debug); })) + create_buffer("*scratch*", Buffer::Flags::None); + + return *m_buffers.front(); +} + void BufferManager::backup_modified_buffers() { for (auto& buf : m_buffers) diff --git a/src/buffer_manager.hh b/src/buffer_manager.hh index f992dcf6..d12c515b 100644 --- a/src/buffer_manager.hh +++ b/src/buffer_manager.hh @@ -30,6 +30,8 @@ public: Buffer* get_buffer_ifp(StringView name); Buffer& get_buffer(StringView name); + Buffer& get_first_buffer(); + void backup_modified_buffers(); void clear_buffer_trash(); diff --git a/src/client_manager.cc b/src/client_manager.cc index d7523ff2..889f0777 100644 --- a/src/client_manager.cc +++ b/src/client_manager.cc @@ -40,7 +40,7 @@ Client* ClientManager::create_client(std::unique_ptr&& ui, EnvVarMap env_vars, StringView init_commands) { - Buffer& buffer = **BufferManager::instance().begin(); + Buffer& buffer = BufferManager::instance().get_first_buffer(); WindowAndSelections ws = get_free_window(buffer); Client* client = new Client{std::move(ui), std::move(ws.window), std::move(ws.selections), std::move(env_vars), diff --git a/src/main.cc b/src/main.cc index 241e4336..ddc1c0e0 100644 --- a/src/main.cc +++ b/src/main.cc @@ -564,29 +564,23 @@ int run_server(StringView session, StringView init_command, { write_to_debug_buffer(format("error while opening command line files: {}", error.what())); } - else - buffer_manager.create_buffer("*scratch*", Buffer::Flags::None); try { - if (not daemon) + if (not daemon and + (local_client = client_manager.create_client( + create_local_ui(ui_type), get_env_vars(), init_command))) { - local_client = client_manager.create_client( - create_local_ui(ui_type), get_env_vars(), init_command); + auto& selections = local_client->context().selections_write_only(); + auto& buffer = selections.buffer(); + selections = SelectionList(buffer, buffer.clamp(target_coord)); + local_client->context().window().center_line(target_coord.line); - if (local_client) - { - auto& selections = local_client->context().selections_write_only(); - auto& buffer = selections.buffer(); - selections = SelectionList(buffer, buffer.clamp(target_coord)); - local_client->context().window().center_line(target_coord.line); - - if (startup_error) - local_client->print_status({ - "error during startup, see *debug* buffer for details", - get_face("Error") - }); - } + if (startup_error) + local_client->print_status({ + "error during startup, see *debug* buffer for details", + get_face("Error") + }); } while (not terminate and (not client_manager.empty() or daemon))