summaryrefslogtreecommitdiffstats
path: root/src/core/ansicol.c
diff options
context:
space:
mode:
authorMichael Brown2013-12-07 21:53:20 +0100
committerMichael Brown2013-12-09 16:34:07 +0100
commit7025f5c648aedf744690e9e04257d6dddc94919d (patch)
tree7117fefd350b81c92732f8f600ff2d7959c0e0fc /src/core/ansicol.c
parent[fbcon] Always draw cursor using current foreground and background colours (diff)
downloadipxe-7025f5c648aedf744690e9e04257d6dddc94919d.tar.gz
ipxe-7025f5c648aedf744690e9e04257d6dddc94919d.tar.xz
ipxe-7025f5c648aedf744690e9e04257d6dddc94919d.zip
[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>
Diffstat (limited to 'src/core/ansicol.c')
-rw-r--r--src/core/ansicol.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/core/ansicol.c b/src/core/ansicol.c
new file mode 100644
index 00000000..142a00f8
--- /dev/null
+++ b/src/core/ansicol.c
@@ -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;
+}