|
|
1.1 root 1: #include <stdio.h>
2: #include <curses.h>
3: #include <ipxe/console.h>
4:
5: FILE_LICENCE ( GPL2_OR_LATER );
6:
7: static void ansiscr_reset(struct _curses_screen *scr) __nonnull;
8: static void ansiscr_movetoyx(struct _curses_screen *scr,
9: unsigned int y, unsigned int x) __nonnull;
10: static void ansiscr_putc(struct _curses_screen *scr, chtype c) __nonnull;
11:
12: unsigned short _COLS = 80;
13: unsigned short _LINES = 24;
14:
15: static void ansiscr_reset ( struct _curses_screen *scr ) {
16: /* Reset terminal attributes and clear screen */
17: scr->attrs = 0;
18: scr->curs_x = 0;
19: scr->curs_y = 0;
20: printf ( "\033[0m" );
21: }
22:
23: static void ansiscr_movetoyx ( struct _curses_screen *scr,
24: unsigned int y, unsigned int x ) {
25: if ( ( x != scr->curs_x ) || ( y != scr->curs_y ) ) {
26: /* ANSI escape sequence to update cursor position */
27: printf ( "\033[%d;%dH", ( y + 1 ), ( x + 1 ) );
28: scr->curs_x = x;
29: scr->curs_y = y;
30: }
31: }
32:
33: static void ansiscr_putc ( struct _curses_screen *scr, chtype c ) {
34: unsigned int character = ( c & A_CHARTEXT );
35: attr_t attrs = ( c & ( A_ATTRIBUTES | A_COLOR ) );
36: int bold = ( attrs & A_BOLD );
37: attr_t cpair = PAIR_NUMBER ( attrs );
38: short fcol;
39: short bcol;
40:
41: /* Update attributes if changed */
42: if ( attrs != scr->attrs ) {
43: scr->attrs = attrs;
44: pair_content ( cpair, &fcol, &bcol );
45: /* ANSI escape sequence to update character attributes */
46: printf ( "\033[0;%d;3%d;4%dm", ( bold ? 1 : 22 ), fcol, bcol );
47: }
48:
49: /* Print the actual character */
50: putchar ( character );
51:
52: /* Update expected cursor position */
53: if ( ++(scr->curs_x) == _COLS ) {
54: scr->curs_x = 0;
55: ++scr->curs_y;
56: }
57: }
58:
59: static int ansiscr_getc ( struct _curses_screen *scr __unused ) {
60: return getchar();
61: }
62:
63: static bool ansiscr_peek ( struct _curses_screen *scr __unused ) {
64: return iskey();
65: }
66:
67: SCREEN _ansi_screen = {
68: .init = ansiscr_reset,
69: .exit = ansiscr_reset,
70: .movetoyx = ansiscr_movetoyx,
71: .putc = ansiscr_putc,
72: .getc = ansiscr_getc,
73: .peek = ansiscr_peek,
74: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.