about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/command.c90
-rw-r--r--src/command.h1
-rw-r--r--src/input_win.c93
-rw-r--r--src/ui.h1
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);
 
@@ -398,47 +386,6 @@ _printable(const int ch)
 }
 
 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)
 {
     char *found = NULL;
@@ -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