예제 #1
0
/*
	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);
};
예제 #2
0
파일: screen.c 프로젝트: erichuang1994/fbbs
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();
}
예제 #3
0
int egetch(void)
{
	int rval;

	while (1) {
		rval = terminal_getchar();
		if (rval != Ctrl('L'))
			break;
		screen_redraw();
	}
	return rval;
}
예제 #4
0
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);
	};
};
예제 #5
0
/**
 * 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;
}
예제 #6
0
static void 
screen_enter(){
	lcd_fill(0x00);
	screen_visible(INFO_SCREEN, 1);
	screen_redraw(INFO_SCREEN);	
};