X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=gui.c;h=1498426a8922e11726280f9c7cbecb6f49058174;hb=44d40c0c021b65cbfa88466b34054d0fcbcc2a45;hp=3b001a7da191a7c5f52a177ee73e0045c81ce05c;hpb=133240840bd45fbbe4f4be4c52343e0cd32f7e21;p=paraslash.git diff --git a/gui.c b/gui.c index 3b001a7d..1498426a 100644 --- a/gui.c +++ b/gui.c @@ -109,6 +109,8 @@ static void com_scroll_up(void); static void com_scroll_down(void); static void com_page_up(void); static void com_page_down(void); +static void com_cancel_scrolling(void); +static void com_scroll_top(void); static struct gui_command command_list[] = { { @@ -186,6 +188,16 @@ static struct gui_command command_list[] = { .name = "page_down", .description = "scroll down one page", .handler = com_page_down + }, { + .key = "", + .name = "scroll_top", + .description = "scroll to top of buffer", + .handler = com_scroll_top + }, { + .key = "", + .name = "cancel_scroll", + .description = "deactivate scroll mode", + .handler = com_cancel_scrolling }, { .handler = NULL } @@ -230,6 +242,14 @@ static char *km_keyname(int c) sprintf(buf, ""); return buf; } + if (c == KEY_HOME) { + sprintf(buf, ""); + return buf; + } + if (c == KEY_END) { + sprintf(buf, ""); + return buf; + } if (c < 256 && c > -128 && iscntrl((unsigned char) c)) { if (c < 0) c += 256; @@ -768,24 +788,17 @@ static void init_colors(void) init_pair(COLOR_BOT, theme.default_fg, theme.default_bg); } -/* - * (re-)initialize the curses library FIXME: Error checking - */ +/* (Re-)initialize the curses library. FIXME: Error checking. */ static void init_curses(void) { curses_active = 1; - if (top.win && refresh() == ERR) { /* refesh is really needed */ + if (top.win && refresh() == ERR) /* refesh is really needed */ msg_n_exit(EXIT_FAILURE, "refresh() failed\n"); - } check_geometry(); curs_set(0); /* make cursor invisible, ignore errors */ -// if (noraw() == ERR); -// msg_n_exit(EXIT_FAILURE, "can not place terminal out of " -// "raw mode\n"); nonl(); /* tell curses not to do NL->CR/NL on output */ noecho(); /* don't echo input */ cbreak(); /* take input chars one at a time, no wait for \n */ - //reset_prog_mode(); init_colors(); clear(); init_wins(theme.top_lines_default); @@ -793,7 +806,6 @@ static void init_curses(void) noecho(); /* don't echo input */ } - static void check_sigchld(void) { int ret; @@ -1097,6 +1109,41 @@ static void print_scroll_msg(void) filled - scroll_position, ringbuffer_filled(bot_win_rb)); } +static void com_scroll_top(void) +{ + int i = RINGBUFFER_SIZE - 1; + unsigned lines = 0; + + while (i > 0 && !ringbuffer_get(bot_win_rb, i)) + i--; + /* i is oldest entry */ + for (; lines < bot.lines && i >= 0; i--) { + struct rb_entry *rbe = ringbuffer_get(bot_win_rb, i); + if (!rbe) + break; + lines += NUM_LINES(strlen(rbe->msg)); + } + i++; + if (lines > 0 && scroll_position != i) { + scroll_position = i; + redraw_bot_win(); + print_scroll_msg(); + return; + } + print_in_bar(COLOR_ERRMSG, "top of buffer is shown\n"); +} + +static void com_cancel_scrolling(void) +{ + + if (scroll_position == 0) { + print_in_bar(COLOR_ERRMSG, "bottom of buffer is shown\n"); + return; + } + scroll_position = 0; + redraw_bot_win(); +} + static void com_page_down(void) { unsigned lines = 0;