iPXE
ansi_screen.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <curses.h>
3 #include <ipxe/ansicol.h>
4 #include <ipxe/console.h>
5 
6 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
7 FILE_SECBOOT ( PERMITTED );
8 
9 static void ansiscr_reset(struct _curses_screen *scr) __nonnull;
10 static void ansiscr_movetoyx(struct _curses_screen *scr,
11  unsigned int y, unsigned int x) __nonnull;
12 static void ansiscr_putc(struct _curses_screen *scr, chtype c) __nonnull;
13 
14 static unsigned int saved_usage;
15 
16 static void ansiscr_attrs ( struct _curses_screen *scr, attr_t attrs ) {
17  int bold = ( attrs & A_BOLD );
18  attr_t cpair = PAIR_NUMBER ( attrs );
19 
20  if ( scr->attrs != attrs ) {
21  scr->attrs = attrs;
22  /* Reset attributes and set/clear bold as appropriate */
23  printf ( "\033[0;%dm", ( bold ? 1 : 22 ) );
24  /* Set foreground and background colours */
25  ansicol_set_pair ( cpair );
26  }
27 }
28 
29 static void ansiscr_reset ( struct _curses_screen *scr ) {
30  /* Reset terminal attributes and clear screen */
31  scr->attrs = 0;
32  scr->curs_x = 0;
33  scr->curs_y = 0;
34  printf ( "\0330m" );
36  printf ( "\033[2J" );
37 }
38 
39 static void ansiscr_init ( struct _curses_screen *scr ) {
41  ansiscr_reset ( scr );
42 }
43 
44 static void ansiscr_exit ( struct _curses_screen *scr ) {
45  ansiscr_reset ( scr );
47 }
48 
49 static void ansiscr_erase ( struct _curses_screen *scr, attr_t attrs ) {
50  ansiscr_attrs ( scr, attrs );
51  printf ( "\033[2J" );
52 }
53 
54 static void ansiscr_movetoyx ( struct _curses_screen *scr,
55  unsigned int y, unsigned int x ) {
56  if ( ( x != scr->curs_x ) || ( y != scr->curs_y ) ) {
57  /* ANSI escape sequence to update cursor position */
58  printf ( "\033[%d;%dH", ( y + 1 ), ( x + 1 ) );
59  scr->curs_x = x;
60  scr->curs_y = y;
61  }
62 }
63 
64 static void ansiscr_putc ( struct _curses_screen *scr, chtype c ) {
65  unsigned int character = ( c & A_CHARTEXT );
66  attr_t attrs = ( c & ( A_ATTRIBUTES | A_COLOR ) );
67 
68  /* Update attributes if changed */
69  ansiscr_attrs ( scr, attrs );
70 
71  /* Print the actual character */
72  putchar ( character );
73 
74  /* Update expected cursor position */
75  if ( ++(scr->curs_x) == COLS ) {
76  scr->curs_x = 0;
77  ++scr->curs_y;
78  }
79 }
80 
81 static int ansiscr_getc ( struct _curses_screen *scr __unused ) {
82  return getchar();
83 }
84 
85 static bool ansiscr_peek ( struct _curses_screen *scr __unused ) {
86  return iskey();
87 }
88 
89 static void ansiscr_cursor ( struct _curses_screen *scr __unused,
90  int visibility ) {
91  printf ( "\033[?25%c", ( visibility ? 'h' : 'l' ) );
92 }
93 
95  .init = ansiscr_init,
96  .exit = ansiscr_exit,
97  .erase = ansiscr_erase,
98  .movetoyx = ansiscr_movetoyx,
99  .putc = ansiscr_putc,
100  .getc = ansiscr_getc,
101  .peek = ansiscr_peek,
102  .cursor = ansiscr_cursor,
103 };
MuCurses header file.
FILE_SECBOOT(PERMITTED)
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:465
Curses SCREEN object.
Definition: curses.h:34
#define A_ATTRIBUTES
Definition: curses.h:147
static void ansiscr_exit(struct _curses_screen *scr)
Definition: ansi_screen.c:44
#define CONSOLE_USAGE_TUI
Text-based user interface.
Definition: console.h:148
static unsigned int x
Definition: pixbuf.h:63
static int ansiscr_getc(struct _curses_screen *scr __unused)
Definition: ansi_screen.c:81
static void ansiscr_cursor(struct _curses_screen *scr __unused, int visibility)
Definition: ansi_screen.c:89
static bool ansiscr_peek(struct _curses_screen *scr __unused)
Definition: ansi_screen.c:85
void ansicol_set_pair(unsigned int cpair)
Set ANSI foreground and background colour.
Definition: ansicol.c:90
static void ansiscr_erase(struct _curses_screen *scr, attr_t attrs)
Definition: ansi_screen.c:49
uint32_t attr_t
Definition: curses.h:31
#define __nonnull
Declare a function's pointer parameters as non-null - i.e.
Definition: compiler.h:592
static void ansiscr_movetoyx(struct _curses_screen *scr, unsigned int y, unsigned int x) __nonnull
Definition: ansi_screen.c:54
#define __unused
Declare a variable or data structure as unused.
Definition: compiler.h:573
void(* init)(struct _curses_screen *scr)
Definition: curses.h:40
#define COLS
Definition: vga.h:27
User interaction.
int getchar(void)
Read a single character from any console.
Definition: console.c:86
SCREEN _ansi_screen
Definition: ansi_screen.c:94
static void ansiscr_reset(struct _curses_screen *scr) __nonnull
Definition: ansi_screen.c:29
unsigned int curs_x
Current cursor position.
Definition: curses.h:36
static void ansiscr_init(struct _curses_screen *scr)
Definition: ansi_screen.c:39
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
#define CPAIR_DEFAULT
Default colour pair.
Definition: ansicol.h:38
attr_t attrs
Current attribute.
Definition: curses.h:38
static void ansiscr_putc(struct _curses_screen *scr, chtype c) __nonnull
Definition: ansi_screen.c:64
#define A_COLOR
Definition: curses.h:150
unsigned int curs_y
Definition: curses.h:36
#define A_CHARTEXT
Definition: curses.h:148
static unsigned int unsigned int y
Definition: pixbuf.h:63
static int console_set_usage(int usage)
Set console usage.
Definition: console.h:188
static unsigned int saved_usage
Definition: ansi_screen.c:14
uint32_t chtype
Definition: curses.h:30
static void ansiscr_attrs(struct _curses_screen *scr, attr_t attrs)
Definition: ansi_screen.c:16
#define A_BOLD
Definition: curses.h:139
int putchar(int character)
Write a single character to each console device.
Definition: console.c:29
#define PAIR_NUMBER(attrs)
Definition: curses.h:154
int iskey(void)
Check for available input on any console.
Definition: console.c:131
ANSI colours.