/* Enter a new screen - completely clear the display - allow updating the screens windows - call the screen specific enter function to start tasks and timers etc. - draw contents of screens windows - allow keystrokes to be sent to the screen */ static void screen_enter(enum SCREEN screen){ lcd_fill(0x00); cur_screen = screen; deferred_screen = NO_SCREEN; screen_visible(screen, 1); screen_list[screen].screen_enter(); screen_redraw(screen); };
void screen_flush(void) { if (!screen.buf) { terminal_flush(); return; } if (!terminal_input_buffer_empty()) return; if (screen.redraw || (abs(screen.scrollcnt) >= (screen.lines - 3))) { screen_redraw(); return; } if (screen.scrollcnt < 0) { move_terminal_cursor(0, 0); while (screen.scrollcnt < 0) { ansi_cmd(ANSI_CMD_SR); screen.scrollcnt++; } } if (screen.scrollcnt > 0) { move_terminal_cursor(0, screen.lines - 1); while (screen.scrollcnt > 0) { terminal_putchar('\n'); screen.scrollcnt--; } } for (int i = 0; i < screen.lines; i++) { screen_line_t *sl = get_screen_line(i); sl->data[sl->len] = '\0'; int width = screen_display_width((char *) sl->data, true); if (sl->modified) { sl->modified = false; move_terminal_cursor(0, i); screen_write_cached(sl->data, sl->len); screen.tc_col = width; if (screen.tc_col >= screen.columns) { screen.tc_col -= screen.columns; screen.tc_line++; if (screen.tc_line >= screen.lines) screen.tc_line = screen.lines - 1; } } if (sl->old_width > width) { move_terminal_cursor(width, i); ansi_cmd(ANSI_CMD_CE); } sl->old_width = width; } move_terminal_cursor(screen.cur_col, screen.cur_ln); terminal_flush(); }
int egetch(void) { int rval; while (1) { rval = terminal_getchar(); if (rval != Ctrl('L')) break; screen_redraw(); } return rval; }
void popup_end(){ if (timed_popup) { task_del(close_popup_task); timer_del(&popup_tmr); }; popup_active = 0; set_keypress_handler(mainscreen_keypress); if (deferred_screen != NO_SCREEN) screen_enter(deferred_screen); else { popup_restore(); screen_visible(cur_screen, 1); screen_redraw(cur_screen); }; };
/** * Get next byte from stdin, with special byte interpreted. * @return next byte from stdin */ int igetch(void) { static bool cr = 0; int ch; while (1) { ch = get_raw_ch(); switch (ch) { case IAC: handle_iac(); continue; case KEY_ESC: ch = handle_esc(); break; case Ctrl('L'): screen_redraw(); continue; case '\r': ch = '\n'; cr = true; break; case '\n': if (cr) { cr = false; continue; } break; case '\0': cr = false; continue; default: cr = false; break; } break; } return ch; }
static void screen_enter(){ lcd_fill(0x00); screen_visible(INFO_SCREEN, 1); screen_redraw(INFO_SCREEN); };