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[] = {
{
.name = "page_down",
.description = "scroll down one page",
.handler = com_page_down
+ }, {
+ .key = "<home>",
+ .name = "scroll_top",
+ .description = "scroll to top of buffer",
+ .handler = com_scroll_top
+ }, {
+ .key = "<end>",
+ .name = "cancel_scroll",
+ .description = "deactivate scroll mode",
+ .handler = com_cancel_scrolling
}, {
.handler = NULL
}
sprintf(buf, "<ppage>");
return buf;
}
+ if (c == KEY_HOME) {
+ sprintf(buf, "<home>");
+ return buf;
+ }
+ if (c == KEY_END) {
+ sprintf(buf, "<end>");
+ return buf;
+ }
if (c < 256 && c > -128 && iscntrl((unsigned char) c)) {
if (c < 0)
c += 256;
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);
noecho(); /* don't echo input */
}
-
static void check_sigchld(void)
{
int ret;
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;