Skip to content

Commit

Permalink
[console] Allow consoles to update the recorded console size
Browse files Browse the repository at this point in the history
Provide a mechanism for consoles to update the recorded console width
and height, and use this width and height to provide the curses COLS
and LINES variables.

We choose not to use ANSI escape sequences to obtain the width and
height, for two reasons:

- iPXE's model is that all output is sent to all consoles; we could
  therefore end up with multiple consoles reporting conflicting widths
  and heights

- when a serial console is in use, we probably don't want to resize
  the output shown on the BIOS console to match the size of the serial
  console, since it's likely that the serial console is in use only
  for debugging.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Dec 6, 2013
1 parent 1680d0d commit 03401f9
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 8 deletions.
9 changes: 9 additions & 0 deletions src/core/console.c
Expand Up @@ -10,6 +10,12 @@ FILE_LICENCE ( GPL2_OR_LATER );
/** Current console usage */
int console_usage = CONSOLE_USAGE_STDOUT;

/** Console width */
unsigned int console_width = CONSOLE_DEFAULT_WIDTH;

/** Console height */
unsigned int console_height = CONSOLE_DEFAULT_HEIGHT;

/**
* Write a single character to each console device
*
Expand Down Expand Up @@ -138,6 +144,9 @@ int console_configure ( struct console_configuration *config ) {
struct console_driver *console;
int rc;

/* Reset console width and height */
console_set_size ( CONSOLE_DEFAULT_WIDTH, CONSOLE_DEFAULT_HEIGHT );

/* Try to configure each console */
for_each_table_entry ( console, CONSOLES ) {
if ( ( console->configure ) &&
Expand Down
5 changes: 1 addition & 4 deletions src/hci/mucurses/ansi_screen.c
Expand Up @@ -9,9 +9,6 @@ static void ansiscr_movetoyx(struct _curses_screen *scr,
unsigned int y, unsigned int x) __nonnull;
static void ansiscr_putc(struct _curses_screen *scr, chtype c) __nonnull;

unsigned short _COLS = 80;
unsigned short _LINES = 24;

static unsigned int saved_usage;

static void ansiscr_attrs ( struct _curses_screen *scr, attr_t attrs ) {
Expand Down Expand Up @@ -72,7 +69,7 @@ static void ansiscr_putc ( struct _curses_screen *scr, chtype c ) {
putchar ( character );

/* Update expected cursor position */
if ( ++(scr->curs_x) == _COLS ) {
if ( ++(scr->curs_x) == COLS ) {
scr->curs_x = 0;
++scr->curs_y;
}
Expand Down
7 changes: 3 additions & 4 deletions src/include/curses.h
Expand Up @@ -3,6 +3,7 @@

#include <stdint.h>
#include <stdarg.h>
#include <ipxe/console.h>

/** @file
*
Expand Down Expand Up @@ -105,12 +106,10 @@ typedef struct _curses_window {
} WINDOW;

extern WINDOW _stdscr;
extern unsigned short _COLS;
extern unsigned short _LINES;

#define stdscr ( &_stdscr )
#define COLS _COLS
#define LINES _LINES
#define COLS console_width
#define LINES console_height

#define MUCURSES_BITS( mask, shift ) (( mask ) << (shift))
#define CPAIR_SHIFT 8
Expand Down
20 changes: 20 additions & 0 deletions src/include/ipxe/console.h
Expand Up @@ -159,7 +159,15 @@ struct console_driver {
*/
#define CONSOLE_EXPLICIT( console ) ( ( 2 * console + 1 ) != 2 )

/** Default console width */
#define CONSOLE_DEFAULT_WIDTH 80

/** Default console height */
#define CONSOLE_DEFAULT_HEIGHT 25

extern int console_usage;
extern unsigned int console_width;
extern unsigned int console_height;

/**
* Set console usage
Expand All @@ -175,6 +183,18 @@ console_set_usage ( int usage ) {
return old_usage;
}

/**
* Set console size
*
* @v width Width, in characters
* @v height Height, in characters
*/
static inline __attribute__ (( always_inline )) void
console_set_size ( unsigned int width, unsigned int height ) {
console_width = width;
console_height = height;
}

extern int iskey ( void );
extern int getkey ( unsigned long timeout );
extern int console_configure ( struct console_configuration *config );
Expand Down

0 comments on commit 03401f9

Please sign in to comment.