int SLscroll_pagedown (SLscroll_Window_Type *win) { SLscroll_Type *l, *bot; unsigned int nrows, hidden_mask; unsigned int n; if (win == NULL) return -1; (void) SLscroll_find_top (win); nrows = win->nrows; if ((NULL != (bot = win->bot_window_line)) && (nrows > 2)) { n = 0; hidden_mask = win->hidden_mask; l = win->current_line; while ((l != NULL) && (l != bot)) { l = l->next; if ((hidden_mask == 0) || ((l != NULL) && (0 == (l->flags & hidden_mask)))) n++; } if (l != NULL) { win->current_line = l; win->top_window_line = l; win->line_num += n; find_window_bottom (win); if (n || (bot != win->bot_window_line)) return 0; return -1; } } if (nrows < 2) nrows++; if (0 == SLscroll_next_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 (); } } }