From 2d1cbdd3535af0e660129ad3af3121c595e8c3a8 Mon Sep 17 00:00:00 2001 From: Andreas Obergrusberger Date: Sun, 26 Aug 2007 09:05:17 +0000 Subject: [PATCH] Removed nested functions git-svn-id: https://svn.musicpd.org/ncmpc/branches/tradiaz@6811 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/screen_play.c | 178 ++++++++++++++--------- src/wreadln.c | 362 +++++++++++++++++++++++++++------------------- src/wreadln.h | 8 +- 3 files changed, 335 insertions(+), 213 deletions(-) diff --git a/src/screen_play.c b/src/screen_play.c index d83b791..718bb13 100644 --- a/src/screen_play.c +++ b/src/screen_play.c @@ -40,6 +40,14 @@ #define MAX_SONG_LENGTH 512 +typedef struct +{ + GList **list; + GList **dir_list; + screen_t *screen; + mpdclient_t *c; +} completion_callback_data_t; + static list_window_t *lw = NULL; static void @@ -115,6 +123,36 @@ center_playing_item(screen_t *screen, mpdclient_t *c) } + + + +void save_pre_completion_cb(GCompletion *gcmp, gchar *line, void *data) + { + completion_callback_data_t *tmp = (completion_callback_data_t *)data; + GList **list = tmp->list; + mpdclient_t *c = tmp->c; + + if( *list == NULL ) + { + /* create completion list */ + *list = gcmp_list_from_path(c, "", NULL, GCMP_TYPE_PLAYLIST); + g_completion_add_items(gcmp, *list); + } + } + + void save_post_completion_cb(GCompletion *gcmp, gchar *line, GList *items, + void *data) + { + completion_callback_data_t *tmp = (completion_callback_data_t *)data; + screen_t *screen = tmp->screen; + + if( g_list_length(items)>=1 ) + { + screen_display_completion_list(screen, items); + lw->clear = 1; + lw->repaint = 1; + } + } int playlist_save(screen_t *screen, mpdclient_t *c, char *name, char *defaultname) { @@ -122,34 +160,21 @@ playlist_save(screen_t *screen, mpdclient_t *c, char *name, char *defaultname) gint error; GCompletion *gcmp; GList *list = NULL; - - void pre_completion_cb(GCompletion *gcmp, gchar *line) - { - if( list == NULL ) - { - /* create completion list */ - list = gcmp_list_from_path(c, "", NULL, GCMP_TYPE_PLAYLIST); - g_completion_add_items(gcmp, list); - } - } - - void post_completion_cb(GCompletion *gcmp, gchar *line, GList *items) - { - if( g_list_length(items)>=1 ) - { - screen_display_completion_list(screen, items); - lw->clear = 1; - lw->repaint = 1; - } - } + completion_callback_data_t data; if( name==NULL ) { /* initialize completion support */ gcmp = g_completion_new(NULL); g_completion_set_compare(gcmp, strncmp); - wrln_pre_completion_callback = pre_completion_cb; - wrln_post_completion_callback = post_completion_cb; + data.list = &list; + data.dir_list = NULL; + data.screen = screen; + data.c = c; + wrln_completion_callback_data = &data; + wrln_pre_completion_callback = save_pre_completion_cb; + wrln_post_completion_callback = save_post_completion_cb; + /* query the user for a filename */ filename = screen_readln(screen->status_window.w, @@ -159,6 +184,7 @@ playlist_save(screen_t *screen, mpdclient_t *c, char *name, char *defaultname) gcmp); /* destroy completion support */ + wrln_completion_callback_data = NULL; wrln_pre_completion_callback = NULL; wrln_post_completion_callback = NULL; g_completion_free(gcmp); @@ -208,63 +234,82 @@ playlist_save(screen_t *screen, mpdclient_t *c, char *name, char *defaultname) return 0; } -static int -handle_add_to_playlist(screen_t *screen, mpdclient_t *c) +void add_dir(GCompletion *gcmp, gchar *dir, GList **dir_list, GList **list, + mpdclient_t *c) { - gchar *path; - GCompletion *gcmp; - GList *list = NULL; - GList *dir_list = NULL; + g_completion_remove_items(gcmp, *list); + *list = string_list_remove(*list, dir); + *list = gcmp_list_from_path(c, dir, *list, GCMP_TYPE_RFILE); + g_completion_add_items(gcmp, *list); + *dir_list = g_list_append(*dir_list, g_strdup(dir)); +} - void add_dir(gchar *dir) - { - g_completion_remove_items(gcmp, list); - list = string_list_remove(list, dir); - list = gcmp_list_from_path(c, dir, list, GCMP_TYPE_RFILE); - g_completion_add_items(gcmp, list); - dir_list = g_list_append(dir_list, g_strdup(dir)); - } +void add_pre_completion_cb(GCompletion *gcmp, gchar *line, void *data) +{ + completion_callback_data_t *tmp = (completion_callback_data_t *)data; + GList **dir_list = tmp->dir_list; + GList **list = tmp->list; + mpdclient_t *c = tmp->c; - void pre_completion_cb(GCompletion *gcmp, gchar *line) + D("pre_completion()...\n"); + if( *list == NULL ) { - D("pre_completion()...\n"); - if( list == NULL ) - { - /* create initial list */ - list = gcmp_list_from_path(c, "", NULL, GCMP_TYPE_RFILE); - g_completion_add_items(gcmp, list); - } - else if( line && line[0] && line[strlen(line)-1]=='/' && - string_list_find(dir_list, line) == NULL ) - { - /* add directory content to list */ - add_dir(line); - } + /* create initial list */ + *list = gcmp_list_from_path(c, "", NULL, GCMP_TYPE_RFILE); + g_completion_add_items(gcmp, *list); } + else if( line && line[0] && line[strlen(line)-1]=='/' && + string_list_find(*dir_list, line) == NULL ) + { + /* add directory content to list */ + add_dir(gcmp, line, dir_list, list, c); + } +} - void post_completion_cb(GCompletion *gcmp, gchar *line, GList *items) +void add_post_completion_cb(GCompletion *gcmp, gchar *line, GList *items, + void *data) +{ + completion_callback_data_t *tmp = (completion_callback_data_t *)data; + GList **dir_list = tmp->dir_list; + GList **list = tmp->list; + mpdclient_t *c = tmp->c; + screen_t *screen = tmp->screen; + + D("post_completion()...\n"); + if( g_list_length(items)>=1 ) { - D("post_completion()...\n"); - if( g_list_length(items)>=1 ) - { - screen_display_completion_list(screen, items); - lw->clear = 1; - lw->repaint = 1; - } + screen_display_completion_list(screen, items); + lw->clear = 1; + lw->repaint = 1; + } - if( line && line[0] && line[strlen(line)-1]=='/' && - string_list_find(dir_list, line) == NULL ) - { - /* add directory content to list */ - add_dir(line); - } + if( line && line[0] && line[strlen(line)-1]=='/' && + string_list_find(*dir_list, line) == NULL ) + { + /* add directory content to list */ + add_dir(gcmp, line, dir_list, list, c); } +} + +static int +handle_add_to_playlist(screen_t *screen, mpdclient_t *c) +{ + gchar *path; + GCompletion *gcmp; + GList *list = NULL; + GList *dir_list = NULL; + completion_callback_data_t data; /* initialize completion support */ gcmp = g_completion_new(NULL); g_completion_set_compare(gcmp, strncmp); - wrln_pre_completion_callback = pre_completion_cb; - wrln_post_completion_callback = post_completion_cb; + data.list = &list; + data.dir_list = &dir_list; + data.screen = screen; + data.c = c; + wrln_completion_callback_data = &data; + wrln_pre_completion_callback = add_pre_completion_cb; + wrln_post_completion_callback = add_post_completion_cb; /* get path */ path = screen_readln(screen->status_window.w, _("Add: "), @@ -273,6 +318,7 @@ handle_add_to_playlist(screen_t *screen, mpdclient_t *c) gcmp); /* destroy completion data */ + wrln_completion_callback_data = NULL; wrln_pre_completion_callback = NULL; wrln_post_completion_callback = NULL; g_completion_free(gcmp); diff --git a/src/wreadln.c b/src/wreadln.c index 380e872..8694bb3 100644 --- a/src/wreadln.c +++ b/src/wreadln.c @@ -48,6 +48,7 @@ guint wrln_max_line_size = WRLN_MAX_LINE_SIZE; guint wrln_max_history_length = WRLN_MAX_HISTORY_LENGTH; wrln_wgetch_fn_t wrln_wgetch = NULL; +void *wrln_completion_callback_data = NULL; wrln_gcmp_pre_cb_t wrln_pre_completion_callback = NULL; wrln_gcmp_post_cb_t wrln_post_completion_callback = NULL; @@ -55,8 +56,72 @@ extern void sigstop(void); extern void screen_bell(void); extern size_t my_strlen(char *str); - #ifndef USE_NCURSESW +/* move the cursor one step to the right */ +static inline void cursor_move_right(gint *cursor, + gint *start, + gint width, + gint x0, + gint x1, + gchar *line) +{ + if( *cursor < strlen(line) && *cursor= x1 && *start<*cursor-width+1) + (*start)++; + } +} + +/* move the cursor one step to the left */ +static inline void cursor_move_left(gint *cursor, + gint *start) +{ + if( *cursor > 0 ) + { + if( *cursor==*start && *start > 0 ) + (*start)--; + (*cursor)--; + } +} + +/* move the cursor to the end of the line */ +static inline void cursor_move_to_eol(gint *cursor, + gint *start, + gint width, + gint x0, + gint x1, + gchar *line) +{ + *cursor = strlen(line); + if( *cursor+x0 >= x1 ) + *start = *cursor-width+1; +} + +/* draw line buffer and update cursor position */ +static inline void drawline(gint cursor, + gint start, + gint width, + gint x0, + gint x1, + gint y, + gboolean masked, + gchar *line, + WINDOW *w) +{ + wmove(w, y, x0); + /* clear input area */ + whline(w, ' ', width); + /* print visible part of the line buffer */ + if(masked == TRUE) whline(w, '*', my_strlen(line)-start); + else waddnstr(w, line+start, width); + /* move the cursor to the correct position */ + wmove(w, y, x0 + cursor-start); + /* tell ncurses to redraw the screen */ + doupdate(); +} + + /* libcurses version */ gchar * @@ -74,45 +139,6 @@ _wreadln(WINDOW *w, gint cursor = 0, start = 0; gint key = 0, i; - /* move the cursor one step to the right */ - void cursor_move_right(void) { - if( cursor < my_strlen(line) && cursor= x1 && start 0 ) - { - if( cursor==start && start > 0 ) - start--; - cursor--; - } - } - /* move the cursor to the end of the line */ - void cursor_move_to_eol(void) { - cursor = my_strlen(line); - if( cursor+x0 >= x1 ) - start = cursor-width+1; - } - /* draw line buffer and update cursor position */ - void drawline() { - wmove(w, y, x0); - /* clear input area */ - whline(w, ' ', width); - /* print visible part of the line buffer */ - if(masked == TRUE) whline(w, '*', my_strlen(line)-start); - else waddnstr(w, line+start, width); - /* move the cursor to the correct position */ - wmove(w, y, x0 + cursor-start); - /* tell ncurses to redraw the screen */ - doupdate(); - } - - /* allocate a line buffer */ line = g_malloc0(wrln_max_line_size); /* turn off echo */ @@ -154,15 +180,15 @@ _wreadln(WINDOW *w, hlist = hlist->prev; g_strlcpy(line, hlist->data, wrln_max_line_size); } - cursor_move_to_eol(); - drawline(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); + drawline(cursor, start, width, x0, x1, 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(); - drawline(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); + drawline(cursor, start, width, x0, x1, y, masked, line, w); } while( key!=13 && key!='\n' ) @@ -194,7 +220,7 @@ _wreadln(WINDOW *w, { x1=COLS; width = x1-x0; - cursor_move_to_eol(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); } /* make shure the cursor is visible */ curs_set(1); @@ -207,18 +233,20 @@ _wreadln(WINDOW *w, GList *list; if(wrln_pre_completion_callback) - wrln_pre_completion_callback(gcmp, line); + 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_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_post_completion_callback(gcmp, line, list, + wrln_completion_callback_data); } break; @@ -234,10 +262,10 @@ _wreadln(WINDOW *w, return NULL; case KEY_LEFT: - cursor_move_left(); + cursor_move_left(&cursor, &start); break; case KEY_RIGHT: - cursor_move_right(); + cursor_move_right(&cursor, &start, width, x0, x1, line); break; case KEY_HOME: case KEY_CTRL_A: @@ -246,7 +274,7 @@ _wreadln(WINDOW *w, break; case KEY_END: case KEY_CTRL_E: - cursor_move_to_eol(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); break; case KEY_CTRL_K: line[cursor] = 0; @@ -258,7 +286,7 @@ _wreadln(WINDOW *w, { for (i = cursor - 1; line[i] != 0; i++) line[i] = line[i + 1]; - cursor_move_left(); + cursor_move_left(&cursor, &start); } break; case KEY_DC: /* handle delete key. As above */ @@ -282,7 +310,7 @@ _wreadln(WINDOW *w, hlist = hlist->prev; g_strlcpy(line, hlist->data, wrln_max_line_size); } - cursor_move_to_eol(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); break; case KEY_DOWN: /* get next history entry */ @@ -292,7 +320,7 @@ _wreadln(WINDOW *w, hlist = hlist->next; g_strlcpy(line, hlist->data, wrln_max_line_size); } - cursor_move_to_eol(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, line); break; case '\n': @@ -317,18 +345,18 @@ _wreadln(WINDOW *w, line[cursor + 1] = 0; g_strlcat (&line[cursor + 1], tmp, size); g_free(tmp); - cursor_move_right(); + cursor_move_right(&cursor, &start, width, x0, x1, line); } else { line[cursor + 1] = 0; line[cursor] = key; - cursor_move_right(); + cursor_move_right(&cursor, &start, width, x0, x1, line); } } } - drawline(); + drawline(cursor, start, width, x0, x1, y, masked, line, w); } /* update history */ @@ -364,6 +392,106 @@ _wreadln(WINDOW *w, } #else + +/* move the cursor one step to the right */ +static inline void cursor_move_right(gint *cursor, + gint *start, + gint width, + gint x0, + gint x1, + wchar_t *wline) +{ + if( *cursor < wcslen(wline) && *cursor= x1 && *start<*cursor-width+1) + (*start)++; + } +} + +/* move the cursor one step to the left */ +static inline void cursor_move_left(gint *cursor, + gint *start, + gint width, + gint x0, + gint x1, + wchar_t *line) +{ + if( *cursor > 0 ) + { + if( *cursor==*start && *start > 0 ) + (*start)--; + (*cursor)--; + } +} + + +static inline void backspace(gint *cursor, + gint *start, + gint width, + gint x0, + gint x1, + wchar_t *wline) +{ + int i; + if( *cursor > 0 ) + { + for (i = *cursor - 1; wline[i] != 0; i++) + wline[i] = wline[i + 1]; + cursor_move_left(cursor, start, width, x0, x1, wline); + } +} + +/* handle delete */ +static inline void delete(gint *cursor, + wchar_t *wline) +{ + int i; + if( *cursor <= wcslen(wline) - 1 ) + { + for (i = *cursor; wline[i] != 0; i++) + wline[i] = wline[i + 1]; + } +} + +/* move the cursor to the end of the line */ +static inline void cursor_move_to_eol(gint *cursor, + gint *start, + gint width, + gint x0, + gint x1, + wchar_t *line) +{ + *cursor = wcslen(line); + if( *cursor+x0 >= x1 ) + *start = *cursor-width+1; +} + +/* draw line buffer and update cursor position */ +static inline void drawline(gint cursor, + gint start, + gint width, + gint x0, + gint x1, + gint y, + gboolean masked, + wchar_t *line, + WINDOW *w) +{ + wmove(w, y, x0); + /* clear input area */ + whline(w, ' ', width); + /* print visible part of the line buffer */ + if(masked == TRUE) whline(w, '*', wcslen(line)-start); + else waddnwstr(w, line+start, width); + FILE *dbg = fopen ("dbg", "a+"); + fprintf (dbg, "%i,%s---%i---", width, line, wcslen (line)); + /* move the cursor to the correct position */ + wmove(w, y, x0 + cursor-start); + /* tell ncurses to redraw the screen */ + doupdate(); +} + /* libcursesw version */ gchar * @@ -384,70 +512,7 @@ _wreadln(WINDOW *w, gint key; gint i; - /* move the cursor to the beginning of the line */ - void cursor_move_home(void) { - x=0; - cursor=0; - start=0; - } - /* move the cursor to the end of the line */ - void cursor_move_to_eol(void) { - cursor = wcslen(wline); - //x=wcswidth(wline,cursor); - if( cursor+x0 >= x1 ) - start = cursor-width+1; - } - /* move the cursor one step to the left */ - void cursor_move_left(void) { - if( cursor > 0 ) - { - if( cursor==start && start > 0 ) - start--; - //x-=wcwidth(wline[cursor]); - cursor--; - } - } - /* move the cursor one step to the right */ - void cursor_move_right(void) { - if( cursor < wcslen(wline) && cursor= x1 && start 0 ) - { - for (i = cursor - 1; wline[i] != 0; i++) - wline[i] = wline[i + 1]; - cursor_move_left(); - } - } - /* handle delete */ - void delete() { - if( cursor <= wcslen(wline) - 1 ) - { - for (i = cursor; wline[i] != 0; i++) - wline[i] = wline[i + 1]; - } - } - /* draw line buffer and update cursor position */ - void drawline() { - wmove(w, y, x0); - /* clear input area */ - whline(w, ' ', width); - /* print visible part of the line buffer */ - if(masked == TRUE) whline(w, '*', my_strlen(line)-start); - else waddnstr(w, line+start, width); - /* move the cursor to the correct position */ - wmove(w, y, x0 + cursor-start); - /* tell ncurses to redraw the screen */ - doupdate(); - } - + /* initialize variables */ start = 0; x = 0; @@ -495,15 +560,15 @@ _wreadln(WINDOW *w, hlist = hlist->prev; mbstowcs(wline, hlist->data, wrln_max_line_size); } - cursor_move_to_eol(); - drawline(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, wline); + drawline(cursor, start, width, x0, x1, y, masked, wline, w); } else if( initial_value ) { /* copy the initial value to the line buffer */ mbstowcs(wline, initial_value, wrln_max_line_size); - cursor_move_to_eol(); - drawline(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, wline); + drawline(cursor, start, width, x0, x1, y, masked, wline, w); } wch=0; @@ -518,23 +583,25 @@ _wreadln(WINDOW *w, switch(wch) { case KEY_HOME: - cursor_move_home(); + x=0; + cursor=0; + start=0; break; case KEY_END: - cursor_move_to_eol(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, wline); break; case KEY_LEFT: - cursor_move_left(); + cursor_move_left(&cursor, &start, width, x0, x1, wline); break; case KEY_RIGHT: - cursor_move_right(); + cursor_move_right(&cursor, &start, width, x0, x1, wline); break; case KEY_DC: - delete(); + delete(&cursor, wline); break; case KEY_BCKSPC: case KEY_BACKSPACE: - backspace(); + backspace(&cursor, &start, width, x0, x1, wline); break; case KEY_UP: /* get previous history entry */ @@ -549,7 +616,7 @@ _wreadln(WINDOW *w, hlist = hlist->prev; mbstowcs(wline, hlist->data, wrln_max_line_size); } - cursor_move_to_eol(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, wline); break; case KEY_DOWN: /* get next history entry */ @@ -559,7 +626,7 @@ _wreadln(WINDOW *w, hlist = hlist->next; mbstowcs(wline, hlist->data, wrln_max_line_size); } - cursor_move_to_eol(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, wline); break; case KEY_RESIZE: /* resize event */ @@ -567,7 +634,7 @@ _wreadln(WINDOW *w, { x1=COLS; width = x1-x0; - cursor_move_to_eol(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, wline); } /* make shure the cursor is visible */ curs_set(1); @@ -580,16 +647,18 @@ _wreadln(WINDOW *w, switch(wch) { case KEY_CTRL_A: - cursor_move_home(); + x=0; + cursor=0; + start=0; break; case KEY_CTRL_C: exit(EXIT_SUCCESS); break; case KEY_CTRL_D: - delete(); + delete(&cursor, wline); break; case KEY_CTRL_E: - cursor_move_to_eol(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, wline); break; case TAB: if( gcmp ) @@ -602,18 +671,20 @@ _wreadln(WINDOW *w, wcstombs(mbline, wline, i); if(wrln_pre_completion_callback) - wrln_pre_completion_callback(gcmp, mbline); + wrln_pre_completion_callback(gcmp, mbline, + wrln_completion_callback_data); list = g_completion_complete(gcmp, mbline, &prefix); if( prefix ) { mbstowcs(wline, prefix, wrln_max_line_size); - cursor_move_to_eol(); + cursor_move_to_eol(&cursor, &start, width, x0, x1, wline); g_free(prefix); } else screen_bell(); if( wrln_post_completion_callback ) - wrln_post_completion_callback(gcmp, mbline, list); + wrln_post_completion_callback(gcmp, mbline, list, + wrln_completion_callback_data); g_free(mbline); } @@ -635,7 +706,7 @@ _wreadln(WINDOW *w, sigstop(); break; case 127: - backspace(); + backspace(&cursor, &start, width, x0, x1, wline); break; case '\n': case 13: @@ -653,19 +724,20 @@ _wreadln(WINDOW *w, wline[cursor+1] = 0; wcscat(&wline[cursor+1], tmp); g_free(tmp); - cursor_move_right(); + cursor_move_right(&cursor, &start, width, x0, x1, wline); } else { + FILE *ff = fopen ("curspr", "a+"); + fprintf (ff, "%i", cursor); wline[cursor] = wch; wline[cursor+1] = 0; - cursor_move_right(); + cursor_move_right(&cursor, &start, width, x0, x1, wline); } } } - drawline(); + drawline(cursor, start, width, x0, x1, y, masked, wline, w); } - i = wcstombs(NULL,wline,0)+1; mbline = g_malloc0(i); wcstombs(mbline, wline, i); diff --git a/src/wreadln.h b/src/wreadln.h index 667740c..72ef411 100644 --- a/src/wreadln.h +++ b/src/wreadln.h @@ -11,12 +11,16 @@ extern guint wrln_max_history_length; typedef int (*wrln_wgetch_fn_t) (WINDOW *w); extern wrln_wgetch_fn_t wrln_wgetch; +/* completion callback data */ +extern void *wrln_completion_callback_data; + /* called after TAB is pressed but before g_completion_complete */ -typedef void (*wrln_gcmp_pre_cb_t) (GCompletion *gcmp, gchar *buf); +typedef void (*wrln_gcmp_pre_cb_t) (GCompletion *gcmp, gchar *buf, void *data); extern wrln_gcmp_pre_cb_t wrln_pre_completion_callback; /* post completion callback */ -typedef void (*wrln_gcmp_post_cb_t) (GCompletion *gcmp, gchar *s, GList *l); +typedef void (*wrln_gcmp_post_cb_t) (GCompletion *gcmp, gchar *s, GList *l, + void *data); extern wrln_gcmp_post_cb_t wrln_post_completion_callback; /* Note, wreadln calls curs_set() and noecho(), to enable cursor and -- 2.30.2