@hugomg here is a quick and dirty fix (apply with git am
).
From c27e41f19dbd8ad9127fef9789a682ff0f3401de Mon Sep 17 00:00:00 2001
From: Johannes Altmanninger <aclopte@gmail.com>
Date: Sun, 13 Aug 2023 16:35:19 +0200
Subject: [PATCH 1/2] ctrl-z to trigger daemonization also if there is only one
client
Fixes https://github.com/mawww/kakoune/issues/4957
---
src/main.cc | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/main.cc b/src/main.cc
index a6762a2d5..bd7b727c9 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -675,11 +675,7 @@ std::unique_ptr<UserInterface> create_local_ui(UIType ui_type)
LocalUI()
{
set_signal_handler(SIGTSTP, [](int) {
- if (ClientManager::instance().count() == 1 and
- *ClientManager::instance().begin() == local_client)
- TerminalUI::instance().suspend();
- else
- convert_to_client_pending = true;
+ convert_to_client_pending = true;
});
}
@@ -892,8 +888,10 @@ int run_server(StringView session, StringView server_init,
show_startup_info(local_client, global_scope.options()["startup_info_version"].get<int>());
}
+ bool converting_to_client = false;
while (not terminate and
- (not client_manager.empty() or server.negotiating() or server.is_daemon()))
+ (not client_manager.empty() or server.negotiating()
+ or server.is_daemon() or converting_to_client))
{
client_manager.redraw_clients();
@@ -910,6 +908,8 @@ int run_server(StringView session, StringView server_init,
}
}
catch (const cancel&) {}
+ if (not client_manager.empty())
+ converting_to_client = false;
client_manager.process_pending_inputs();
@@ -946,6 +946,8 @@ int run_server(StringView session, StringView server_init,
server.close_session(false);
throw convert_to_client_mode{ std::move(session), std::move(client_name), std::move(buffer_name), std::move(selections) };
}
+
+ converting_to_client = true;
}
}
}
--
2.41.0.494.g1b0a512956
From 7aae265dd5cbcd7986891268529147ca0db222e1 Mon Sep 17 00:00:00 2001
From: Johannes Altmanninger <aclopte@gmail.com>
Date: Mon, 14 Aug 2023 22:55:02 +0200
Subject: [PATCH 2/2] Daemonize upon receiving SIGHUP
Fixes https://discuss.kakoune.com/t/i-closed-the-terminal-that-had-the-kak-server-now-the-clients-are-sad/2269/13
---
src/main.cc | 8 +++++++-
src/terminal_ui.cc | 13 ++++++++-----
src/terminal_ui.hh | 3 +++
3 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/src/main.cc b/src/main.cc
index bd7b727c9..a50c6a763 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -601,6 +601,7 @@ void register_options()
static Client* local_client = nullptr;
static int local_client_exit = 0;
static bool convert_to_client_pending = false;
+static bool converting_to_client = false;
enum class UIType
{
@@ -677,12 +678,18 @@ std::unique_ptr<UserInterface> create_local_ui(UIType ui_type)
set_signal_handler(SIGTSTP, [](int) {
convert_to_client_pending = true;
});
+ set_signal_handler(SIGHUP, [](int) {
+ stdin_closed = true;
+ convert_to_client_pending = true;
+ hup = true;
+ });
}
~LocalUI() override
{
local_client = nullptr;
if (convert_to_client_pending or
+ converting_to_client or
ClientManager::instance().empty())
return;
@@ -888,7 +895,6 @@ int run_server(StringView session, StringView server_init,
show_startup_info(local_client, global_scope.options()["startup_info_version"].get<int>());
}
- bool converting_to_client = false;
while (not terminate and
(not client_manager.empty() or server.negotiating()
or server.is_daemon() or converting_to_client))
diff --git a/src/terminal_ui.cc b/src/terminal_ui.cc
index f87a914e9..e28ed1d27 100644
--- a/src/terminal_ui.cc
+++ b/src/terminal_ui.cc
@@ -429,7 +429,8 @@ static constexpr StringView assistant_dilbert[] =
template<typename T> T sq(T x) { return x * x; }
static sig_atomic_t resize_pending = 0;
-static sig_atomic_t stdin_closed = 0;
+sig_atomic_t stdin_closed = 0;
+sig_atomic_t hup = 0;
template<sig_atomic_t* signal_flag>
static void signal_handler(int)
@@ -474,9 +475,12 @@ TerminalUI::TerminalUI()
TerminalUI::~TerminalUI()
{
- enable_mouse(false);
- restore_terminal();
- tcsetattr(STDIN_FILENO, TCSAFLUSH, &m_original_termios);
+ if (not hup)
+ {
+ enable_mouse(false);
+ restore_terminal();
+ tcsetattr(STDIN_FILENO, TCSAFLUSH, &m_original_termios);
+ }
set_signal_handler(SIGWINCH, SIG_DFL);
set_signal_handler(SIGHUP, SIG_DFL);
set_signal_handler(SIGTSTP, SIG_DFL);
@@ -669,7 +673,6 @@ Optional<Key> TerminalUI::get_next_key()
if (stdin_closed)
{
set_signal_handler(SIGWINCH, SIG_DFL);
- set_signal_handler(SIGHUP, SIG_DFL);
if (m_window)
m_window.destroy();
m_stdin_watcher.disable();
diff --git a/src/terminal_ui.hh b/src/terminal_ui.hh
index dd4ef870b..3b4a6f4f4 100644
--- a/src/terminal_ui.hh
+++ b/src/terminal_ui.hh
@@ -19,6 +19,9 @@ namespace Kakoune
struct DisplayAtom;
struct Writer;
+extern sig_atomic_t stdin_closed;
+extern sig_atomic_t hup;
+
class TerminalUI : public UserInterface, public Singleton<TerminalUI>
{
public:
--
2.41.0.494.g1b0a512956