about summary refs log tree commit diff stats
path: root/src/ui
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2015-01-16 23:12:00 +0000
committerJames Booth <boothj5@gmail.com>2015-01-16 23:12:00 +0000
commit972d524fdcbcf7d706f5970853180a856ff044b8 (patch)
tree613b1a215ede3314cd4600783550baf849dda7ce /src/ui
parent9fad03af747a2345fa3da7d071a6acd1017d204b (diff)
parent4c6cfcdca0f7aec1f0e3243a60d88ed494357a5d (diff)
downloadprofani-tty-972d524fdcbcf7d706f5970853180a856ff044b8.tar.gz
Merge branch 'master' into inp-utf8
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/core.c8
-rw-r--r--src/ui/inputwin.c53
-rw-r--r--src/ui/inputwin.h3
-rw-r--r--src/ui/ui.h3
4 files changed, 46 insertions, 21 deletions
diff --git a/src/ui/core.c b/src/ui/core.c
index 3e4d2c80..14ea2c17 100644
--- a/src/ui/core.c
+++ b/src/ui/core.c
@@ -204,15 +204,15 @@ ui_readline(void)
 }
 
 void
-ui_input_clear(void)
+ui_inp_history_append(char *inp)
 {
-    inp_win_reset();
+    inp_history_append(inp);
 }
 
 void
-ui_replace_input(char *input, const char * const new_input, int *size)
+ui_input_clear(void)
 {
-    inp_replace_input(input, new_input, size);
+    inp_win_reset();
 }
 
 void
diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c
index 956dc156..af5eeed9 100644
--- a/src/ui/inputwin.c
+++ b/src/ui/inputwin.c
@@ -50,6 +50,7 @@
 #include "config/accounts.h"
 #include "config/preferences.h"
 #include "config/theme.h"
+#include "tools/history.h"
 #include "log.h"
 #include "muc.h"
 #include "profanity.h"
@@ -72,6 +73,7 @@
 #define KEY_CTRL_U 0025
 #define KEY_CTRL_W 0027
 
+#define MAX_HISTORY 100
 #define INP_WIN_MAX 1000
 
 static WINDOW *inp_win;
@@ -79,6 +81,7 @@ static int pad_start = 0;
 static int rows, cols;
 static char line[INP_WIN_MAX];
 static int inp_size;
+static History history;
 
 static int _handle_edit(int key_type, const wint_t ch);
 static int _handle_alt_key(int key);
@@ -103,6 +106,7 @@ create_input_window(void)
     keypad(inp_win, TRUE);
     wmove(inp_win, 0, 0);
     _inp_win_update_virtual();
+    history = history_new(MAX_HISTORY);
 }
 
 void
@@ -227,7 +231,7 @@ inp_read(int *key_type, wint_t *ch)
     echo();
 
     if (*ch == '\n') {
-        line[inp_size++] = '\0';
+        line[inp_size] = '\0';
         inp_size = 0;
         return strdup(line);
     } else {
@@ -273,13 +277,13 @@ _get_display_length(void)
 }
 
 void
-inp_replace_input(char *input, const char * const new_input, int *size)
+inp_replace_input(const char * const new_input)
 {
-    strncpy(input, new_input, INP_WIN_MAX);
-    *size = strlen(input);
+    strncpy(line, new_input, INP_WIN_MAX);
+    inp_size = strlen(line);
     inp_win_reset();
-    input[*size] = '\0';
-    waddstr(inp_win, input);
+    line[inp_size] = '\0';
+    waddstr(inp_win, line);
     _go_to_end();
 }
 
@@ -291,6 +295,12 @@ inp_win_reset(void)
     _inp_win_update_virtual();
 }
 
+void
+inp_history_append(char *inp)
+{
+    history_append(history, inp);
+}
+
 static void
 _clear_input(void)
 {
@@ -514,9 +524,10 @@ _handle_edit(int key_type, const wint_t ch)
                 return 0;
             }
         case KEY_CTRL_P:
-            prev = cmd_history_previous(line, &inp_size);
+            line[inp_size] = '\0';
+            prev = history_previous(history, line);
             if (prev) {
-                inp_replace_input(line, prev, &inp_size);
+                inp_replace_input(prev);
             }
             return 1;
 
@@ -525,13 +536,14 @@ _handle_edit(int key_type, const wint_t ch)
                 return 0;
             }
         case KEY_CTRL_N:
-            next = cmd_history_next(line, &inp_size);
+            line[inp_size] = '\0';
+            next = history_next(history, line);
             if (next) {
-                inp_replace_input(line, next, &inp_size);
+                inp_replace_input(next);
             } else if (inp_size != 0) {
                 line[inp_size] = '\0';
-                cmd_history_append(line);
-                inp_replace_input(line, "", &inp_size);
+                history_append(history, line);
+                inp_replace_input("");
             }
             return 1;
 
@@ -555,10 +567,21 @@ _handle_edit(int key_type, const wint_t ch)
 
         case 9: // tab
             if (inp_size != 0) {
+                line[inp_size] = '\0';
                 if ((strncmp(line, "/", 1) != 0) && (ui_current_win_type() == WIN_MUC)) {
-                    muc_autocomplete(line, &inp_size);
+                    char *result = muc_autocomplete(line);
+                    if (result) {
+                        cons_debug("ac result = %s", result);
+                        inp_replace_input(result);
+                        free(result);
+                    }
                 } else if (strncmp(line, "/", 1) == 0) {
-                    cmd_autocomplete(line, &inp_size);
+                    char *result = cmd_autocomplete(line);
+                    if (result) {
+                        cons_debug("ac result = %s", result);
+                        inp_replace_input(result);
+                        free(result);
+                    }
                 }
             }
             return 1;
@@ -777,4 +800,4 @@ _printable(const wint_t ch)
     bytes[utf_len] = '\0';
     gunichar unichar = g_utf8_get_char(bytes);
     return g_unichar_isprint(unichar) && (ch != KEY_MOUSE);
-}
\ No newline at end of file
+}
diff --git a/src/ui/inputwin.h b/src/ui/inputwin.h
index f121c9d9..39fde720 100644
--- a/src/ui/inputwin.h
+++ b/src/ui/inputwin.h
@@ -43,6 +43,7 @@ void inp_put_back(void);
 void inp_non_block(gint);
 void inp_block(void);
 void inp_get_password(char *passwd);
-void inp_replace_input(char *input, const char * const new_input, int *size);
+void inp_replace_input(const char * const new_input);
+void inp_history_append(char *inp);
 
 #endif
diff --git a/src/ui/ui.h b/src/ui/ui.h
index 90dd4d28..99e73b4a 100644
--- a/src/ui/ui.h
+++ b/src/ui/ui.h
@@ -230,7 +230,6 @@ void ui_statusbar_new(const int win);
 char * ui_readline(void);
 void ui_input_clear(void);
 void ui_input_nonblocking(gboolean);
-void ui_replace_input(char *input, const char * const new_input, int *size);
 
 void ui_invalid_command_usage(const char * const usage, void (*setting_func)(void));
 
@@ -240,6 +239,8 @@ void ui_open_xmlconsole_win(void);
 
 gboolean ui_win_has_unsaved_form(int num);
 
+void ui_inp_history_append(char *inp);
+
 // console window actions
 void cons_show(const char * const msg, ...);
 void cons_about(void);