fix: resolve issues with async editor

If we build Profanity without GTK we dont iterate the context so we will
never know when the editor exited. Calling `g_main_context_iteration()`
or finally switching to GMainLoop fixes this.
So far calling `tray_update()` does this for us in GTK builds.
So this went unnoticed.

The editor will inherit ignored signal handlers (SIGINT, SIGTSTP, SIGPIPE)
from us. Neovim uses libuv which seems to check SIGINT on startup to
determine whether the environment is interactive or not.
We now reset these signals to SIG_DFL in the child process before execvp.

Profanity uses readline which still competed for terminal input with the
editor. We only took care about other Profanity UI processes in our
previous commit. This led to misordered characters in the editor.

In my tests with vim everything worked fine and these bugs were
discovered when a user used neovim.

Fixes: https://github.com/profanity-im/profanity/issues/2148
Ref: 36ec2b0ae1
Signed-off-by: Michael Vetter <jubalh@iodoru.org>
This commit is contained in:
Michael Vetter
2026-04-11 23:45:36 +02:00
parent 89fce43c07
commit dd76f9087f
5 changed files with 31 additions and 1 deletions

View File

@@ -139,6 +139,8 @@ prof_run(gchar* log_level, gchar* account_name, gchar* config_file, gchar* log_f
session_process_events();
iq_autoping_check();
ui_update();
while (g_main_context_iteration(NULL, FALSE))
;
#ifdef HAVE_GTK
tray_update();
#endif

View File

@@ -14,6 +14,7 @@
#include <errno.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include "config/files.h"
#include "config/preferences.h"
@@ -128,6 +129,12 @@ launch_editor(gchar* initial_content, void (*callback)(gchar* content, void* dat
return TRUE;
} else if (pid == 0) {
// Child process: Inherits TTY from parent
// Reset signal handlers that profanity sets so the editor doesn't inherit them
signal(SIGINT, SIG_DFL);
signal(SIGTSTP, SIG_DFL);
signal(SIGPIPE, SIG_DFL);
if (editor_argv && editor_argv[0]) {
execvp(editor_argv[0], editor_argv);
}

View File

@@ -179,6 +179,7 @@ ui_reset_idle_time(void)
void
ui_suspend(void)
{
inp_suspend();
endwin();
}
@@ -186,6 +187,7 @@ void
ui_resume(void)
{
refresh();
inp_resume();
}
void

View File

@@ -65,6 +65,7 @@ static fd_set fds;
static int r;
static char* inp_line = NULL;
static gboolean get_password = FALSE;
static gboolean is_suspended = FALSE;
static void _inp_win_update_virtual(void);
static int _inp_edited(const wint_t ch);
@@ -172,7 +173,7 @@ char*
inp_readline(void)
{
// UI is suspended
if (isendwin()) {
if (is_suspended || isendwin()) {
g_usleep(100000); // 100ms
return NULL;
}
@@ -272,6 +273,22 @@ inp_close(void)
discard = NULL;
}
void
inp_suspend(void)
{
is_suspended = TRUE;
rl_callback_handler_remove();
rl_deprep_terminal();
}
void
inp_resume(void)
{
is_suspended = FALSE;
rl_callback_handler_install(NULL, _inp_rl_linehandler);
rl_prep_terminal(0);
}
char*
inp_get_line(void)
{

View File

@@ -18,6 +18,8 @@ void create_input_window(void);
void inp_close(void);
void inp_win_resize(void);
void inp_put_back(void);
void inp_suspend(void);
void inp_resume(void);
char* inp_get_password(void);
char* inp_get_line(void);