diff options
Diffstat (limited to 'src/wreadln.c')
-rw-r--r-- | src/wreadln.c | 563 |
1 files changed, 269 insertions, 294 deletions
diff --git a/src/wreadln.c b/src/wreadln.c index f4a7ec3e2..2ae03f83f 100644 --- a/src/wreadln.c +++ b/src/wreadln.c @@ -66,12 +66,11 @@ static inline void cursor_move_right(gint *cursor, gint x1, gchar *line) { - if( *cursor < strlen(line) && *cursor<wrln_max_line_size-1 ) - { - (*cursor)++; - if( *cursor+x0 >= x1 && *start<*cursor-width+1) - (*start)++; - } + if (*cursor < strlen(line) && *cursor < wrln_max_line_size - 1) { + (*cursor)++; + if (*cursor + x0 >= x1 && *start < *cursor - width + 1) + (*start)++; + } } /* move the cursor one step to the left */ @@ -125,276 +124,253 @@ static inline void drawline(gint cursor, /* libcurses version */ gchar * -_wreadln(WINDOW *w, - gchar *prompt, - gchar *initial_value, - gint x1, - GList **history, - GCompletion *gcmp, - gboolean masked) +_wreadln(WINDOW *w, + gchar *prompt, + gchar *initial_value, + gint x1, + GList **history, + GCompletion *gcmp, + gboolean masked) { - GList *hlist = NULL, *hcurrent = NULL; - gchar *line; - gint x0, y, width; - gint cursor = 0, start = 0; - gint key = 0, i; - - /* allocate a line buffer */ - line = g_malloc0(wrln_max_line_size); - /* turn off echo */ - noecho(); - /* make shure the cursor is visible */ - curs_set(1); - /* print prompt string */ - if( prompt ) - waddstr(w, prompt); - /* retrive y and x0 position */ - getyx(w, y, x0); - /* check the x1 value */ - if( x1<=x0 || x1>COLS ) - x1 = COLS; - width = x1-x0; - /* clear input area */ - mvwhline(w, y, x0, ' ', width); - - if( history ) - { - /* append the a new line to our history list */ - *history = g_list_append(*history, g_malloc0(wrln_max_line_size)); - /* hlist points to the current item in the history list */ - hlist = g_list_last(*history); - hcurrent = hlist; - } + GList *hlist = NULL, *hcurrent = NULL; + gchar *line; + gint x0, y, width; + gint cursor = 0, start = 0; + gint key = 0, i; + + /* allocate a line buffer */ + line = g_malloc0(wrln_max_line_size); + /* turn off echo */ + noecho(); + /* make shure the cursor is visible */ + curs_set(1); + /* print prompt string */ + if( prompt ) + waddstr(w, prompt); + /* retrive y and x0 position */ + getyx(w, y, x0); + /* check the x1 value */ + if( x1<=x0 || x1>COLS ) + x1 = COLS; + width = x1-x0; + /* clear input area */ + mvwhline(w, y, x0, ' ', width); + + if( history ) { + /* append the a new line to our history list */ + *history = g_list_append(*history, g_malloc0(wrln_max_line_size)); + /* hlist points to the current item in the history list */ + hlist = g_list_last(*history); + hcurrent = hlist; + } - if( initial_value == (char *) -1 ) - { - /* get previous history entry */ - if( history && hlist->prev ) - { - if( hlist==hcurrent ) - { - /* save the current line */ - g_strlcpy(hlist->data, line, wrln_max_line_size); - } - /* get previous line */ - hlist = hlist->prev; - g_strlcpy(line, hlist->data, wrln_max_line_size); + if( initial_value == (char *) -1 ) { + /* get previous history entry */ + if( history && hlist->prev ) + { + if( hlist==hcurrent ) + { + /* save the current line */ + g_strlcpy(hlist->data, line, wrln_max_line_size); + } + /* get previous line */ + hlist = hlist->prev; + g_strlcpy(line, hlist->data, wrln_max_line_size); + } + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); + drawline(cursor, start, width, x0, y, masked, line, w); + } else if( initial_value ) { + /* copy the initial value to the line buffer */ + g_strlcpy(line, initial_value, wrln_max_line_size); + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); + drawline(cursor, start, width, x0, y, masked, line, w); } - cursor_move_to_eol(&cursor, &start, width, x0, x1, line); - drawline(cursor, start, width, x0, y, masked, line, w); - } - else if( initial_value ) - { - /* copy the initial value to the line buffer */ - g_strlcpy(line, initial_value, wrln_max_line_size); - cursor_move_to_eol(&cursor, &start, width, x0, x1, line); - drawline(cursor, start, width, x0, y, masked, line, w); - } - while( key!=13 && key!='\n' ) - { - if( wrln_wgetch ) - key = wrln_wgetch(w); - else - key = wgetch(w); + while( key!=13 && key!='\n' ) { + if( wrln_wgetch ) + key = wrln_wgetch(w); + else + key = wgetch(w); - /* check if key is a function key */ - for(i=0; i<63; i++) - if( key==KEY_F(i) ) - { - key=KEY_F(1); - i=64; - } + /* check if key is a function key */ + for(i=0; i<63; i++) + if( key==KEY_F(i) ) { + key=KEY_F(1); + i=64; + } - switch (key) - { + switch (key) { #ifdef HAVE_GETMOUSE - case KEY_MOUSE: /* ignore mouse events */ + case KEY_MOUSE: /* ignore mouse events */ #endif - case ERR: /* ingnore errors */ - break; - - case KEY_RESIZE: - /* a resize event */ - if( x1>COLS ) - { - x1=COLS; - width = x1-x0; - cursor_move_to_eol(&cursor, &start, width, x0, x1, line); - } - /* make shure the cursor is visible */ - curs_set(1); - break; - - case TAB: - if( gcmp ) - { - char *prefix = NULL; - GList *list; - - if(wrln_pre_completion_callback) - wrln_pre_completion_callback(gcmp, line, - wrln_completion_callback_data); - list = g_completion_complete(gcmp, line, &prefix); - if( prefix ) - { - g_strlcpy(line, prefix, wrln_max_line_size); - cursor_move_to_eol(&cursor, &start, width, x0, x1, line); - g_free(prefix); + case ERR: /* ingnore errors */ + break; + + case KEY_RESIZE: + /* a resize event */ + if( x1>COLS ) { + x1=COLS; + width = x1-x0; + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); + } + /* make shure the cursor is visible */ + curs_set(1); + break; + + case TAB: + if( gcmp ) { + char *prefix = NULL; + GList *list; + + if(wrln_pre_completion_callback) + wrln_pre_completion_callback(gcmp, line, + wrln_completion_callback_data); + list = g_completion_complete(gcmp, line, &prefix); + if( prefix ) { + g_strlcpy(line, prefix, wrln_max_line_size); + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); + g_free(prefix); + } + else + screen_bell(); + if( wrln_post_completion_callback ) + wrln_post_completion_callback(gcmp, line, list, + wrln_completion_callback_data); + } + break; + + case KEY_CTRL_G: + screen_bell(); + g_free(line); + if( history ) { + g_free(hcurrent->data); + hcurrent->data = NULL; + *history = g_list_delete_link(*history, hcurrent); + } + return NULL; + + case KEY_LEFT: + cursor_move_left(&cursor, &start); + break; + case KEY_RIGHT: + cursor_move_right(&cursor, &start, width, x0, x1, line); + break; + case KEY_HOME: + case KEY_CTRL_A: + cursor = 0; + start = 0; + break; + case KEY_END: + case KEY_CTRL_E: + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); + break; + case KEY_CTRL_K: + line[cursor] = 0; + break; + case KEY_CTRL_U: + cursor = my_strlen(line); + for (i = 0;i < cursor; i++) + line[i] = '\0'; + cursor = 0; + break; + case 127: + case KEY_BCKSPC: /* handle backspace: copy all */ + case KEY_BACKSPACE: /* chars starting from curpos */ + if( cursor > 0 ) {/* - 1 from buf[n+1] to buf */ + for (i = cursor - 1; line[i] != 0; i++) + line[i] = line[i + 1]; + cursor_move_left(&cursor, &start); + } + break; + case KEY_DC: /* handle delete key. As above */ + case KEY_CTRL_D: + if (cursor <= my_strlen(line) - 1) { + for (i = cursor; line[i] != 0; i++) + line[i] = line[i + 1]; + } + break; + case KEY_UP: + /* get previous history entry */ + if( history && hlist->prev ) { + if( hlist==hcurrent ) + { + /* save the current line */ + g_strlcpy(hlist->data, line, wrln_max_line_size); + } + /* get previous line */ + hlist = hlist->prev; + g_strlcpy(line, hlist->data, wrln_max_line_size); + } + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); + break; + case KEY_DOWN: + /* get next history entry */ + if( history && hlist->next ) { + /* get next line */ + hlist = hlist->next; + g_strlcpy(line, hlist->data, wrln_max_line_size); + } + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); + break; + + case '\n': + case 13: + case KEY_IC: + case KEY_PPAGE: + case KEY_NPAGE: + case KEY_F(1): + /* ignore char */ + break; + default: + if (key >= 32) { + if (strlen (line + cursor)) { /* if the cursor is */ + /* not at the last pos */ + gchar *tmp = 0; + gsize size = strlen(line + cursor) + 1; + + tmp = g_malloc0(size); + g_strlcpy (tmp, line + cursor, size); + line[cursor] = key; + line[cursor + 1] = 0; + g_strlcat (&line[cursor + 1], tmp, size); + g_free(tmp); + cursor_move_right(&cursor, &start, width, x0, x1, line); + } else { + line[cursor + 1] = 0; + line[cursor] = key; + cursor_move_right(&cursor, &start, width, x0, x1, line); + } + } } - else - screen_bell(); - if( wrln_post_completion_callback ) - wrln_post_completion_callback(gcmp, line, list, - wrln_completion_callback_data); - } - break; - case KEY_CTRL_G: - screen_bell(); - g_free(line); - if( history ) - { - g_free(hcurrent->data); - hcurrent->data = NULL; - *history = g_list_delete_link(*history, hcurrent); - } - return NULL; - - case KEY_LEFT: - cursor_move_left(&cursor, &start); - break; - case KEY_RIGHT: - cursor_move_right(&cursor, &start, width, x0, x1, line); - break; - case KEY_HOME: - case KEY_CTRL_A: - cursor = 0; - start = 0; - break; - case KEY_END: - case KEY_CTRL_E: - cursor_move_to_eol(&cursor, &start, width, x0, x1, line); - break; - case KEY_CTRL_K: - line[cursor] = 0; - break; - case KEY_CTRL_U: - cursor = my_strlen(line); - for (i = 0;i < cursor; i++) - line[i] = '\0'; - cursor = 0; - break; - case 127: - case KEY_BCKSPC: /* handle backspace: copy all */ - case KEY_BACKSPACE: /* chars starting from curpos */ - if( cursor > 0 ) /* - 1 from buf[n+1] to buf */ - { - for (i = cursor - 1; line[i] != 0; i++) - line[i] = line[i + 1]; - cursor_move_left(&cursor, &start); - } - break; - case KEY_DC: /* handle delete key. As above */ - case KEY_CTRL_D: - if( cursor <= my_strlen(line) - 1 ) - { - for (i = cursor; line[i] != 0; i++) - line[i] = line[i + 1]; - } - break; - case KEY_UP: - /* get previous history entry */ - if( history && hlist->prev ) - { - if( hlist==hcurrent ) - { - /* save the current line */ - g_strlcpy(hlist->data, line, wrln_max_line_size); - } - /* get previous line */ - hlist = hlist->prev; - g_strlcpy(line, hlist->data, wrln_max_line_size); - } - cursor_move_to_eol(&cursor, &start, width, x0, x1, line); - break; - case KEY_DOWN: - /* get next history entry */ - if( history && hlist->next ) - { - /* get next line */ - hlist = hlist->next; - g_strlcpy(line, hlist->data, wrln_max_line_size); - } - cursor_move_to_eol(&cursor, &start, width, x0, x1, line); - break; - - case '\n': - case 13: - case KEY_IC: - case KEY_PPAGE: - case KEY_NPAGE: - case KEY_F(1): - /* ignore char */ - break; - default: - if (key >= 32) - { - if (strlen (line + cursor)) /* if the cursor is */ - { /* not at the last pos */ - gchar *tmp = 0; - gsize size = strlen(line + cursor) + 1; - - tmp = g_malloc0(size); - g_strlcpy (tmp, line + cursor, size); - line[cursor] = key; - line[cursor + 1] = 0; - g_strlcat (&line[cursor + 1], tmp, size); - g_free(tmp); - cursor_move_right(&cursor, &start, width, x0, x1, line); - } - else - { - line[cursor + 1] = 0; - line[cursor] = key; - cursor_move_right(&cursor, &start, width, x0, x1, line); - } - } + drawline(cursor, start, width, x0, y, masked, line, w); } - drawline(cursor, start, width, x0, y, masked, line, w); - } - - /* update history */ - if( history ) - { - if( strlen(line) ) - { - /* update the current history entry */ - size_t size = strlen(line)+1; - hcurrent->data = g_realloc(hcurrent->data, size); - g_strlcpy(hcurrent->data, line, size); - } - else - { - /* the line was empty - remove the current history entry */ - g_free(hcurrent->data); - hcurrent->data = NULL; - *history = g_list_delete_link(*history, hcurrent); - } + /* update history */ + if( history ) { + if( strlen(line) ) { + /* update the current history entry */ + size_t size = strlen(line)+1; + hcurrent->data = g_realloc(hcurrent->data, size); + g_strlcpy(hcurrent->data, line, size); + } else { + /* the line was empty - remove the current history entry */ + g_free(hcurrent->data); + hcurrent->data = NULL; + *history = g_list_delete_link(*history, hcurrent); + } - while( g_list_length(*history) > wrln_max_history_length ) - { - GList *first = g_list_first(*history); + while( g_list_length(*history) > wrln_max_history_length ) { + GList *first = g_list_first(*history); - /* remove the oldest history entry */ - g_free(first->data); - first->data = NULL; - *history = g_list_delete_link(*history, first); + /* remove the oldest history entry */ + g_free(first->data); + first->data = NULL; + *history = g_list_delete_link(*history, first); + } } - } - - return g_realloc(line, strlen(line)+1); + + return g_realloc(line, strlen(line)+1); } #else @@ -500,24 +476,23 @@ static inline void drawline(gint cursor, /* libcursesw version */ gchar * -_wreadln(WINDOW *w, - gchar *prompt, - gchar *initial_value, - gint x1, - GList **history, - GCompletion *gcmp, - gboolean masked) +_wreadln(WINDOW *w, + gchar *prompt, + gchar *initial_value, + gint x1, + GList **history, + GCompletion *gcmp, + gboolean masked) { - GList *hlist = NULL, *hcurrent = NULL; - wchar_t *wline; - gchar *mbline; - gint x0, x, y, width, start; - gint cursor; - wint_t wch; - gint key; - gint i; + GList *hlist = NULL, *hcurrent = NULL; + wchar_t *wline; + gchar *mbline; + gint x0, x, y, width, start; + gint cursor; + wint_t wch; + gint key; + gint i; - /* initialize variables */ start = 0; x = 0; @@ -787,23 +762,23 @@ _wreadln(WINDOW *w, #endif gchar * -wreadln(WINDOW *w, - gchar *prompt, +wreadln(WINDOW *w, + gchar *prompt, gchar *initial_value, - gint x1, - GList **history, + gint x1, + GList **history, GCompletion *gcmp) - { - return _wreadln(w, prompt, initial_value, x1, history, gcmp, FALSE); - } - +{ + return _wreadln(w, prompt, initial_value, x1, history, gcmp, FALSE); +} + gchar * -wreadln_masked(WINDOW *w, - gchar *prompt, - gchar *initial_value, - gint x1, - GList **history, - GCompletion *gcmp) - { - return _wreadln(w, prompt, initial_value, x1, history, gcmp, TRUE); - } +wreadln_masked(WINDOW *w, + gchar *prompt, + gchar *initial_value, + gint x1, + GList **history, + GCompletion *gcmp) +{ + return _wreadln(w, prompt, initial_value, x1, history, gcmp, TRUE); +} |