From adf1a6ae4a53ea21315033981dd51bd10aede72f Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 28 Oct 2012 00:42:41 +0100 Subject: [PATCH 1/4] Reordered autocompleters --- src/input_win.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/input_win.c b/src/input_win.c index 724b3a25..688e63ba 100644 --- a/src/input_win.c +++ b/src/input_win.c @@ -354,12 +354,6 @@ _handle_edit(const int ch, char *input, int *size) } } - _parameter_autocomplete(input, size, "/msg", - contact_list_find_contact); - _parameter_autocomplete(input, size, "/connect", - prefs_find_login); - _parameter_autocomplete(input, size, "/help", - cmd_help_complete); _parameter_autocomplete(input, size, "/beep", prefs_autocomplete_boolean_choice); _parameter_autocomplete(input, size, "/intype", @@ -375,6 +369,13 @@ _handle_edit(const int ch, char *input, int *size) _parameter_autocomplete(input, size, "/vercheck", prefs_autocomplete_boolean_choice); + _parameter_autocomplete(input, size, "/msg", + contact_list_find_contact); + _parameter_autocomplete(input, size, "/connect", + prefs_find_login); + _parameter_autocomplete(input, size, "/help", + cmd_help_complete); + _notify_autocomplete(input, size); return 1; From 34392622ea52d1d314b9d84b58f3cbb2112f56fe Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 28 Oct 2012 01:08:04 +0100 Subject: [PATCH 2/4] Moved autcomplete code to command.c --- src/command.c | 90 +++++++++++++++++++++++++++++++++++++++++++++-- src/command.h | 1 + src/input_win.c | 93 +++++++++++-------------------------------------- src/ui.h | 1 + 4 files changed, 110 insertions(+), 75 deletions(-) diff --git a/src/command.c b/src/command.c index 3252fdda..d96f4d85 100644 --- a/src/command.c +++ b/src/command.c @@ -38,16 +38,20 @@ #include "tinyurl.h" #include "ui.h" +typedef char*(*autocomplete_func)(char *); + /* * Command structure * * cmd - The command string including leading '/' * func - The function to execute for the command + * complete_func - Function to autcomplete parameters * help - A help struct containing usage info etc */ struct cmd_t { const gchar *cmd; gboolean (*func)(const char * const inp, struct cmd_help_t help); + autocomplete_func complete_func; struct cmd_help_t help; }; @@ -57,6 +61,9 @@ static void _update_presence(const jabber_presence_t presence, static gboolean _cmd_set_boolean_preference(const char * const inp, struct cmd_help_t help, const char * const cmd_str, const char * const display, void (*set_func)(gboolean)); +static char *_cmd_help_complete(char *inp); +static void _parameter_autocomplete(char *input, int *size, char *command, + autocomplete_func func); // command prototypes static gboolean _cmd_quit(const char * const inp, struct cmd_help_t help); @@ -93,6 +100,7 @@ static struct cmd_t main_commands[] = { { "/help", _cmd_help, + _cmd_help_complete, { "/help [area|command]", "Show help summary, or help on a specific area or command", { "/help [area|command]", "--------------------", @@ -106,6 +114,7 @@ static struct cmd_t main_commands[] = { "/about", _cmd_about, + NULL, { "/about", "About Profanity", { "/about", "------", @@ -114,6 +123,7 @@ static struct cmd_t main_commands[] = { "/connect", _cmd_connect, + prefs_find_login, { "/connect user@host", "Login to jabber.", { "/connect user@host", "------------------", @@ -126,6 +136,7 @@ static struct cmd_t main_commands[] = { "/disconnect", _cmd_disconnect, + NULL, { "/disconnect", "Logout of current jabber session.", { "/disconnect", "------------------", @@ -135,6 +146,7 @@ static struct cmd_t main_commands[] = { "/prefs", _cmd_prefs, + NULL, { "/prefs", "Show current preferences.", { "/prefs", "------", @@ -149,6 +161,7 @@ static struct cmd_t main_commands[] = { "/msg", _cmd_msg, + contact_list_find_contact, { "/msg user@host mesg", "Send mesg to user.", { "/msg user@host mesg", "-------------------", @@ -164,6 +177,7 @@ static struct cmd_t main_commands[] = { "/tiny", _cmd_tiny, + NULL, { "/tiny url", "Send url as tinyurl in current chat.", { "/tiny url", "---------", @@ -176,6 +190,7 @@ static struct cmd_t main_commands[] = { "/who", _cmd_who, + NULL, { "/who [status]", "Show contacts with chosen status.", { "/who [status]", "-------------", @@ -186,6 +201,7 @@ static struct cmd_t main_commands[] = { "/close", _cmd_close, + NULL, { "/close", "Close current chat window.", { "/close", "------", @@ -195,6 +211,7 @@ static struct cmd_t main_commands[] = { "/quit", _cmd_quit, + NULL, { "/quit", "Quit Profanity.", { "/quit", "-----", @@ -206,6 +223,7 @@ static struct cmd_t setting_commands[] = { { "/beep", _cmd_set_beep, + prefs_autocomplete_boolean_choice, { "/beep on|off", "Terminal beep on new messages.", { "/beep on|off", "------------", @@ -220,6 +238,7 @@ static struct cmd_t setting_commands[] = { "/notify", _cmd_set_notify, + NULL, { "/notify type value", "Control various desktop noficiations.", { "/notify type value", "------------------", @@ -245,6 +264,7 @@ static struct cmd_t setting_commands[] = { "/flash", _cmd_set_flash, + prefs_autocomplete_boolean_choice, { "/flash on|off", "Terminal flash on new messages.", { "/flash on|off", "-------------", @@ -259,6 +279,7 @@ static struct cmd_t setting_commands[] = { "/intype", _cmd_set_intype, + prefs_autocomplete_boolean_choice, { "/intype on|off", "Show when contact is typing.", { "/intype on|off", "--------------", @@ -270,6 +291,7 @@ static struct cmd_t setting_commands[] = { "/showsplash", _cmd_set_showsplash, + prefs_autocomplete_boolean_choice, { "/showsplash on|off", "Splash logo on startup.", { "/showsplash on|off", "------------------", @@ -281,6 +303,7 @@ static struct cmd_t setting_commands[] = { "/vercheck", _cmd_vercheck, + prefs_autocomplete_boolean_choice, { "/vercheck [on|off]", "Check for a new release.", { "/vercheck [on|off]", "------------------", @@ -291,6 +314,7 @@ static struct cmd_t setting_commands[] = { "/chlog", _cmd_set_chlog, + prefs_autocomplete_boolean_choice, { "/chlog on|off", "Chat logging to file", { "/chlog on|off", "-------------", @@ -307,6 +331,7 @@ static struct cmd_t setting_commands[] = { "/history", _cmd_set_history, + prefs_autocomplete_boolean_choice, { "/history on|off", "Chat history in message windows.", { "/history on|off", "-------------", @@ -322,6 +347,7 @@ static struct cmd_t status_commands[] = { { "/away", _cmd_away, + NULL, { "/away [msg]", "Set status to away.", { "/away [msg]", "-----------", @@ -333,6 +359,7 @@ static struct cmd_t status_commands[] = { "/chat", _cmd_chat, + NULL, { "/chat [msg]", "Set status to chat (available for chat).", { "/chat [msg]", "-----------", @@ -345,6 +372,7 @@ static struct cmd_t status_commands[] = { "/dnd", _cmd_dnd, + NULL, { "/dnd [msg]", "Set status to dnd (do not disturb.", { "/dnd [msg]", "----------", @@ -357,6 +385,7 @@ static struct cmd_t status_commands[] = { "/online", _cmd_online, + NULL, { "/online [msg]", "Set status to online.", { "/online [msg]", "-------------", @@ -368,6 +397,7 @@ static struct cmd_t status_commands[] = { "/xa", _cmd_xa, + NULL, { "/xa [msg]", "Set status to xa (extended away).", { "/xa [msg]", "---------", @@ -446,8 +476,8 @@ cmd_reset_completer(void) } // Command help autocomplete -char * -cmd_help_complete(char *inp) +static char * +_cmd_help_complete(char *inp) { return p_autocomplete_complete(help_ac, inp); } @@ -545,6 +575,32 @@ cmd_execute_default(const char * const inp) return TRUE; } +void +cmd_complete_parameters(char *input, int *size) +{ + _parameter_autocomplete(input, size, "/beep", + prefs_autocomplete_boolean_choice); + _parameter_autocomplete(input, size, "/intype", + prefs_autocomplete_boolean_choice); + _parameter_autocomplete(input, size, "/flash", + prefs_autocomplete_boolean_choice); + _parameter_autocomplete(input, size, "/showsplash", + prefs_autocomplete_boolean_choice); + _parameter_autocomplete(input, size, "/chlog", + prefs_autocomplete_boolean_choice); + _parameter_autocomplete(input, size, "/history", + prefs_autocomplete_boolean_choice); + _parameter_autocomplete(input, size, "/vercheck", + prefs_autocomplete_boolean_choice); + + _parameter_autocomplete(input, size, "/msg", + contact_list_find_contact); + _parameter_autocomplete(input, size, "/connect", + prefs_find_login); + _parameter_autocomplete(input, size, "/help", + _cmd_help_complete); +} + // The command functions static gboolean @@ -1114,3 +1170,33 @@ _cmd_get_command(const char * const command) return NULL; } + +static void +_parameter_autocomplete(char *input, int *size, char *command, + autocomplete_func func) +{ + char *found = NULL; + char *auto_msg = NULL; + char inp_cpy[*size]; + int i; + char *command_cpy = malloc(strlen(command) + 2); + sprintf(command_cpy, "%s ", command); + int len = strlen(command_cpy); + if ((strncmp(input, command_cpy, len) == 0) && (*size > len)) { + for(i = len; i < *size; i++) { + inp_cpy[i-len] = input[i]; + } + inp_cpy[(*size) - len] = '\0'; + found = func(inp_cpy); + if (found != NULL) { + auto_msg = (char *) malloc((len + (strlen(found) + 1)) * sizeof(char)); + strcpy(auto_msg, command_cpy); + strcat(auto_msg, found); + inp_replace_input(input, auto_msg, size); + free(auto_msg); + free(found); + } + } + free(command_cpy); +} + diff --git a/src/command.h b/src/command.h index a7c37fcf..4f88cfb2 100644 --- a/src/command.h +++ b/src/command.h @@ -36,6 +36,7 @@ void cmd_init(void); void cmd_close(void); char * cmd_complete(char *inp); void cmd_reset_completer(void); +void cmd_complete_parameters(char *input, int *size); gboolean cmd_execute(const char * const command, const char * const inp); gboolean cmd_execute_default(const char * const inp); diff --git a/src/input_win.c b/src/input_win.c index 688e63ba..bca62703 100644 --- a/src/input_win.c +++ b/src/input_win.c @@ -58,16 +58,11 @@ #include "preferences.h" #include "ui.h" -typedef char*(*autocomplete_func)(char *); - static WINDOW *inp_win; static int pad_start = 0; static int _handle_edit(const int ch, char *input, int *size); static int _printable(const int ch); -static void _replace_input(char *input, const char * const new_input, int *size); -static void _parameter_autocomplete(char *input, int *size, char *command, - autocomplete_func func); static void _notify_autocomplete(char *input, int *size); void @@ -206,6 +201,19 @@ inp_put_back(void) prefresh(inp_win, 0, pad_start, rows-1, 0, rows-1, cols-1); } +void +inp_replace_input(char *input, const char * const new_input, int *size) +{ + int i; + + strcpy(input, new_input); + *size = strlen(input); + inp_clear(); + for (i = 0; i < *size; i++) + waddch(inp_win, input[i]); +} + + /* * Deal with command editing, return 1 if ch was an edit * key press: up, down, left, right or backspace @@ -307,7 +315,7 @@ _handle_edit(const int ch, char *input, int *size) case KEY_UP: prev = history_previous(input, size); if (prev) { - _replace_input(input, prev, size); + inp_replace_input(input, prev, size); pad_start = 0; prefresh(inp_win, 0, pad_start, rows-1, 0, rows-1, cols-1); } @@ -316,7 +324,7 @@ _handle_edit(const int ch, char *input, int *size) case KEY_DOWN: next = history_next(input, size); if (next) { - _replace_input(input, next, size); + inp_replace_input(input, next, size); pad_start = 0; prefresh(inp_win, 0, pad_start, rows-1, 0, rows-1, cols-1); } @@ -348,33 +356,13 @@ _handle_edit(const int ch, char *input, int *size) if (found != NULL) { auto_msg = (char *) malloc((strlen(found) + 1) * sizeof(char)); strcpy(auto_msg, found); - _replace_input(input, auto_msg, size); + inp_replace_input(input, auto_msg, size); free(auto_msg); free(found); } } - _parameter_autocomplete(input, size, "/beep", - prefs_autocomplete_boolean_choice); - _parameter_autocomplete(input, size, "/intype", - prefs_autocomplete_boolean_choice); - _parameter_autocomplete(input, size, "/flash", - prefs_autocomplete_boolean_choice); - _parameter_autocomplete(input, size, "/showsplash", - prefs_autocomplete_boolean_choice); - _parameter_autocomplete(input, size, "/chlog", - prefs_autocomplete_boolean_choice); - _parameter_autocomplete(input, size, "/history", - prefs_autocomplete_boolean_choice); - _parameter_autocomplete(input, size, "/vercheck", - prefs_autocomplete_boolean_choice); - - _parameter_autocomplete(input, size, "/msg", - contact_list_find_contact); - _parameter_autocomplete(input, size, "/connect", - prefs_find_login); - _parameter_autocomplete(input, size, "/help", - cmd_help_complete); + cmd_complete_parameters(input, size); _notify_autocomplete(input, size); @@ -397,47 +385,6 @@ _printable(const int ch) ch != KEY_IC && ch != KEY_EIC && ch != KEY_RESIZE); } -static void -_replace_input(char *input, const char * const new_input, int *size) -{ - int i; - - strcpy(input, new_input); - *size = strlen(input); - inp_clear(); - for (i = 0; i < *size; i++) - waddch(inp_win, input[i]); -} - -static void -_parameter_autocomplete(char *input, int *size, char *command, - autocomplete_func func) -{ - char *found = NULL; - char *auto_msg = NULL; - char inp_cpy[*size]; - int i; - char *command_cpy = malloc(strlen(command) + 2); - sprintf(command_cpy, "%s ", command); - int len = strlen(command_cpy); - if ((strncmp(input, command_cpy, len) == 0) && (*size > len)) { - for(i = len; i < *size; i++) { - inp_cpy[i-len] = input[i]; - } - inp_cpy[(*size) - len] = '\0'; - found = func(inp_cpy); - if (found != NULL) { - auto_msg = (char *) malloc((len + (strlen(found) + 1)) * sizeof(char)); - strcpy(auto_msg, command_cpy); - strcat(auto_msg, found); - _replace_input(input, auto_msg, size); - free(auto_msg); - free(found); - } - } - free(command_cpy); -} - static void _notify_autocomplete(char *input, int *size) { @@ -456,7 +403,7 @@ _notify_autocomplete(char *input, int *size) auto_msg = (char *) malloc((16 + (strlen(found) + 1)) * sizeof(char)); strcpy(auto_msg, "/notify message "); strcat(auto_msg, found); - _replace_input(input, auto_msg, size); + inp_replace_input(input, auto_msg, size); free(auto_msg); free(found); } @@ -470,7 +417,7 @@ _notify_autocomplete(char *input, int *size) auto_msg = (char *) malloc((15 + (strlen(found) + 1)) * sizeof(char)); strcpy(auto_msg, "/notify typing "); strcat(auto_msg, found); - _replace_input(input, auto_msg, size); + inp_replace_input(input, auto_msg, size); free(auto_msg); free(found); } @@ -484,7 +431,7 @@ _notify_autocomplete(char *input, int *size) auto_msg = (char *) malloc((8 + (strlen(found) + 1)) * sizeof(char)); strcpy(auto_msg, "/notify "); strcat(auto_msg, found); - _replace_input(input, auto_msg, size); + inp_replace_input(input, auto_msg, size); free(auto_msg); free(found); } diff --git a/src/ui.h b/src/ui.h index df42a191..642d2ec5 100644 --- a/src/ui.h +++ b/src/ui.h @@ -136,5 +136,6 @@ void inp_put_back(void); void inp_non_block(void); void inp_block(void); void inp_get_password(char *passwd); +void inp_replace_input(char *input, const char * const new_input, int *size); #endif From 6a32ed457195720404fb9e1347baf0796d91217f Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 28 Oct 2012 01:42:26 +0100 Subject: [PATCH 3/4] Moved remaining autocomplete code to command.c --- src/command.c | 188 +++++++++++++++++++++++++++++++++--------------- src/command.h | 12 ++-- src/input_win.c | 85 +--------------------- 3 files changed, 136 insertions(+), 149 deletions(-) diff --git a/src/command.c b/src/command.c index d96f4d85..c68ce06b 100644 --- a/src/command.c +++ b/src/command.c @@ -51,7 +51,6 @@ typedef char*(*autocomplete_func)(char *); struct cmd_t { const gchar *cmd; gboolean (*func)(const char * const inp, struct cmd_help_t help); - autocomplete_func complete_func; struct cmd_help_t help; }; @@ -61,7 +60,15 @@ static void _update_presence(const jabber_presence_t presence, static gboolean _cmd_set_boolean_preference(const char * const inp, struct cmd_help_t help, const char * const cmd_str, const char * const display, void (*set_func)(gboolean)); + +static char *_cmd_complete(char *inp); +static void _cmd_reset_command_completer(void); static char *_cmd_help_complete(char *inp); +static void _cmd_help_reset_completer(void); +static char *_cmd_notify_complete(char *inp); +static void _cmd_notify_reset_completer(void); +static void _cmd_complete_parameters(char *input, int *size); +static void _notify_autocomplete(char *input, int *size); static void _parameter_autocomplete(char *input, int *size, char *command, autocomplete_func func); @@ -100,7 +107,6 @@ static struct cmd_t main_commands[] = { { "/help", _cmd_help, - _cmd_help_complete, { "/help [area|command]", "Show help summary, or help on a specific area or command", { "/help [area|command]", "--------------------", @@ -114,7 +120,6 @@ static struct cmd_t main_commands[] = { "/about", _cmd_about, - NULL, { "/about", "About Profanity", { "/about", "------", @@ -123,7 +128,6 @@ static struct cmd_t main_commands[] = { "/connect", _cmd_connect, - prefs_find_login, { "/connect user@host", "Login to jabber.", { "/connect user@host", "------------------", @@ -136,7 +140,6 @@ static struct cmd_t main_commands[] = { "/disconnect", _cmd_disconnect, - NULL, { "/disconnect", "Logout of current jabber session.", { "/disconnect", "------------------", @@ -146,7 +149,6 @@ static struct cmd_t main_commands[] = { "/prefs", _cmd_prefs, - NULL, { "/prefs", "Show current preferences.", { "/prefs", "------", @@ -161,7 +163,6 @@ static struct cmd_t main_commands[] = { "/msg", _cmd_msg, - contact_list_find_contact, { "/msg user@host mesg", "Send mesg to user.", { "/msg user@host mesg", "-------------------", @@ -177,7 +178,6 @@ static struct cmd_t main_commands[] = { "/tiny", _cmd_tiny, - NULL, { "/tiny url", "Send url as tinyurl in current chat.", { "/tiny url", "---------", @@ -190,7 +190,6 @@ static struct cmd_t main_commands[] = { "/who", _cmd_who, - NULL, { "/who [status]", "Show contacts with chosen status.", { "/who [status]", "-------------", @@ -201,7 +200,6 @@ static struct cmd_t main_commands[] = { "/close", _cmd_close, - NULL, { "/close", "Close current chat window.", { "/close", "------", @@ -211,7 +209,6 @@ static struct cmd_t main_commands[] = { "/quit", _cmd_quit, - NULL, { "/quit", "Quit Profanity.", { "/quit", "-----", @@ -223,7 +220,6 @@ static struct cmd_t setting_commands[] = { { "/beep", _cmd_set_beep, - prefs_autocomplete_boolean_choice, { "/beep on|off", "Terminal beep on new messages.", { "/beep on|off", "------------", @@ -238,7 +234,6 @@ static struct cmd_t setting_commands[] = { "/notify", _cmd_set_notify, - NULL, { "/notify type value", "Control various desktop noficiations.", { "/notify type value", "------------------", @@ -264,7 +259,6 @@ static struct cmd_t setting_commands[] = { "/flash", _cmd_set_flash, - prefs_autocomplete_boolean_choice, { "/flash on|off", "Terminal flash on new messages.", { "/flash on|off", "-------------", @@ -279,7 +273,6 @@ static struct cmd_t setting_commands[] = { "/intype", _cmd_set_intype, - prefs_autocomplete_boolean_choice, { "/intype on|off", "Show when contact is typing.", { "/intype on|off", "--------------", @@ -291,7 +284,6 @@ static struct cmd_t setting_commands[] = { "/showsplash", _cmd_set_showsplash, - prefs_autocomplete_boolean_choice, { "/showsplash on|off", "Splash logo on startup.", { "/showsplash on|off", "------------------", @@ -303,7 +295,6 @@ static struct cmd_t setting_commands[] = { "/vercheck", _cmd_vercheck, - prefs_autocomplete_boolean_choice, { "/vercheck [on|off]", "Check for a new release.", { "/vercheck [on|off]", "------------------", @@ -314,7 +305,6 @@ static struct cmd_t setting_commands[] = { "/chlog", _cmd_set_chlog, - prefs_autocomplete_boolean_choice, { "/chlog on|off", "Chat logging to file", { "/chlog on|off", "-------------", @@ -331,7 +321,6 @@ static struct cmd_t setting_commands[] = { "/history", _cmd_set_history, - prefs_autocomplete_boolean_choice, { "/history on|off", "Chat history in message windows.", { "/history on|off", "-------------", @@ -347,7 +336,6 @@ static struct cmd_t status_commands[] = { { "/away", _cmd_away, - NULL, { "/away [msg]", "Set status to away.", { "/away [msg]", "-----------", @@ -359,7 +347,6 @@ static struct cmd_t status_commands[] = { "/chat", _cmd_chat, - NULL, { "/chat [msg]", "Set status to chat (available for chat).", { "/chat [msg]", "-----------", @@ -372,7 +359,6 @@ static struct cmd_t status_commands[] = { "/dnd", _cmd_dnd, - NULL, { "/dnd [msg]", "Set status to dnd (do not disturb.", { "/dnd [msg]", "----------", @@ -385,7 +371,6 @@ static struct cmd_t status_commands[] = { "/online", _cmd_online, - NULL, { "/online [msg]", "Set status to online.", { "/online [msg]", "-------------", @@ -397,7 +382,6 @@ static struct cmd_t status_commands[] = { "/xa", _cmd_xa, - NULL, { "/xa [msg]", "Set status to xa (extended away).", { "/xa [msg]", "---------", @@ -462,43 +446,41 @@ cmd_close(void) } // Command autocompletion functions - -char * -cmd_complete(char *inp) +void +cmd_autocomplete(char *input, int *size) { - return p_autocomplete_complete(commands_ac, inp); + int i = 0; + char *found = NULL; + char *auto_msg = NULL; + char inp_cpy[*size]; + + if ((strncmp(input, "/", 1) == 0) && (!str_contains(input, *size, ' '))) { + for(i = 0; i < *size; i++) { + inp_cpy[i] = input[i]; + } + inp_cpy[i] = '\0'; + found = _cmd_complete(inp_cpy); + if (found != NULL) { + auto_msg = (char *) malloc((strlen(found) + 1) * sizeof(char)); + strcpy(auto_msg, found); + inp_replace_input(input, auto_msg, size); + free(auto_msg); + free(found); + } + } + + _cmd_complete_parameters(input, size); } void -cmd_reset_completer(void) +cmd_reset_autocomplete() { - p_autocomplete_reset(commands_ac); -} - -// Command help autocomplete -static char * -_cmd_help_complete(char *inp) -{ - return p_autocomplete_complete(help_ac, inp); -} - -void -cmd_help_reset_completer(void) -{ - p_autocomplete_reset(help_ac); -} - -// Command notify autcomplete -char * -cmd_notify_complete(char *inp) -{ - return p_autocomplete_complete(notify_ac, inp); -} - -void -cmd_notify_reset_completer(void) -{ - p_autocomplete_reset(notify_ac); + contact_list_reset_search_attempts(); + prefs_reset_login_search(); + prefs_reset_boolean_choice(); + _cmd_help_reset_completer(); + _cmd_notify_reset_completer(); + _cmd_reset_command_completer(); } GSList * @@ -575,8 +557,44 @@ cmd_execute_default(const char * const inp) return TRUE; } -void -cmd_complete_parameters(char *input, int *size) +static char * +_cmd_complete(char *inp) +{ + return p_autocomplete_complete(commands_ac, inp); +} + +static void +_cmd_reset_command_completer(void) +{ + p_autocomplete_reset(commands_ac); +} + +static char * +_cmd_help_complete(char *inp) +{ + return p_autocomplete_complete(help_ac, inp); +} + +static void +_cmd_help_reset_completer(void) +{ + p_autocomplete_reset(help_ac); +} + +static char * +_cmd_notify_complete(char *inp) +{ + return p_autocomplete_complete(notify_ac, inp); +} + +static void +_cmd_notify_reset_completer(void) +{ + p_autocomplete_reset(notify_ac); +} + +static void +_cmd_complete_parameters(char *input, int *size) { _parameter_autocomplete(input, size, "/beep", prefs_autocomplete_boolean_choice); @@ -599,6 +617,8 @@ cmd_complete_parameters(char *input, int *size) prefs_find_login); _parameter_autocomplete(input, size, "/help", _cmd_help_complete); + + _notify_autocomplete(input, size); } // The command functions @@ -1200,3 +1220,55 @@ _parameter_autocomplete(char *input, int *size, char *command, free(command_cpy); } +static void +_notify_autocomplete(char *input, int *size) +{ + char *found = NULL; + char *auto_msg = NULL; + char inp_cpy[*size]; + int i; + + if ((strncmp(input, "/notify message ", 16) == 0) && (*size > 16)) { + for(i = 16; i < *size; i++) { + inp_cpy[i-16] = input[i]; + } + inp_cpy[(*size) - 16] = '\0'; + found = prefs_autocomplete_boolean_choice(inp_cpy); + if (found != NULL) { + auto_msg = (char *) malloc((16 + (strlen(found) + 1)) * sizeof(char)); + strcpy(auto_msg, "/notify message "); + strcat(auto_msg, found); + inp_replace_input(input, auto_msg, size); + free(auto_msg); + free(found); + } + } else if ((strncmp(input, "/notify typing ", 15) == 0) && (*size > 15)) { + for(i = 15; i < *size; i++) { + inp_cpy[i-15] = input[i]; + } + inp_cpy[(*size) - 15] = '\0'; + found = prefs_autocomplete_boolean_choice(inp_cpy); + if (found != NULL) { + auto_msg = (char *) malloc((15 + (strlen(found) + 1)) * sizeof(char)); + strcpy(auto_msg, "/notify typing "); + strcat(auto_msg, found); + inp_replace_input(input, auto_msg, size); + free(auto_msg); + free(found); + } + } else if ((strncmp(input, "/notify ", 8) == 0) && (*size > 8)) { + for(i = 8; i < *size; i++) { + inp_cpy[i-8] = input[i]; + } + inp_cpy[(*size) - 8] = '\0'; + found = _cmd_notify_complete(inp_cpy); + if (found != NULL) { + auto_msg = (char *) malloc((8 + (strlen(found) + 1)) * sizeof(char)); + strcpy(auto_msg, "/notify "); + strcat(auto_msg, found); + inp_replace_input(input, auto_msg, size); + free(auto_msg); + free(found); + } + } +} diff --git a/src/command.h b/src/command.h index 4f88cfb2..e53d1773 100644 --- a/src/command.h +++ b/src/command.h @@ -34,17 +34,13 @@ struct cmd_help_t { void cmd_init(void); void cmd_close(void); -char * cmd_complete(char *inp); -void cmd_reset_completer(void); -void cmd_complete_parameters(char *input, int *size); + +void cmd_autocomplete(char *input, int *size); +void cmd_reset_autocomplete(void); + gboolean cmd_execute(const char * const command, const char * const inp); gboolean cmd_execute_default(const char * const inp); -// command help -char * cmd_help_complete(char *inp); -char * cmd_notify_complete(char *inp); -void cmd_help_reset_completer(void); -void cmd_notify_reset_completer(void); GSList * cmd_get_basic_help(void); GSList * cmd_get_settings_help(void); GSList * cmd_get_status_help(void); diff --git a/src/input_win.c b/src/input_win.c index bca62703..1c12e8a1 100644 --- a/src/input_win.c +++ b/src/input_win.c @@ -63,7 +63,6 @@ static int pad_start = 0; static int _handle_edit(const int ch, char *input, int *size); static int _printable(const int ch); -static void _notify_autocomplete(char *input, int *size); void create_input_window(void) @@ -166,12 +165,7 @@ inp_get_char(int *ch, char *input, int *size) } } - contact_list_reset_search_attempts(); - prefs_reset_login_search(); - prefs_reset_boolean_choice(); - cmd_help_reset_completer(); - cmd_notify_reset_completer(); - cmd_reset_completer(); + cmd_reset_autocomplete(); } } @@ -225,11 +219,8 @@ _handle_edit(const int ch, char *input, int *size) int i, rows, cols; char *prev = NULL; char *next = NULL; - char *found = NULL; - char *auto_msg = NULL; int inp_y = 0; int inp_x = 0; - char inp_cpy[*size]; getmaxyx(stdscr, rows, cols); getyx(inp_win, inp_y, inp_x); @@ -345,27 +336,7 @@ _handle_edit(const int ch, char *input, int *size) return 1; case 9: // tab - - // autocomplete command - if ((strncmp(input, "/", 1) == 0) && (!str_contains(input, *size, ' '))) { - for(i = 0; i < *size; i++) { - inp_cpy[i] = input[i]; - } - inp_cpy[i] = '\0'; - found = cmd_complete(inp_cpy); - if (found != NULL) { - auto_msg = (char *) malloc((strlen(found) + 1) * sizeof(char)); - strcpy(auto_msg, found); - inp_replace_input(input, auto_msg, size); - free(auto_msg); - free(found); - } - } - - cmd_complete_parameters(input, size); - - _notify_autocomplete(input, size); - + cmd_autocomplete(input, size); return 1; default: @@ -385,55 +356,3 @@ _printable(const int ch) ch != KEY_IC && ch != KEY_EIC && ch != KEY_RESIZE); } -static void -_notify_autocomplete(char *input, int *size) -{ - char *found = NULL; - char *auto_msg = NULL; - char inp_cpy[*size]; - int i; - - if ((strncmp(input, "/notify message ", 16) == 0) && (*size > 16)) { - for(i = 16; i < *size; i++) { - inp_cpy[i-16] = input[i]; - } - inp_cpy[(*size) - 16] = '\0'; - found = prefs_autocomplete_boolean_choice(inp_cpy); - if (found != NULL) { - auto_msg = (char *) malloc((16 + (strlen(found) + 1)) * sizeof(char)); - strcpy(auto_msg, "/notify message "); - strcat(auto_msg, found); - inp_replace_input(input, auto_msg, size); - free(auto_msg); - free(found); - } - } else if ((strncmp(input, "/notify typing ", 15) == 0) && (*size > 15)) { - for(i = 15; i < *size; i++) { - inp_cpy[i-15] = input[i]; - } - inp_cpy[(*size) - 15] = '\0'; - found = prefs_autocomplete_boolean_choice(inp_cpy); - if (found != NULL) { - auto_msg = (char *) malloc((15 + (strlen(found) + 1)) * sizeof(char)); - strcpy(auto_msg, "/notify typing "); - strcat(auto_msg, found); - inp_replace_input(input, auto_msg, size); - free(auto_msg); - free(found); - } - } else if ((strncmp(input, "/notify ", 8) == 0) && (*size > 8)) { - for(i = 8; i < *size; i++) { - inp_cpy[i-8] = input[i]; - } - inp_cpy[(*size) - 8] = '\0'; - found = cmd_notify_complete(inp_cpy); - if (found != NULL) { - auto_msg = (char *) malloc((8 + (strlen(found) + 1)) * sizeof(char)); - strcpy(auto_msg, "/notify "); - strcat(auto_msg, found); - inp_replace_input(input, auto_msg, size); - free(auto_msg); - free(found); - } - } -} From 7aa177c6687d78b3bc3f1fe1b951145cb2a07635 Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 28 Oct 2012 01:47:57 +0100 Subject: [PATCH 4/4] Added /who autocomplete --- src/command.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/command.c b/src/command.c index c68ce06b..0fd093bb 100644 --- a/src/command.c +++ b/src/command.c @@ -63,6 +63,8 @@ static gboolean _cmd_set_boolean_preference(const char * const inp, static char *_cmd_complete(char *inp); static void _cmd_reset_command_completer(void); +static char *_cmd_who_complete(char *inp); +static void _cmd_reset_who_completer(void); static char *_cmd_help_complete(char *inp); static void _cmd_help_reset_completer(void); static char *_cmd_notify_complete(char *inp); @@ -394,6 +396,7 @@ static struct cmd_t status_commands[] = }; static PAutocomplete commands_ac; +static PAutocomplete who_ac; static PAutocomplete help_ac; static PAutocomplete notify_ac; @@ -404,12 +407,16 @@ void cmd_init(void) { log_info("Initialising commands"); + commands_ac = p_autocomplete_new(); + who_ac = p_autocomplete_new(); + help_ac = p_autocomplete_new(); p_autocomplete_add(help_ac, strdup("basic")); p_autocomplete_add(help_ac, strdup("status")); p_autocomplete_add(help_ac, strdup("settings")); p_autocomplete_add(help_ac, strdup("navigation")); + notify_ac = p_autocomplete_new(); p_autocomplete_add(notify_ac, strdup("message")); p_autocomplete_add(notify_ac, strdup("typing")); @@ -432,6 +439,7 @@ cmd_init(void) struct cmd_t *pcmd = status_commands+i; p_autocomplete_add(commands_ac, (gchar *)strdup(pcmd->cmd)); p_autocomplete_add(help_ac, (gchar *)strdup(pcmd->cmd+1)); + p_autocomplete_add(who_ac, (gchar *)strdup(pcmd->cmd+1)); } history_init(); @@ -441,6 +449,7 @@ void cmd_close(void) { p_autocomplete_clear(commands_ac); + p_autocomplete_clear(who_ac); p_autocomplete_clear(help_ac); p_autocomplete_clear(notify_ac); } @@ -481,6 +490,7 @@ cmd_reset_autocomplete() _cmd_help_reset_completer(); _cmd_notify_reset_completer(); _cmd_reset_command_completer(); + _cmd_reset_who_completer(); } GSList * @@ -569,6 +579,18 @@ _cmd_reset_command_completer(void) p_autocomplete_reset(commands_ac); } +static char * +_cmd_who_complete(char *inp) +{ + return p_autocomplete_complete(who_ac, inp); +} + +static void +_cmd_reset_who_completer(void) +{ + p_autocomplete_reset(who_ac); +} + static char * _cmd_help_complete(char *inp) { @@ -617,6 +639,8 @@ _cmd_complete_parameters(char *input, int *size) prefs_find_login); _parameter_autocomplete(input, size, "/help", _cmd_help_complete); + _parameter_autocomplete(input, size, "/who", + _cmd_who_complete); _notify_autocomplete(input, size); }