diff options
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | src/list_window.c | 19 | ||||
-rw-r--r-- | src/list_window.h | 3 | ||||
-rw-r--r-- | src/screen_help.c | 56 |
4 files changed, 67 insertions, 13 deletions
@@ -2,6 +2,8 @@ * options.c: fixed short option handling for multiple short options at once (-abcde) * conf.c: removed support for the old configuration syntax + * list_window.[c.h]: added LW_HIDE_CURSOR_FLAG + * screen_help.c: hide cursor on the help screen 2004-07-09 Kalle Wallin <kaw@linux.se> * ncmpc-0.11.0 released (r1820) diff --git a/src/list_window.c b/src/list_window.c index 84c19a1c1..b541ac708 100644 --- a/src/list_window.c +++ b/src/list_window.c @@ -166,15 +166,22 @@ list_window_paint(list_window_t *lw, int i; int fill = options.wide_cursor; - while( lw->selected < lw->start ) + if( lw->flags & LW_HIDE_CURSOR ) { - lw->start--; - lw->clear=1; + lw->selected = -1; } - while( lw->selected >= lw->start+lw->rows ) + else { - lw->start++; - lw->clear=1; + while( lw->selected < lw->start ) + { + lw->start--; + lw->clear=1; + } + while( lw->selected >= lw->start+lw->rows ) + { + lw->start++; + lw->clear=1; + } } for(i=0; i<lw->rows; i++) diff --git a/src/list_window.h b/src/list_window.h index 8f82791d1..8374e53d7 100644 --- a/src/list_window.h +++ b/src/list_window.h @@ -3,6 +3,8 @@ #define LW_ROW(lw) (lw ? lw->selected-lw->start : 0) +#define LW_HIDE_CURSOR 0x01 + typedef char * (*list_window_callback_fn_t) (int index, int *highlight, void *data); @@ -17,6 +19,7 @@ typedef struct int xoffset; int clear; int repaint; + int flags; } list_window_t; diff --git a/src/screen_help.c b/src/screen_help.c index 4d76ffe7f..4d1db1594 100644 --- a/src/screen_help.c +++ b/src/screen_help.c @@ -188,6 +188,7 @@ static void help_init(WINDOW *w, int cols, int rows) { lw = list_window_init(w, cols, rows); + lw->flags = LW_HIDE_CURSOR; } static void @@ -233,15 +234,56 @@ help_update(screen_t *screen, mpdclient_t *c) static int help_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) { - int retval; + lw->repaint=1; + switch(cmd) + { + case CMD_LIST_NEXT: + if( lw->start+lw->rows < help_text_rows ) + lw->start++; + return 1; + case CMD_LIST_PREVIOUS: + if( lw->start >0 ) + lw->start--; + return 1; + case CMD_LIST_FIRST: + lw->start = 0; + return 1; + case CMD_LIST_LAST: + lw->start = help_text_rows-lw->rows; + if( lw->start<0 ) + lw->start = 0; + return 1; + case CMD_LIST_NEXT_PAGE: + lw->start = lw->start + lw->rows; + if( lw->start+lw->rows >= help_text_rows ) + lw->start = help_text_rows-lw->rows; + if( lw->start<0 ) + lw->start = 0; + return 1; + case CMD_LIST_PREVIOUS_PAGE: + lw->start = lw->start - lw->rows; + if( lw->start<0 ) + lw->start = 0; + return 1; + default: + break; + } - retval = list_window_cmd(lw, help_text_rows, cmd); - if( !retval ) - return screen_find(screen, c, - lw, help_text_rows, - cmd, list_callback); + lw->selected = lw->start+lw->rows; + if( screen_find(screen, c, + lw, help_text_rows, + cmd, list_callback) ) + { + /* center the row */ + lw->start = lw->selected-(lw->rows/2); + if( lw->start+lw->rows > help_text_rows ) + lw->start = help_text_rows-lw->rows; + if( lw->start<0 ) + lw->start=0; + return 1; + } - return retval; + return 0; } static list_window_t * |