From b8711d56275166d806e5e3d5ed7436e6e3a8e16c Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Wed, 23 Feb 2022 11:50:42 +0100 Subject: [PATCH] Add `/subject editor` command Allow editing the MUC subject using external editor. Use `/subject editor`. Fix https://github.com/profanity-im/profanity/issues/1638 --- src/command/cmd_ac.c | 7 ++----- src/command/cmd_defs.c | 2 ++ src/command/cmd_funcs.c | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 81597a2d..57484736 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -780,6 +780,7 @@ cmd_ac_init(void) subject_ac = autocomplete_new(); autocomplete_add(subject_ac, "set"); autocomplete_add(subject_ac, "edit"); + autocomplete_add(subject_ac, "editor"); autocomplete_add(subject_ac, "prepend"); autocomplete_add(subject_ac, "append"); autocomplete_add(subject_ac, "clear"); @@ -3656,11 +3657,7 @@ _subject_autocomplete(ProfWin* window, const char* const input, gboolean previou char* result = NULL; if (window->type == WIN_MUC) { - if ((g_strcmp0(input, "/subject e") == 0) - || (g_strcmp0(input, "/subject ed") == 0) - || (g_strcmp0(input, "/subject edi") == 0) - || (g_strcmp0(input, "/subject edit") == 0) - || (g_strcmp0(input, "/subject edit ") == 0) + if ((g_strcmp0(input, "/subject edit ") == 0) || (g_strcmp0(input, "/subject edit \"") == 0)) { ProfMucWin* mucwin = (ProfMucWin*)window; assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index 359f47d0..e56b3dc8 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -676,6 +676,7 @@ static struct cmd_t command_defs[] = { CMD_SYN( "/subject set ", "/subject edit ", + "/subject editor", "/subject prepend ", "/subject append ", "/subject clear") @@ -684,6 +685,7 @@ static struct cmd_t command_defs[] = { CMD_ARGS( { "set ", "Set the room subject." }, { "edit ", "Edit the current room subject, tab autocompletion will display the subject to edit." }, + { "editor", "Edit the current room subject in external editor." }, { "prepend ", "Prepend text to the current room subject, use double quotes if a trailing space is needed." }, { "append ", "Append text to the current room subject, use double quotes if a preceding space is needed." }, { "clear", "Clear the room subject." }) diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 4b79b145..b18fd6a2 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -122,6 +122,7 @@ static void _who_roster(ProfWin* window, const char* const command, gchar** args static gboolean _cmd_execute(ProfWin* window, const char* const command, const char* const inp); static gboolean _cmd_execute_default(ProfWin* window, const char* inp); static gboolean _cmd_execute_alias(ProfWin* window, const char* const inp, gboolean* ran); +gboolean _get_message_from_editor(gchar* message, gchar** returned_message); /* * Take a line of input and process it, return TRUE if profanity is to @@ -4094,6 +4095,22 @@ cmd_subject(ProfWin* window, const char* const command, gchar** args) return TRUE; } + if (g_strcmp0(args[0], "editor") == 0) { + gchar* message = NULL; + char* subject = muc_subject(mucwin->roomjid); + + if (_get_message_from_editor(subject, &message)) { + return TRUE; + } + + if (message) { + message_send_groupchat_subject(mucwin->roomjid, message); + } else { + cons_bad_cmd_usage(command); + } + return TRUE; + } + if (g_strcmp0(args[0], "prepend") == 0) { if (args[1]) { char* old_subject = muc_subject(mucwin->roomjid);