diff --git a/src/profanity.c b/src/profanity.c index f2291db8..6da1f39a 100644 --- a/src/profanity.c +++ b/src/profanity.c @@ -150,6 +150,8 @@ prof_run(gchar* log_level, gchar* account_name, gchar* config_file, gchar* log_f if (!background_mode) { ui_update(); } + while (g_main_context_iteration(NULL, FALSE)) + ; #ifdef HAVE_GTK tray_update(); #endif diff --git a/src/tools/editor.c b/src/tools/editor.c index 7993f4c0..8e353108 100644 --- a/src/tools/editor.c +++ b/src/tools/editor.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "config/files.h" #include "config/preferences.h" @@ -313,6 +314,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); } diff --git a/src/ui/core.c b/src/ui/core.c index f21eb2cf..4c0d0739 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -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 diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c index 1f99aa27..0b69c8c9 100644 --- a/src/ui/inputwin.c +++ b/src/ui/inputwin.c @@ -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); @@ -180,7 +181,7 @@ char* inp_readline(void) { // UI is suspended - if (isendwin()) { + if (is_suspended || isendwin()) { g_usleep(100000); // 100ms return NULL; } @@ -285,6 +286,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) { diff --git a/src/ui/inputwin.h b/src/ui/inputwin.h index cdd8573a..da513789 100644 --- a/src/ui/inputwin.h +++ b/src/ui/inputwin.h @@ -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); void inp_set_line(const char* const new_line); diff --git a/src/xmpp/session.c b/src/xmpp/session.c index 18ccf63d..89dc7412 100644 --- a/src/xmpp/session.c +++ b/src/xmpp/session.c @@ -117,7 +117,7 @@ session_connect_with_account(const ProfAccount* const account) auto_char char* jid = NULL; if (account->resource) { auto_jid Jid* jidp = jid_create_from_bare_and_resource(account->jid, account->resource); - jid = strdup(jidp->fulljid); + jid = strdup(jid_fulljid_or_barejid(jidp)); } else { jid = strdup(account->jid); }