From 4c882129c37e53e70fc08d9d0557039bb766a60d Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sat, 14 Oct 2000 14:32:53 +0000 Subject: [PATCH] /connect + /server server/chatnet completion by tommik. Completion works now with commands that optionally could have subcommands, like /server l could return list (subcommand) or localhost (server). git-svn-id: http://svn.irssi.org/repos/irssi/trunk@751 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- src/fe-common/core/chat-completion.c | 60 ++++++++++++++++++++++++++++ src/fe-common/core/completion.c | 22 +++++----- 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/fe-common/core/chat-completion.c b/src/fe-common/core/chat-completion.c index 128c8789..dff1f90b 100644 --- a/src/fe-common/core/chat-completion.c +++ b/src/fe-common/core/chat-completion.c @@ -26,6 +26,8 @@ #include "settings.h" #include "servers.h" +#include "chatnets.h" +#include "servers-setup.h" #include "channels.h" #include "channels-setup.h" #include "queries.h" @@ -500,6 +502,60 @@ static void sig_complete_msg(GList **list, WINDOW_REC *window, if (*list != NULL) signal_stop(); } +GList *completion_get_chatnets(const char *word) +{ + GList *list; + GSList *tmp; + int len; + + g_return_val_if_fail(word != NULL, NULL); + + len = strlen(word); + list = NULL; + + for (tmp = chatnets; tmp != NULL; tmp = tmp->next) { + CHATNET_REC *rec = tmp->data; + + if (g_strncasecmp(rec->name, word, len) == 0) + list = g_list_append(list, g_strdup(rec->name)); + } + + return list; +} + +GList *completion_get_servers(const char *word) +{ + GList *list; + GSList *tmp; + int len; + + g_return_val_if_fail(word != NULL, NULL); + + len = strlen(word); + list = NULL; + + for (tmp = setupservers; tmp != NULL; tmp = tmp->next) { + SERVER_SETUP_REC *rec = tmp->data; + + if (g_strncasecmp(rec->address, word, len) == 0) + list = g_list_append(list, g_strdup(rec->address)); + } + + return list; +} + +static void sig_complete_connect(GList **list, WINDOW_REC *window, + const char *word, const char *line, + int *want_space) +{ + g_return_if_fail(list != NULL); + g_return_if_fail(word != NULL); + + *list = completion_get_chatnets(word); + *list = g_list_concat(*list, completion_get_servers(word)); + if (*list != NULL) signal_stop(); +} + /* expand \n, \t and \\ */ static char *expand_escapes(const char *line, SERVER_REC *server, WI_ITEM_REC *item) @@ -624,6 +680,8 @@ void chat_completion_init(void) signal_add("complete word", (SIGNAL_FUNC) sig_complete_word); signal_add("complete command msg", (SIGNAL_FUNC) sig_complete_msg); + signal_add("complete command connect", (SIGNAL_FUNC) sig_complete_connect); + signal_add("complete command server", (SIGNAL_FUNC) sig_complete_connect); signal_add("message public", (SIGNAL_FUNC) sig_message_public); signal_add("message private", (SIGNAL_FUNC) sig_message_private); signal_add("command msg", (SIGNAL_FUNC) cmd_msg); @@ -640,6 +698,8 @@ void chat_completion_deinit(void) signal_remove("complete word", (SIGNAL_FUNC) sig_complete_word); signal_remove("complete command msg", (SIGNAL_FUNC) sig_complete_msg); + signal_remove("complete command connect", (SIGNAL_FUNC) sig_complete_connect); + signal_remove("complete command server", (SIGNAL_FUNC) sig_complete_connect); signal_remove("message public", (SIGNAL_FUNC) sig_message_public); signal_remove("message private", (SIGNAL_FUNC) sig_message_private); signal_remove("command msg", (SIGNAL_FUNC) cmd_msg); diff --git a/src/fe-common/core/completion.c b/src/fe-common/core/completion.c index a7e80b74..1e4e49db 100644 --- a/src/fe-common/core/completion.c +++ b/src/fe-common/core/completion.c @@ -495,17 +495,6 @@ static void sig_complete_word(GList **list, WINDOW_REC *window, line = linestart[1] == *cmdchars ? g_strdup(linestart+2) : expand_aliases(linestart+1); - if (command_have_sub(line)) { - /* complete subcommand */ - cmd = g_strconcat(line, " ", word, NULL); - *list = completion_get_subcommands(cmd); - g_free(cmd); - - if (*list != NULL) signal_stop(); - g_free(line); - return; - } - cmd = line_get_command(line, &args, FALSE); if (cmd == NULL) { g_free(line); @@ -514,7 +503,7 @@ static void sig_complete_word(GList **list, WINDOW_REC *window, /* we're completing -option? */ if (*word == '-') { - *list = completion_get_options(cmd, word+1); + *list = completion_get_options(cmd, word+1); g_free(cmd); g_free(line); return; @@ -524,6 +513,15 @@ static void sig_complete_word(GList **list, WINDOW_REC *window, signal = g_strconcat("complete command ", cmd, NULL); signal_emit(signal, 5, list, window, word, args, want_space); + if (command_have_sub(line)) { + /* complete subcommand */ + g_free(cmd); + cmd = g_strconcat(line, " ", word, NULL); + *list = g_list_concat(completion_get_subcommands(cmd), *list); + + if (*list != NULL) signal_stop(); + } + g_free(signal); g_free(cmd);