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
6FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
7FILE_SECBOOT ( PERMITTED );
8
9static void ansiscr_reset(struct _curses_screen *scr) __nonnull;
10static void ansiscr_movetoyx(struct _curses_screen *scr,
11 unsigned int y, unsigned int x) __nonnull;
12static void ansiscr_putc(struct _curses_screen *scr, chtype c) __nonnull;
13
14static unsigned int saved_usage;
15
16static 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
29static 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
39static void ansiscr_init ( struct _curses_screen *scr ) {
41 ansiscr_reset ( scr );
42}
43
44static void ansiscr_exit ( struct _curses_screen *scr ) {
45 ansiscr_reset ( scr );
47}
48
49static void ansiscr_erase ( struct _curses_screen *scr, attr_t attrs ) {
50 ansiscr_attrs ( scr, attrs );
51 printf ( "\033[2J" );
52}
53
54static 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
64static 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
81static int ansiscr_getc ( struct _curses_screen *scr __unused ) {
82 return getchar();
83}
84
85static bool ansiscr_peek ( struct _curses_screen *scr __unused ) {
86 return iskey();
87}
88
89static 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};
static void ansiscr_movetoyx(struct _curses_screen *scr, unsigned int y, unsigned int x) __nonnull
Definition ansi_screen.c:54
static void ansiscr_attrs(struct _curses_screen *scr, attr_t attrs)
Definition ansi_screen.c:16
static int ansiscr_getc(struct _curses_screen *scr __unused)
Definition ansi_screen.c:81
static bool ansiscr_peek(struct _curses_screen *scr __unused)
Definition ansi_screen.c:85
static void ansiscr_exit(struct _curses_screen *scr)
Definition ansi_screen.c:44
static unsigned int saved_usage
Definition ansi_screen.c:14
static void ansiscr_erase(struct _curses_screen *scr, attr_t attrs)
Definition ansi_screen.c:49
static void ansiscr_putc(struct _curses_screen *scr, chtype c) __nonnull
Definition ansi_screen.c:64
static void ansiscr_reset(struct _curses_screen *scr) __nonnull
Definition ansi_screen.c:29
static void ansiscr_cursor(struct _curses_screen *scr __unused, int visibility)
Definition ansi_screen.c:89
static void ansiscr_init(struct _curses_screen *scr)
Definition ansi_screen.c:39
SCREEN _ansi_screen
Definition ansi_screen.c:94
void ansicol_set_pair(unsigned int cpair)
Set ANSI foreground and background colour.
Definition ansicol.c:90
ANSI colours.
int getchar(void)
Read a single character from any console.
Definition console.c:86
int iskey(void)
Check for available input on any console.
Definition console.c:131
int putchar(int character)
Write a single character to each console device.
Definition console.c:29
MuCurses header file.
#define PAIR_NUMBER(attrs)
Definition curses.h:154
uint32_t attr_t
Definition curses.h:31
uint32_t chtype
Definition curses.h:30
#define A_CHARTEXT
Definition curses.h:148
struct _curses_screen SCREEN
Curses SCREEN object.
#define A_BOLD
Definition curses.h:139
#define A_COLOR
Definition curses.h:150
#define A_ATTRIBUTES
Definition curses.h:147
#define CPAIR_DEFAULT
Default colour pair.
Definition ansicol.h:38
#define __nonnull
Declare a function's pointer parameters as non-null - i.e.
Definition compiler.h:592
#define __unused
Declare a variable or data structure as unused.
Definition compiler.h:573
#define CONSOLE_USAGE_TUI
Text-based user interface.
Definition console.h:148
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
User interaction.
static int console_set_usage(int usage)
Set console usage.
Definition console.h:188
static unsigned int unsigned int y
Definition pixbuf.h:63
static unsigned int x
Definition pixbuf.h:63
Curses SCREEN object.
Definition curses.h:34
attr_t attrs
Current attribute.
Definition curses.h:38
unsigned int curs_x
Current cursor position.
Definition curses.h:36
unsigned int curs_y
Definition curses.h:36
#define COLS
Definition vga.h:27
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition vsprintf.c:465