Restore client name after converting to client

When Kakoune forked the sever to background, the newly converted
to client process (the original client/server process) was not
preserving its previous client name.
This commit is contained in:
Maxime Coste 2018-03-23 07:36:18 +11:00
parent 796fbc6c1f
commit db7b43acd5
5 changed files with 19 additions and 14 deletions

View File

@ -39,7 +39,7 @@ String ClientManager::generate_name() const
} }
Client* ClientManager::create_client(std::unique_ptr<UserInterface>&& ui, int pid, Client* ClientManager::create_client(std::unique_ptr<UserInterface>&& ui, int pid,
EnvVarMap env_vars, StringView init_cmds, String name, EnvVarMap env_vars, StringView init_cmds,
Optional<BufferCoord> init_coord, Optional<BufferCoord> init_coord,
Client::OnExitCallback on_exit) Client::OnExitCallback on_exit)
{ {
@ -47,7 +47,8 @@ Client* ClientManager::create_client(std::unique_ptr<UserInterface>&& ui, int pi
WindowAndSelections ws = get_free_window(buffer); WindowAndSelections ws = get_free_window(buffer);
Client* client = new Client{std::move(ui), std::move(ws.window), Client* client = new Client{std::move(ui), std::move(ws.window),
std::move(ws.selections), pid, std::move(ws.selections), pid,
std::move(env_vars), generate_name(), std::move(env_vars),
name.empty() ? generate_name() : std::move(name),
std::move(on_exit)}; std::move(on_exit)};
m_clients.emplace_back(client); m_clients.emplace_back(client);

View File

@ -20,7 +20,7 @@ public:
~ClientManager(); ~ClientManager();
Client* create_client(std::unique_ptr<UserInterface>&& ui, int pid, Client* create_client(std::unique_ptr<UserInterface>&& ui, int pid,
EnvVarMap env_vars, StringView init_cmds, String name, EnvVarMap env_vars, StringView init_cmds,
Optional<BufferCoord> init_coord, Optional<BufferCoord> init_coord,
Client::OnExitCallback on_exit); Client::OnExitCallback on_exit);

View File

@ -511,14 +511,14 @@ std::unique_ptr<UserInterface> create_local_ui(UIType ui_type)
return std::make_unique<LocalUI>(); return std::make_unique<LocalUI>();
} }
int run_client(StringView session, StringView client_init, int run_client(StringView session, StringView name, StringView client_init,
Optional<BufferCoord> init_coord, UIType ui_type, Optional<BufferCoord> init_coord, UIType ui_type,
bool suspend) bool suspend)
{ {
try try
{ {
EventManager event_manager; EventManager event_manager;
RemoteClient client{session, make_ui(ui_type), getpid(), get_env_vars(), RemoteClient client{session, name, make_ui(ui_type), getpid(), get_env_vars(),
client_init, std::move(init_coord)}; client_init, std::move(init_coord)};
if (suspend) if (suspend)
raise(SIGTSTP); raise(SIGTSTP);
@ -536,6 +536,7 @@ int run_client(StringView session, StringView client_init,
struct convert_to_client_mode struct convert_to_client_mode
{ {
String session; String session;
String client_name;
String buffer_name; String buffer_name;
String selections; String selections;
}; };
@ -659,7 +660,7 @@ int run_server(StringView session, StringView server_init,
if (not (flags & ServerFlags::Daemon)) if (not (flags & ServerFlags::Daemon))
{ {
local_client = client_manager.create_client( local_client = client_manager.create_client(
create_local_ui(ui_type), getpid(), get_env_vars(), client_init, std::move(init_coord), create_local_ui(ui_type), getpid(), {}, get_env_vars(), client_init, std::move(init_coord),
[](int status) { local_client_exit = status; }); [](int status) { local_client_exit = status; });
if (startup_error) if (startup_error)
@ -693,8 +694,9 @@ int run_server(StringView session, StringView server_init,
} }
else if (convert_to_client_pending) else if (convert_to_client_pending)
{ {
String buffer_name = local_client->context().buffer().name(); const String client_name = local_client->context().name();
String selections = selection_list_to_string(local_client->context().selections()); const String buffer_name = local_client->context().buffer().name();
const String selections = selection_list_to_string(local_client->context().selections());
ClientManager::instance().remove_client(*local_client, true, 0); ClientManager::instance().remove_client(*local_client, true, 0);
client_manager.clear_client_trash(); client_manager.clear_client_trash();
@ -704,7 +706,7 @@ int run_server(StringView session, StringView server_init,
{ {
String session = server.session(); String session = server.session();
server.close_session(false); server.close_session(false);
throw convert_to_client_mode{ std::move(session), std::move(buffer_name), std::move(selections) }; throw convert_to_client_mode{ std::move(session), std::move(client_name), std::move(buffer_name), std::move(selections) };
} }
} }
} }
@ -985,7 +987,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, false); return run_client(*server_session, {}, new_files + client_init, init_coord, ui_type, false);
} }
else else
{ {
@ -1000,7 +1002,7 @@ int main(int argc, char* argv[])
} }
catch (convert_to_client_mode& convert) catch (convert_to_client_mode& convert)
{ {
return run_client(convert.session, return run_client(convert.session, convert.client_name,
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, true); escape(convert.buffer_name, "'^", '\\'), convert.selections), {}, ui_type, true);
} }

View File

@ -566,7 +566,7 @@ bool check_session(StringView session)
return connect(sock, (sockaddr*)&addr, sizeof(addr.sun_path)) != -1; return connect(sock, (sockaddr*)&addr, sizeof(addr.sun_path)) != -1;
} }
RemoteClient::RemoteClient(StringView session, std::unique_ptr<UserInterface>&& ui, RemoteClient::RemoteClient(StringView session, StringView name, std::unique_ptr<UserInterface>&& ui,
int pid, const EnvVarMap& env_vars, StringView init_command, int pid, const EnvVarMap& env_vars, StringView init_command,
Optional<BufferCoord> init_coord) Optional<BufferCoord> init_coord)
: m_ui(std::move(ui)) : m_ui(std::move(ui))
@ -576,6 +576,7 @@ RemoteClient::RemoteClient(StringView session, std::unique_ptr<UserInterface>&&
{ {
MsgWriter msg{m_send_buffer, MessageType::Connect}; MsgWriter msg{m_send_buffer, MessageType::Connect};
msg.write(pid); msg.write(pid);
msg.write(name);
msg.write(init_command); msg.write(init_command);
msg.write(init_coord); msg.write(init_coord);
msg.write(m_ui->dimensions()); msg.write(m_ui->dimensions());
@ -723,13 +724,14 @@ private:
case MessageType::Connect: case MessageType::Connect:
{ {
auto pid = m_reader.read<int>(); auto pid = m_reader.read<int>();
auto name = m_reader.read<String>();
auto init_cmds = m_reader.read<String>(); auto init_cmds = m_reader.read<String>();
auto init_coord = m_reader.read_optional<BufferCoord>(); auto init_coord = m_reader.read_optional<BufferCoord>();
auto dimensions = m_reader.read<DisplayCoord>(); auto dimensions = m_reader.read<DisplayCoord>();
auto env_vars = m_reader.read_hash_map<String, String, MemoryDomain::EnvVars>(); auto env_vars = m_reader.read_hash_map<String, String, MemoryDomain::EnvVars>();
auto* ui = new RemoteUI{sock, dimensions}; auto* ui = new RemoteUI{sock, dimensions};
if (auto* client = ClientManager::instance().create_client( if (auto* client = ClientManager::instance().create_client(
std::unique_ptr<UserInterface>(ui), pid, std::unique_ptr<UserInterface>(ui), pid, std::move(name),
std::move(env_vars), init_cmds, init_coord, std::move(env_vars), init_cmds, init_coord,
[ui](int status) { ui->exit(status); })) [ui](int status) { ui->exit(status); }))
ui->set_client(client); ui->set_client(client);

View File

@ -30,7 +30,7 @@ using RemoteBuffer = Vector<char, MemoryDomain::Remote>;
class RemoteClient class RemoteClient
{ {
public: public:
RemoteClient(StringView session, std::unique_ptr<UserInterface>&& ui, RemoteClient(StringView session, StringView name, std::unique_ptr<UserInterface>&& ui,
int pid, const EnvVarMap& env_vars, StringView init_command, int pid, const EnvVarMap& env_vars, StringView init_command,
Optional<BufferCoord> init_coord); Optional<BufferCoord> init_coord);