summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-08-26 19:33:52 +0100
committerMaxime Coste <frrrwww@gmail.com>2015-08-26 19:33:52 +0100
commit0c41c141875dd91a12e20fa99fc7876d0ee8a792 (patch)
tree8c7ce52dc9344688d39ddf6bffa0a40a888be55a /src
parent3552152b34d64246ecb1003314a1040161fe3e97 (diff)
Reorganize slightly local client creation
Diffstat (limited to 'src')
-rw-r--r--src/client_manager.cc14
-rw-r--r--src/client_manager.hh2
-rw-r--r--src/main.cc86
3 files changed, 48 insertions, 54 deletions
diff --git a/src/client_manager.cc b/src/client_manager.cc
index 922ee250..927c1c0e 100644
--- a/src/client_manager.cc
+++ b/src/client_manager.cc
@@ -66,15 +66,11 @@ void ClientManager::handle_pending_inputs() const
void ClientManager::remove_client(Client& client)
{
- for (auto it = m_clients.begin(); it != m_clients.end(); ++it)
- {
- if (it->get() == &client)
- {
- m_clients.erase(it);
- return;
- }
- }
- kak_assert(false);
+ auto it = find_if(m_clients,
+ [&](const std::unique_ptr<Client>& ptr)
+ { return ptr.get() == &client; });
+ kak_assert(it != m_clients.end());
+ m_clients.erase(it);
}
WindowAndSelections ClientManager::get_free_window(Buffer& buffer)
diff --git a/src/client_manager.hh b/src/client_manager.hh
index 01bb2bfc..3db5fb8f 100644
--- a/src/client_manager.hh
+++ b/src/client_manager.hh
@@ -28,7 +28,7 @@ public:
bool empty() const { return m_clients.empty(); }
size_t count() const { return m_clients.size(); }
- void ensure_no_client_uses_buffer(Buffer& buffer);
+ void ensure_no_client_uses_buffer(Buffer& buffer);
WindowAndSelections get_free_window(Buffer& buffer);
void add_free_window(std::unique_ptr<Window>&& window, SelectionList selections);
diff --git a/src/main.cc b/src/main.cc
index fb0741fa..fce01de9 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -227,40 +227,63 @@ void register_options()
UserInterface::Options{});
}
-template<typename UI>
-void create_local_client(StringView init_command, bool startup_error)
+std::unique_ptr<UserInterface> create_local_ui(bool dummy_ui)
{
- struct LocalUI : UI
+ struct DummyUI : UserInterface
+ {
+ void menu_show(ConstArrayView<String>, CharCoord, Face, Face, MenuStyle) override {}
+ void menu_select(int) override {}
+ void menu_hide() override {}
+
+ void info_show(StringView, StringView, CharCoord, Face, InfoStyle) override {}
+ void info_hide() override {}
+
+ void draw(const DisplayBuffer&, const Face&) override {}
+ void draw_status(const DisplayLine&, const DisplayLine&, const Face&) override {}
+ CharCoord dimensions() override { return {24,80}; }
+ bool is_key_available() override { return false; }
+ Key get_key() override { return Key::Invalid; }
+ void refresh() override {}
+ void set_input_callback(InputCallback) override {}
+ void set_ui_options(const Options&) override {}
+ };
+
+ if (dummy_ui)
+ return make_unique<DummyUI>();
+
+ struct LocalUI : NCursesUI
{
~LocalUI()
{
if (not ClientManager::instance().empty() and fork())
{
- this->UI::~UI();
+ this->NCursesUI::~NCursesUI();
write_stdout("detached from terminal\n");
exit(0);
}
}
};
- if (std::is_same<UI, NCursesUI>::value)
- {
- if (not isatty(1))
- throw runtime_error("stdout is not a tty");
+ if (not isatty(1))
+ throw runtime_error("stdout is not a tty");
- if (not isatty(0))
- {
- // move stdin to another fd, and restore tty as stdin
- int fd = dup(0);
- int tty = open("/dev/tty", O_RDONLY);
- dup2(tty, 0);
- close(tty);
- create_fifo_buffer("*stdin*", fd);
- }
+ if (not isatty(0))
+ {
+ // move stdin to another fd, and restore tty as stdin
+ int fd = dup(0);
+ int tty = open("/dev/tty", O_RDONLY);
+ dup2(tty, 0);
+ close(tty);
+ create_fifo_buffer("*stdin*", fd);
}
+ return make_unique<LocalUI>();
+}
+
+void create_local_client(std::unique_ptr<UserInterface> ui, StringView init_command, bool startup_error)
+{
static Client* client = ClientManager::instance().create_client(
- make_unique<LocalUI>(), get_env_vars(), init_command);
+ std::move(ui), get_env_vars(), init_command);
if (startup_error)
client->print_status({
@@ -329,26 +352,6 @@ int run_client(StringView session, StringView init_command)
return 0;
}
-struct DummyUI : UserInterface
-{
-public:
- void menu_show(ConstArrayView<String>, CharCoord, Face, Face, MenuStyle) override {}
- void menu_select(int) override {}
- void menu_hide() override {}
-
- void info_show(StringView, StringView, CharCoord, Face, InfoStyle) override {}
- void info_hide() override {}
-
- void draw(const DisplayBuffer&, const Face&) override {}
- void draw_status(const DisplayLine&, const DisplayLine&, const Face&) override {}
- CharCoord dimensions() override { return {24,80}; }
- bool is_key_available() override { return false; }
- Key get_key() override { return Key::Invalid; }
- void refresh() override {}
- void set_input_callback(InputCallback) override {}
- void set_ui_options(const Options&) override {}
-};
-
int run_server(StringView session, StringView init_command,
bool ignore_kakrc, bool daemon, bool dummy_ui,
ConstArrayView<StringView> files)
@@ -445,12 +448,7 @@ int run_server(StringView session, StringView init_command,
new Buffer("*scratch*", Buffer::Flags::None);
if (not daemon)
- {
- if (dummy_ui)
- create_local_client<DummyUI>(init_command, startup_error);
- else
- create_local_client<NCursesUI>(init_command, startup_error);
- }
+ create_local_client(create_local_ui(dummy_ui), init_command, startup_error);
while (not terminate and (not client_manager.empty() or daemon))
{