Fork server to background when the client/server process receives SIGHUP
Avoid losing the whole session when closing the terminal emulator of the client/server process, only the client will be removed and the server will be forked.
This commit is contained in:
parent
fdf7cf3944
commit
ba71f209af
14
src/main.cc
14
src/main.cc
|
@ -53,7 +53,7 @@ struct startup_error : runtime_error
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void write_stdout(StringView str) { write(1, str); }
|
inline void write_stdout(StringView str) { write(1, str); }
|
||||||
inline void write_stderr(StringView str) { write(2, str); }
|
inline void write_stderr(StringView str) { try { write(2, str); } catch (runtime_error&) {} }
|
||||||
|
|
||||||
String runtime_directory()
|
String runtime_directory()
|
||||||
{
|
{
|
||||||
|
@ -337,6 +337,7 @@ void register_options()
|
||||||
|
|
||||||
static Client* local_client = nullptr;
|
static Client* local_client = nullptr;
|
||||||
static int local_client_exit = 0;
|
static int local_client_exit = 0;
|
||||||
|
static sig_atomic_t sighup_raised = 0;
|
||||||
static UserInterface* local_ui = nullptr;
|
static UserInterface* local_ui = nullptr;
|
||||||
static bool convert_to_client_pending = false;
|
static bool convert_to_client_pending = false;
|
||||||
|
|
||||||
|
@ -412,8 +413,8 @@ std::unique_ptr<UserInterface> create_local_ui(UIType ui_type)
|
||||||
kak_assert(not local_ui);
|
kak_assert(not local_ui);
|
||||||
local_ui = this;
|
local_ui = this;
|
||||||
m_old_sighup = set_signal_handler(SIGHUP, [](int) {
|
m_old_sighup = set_signal_handler(SIGHUP, [](int) {
|
||||||
ClientManager::instance().remove_client(*local_client, false, -1);
|
|
||||||
static_cast<LocalUI*>(local_ui)->on_sighup();
|
static_cast<LocalUI*>(local_ui)->on_sighup();
|
||||||
|
sighup_raised = 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
m_old_sigtstp = set_signal_handler(SIGTSTP, [](int) {
|
m_old_sigtstp = set_signal_handler(SIGTSTP, [](int) {
|
||||||
|
@ -645,7 +646,14 @@ int run_server(StringView session, StringView server_init,
|
||||||
client_manager.clear_window_trash();
|
client_manager.clear_window_trash();
|
||||||
buffer_manager.clear_buffer_trash();
|
buffer_manager.clear_buffer_trash();
|
||||||
|
|
||||||
if (convert_to_client_pending)
|
if (sighup_raised)
|
||||||
|
{
|
||||||
|
ClientManager::instance().remove_client(*local_client, true, 0);
|
||||||
|
if (not client_manager.empty() and fork_server_to_background())
|
||||||
|
return 0;
|
||||||
|
sighup_raised = 0;
|
||||||
|
}
|
||||||
|
else if (convert_to_client_pending)
|
||||||
{
|
{
|
||||||
String buffer_name = local_client->context().buffer().name();
|
String buffer_name = local_client->context().buffer().name();
|
||||||
String selections = selection_list_to_string(local_client->context().selections());
|
String selections = selection_list_to_string(local_client->context().selections());
|
||||||
|
|
Loading…
Reference in New Issue
Block a user