Remote: when converting to client, suspend *after* connecting

Also, do not quit server while there is a connection being accepted
Fixes #1690
This commit is contained in:
Maxime Coste 2017-11-12 22:28:13 +08:00
parent 00e0630272
commit 208f9641ef
2 changed files with 11 additions and 5 deletions

View File

@ -503,13 +503,16 @@ std::unique_ptr<UserInterface> create_local_ui(UIType ui_type)
} }
int run_client(StringView session, StringView client_init, int run_client(StringView session, StringView client_init,
Optional<BufferCoord> init_coord, UIType ui_type) Optional<BufferCoord> init_coord, UIType ui_type,
bool suspend)
{ {
try try
{ {
EventManager event_manager; EventManager event_manager;
RemoteClient client{session, make_ui(ui_type), getpid(), get_env_vars(), RemoteClient client{session, make_ui(ui_type), getpid(), get_env_vars(),
client_init, std::move(init_coord)}; client_init, std::move(init_coord)};
if (suspend)
raise(SIGTSTP);
while (not client.exit_status()) while (not client.exit_status())
event_manager.handle_next_events(EventMode::Normal); event_manager.handle_next_events(EventMode::Normal);
return *client.exit_status(); return *client.exit_status();
@ -661,7 +664,9 @@ int run_server(StringView session, StringView server_init,
local_client->info_show("Welcome to Kakoune", startup_info, {}, InfoStyle::Prompt); local_client->info_show("Welcome to Kakoune", startup_info, {}, InfoStyle::Prompt);
} }
while (not terminate and (not client_manager.empty() or (flags & ServerFlags::Daemon))) while (not terminate and
(not client_manager.empty() or server.negotiating() or
(flags & ServerFlags::Daemon)))
{ {
client_manager.redraw_clients(); client_manager.redraw_clients();
event_manager.handle_next_events(EventMode::Normal); event_manager.handle_next_events(EventMode::Normal);
@ -980,7 +985,7 @@ int main(int argc, char* argv[])
for (auto name : files) for (auto name : files)
new_files += format("edit '{}';", escape(real_path(name), "'", '\\')); new_files += format("edit '{}';", escape(real_path(name), "'", '\\'));
return run_client(*server_session, new_files + client_init, init_coord, ui_type); return run_client(*server_session, new_files + client_init, init_coord, ui_type, false);
} }
else else
{ {
@ -995,10 +1000,9 @@ int main(int argc, char* argv[])
} }
catch (convert_to_client_mode& convert) catch (convert_to_client_mode& convert)
{ {
raise(SIGTSTP);
return run_client(convert.session, return run_client(convert.session,
format("try %^buffer '{}'; select '{}'^; echo converted to client only mode", format("try %^buffer '{}'; select '{}'^; echo converted to client only mode",
escape(convert.buffer_name, "'^", '\\'), convert.selections), {}, ui_type); escape(convert.buffer_name, "'^", '\\'), convert.selections), {}, ui_type, true);
} }
} }
} }

View File

@ -53,6 +53,8 @@ struct Server : public Singleton<Server>
bool rename_session(StringView name); bool rename_session(StringView name);
void close_session(bool do_unlink = true); void close_session(bool do_unlink = true);
bool negotiating() const { return not m_accepters.empty(); }
private: private:
class Accepter; class Accepter;
void remove_accepter(Accepter* accepter); void remove_accepter(Accepter* accepter);