about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2012-10-28 01:52:22 +0100
committerJames Booth <boothj5@gmail.com>2012-10-28 01:52:22 +0100
commit90606141a92fbff4a97282c44dc923944526c977 (patch)
tree354ef153a544e0c4c38c3e249e948c5771598fb4
parent44f64bea64f940719cdb66782ff52d6ee92fe8c7 (diff)
parent7aa177c6687d78b3bc3f1fe1b951145cb2a07635 (diff)
downloadprofani-tty-90606141a92fbff4a97282c44dc923944526c977.tar.gz
Merge branch 'master' into chatstates
-rw-r--r--src/command.c242
-rw-r--r--src/command.h11
-rw-r--r--src/input_win.c167
-rw-r--r--src/ui.h1
4 files changed, 234 insertions, 187 deletions
diff --git a/src/command.c b/src/command.c
index 3252fdda..0fd093bb 100644
--- a/src/command.c
+++ b/src/command.c
@@ -38,11 +38,14 @@
 #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 {
@@ -58,6 +61,19 @@ 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_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);
+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);
+
 // command prototypes
 static gboolean _cmd_quit(const char * const inp, struct cmd_help_t help);
 static gboolean _cmd_help(const char * const inp, struct cmd_help_t help);
@@ -380,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;
 
@@ -390,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"));
@@ -418,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();
@@ -427,48 +449,48 @@ void
 cmd_close(void)
 {
     p_autocomplete_clear(commands_ac);
+    p_autocomplete_clear(who_ac);
     p_autocomplete_clear(help_ac);
     p_autocomplete_clear(notify_ac);
 }
 
 // Command autocompletion functions
-
-char *
-cmd_complete(char *inp)
-{
-    return p_autocomplete_complete(commands_ac, inp);
-}
-
 void
-cmd_reset_completer(void)
+cmd_autocomplete(char *input, int *size)
 {
-    p_autocomplete_reset(commands_ac);
-}
-
-// Command help autocomplete
-char *
-cmd_help_complete(char *inp)
-{
-    return p_autocomplete_complete(help_ac, inp);
-}
-
-void
-cmd_help_reset_completer(void)
-{
-    p_autocomplete_reset(help_ac);
-}
+    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);
+        }
+    }
 
-// Command notify autcomplete
-char *
-cmd_notify_complete(char *inp)
-{
-    return p_autocomplete_complete(notify_ac, inp);
+    _cmd_complete_parameters(input, size);
 }
 
 void
-cmd_notify_reset_completer(void)
+cmd_reset_autocomplete()
 {
-    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();
+    _cmd_reset_who_completer();
 }
 
 GSList *
@@ -545,6 +567,84 @@ cmd_execute_default(const char * const inp)
     return TRUE;
 }
 
+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_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)
+{
+    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);
+    _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);
+    _parameter_autocomplete(input, size, "/who",
+        _cmd_who_complete);
+
+    _notify_autocomplete(input, size);
+}
+
 // The command functions
 
 static gboolean
@@ -1114,3 +1214,85 @@ _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);
+}
+
+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 a7c37fcf..e53d1773 100644
--- a/src/command.h
+++ b/src/command.h
@@ -34,16 +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_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 724b3a25..1c12e8a1 100644
--- a/src/input_win.c
+++ b/src/input_win.c
@@ -58,17 +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
 create_input_window(void)
@@ -171,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();
         }
     }
 
@@ -206,6 +195,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
@@ -217,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);
@@ -307,7 +306,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 +315,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);
         }
@@ -337,46 +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);
-                _replace_input(input, auto_msg, size);
-                free(auto_msg);
-                free(found);
-            }
-        }
-
-        _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",
-            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);
-
-        _notify_autocomplete(input, size);
-
+        cmd_autocomplete(input, size);
         return 1;
 
     default:
@@ -396,96 +356,3 @@ _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)
-{
-    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);
-            _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);
-            _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);
-            _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