int SLscroll_pageup (SLscroll_Window_Type *win) { SLscroll_Type *l, *top; unsigned int nrows, hidden_mask; unsigned int n; if (win == NULL) return -1; (void) SLscroll_find_top (win); nrows = win->nrows; if ((NULL != (top = win->top_window_line)) && (nrows > 2)) { n = 0; hidden_mask = win->hidden_mask; l = win->current_line; while ((l != NULL) && (l != top)) { l = l->prev; if ((hidden_mask == 0) || ((l != NULL) && (0 == (l->flags & hidden_mask)))) n++; } if (l != NULL) { unsigned int save_line_num; int ret = 0; win->current_line = l; win->line_num -= n; /* Compute a new top/bottom header */ save_line_num = win->line_num; if ((0 == SLscroll_prev_n (win, nrows - 1)) && (n == 0)) ret = -1; win->top_window_line = win->current_line; win->current_line = l; win->line_num = save_line_num; find_window_bottom (win); return ret; } } if (nrows < 2) nrows++; if (0 == SLscroll_prev_n (win, nrows - 1)) return -1; return 0; }
static void main_loop (void) { int screen_start; while (1) { update_display (); switch (SLkp_getkey ()) { case SL_KEY_ERR: case 'q': case 'Q': demolib_exit (0); break; case SL_KEY_RIGHT: Screen_Start += 1; screen_start = Screen_Start; SLsmg_set_screen_start (NULL, &screen_start); break; case SL_KEY_LEFT: Screen_Start -= 1; if (Screen_Start < 0) Screen_Start = 0; screen_start = Screen_Start; SLsmg_set_screen_start (NULL, &screen_start); break; case SL_KEY_UP: SLscroll_prev_n (&Line_Window, 1); Line_Window.top_window_line = Line_Window.current_line; break; case '\r': case SL_KEY_DOWN: SLscroll_next_n (&Line_Window, 1); Line_Window.top_window_line = Line_Window.current_line; break; case SL_KEY_NPAGE: case ' ': case 4: SLscroll_pagedown (&Line_Window); break; case SL_KEY_PPAGE: case 127: case 21: SLscroll_pageup (&Line_Window); break; case APP_KEY_BOB: while (-1 != SLscroll_pageup (&Line_Window)) ; break; case APP_KEY_EOB: while (-1 != SLscroll_pagedown (&Line_Window)) ; break; default: SLtt_beep (); } } }