176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- *
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   Copyright 2004-2008 H. Peter Anvin - All Rights Reserved
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   This program is free software; you can redistribute it and/or modify
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   it under the terms of the GNU General Public License as published by
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   Boston MA 02110-1301, USA; either version 2 of the License, or
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   (at your option) any later version; incorporated herein by reference.
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- */
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdlib.h>
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h>
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h>
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <colortbl.h>
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "menu.h"
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The color/attribute indexes (\1#X, \2#XX, \3#XXX) are as follows
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 00 - screen		Rest of the screen
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 01 - border		Border area
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 02 - title		Title bar
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 03 - unsel		Unselected menu item
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 04 - hotkey		Unselected hotkey
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 05 - sel		Selection bar
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 06 - hotsel		Selected hotkey
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 07 - scrollbar	Scroll bar
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 08 - tabmsg		Press [Tab] message
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 09 - cmdmark		Command line marker
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 10 - cmdline		Command line
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 11 - pwdborder	Password box border
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 12 - pwdheader	Password box header
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 13 - pwdentry	Password box contents
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 14 - timeout_msg	Timeout message
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 15 - timeout		Timeout counter
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 16 - help		Current entry help text
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 17 - disabled        Disabled menu item
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic const struct color_table default_colors[] = {
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"screen", "37;40", 0x80ffffff, 0x00000000, SHADOW_NORMAL},
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"border", "30;44", 0x40000000, 0x00000000, SHADOW_NORMAL},
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"title", "1;36;44", 0xc00090f0, 0x00000000, SHADOW_NORMAL},
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"unsel", "37;44", 0x90ffffff, 0x00000000, SHADOW_NORMAL},
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"hotkey", "1;37;44", 0xffffffff, 0x00000000, SHADOW_NORMAL},
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"sel", "7;37;40", 0xe0000000, 0x20ff8000, SHADOW_ALL},
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"hotsel", "1;7;37;40", 0xe0400000, 0x20ff8000, SHADOW_ALL},
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"scrollbar", "30;44", 0x40000000, 0x00000000, SHADOW_NORMAL},
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"tabmsg", "31;40", 0x90ffff00, 0x00000000, SHADOW_NORMAL},
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"cmdmark", "1;36;40", 0xc000ffff, 0x00000000, SHADOW_NORMAL},
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"cmdline", "37;40", 0xc0ffffff, 0x00000000, SHADOW_NORMAL},
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"pwdborder", "30;47", 0x80ffffff, 0x20ffffff, SHADOW_NORMAL},
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"pwdheader", "31;47", 0x80ff8080, 0x20ffffff, SHADOW_NORMAL},
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"pwdentry", "30;47", 0x80ffffff, 0x20ffffff, SHADOW_NORMAL},
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"timeout_msg", "37;40", 0x80ffffff, 0x00000000, SHADOW_NORMAL},
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"timeout", "1;37;40", 0xc0ffffff, 0x00000000, SHADOW_NORMAL},
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"help", "37;40", 0xc0ffffff, 0x00000000, SHADOW_NORMAL},
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"disabled", "1;30;44", 0x60cccccc, 0x00000000, SHADOW_NORMAL},
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define NCOLORS (sizeof default_colors/sizeof default_colors[0])
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst int message_base_color = NCOLORS;
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst int menu_color_table_size = NCOLORS + 256;
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Algorithmically generate the msgXX colors */
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid set_msg_colors_global(struct color_table *tbl,
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			   unsigned int fg, unsigned int bg,
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			   enum color_table_shadow shadow)
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct color_table *cp = tbl + message_base_color;
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    unsigned int i;
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    unsigned int fga, bga;
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    unsigned int fgh, bgh;
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    unsigned int fg_idx, bg_idx;
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    unsigned int fg_rgb, bg_rgb;
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    static const unsigned int pc2rgb[8] =
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	{ 0x000000, 0x0000ff, 0x00ff00, 0x00ffff, 0xff0000, 0xff00ff, 0xffff00,
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	0xffffff
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    };
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    /* Converting PC RGBI to sensible RGBA values is an "interesting"
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       proposition.  This algorithm may need plenty of tweaking. */
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    fga = fg & 0xff000000;
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    fgh = ((fg >> 1) & 0xff000000) | 0x80000000;
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    bga = bg & 0xff000000;
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    bgh = ((bg >> 1) & 0xff000000) | 0x80000000;
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    for (i = 0; i < 256; i++) {
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	fg_idx = i & 15;
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	bg_idx = i >> 4;
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	fg_rgb = pc2rgb[fg_idx & 7] & fg;
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	bg_rgb = pc2rgb[bg_idx & 7] & bg;
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (fg_idx & 8) {
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    /* High intensity foreground */
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    fg_rgb |= fgh;
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	} else {
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    fg_rgb |= fga;
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (bg_idx == 0) {
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    /* Default black background, assume transparent */
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    bg_rgb = 0;
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	} else if (bg_idx & 8) {
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    bg_rgb |= bgh;
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	} else {
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    bg_rgb |= bga;
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cp->argb_fg = fg_rgb;
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cp->argb_bg = bg_rgb;
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cp->shadow = shadow;
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cp++;
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct color_table *default_color_table(void)
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    unsigned int i;
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    const struct color_table *dp;
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct color_table *cp;
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct color_table *color_table;
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    static const int pc2ansi[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    static char msg_names[6 * 256];
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    char *mp;
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    color_table = calloc(NCOLORS + 256, sizeof(struct color_table));
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    dp = default_colors;
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    cp = color_table;
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    for (i = 0; i < NCOLORS; i++) {
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	*cp = *dp;
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cp->ansi = refstrdup(dp->ansi);
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cp++;
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	dp++;
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    mp = msg_names;
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    for (i = 0; i < 256; i++) {
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cp->name = mp;
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	mp += sprintf(mp, "msg%02x", i) + 1;
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	rsprintf(&cp->ansi, "%s3%d;4%d", (i & 8) ? "1;" : "",
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		 pc2ansi[i & 7], pc2ansi[(i >> 4) & 7]);
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cp++;
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /*** XXX: This needs to move to run_menu() ***/
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    console_color_table = color_table;
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    console_color_table_size = NCOLORS + 256;
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    set_msg_colors_global(color_table, MSG_COLORS_DEF_FG,
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			  MSG_COLORS_DEF_BG, MSG_COLORS_DEF_SHADOW);
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return color_table;
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct color_table *copy_color_table(const struct color_table *master)
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    const struct color_table *dp;
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct color_table *color_table, *cp;
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    unsigned int i;
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    color_table = calloc(NCOLORS + 256, sizeof(struct color_table));
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    dp = master;
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    cp = color_table;
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    for (i = 0; i < NCOLORS + 256; i++) {
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	*cp = *dp;
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cp->ansi = refstr_get(dp->ansi);
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	cp++;
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	dp++;
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return color_table;
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
185