Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
[console] Add centralised concept of colours and colour pairs
Add a centralised concept of colours and colour pairs (using the default colour pairs as configured via config/colour.h). A colour pair consists of a pair of colour indices. Add the ability to redefine both a colour pair and an individual colour index, with minimal overhead if this feature is not required (e.g. because the relevant shell commands are not present in the build). Signed-off-by: Michael Brown <mcb30@ipxe.org>
- Loading branch information
Showing
5 changed files
with
361 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
/* | ||
* Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>. | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation; either version 2 of the | ||
* License, or any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
* 02110-1301, USA. | ||
*/ | ||
|
||
FILE_LICENCE ( GPL2_OR_LATER ); | ||
|
||
#include <stdio.h> | ||
#include <errno.h> | ||
#include <assert.h> | ||
#include <ipxe/ansiesc.h> | ||
#include <ipxe/ansicol.h> | ||
#include <config/colour.h> | ||
|
||
/** @file | ||
* | ||
* ANSI colours | ||
* | ||
*/ | ||
|
||
/** ANSI colour pair definitions */ | ||
static struct ansicol_pair ansicol_pairs[] = { | ||
[CPAIR_DEFAULT] = { COLOR_DEFAULT, COLOR_DEFAULT }, | ||
[CPAIR_NORMAL] = { COLOR_NORMAL_FG, COLOR_NORMAL_BG }, | ||
[CPAIR_SELECT] = { COLOR_SELECT_FG, COLOR_SELECT_BG }, | ||
[CPAIR_SEPARATOR] = { COLOR_SEPARATOR_FG, COLOR_SEPARATOR_BG }, | ||
[CPAIR_EDIT] = { COLOR_EDIT_FG, COLOR_EDIT_BG }, | ||
[CPAIR_ALERT] = { COLOR_ALERT_FG, COLOR_ALERT_BG }, | ||
[CPAIR_URL] = { COLOR_URL_FG, COLOR_URL_BG }, | ||
[CPAIR_PXE] = { COLOR_PXE_FG, COLOR_PXE_BG }, | ||
}; | ||
|
||
/** | ||
* Set ANSI colour (when no colour definition support is present) | ||
* | ||
* @v colour Colour index | ||
* @v which Foreground/background selector | ||
*/ | ||
__weak void ansicol_set ( unsigned int colour, unsigned int which ) { | ||
|
||
/* Colour indices are hardcoded and should never be out of range */ | ||
assert ( colour < 10 ); | ||
|
||
/* Set basic colour */ | ||
printf ( CSI "%c%dm", which, colour ); | ||
} | ||
|
||
/** | ||
* Set ANSI foreground colour | ||
* | ||
* @v colour Colour index | ||
*/ | ||
static void ansicol_foreground ( unsigned int colour ) { | ||
ansicol_set ( colour, '3' ); | ||
} | ||
|
||
/** | ||
* Set ANSI background colour | ||
* | ||
* @v colour Colour index | ||
*/ | ||
static void ansicol_background ( unsigned int colour ) { | ||
ansicol_set ( colour, '4' ); | ||
} | ||
|
||
/** | ||
* Set ANSI foreground and background colour | ||
* | ||
* @v cpair Colour pair index | ||
*/ | ||
void ansicol_set_pair ( unsigned int cpair ) { | ||
struct ansicol_pair *pair; | ||
|
||
/* Colour pair indices are hardcoded and should never be out of range */ | ||
assert ( cpair < ( sizeof ( ansicol_pairs ) / | ||
sizeof ( ansicol_pairs[0] ) ) ); | ||
|
||
/* Set both foreground and background colours */ | ||
pair = &ansicol_pairs[cpair]; | ||
ansicol_foreground ( pair->foreground ); | ||
ansicol_background ( pair->background ); | ||
} | ||
|
||
/** | ||
* Define ANSI colour pair | ||
* | ||
* @v cpair Colour pair index | ||
* @v foreground Foreground colour index | ||
* @v background Background colour index | ||
* @ret rc Return status code | ||
*/ | ||
int ansicol_define_pair ( unsigned int cpair, unsigned int foreground, | ||
unsigned int background ) { | ||
struct ansicol_pair *pair; | ||
|
||
/* Fail if colour index is out of range */ | ||
if ( cpair >= ( sizeof ( ansicol_pairs ) / sizeof ( ansicol_pairs[0] ))) | ||
return -EINVAL; | ||
|
||
/* Update colour pair definition */ | ||
pair = &ansicol_pairs[cpair]; | ||
pair->foreground = foreground; | ||
pair->background = background; | ||
DBGC ( &ansicol_pairs[0], "ANSICOL redefined colour pair %d as " | ||
"foreground %d background %d\n", cpair, foreground, background ); | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
/* | ||
* Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>. | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation; either version 2 of the | ||
* License, or any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
* 02110-1301, USA. | ||
*/ | ||
|
||
FILE_LICENCE ( GPL2_OR_LATER ); | ||
|
||
#include <stdio.h> | ||
#include <errno.h> | ||
#include <ipxe/ansiesc.h> | ||
#include <ipxe/ansicol.h> | ||
#include <config/colour.h> | ||
|
||
/** @file | ||
* | ||
* ANSI colour definitions | ||
* | ||
*/ | ||
|
||
/** | ||
* Construct ANSI colour definition | ||
* | ||
* @v basic Basic colour | ||
* @v rgb 24-bit RGB value (or ANSICOL_NO_RGB) | ||
* @ret ansicol ANSI colour definition | ||
*/ | ||
#define ANSICOL_DEFINE( basic, rgb ) ( ( (basic) << 28 ) | (rgb) ) | ||
|
||
/** | ||
* Extract basic colour from ANSI colour definition | ||
* | ||
* @v ansicol ANSI colour definition | ||
* @ret basic Basic colour | ||
*/ | ||
#define ANSICOL_BASIC( ansicol ) ( (ansicol) >> 28 ) | ||
|
||
/** | ||
* Extract 24-bit RGB value from ANSI colour definition | ||
* | ||
* @v ansicol ANSI colour definition | ||
* @ret rgb 24-bit RGB value | ||
*/ | ||
#define ANSICOL_RGB( ansicol ) ( ( (ansicol) >> 0 ) & 0xffffffUL ) | ||
|
||
/** | ||
* Extract 24-bit RGB value red component from ANSI colour definition | ||
* | ||
* @v ansicol ANSI colour definition | ||
* @ret red Red component | ||
*/ | ||
#define ANSICOL_RED( ansicol ) ( ( (ansicol) >> 16 ) & 0xff ) | ||
|
||
/** | ||
* Extract 24-bit RGB value green component from ANSI colour definition | ||
* | ||
* @v ansicol ANSI colour definition | ||
* @ret green Green component | ||
*/ | ||
#define ANSICOL_GREEN( ansicol ) ( ( (ansicol) >> 8 ) & 0xff ) | ||
|
||
/** | ||
* Extract 24-bit RGB value blue component from ANSI colour definition | ||
* | ||
* @v ansicol ANSI colour definition | ||
* @ret blue Blue component | ||
*/ | ||
#define ANSICOL_BLUE( ansicol ) ( ( (ansicol) >> 0 ) & 0xff ) | ||
|
||
/** | ||
* Construct default ANSI colour definition | ||
* | ||
* @v basic Basic colour | ||
* @ret ansicol ANSI colour definition | ||
* | ||
* Colours default to being just a basic colour. | ||
*/ | ||
#define ANSICOL_DEFAULT( basic ) ANSICOL_DEFINE ( (basic), ANSICOL_NO_RGB ) | ||
|
||
/** ANSI colour definitions */ | ||
static uint32_t ansicols[] = { | ||
[COLOR_BLACK] = ANSICOL_DEFAULT ( COLOR_BLACK ), | ||
[COLOR_RED] = ANSICOL_DEFAULT ( COLOR_RED ), | ||
[COLOR_GREEN] = ANSICOL_DEFAULT ( COLOR_GREEN ), | ||
[COLOR_YELLOW] = ANSICOL_DEFAULT ( COLOR_YELLOW ), | ||
[COLOR_BLUE] = ANSICOL_DEFAULT ( COLOR_BLUE ), | ||
[COLOR_MAGENTA] = ANSICOL_DEFAULT ( COLOR_MAGENTA ), | ||
[COLOR_CYAN] = ANSICOL_DEFAULT ( COLOR_CYAN ), | ||
[COLOR_WHITE] = ANSICOL_DEFAULT ( COLOR_WHITE ), | ||
}; | ||
|
||
/** | ||
* Define ANSI colour | ||
* | ||
* @v colour Colour index | ||
* @v basic Basic colour | ||
* @v rgb 24-bit RGB value (or ANSICOL_NO_RGB) | ||
* @ret rc Return status code | ||
*/ | ||
int ansicol_define ( unsigned int colour, unsigned int basic, uint32_t rgb ) { | ||
uint32_t ansicol; | ||
|
||
/* Fail if colour index is out of range */ | ||
if ( colour >= ( sizeof ( ansicols ) / sizeof ( ansicols[0] ) ) ) | ||
return -EINVAL; | ||
|
||
/* Update colour definition */ | ||
ansicol = ANSICOL_DEFINE ( basic, rgb ); | ||
ansicols[colour] = ansicol; | ||
DBGC ( &ansicols[0], "ANSICOL redefined colour %d as basic %d RGB " | ||
"%#06lx%s\n", colour, ANSICOL_BASIC ( ansicol ), | ||
ANSICOL_RGB ( ansicol ), | ||
( ( ansicol & ANSICOL_NO_RGB ) ? " [norgb]" : "" ) ); | ||
|
||
return 0; | ||
} | ||
|
||
/** | ||
* Set ANSI colour (using colour definitions) | ||
* | ||
* @v colour Colour index | ||
* @v which Foreground/background selector | ||
*/ | ||
void ansicol_set ( unsigned int colour, unsigned int which ) { | ||
uint32_t ansicol; | ||
unsigned int basic; | ||
|
||
/* Use default colour if colour index is out of range */ | ||
if ( colour < ( sizeof ( ansicols ) / sizeof ( ansicols[0] ) ) ) { | ||
ansicol = ansicols[colour]; | ||
} else { | ||
ansicol = ANSICOL_DEFINE ( COLOUR_DEFAULT, ANSICOL_NO_RGB ); | ||
} | ||
|
||
/* If basic colour is out of range, use the default colour */ | ||
basic = ANSICOL_BASIC ( ansicol ); | ||
if ( basic >= 10 ) | ||
basic = COLOR_DEFAULT; | ||
|
||
/* Set basic colour first */ | ||
printf ( CSI "%c%dm", which, basic ); | ||
|
||
/* Set 24-bit RGB colour, if applicable */ | ||
if ( ! ( ansicol & ANSICOL_NO_RGB ) ) { | ||
printf ( CSI "%c8;2;%d;%d;%dm", which, ANSICOL_RED ( ansicol ), | ||
ANSICOL_GREEN ( ansicol ), ANSICOL_BLUE ( ansicol ) ); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
#ifndef _IPXE_ANSICOL_H | ||
#define _IPXE_ANSICOL_H | ||
|
||
/** @file | ||
* | ||
* ANSI colours | ||
* | ||
*/ | ||
|
||
FILE_LICENCE ( GPL2_OR_LATER ); | ||
|
||
#include <stdint.h> | ||
#include <curses.h> /* For COLOR_RED etc. */ | ||
|
||
/** Default colour (usually white foreground, black background) */ | ||
#define COLOUR_DEFAULT 9 | ||
#define COLOR_DEFAULT COLOUR_DEFAULT | ||
|
||
/** RGB value for "not defined" */ | ||
#define ANSICOL_NO_RGB 0x01000000 | ||
|
||
/** | ||
* @defgroup ansicolpairs ANSI colour pairs | ||
* @{ | ||
*/ | ||
|
||
/** Default colour pair */ | ||
#define CPAIR_DEFAULT 0 | ||
|
||
/** Normal text */ | ||
#define CPAIR_NORMAL 1 | ||
|
||
/** Highlighted text */ | ||
#define CPAIR_SELECT 2 | ||
|
||
/** Unselectable text (e.g. continuation ellipses, menu separators) */ | ||
#define CPAIR_SEPARATOR 3 | ||
|
||
/** Editable text */ | ||
#define CPAIR_EDIT 4 | ||
|
||
/** Error text */ | ||
#define CPAIR_ALERT 5 | ||
|
||
/** URL text */ | ||
#define CPAIR_URL 6 | ||
|
||
/** PXE selected menu entry */ | ||
#define CPAIR_PXE 7 | ||
|
||
/** @} */ | ||
|
||
/** An ANSI colour pair definition */ | ||
struct ansicol_pair { | ||
/** Foreground colour index */ | ||
uint8_t foreground; | ||
/** Background colour index */ | ||
uint8_t background; | ||
} __attribute__ (( packed )); | ||
|
||
/* ansicol.c */ | ||
extern void ansicol_set_pair ( unsigned int cpair ); | ||
extern int ansicol_define_pair ( unsigned int cpair, unsigned int foreground, | ||
unsigned int background ); | ||
|
||
/* ansicoldef.c */ | ||
extern int ansicol_define ( unsigned int colour, unsigned int ansi, | ||
uint32_t rgb ); | ||
|
||
/* Function provided by ansicol.c but overridden by ansicoldef.c, if present */ | ||
extern void ansicol_set ( unsigned int colour, unsigned int which ); | ||
|
||
#endif /* _IPXE_ANSICOL_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters