X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Flist_window.c;h=5ab8f9c9c125c5ecc628fd050a6de932de327fb8;hb=75348aad7cbddb9ef736a0ecca9e3ddfb8b75f8d;hp=af8abc9d4c07874b10077448618d05ac63401ae2;hpb=e7981e0e28541e5046c40879a4fdbcc308f143ec;p=ncmpc.git diff --git a/src/list_window.c b/src/list_window.c index af8abc9..5ab8f9c 100644 --- a/src/list_window.c +++ b/src/list_window.c @@ -31,10 +31,10 @@ extern void screen_bell(void); -list_window_t * +struct list_window * list_window_init(WINDOW *w, unsigned width, unsigned height) { - list_window_t *lw; + struct list_window *lw; lw = g_malloc0(sizeof(list_window_t)); lw->w = w; @@ -44,19 +44,17 @@ list_window_init(WINDOW *w, unsigned width, unsigned height) return lw; } -list_window_t * -list_window_free(list_window_t *lw) +void +list_window_free(struct list_window *lw) { if (lw) { memset(lw, 0, sizeof(list_window_t)); g_free(lw); } - - return NULL; } void -list_window_reset(list_window_t *lw) +list_window_reset(struct list_window *lw) { lw->selected = 0; lw->xoffset = 0; @@ -65,26 +63,48 @@ list_window_reset(list_window_t *lw) } void -list_window_check_selected(list_window_t *lw, unsigned length) +list_window_check_selected(struct list_window *lw, unsigned length) { - while (lw->start > 0 && lw->start + lw->rows > length) - lw->start--; + if (lw->start + lw->rows > length) { + if (length > lw->rows) + lw->start = length - lw->rows; + else + lw->start = 0; + } - while (lw->selected < lw->start) - lw->selected++; + if (lw->selected < lw->start) + lw->selected = lw->start; - while (lw->selected > 0 && length > 0 && lw->selected >= length) - lw->selected--; + if (length > 0 && lw->selected >= length) + lw->selected = length - 1; } void -list_window_set_selected(list_window_t *lw, unsigned n) +list_window_center(struct list_window *lw, unsigned rows, unsigned n) +{ + if (n > lw->rows / 2) + lw->start = n - lw->rows / 2; + else + lw->start = 0; + + if (lw->start + lw->rows > rows) { + if (lw->rows < rows) + lw->start = rows - lw->rows; + else + lw->start = 0; + } + + lw->repaint = lw->clear = 1; +} + +void +list_window_set_selected(struct list_window *lw, unsigned n) { lw->selected = n; } void -list_window_next(list_window_t *lw, unsigned length) +list_window_next(struct list_window *lw, unsigned length) { if (lw->selected + 1 < length) lw->selected++; @@ -93,7 +113,7 @@ list_window_next(list_window_t *lw, unsigned length) } void -list_window_previous(list_window_t *lw, unsigned length) +list_window_previous(struct list_window *lw, unsigned length) { if (lw->selected > 0) lw->selected--; @@ -102,14 +122,14 @@ list_window_previous(list_window_t *lw, unsigned length) } void -list_window_first(list_window_t *lw) +list_window_first(struct list_window *lw) { lw->xoffset = 0; lw->selected = 0; } void -list_window_last(list_window_t *lw, unsigned length) +list_window_last(struct list_window *lw, unsigned length) { lw->xoffset = 0; if (length > 0) @@ -119,18 +139,18 @@ list_window_last(list_window_t *lw, unsigned length) } void -list_window_next_page(list_window_t *lw, unsigned length) +list_window_next_page(struct list_window *lw, unsigned length) { if (lw->rows < 2) return; if (lw->selected + lw->rows < length) lw->selected += lw->rows - 1; else - return list_window_last(lw, length); + list_window_last(lw, length); } void -list_window_previous_page(list_window_t *lw) +list_window_previous_page(struct list_window *lw) { if (lw->rows < 2) return; @@ -142,7 +162,7 @@ list_window_previous_page(list_window_t *lw) void -list_window_paint(list_window_t *lw, +list_window_paint(struct list_window *lw, list_window_callback_fn_t callback, void *callback_data) { @@ -151,13 +171,13 @@ list_window_paint(list_window_t *lw, int show_cursor = !(lw->flags & LW_HIDE_CURSOR); if (show_cursor) { - while (lw->selected < lw->start) { - lw->start--; + if (lw->selected < lw->start) { + lw->start = lw->selected; lw->clear=1; } - while (lw->selected >= lw->start+lw->rows) { - lw->start++; + if (lw->selected >= lw->start + lw->rows) { + lw->start = lw->selected - lw->rows + 1; lw->clear=1; } } @@ -197,7 +217,7 @@ list_window_paint(list_window_t *lw, } int -list_window_find(list_window_t *lw, +list_window_find(struct list_window *lw, list_window_callback_fn_t callback, void *callback_data, const char *str, @@ -229,7 +249,7 @@ list_window_find(list_window_t *lw, } int -list_window_rfind(list_window_t *lw, +list_window_rfind(struct list_window *lw, list_window_callback_fn_t callback, void *callback_data, const char *str, @@ -263,37 +283,82 @@ list_window_rfind(list_window_t *lw, /* perform basic list window commands (movement) */ int -list_window_cmd(list_window_t *lw, unsigned rows, command_t cmd) +list_window_cmd(struct list_window *lw, unsigned rows, command_t cmd) { switch (cmd) { case CMD_LIST_PREVIOUS: list_window_previous(lw, rows); - lw->repaint=1; break; case CMD_LIST_NEXT: list_window_next(lw, rows); - lw->repaint=1; break; case CMD_LIST_FIRST: list_window_first(lw); - lw->repaint = 1; break; case CMD_LIST_LAST: list_window_last(lw, rows); - lw->repaint = 1; break; case CMD_LIST_NEXT_PAGE: list_window_next_page(lw, rows); - lw->repaint = 1; break; case CMD_LIST_PREVIOUS_PAGE: list_window_previous_page(lw); - lw->repaint = 1; break; default: return 0; } + lw->repaint = 1; + return 1; +} + +int +list_window_scroll_cmd(struct list_window *lw, unsigned rows, command_t cmd) +{ + switch (cmd) { + case CMD_LIST_PREVIOUS: + if (lw->start > 0) + lw->start--; + break; + + case CMD_LIST_NEXT: + if (lw->start + lw->rows < rows) + lw->start++; + break; + + case CMD_LIST_FIRST: + lw->start = 0; + break; + + case CMD_LIST_LAST: + if (rows > lw->rows) + lw->start = rows - lw->rows; + else + lw->start = 0; + break; + + case CMD_LIST_NEXT_PAGE: + lw->start += lw->rows - 1; + if (lw->start + lw->rows > rows) { + if (rows > lw->rows) + lw->start = rows - lw->rows; + else + lw->start = 0; + } + break; + + case CMD_LIST_PREVIOUS_PAGE: + if (lw->start > lw->rows) + lw->start -= lw->rows; + else + lw->start = 0; + break; + + default: + return 0; + } + + lw->repaint = lw->clear = 1; return 1; } @@ -303,53 +368,50 @@ list_window_init_state(void) return g_malloc0(sizeof(list_window_state_t)); } -list_window_state_t * +void list_window_free_state(list_window_state_t *state) { - if( state ) - { - if( state->list ) - { - GList *list = state->list; - while( list ) - { - g_free(list->data); - list->data = NULL; - list = list->next; - } - g_list_free(state->list); - state->list = NULL; + if (state) { + if (state->list) { + GList *list = state->list; + + while (list) { + g_free(list->data); + list->data = NULL; + list = list->next; + } + + g_list_free(state->list); + state->list = NULL; + } + + g_free(state); } - g_free(state); - } - return NULL; } -void -list_window_push_state(list_window_state_t *state, list_window_t *lw) +void +list_window_push_state(list_window_state_t *state, struct list_window *lw) { - if( state ) - { - list_window_t *tmp = g_malloc(sizeof(list_window_t)); - memcpy(tmp, lw, sizeof(list_window_t)); - state->list = g_list_prepend(state->list, (gpointer) tmp); - list_window_reset(lw); - } + if (state) { + struct list_window *tmp = g_malloc(sizeof(list_window_t)); + memcpy(tmp, lw, sizeof(list_window_t)); + state->list = g_list_prepend(state->list, (gpointer) tmp); + list_window_reset(lw); + } } bool -list_window_pop_state(list_window_state_t *state, list_window_t *lw) +list_window_pop_state(list_window_state_t *state, struct list_window *lw) { - if( state && state->list ) - { - list_window_t *tmp = state->list->data; - - memcpy(lw, tmp, sizeof(list_window_t)); - g_free(tmp); - state->list->data = NULL; - state->list = g_list_delete_link(state->list, state->list); - } - - // return TRUE if there are still states in the list - return (state && state->list) ? TRUE : FALSE; + if (state && state->list) { + struct list_window *tmp = state->list->data; + + memcpy(lw, tmp, sizeof(list_window_t)); + g_free(tmp); + state->list->data = NULL; + state->list = g_list_delete_link(state->list, state->list); + } + + // return TRUE if there are still states in the list + return (state && state->list) ? TRUE : FALSE; }