diff options
Diffstat (limited to 'lib/theme.c')
-rw-r--r-- | lib/theme.c | 266 |
1 files changed, 155 insertions, 111 deletions
diff --git a/lib/theme.c b/lib/theme.c index f204729ab4c1..3bcd8ee8fc53 100644 --- a/lib/theme.c +++ b/lib/theme.c @@ -26,9 +26,9 @@ */ #ifdef PORTNCURSES -#include <ncurses/curses.h> +#include <ncurses/ncurses.h> #else -#include <curses.h> +#include <ncurses.h> #endif #include "bsddialog.h" @@ -42,27 +42,31 @@ struct bsddialog_theme t; static struct bsddialog_theme bsddialogtheme = { #define bgwidget COLOR_WHITE #define bgcurr COLOR_YELLOW - .shadow.color = GET_COLOR(COLOR_BLACK, COLOR_BLACK), - .shadow.h = 1, - .shadow.w = 2, - - .terminal.color = GET_COLOR(COLOR_BLACK, COLOR_CYAN), - .widget.delimtitle = true, - .widget.titlecolor = GET_COLOR(COLOR_YELLOW, bgwidget), - .widget.lineraisecolor = GET_COLOR(COLOR_BLACK, bgwidget), - .widget.linelowercolor = GET_COLOR(COLOR_BLACK, bgwidget), - .widget.color = GET_COLOR(COLOR_BLACK, bgwidget), - .widget.bottomtitlecolor = GET_COLOR(COLOR_BLACK, bgwidget), + .terminal.color = GET_COLOR(COLOR_BLACK, COLOR_CYAN), + + .shadow.color = GET_COLOR(COLOR_BLACK, COLOR_BLACK), + .shadow.h = 1, + .shadow.w = 2, + + .dialog.delimtitle = true, + .dialog.titlecolor = GET_COLOR(COLOR_YELLOW, bgwidget), + .dialog.lineraisecolor = GET_COLOR(COLOR_BLACK, bgwidget), + .dialog.linelowercolor = GET_COLOR(COLOR_BLACK, bgwidget), + .dialog.color = GET_COLOR(COLOR_BLACK, bgwidget), + .dialog.bottomtitlecolor = GET_COLOR(COLOR_BLACK, bgwidget), .text.hmargin = 1, - .menu.arrowcolor = GET_COLOR(COLOR_YELLOW, bgwidget), - .menu.f_desccolor = GET_COLOR(COLOR_WHITE, bgcurr), - .menu.desccolor = GET_COLOR(COLOR_BLACK, bgwidget), - .menu.f_namecolor = GET_COLOR(COLOR_BLACK, bgcurr), - .menu.namecolor = GET_COLOR(COLOR_YELLOW, bgwidget), - .menu.namesepcolor = GET_COLOR(COLOR_YELLOW, bgwidget), - .menu.descsepcolor = GET_COLOR(COLOR_YELLOW, bgwidget), + .menu.arrowcolor = GET_COLOR(COLOR_YELLOW, bgwidget), + .menu.selectorcolor = GET_COLOR(COLOR_BLACK, bgwidget) | A_BOLD, + .menu.f_desccolor = GET_COLOR(COLOR_WHITE, bgcurr), + .menu.desccolor = GET_COLOR(COLOR_BLACK, bgwidget), + .menu.f_namecolor = GET_COLOR(COLOR_BLACK, bgcurr), + .menu.namecolor = GET_COLOR(COLOR_YELLOW, bgwidget), + .menu.namesepcolor = GET_COLOR(COLOR_YELLOW, bgwidget), + .menu.descsepcolor = GET_COLOR(COLOR_YELLOW, bgwidget), + .menu.f_shortcutcolor = GET_COLOR(COLOR_RED, bgcurr), + .menu.shortcutcolor = GET_COLOR(COLOR_RED, bgwidget), .form.f_fieldcolor = GET_COLOR(COLOR_WHITE, COLOR_BLUE), .form.fieldcolor = GET_COLOR(COLOR_WHITE, COLOR_CYAN), @@ -85,27 +89,31 @@ static struct bsddialog_theme bsddialogtheme = { static struct bsddialog_theme blackwhite = { #define bk COLOR_BLACK #define fg COLOR_WHITE - .shadow.color = GET_COLOR(COLOR_BLACK, COLOR_BLACK), - .shadow.h = 1, - .shadow.w = 2, - - .terminal.color = GET_COLOR(fg, bk), - .widget.delimtitle = true, - .widget.titlecolor = GET_COLOR(fg, bk), - .widget.lineraisecolor = GET_COLOR(fg, bk), - .widget.linelowercolor = GET_COLOR(fg, bk), - .widget.color = GET_COLOR(fg, bk), - .widget.bottomtitlecolor = GET_COLOR(fg, bk), + .terminal.color = GET_COLOR(fg, bk), + + .shadow.color = GET_COLOR(COLOR_BLACK, COLOR_BLACK), + .shadow.h = 1, + .shadow.w = 2, + + .dialog.delimtitle = true, + .dialog.titlecolor = GET_COLOR(fg, bk), + .dialog.lineraisecolor = GET_COLOR(fg, bk), + .dialog.linelowercolor = GET_COLOR(fg, bk), + .dialog.color = GET_COLOR(fg, bk), + .dialog.bottomtitlecolor = GET_COLOR(fg, bk), .text.hmargin = 1, - .menu.arrowcolor = GET_COLOR(fg, bk), - .menu.f_desccolor = GET_COLOR(fg, bk) | A_REVERSE, - .menu.desccolor = GET_COLOR(fg, bk), - .menu.f_namecolor = GET_COLOR(fg, bk) | A_REVERSE, - .menu.namecolor = GET_COLOR(fg, bk), - .menu.namesepcolor = GET_COLOR(fg, bk), - .menu.descsepcolor = GET_COLOR(fg, bk), + .menu.arrowcolor = GET_COLOR(fg, bk), + .menu.selectorcolor = GET_COLOR(fg, bk), + .menu.f_desccolor = GET_COLOR(fg, bk) | A_REVERSE, + .menu.desccolor = GET_COLOR(fg, bk), + .menu.f_namecolor = GET_COLOR(fg, bk) | A_REVERSE, + .menu.namecolor = GET_COLOR(fg, bk), + .menu.namesepcolor = GET_COLOR(fg, bk), + .menu.descsepcolor = GET_COLOR(fg, bk), + .menu.f_shortcutcolor = GET_COLOR(fg, bk) | A_UNDERLINE | A_REVERSE, + .menu.shortcutcolor = GET_COLOR(fg, bk) | A_UNDERLINE, .form.f_fieldcolor = GET_COLOR(fg, bk) | A_REVERSE, .form.fieldcolor = GET_COLOR(fg, bk), @@ -126,27 +134,31 @@ static struct bsddialog_theme blackwhite = { }; static struct bsddialog_theme dialogtheme = { - .shadow.color = GET_COLOR(COLOR_BLACK, COLOR_BLACK), - .shadow.h = 1, - .shadow.w = 2, - - .terminal.color = GET_COLOR(COLOR_CYAN, COLOR_BLUE) | A_BOLD, - .widget.delimtitle = false, - .widget.titlecolor = GET_COLOR(COLOR_BLUE, COLOR_WHITE) | A_BOLD, - .widget.lineraisecolor = GET_COLOR(COLOR_WHITE, COLOR_WHITE) | A_BOLD, - .widget.linelowercolor = GET_COLOR(COLOR_BLACK, COLOR_WHITE) | A_BOLD, - .widget.color = GET_COLOR(COLOR_BLACK, COLOR_WHITE), - .widget.bottomtitlecolor = GET_COLOR(COLOR_BLACK, COLOR_WHITE) | A_BOLD, + .terminal.color = GET_COLOR(COLOR_CYAN, COLOR_BLUE) | A_BOLD, + + .shadow.color = GET_COLOR(COLOR_BLACK, COLOR_BLACK), + .shadow.h = 1, + .shadow.w = 2, + + .dialog.delimtitle = false, + .dialog.titlecolor = GET_COLOR(COLOR_BLUE, COLOR_WHITE) | A_BOLD, + .dialog.lineraisecolor = GET_COLOR(COLOR_WHITE, COLOR_WHITE) | A_BOLD, + .dialog.linelowercolor = GET_COLOR(COLOR_BLACK, COLOR_WHITE) | A_BOLD, + .dialog.color = GET_COLOR(COLOR_BLACK, COLOR_WHITE), + .dialog.bottomtitlecolor = GET_COLOR(COLOR_BLACK, COLOR_WHITE) | A_BOLD, .text.hmargin = 1, - .menu.arrowcolor = GET_COLOR(COLOR_GREEN, COLOR_WHITE), - .menu.f_desccolor = GET_COLOR(COLOR_WHITE, COLOR_BLUE) | A_BOLD, - .menu.desccolor = GET_COLOR(COLOR_BLACK, COLOR_WHITE) | A_BOLD, - .menu.f_namecolor = GET_COLOR(COLOR_YELLOW,COLOR_BLUE) | A_BOLD, - .menu.namecolor = GET_COLOR(COLOR_BLUE, COLOR_WHITE) | A_BOLD, - .menu.namesepcolor = GET_COLOR(COLOR_RED, COLOR_WHITE), - .menu.descsepcolor = GET_COLOR(COLOR_RED, COLOR_WHITE), + .menu.arrowcolor = GET_COLOR(COLOR_GREEN, COLOR_WHITE), + .menu.selectorcolor = GET_COLOR(COLOR_BLACK, bgwidget) | A_BOLD, + .menu.f_desccolor = GET_COLOR(COLOR_WHITE, COLOR_BLUE) | A_BOLD, + .menu.desccolor = GET_COLOR(COLOR_BLACK, COLOR_WHITE) | A_BOLD, + .menu.f_namecolor = GET_COLOR(COLOR_YELLOW, COLOR_BLUE) | A_BOLD, + .menu.namecolor = GET_COLOR(COLOR_BLUE, COLOR_WHITE) | A_BOLD, + .menu.namesepcolor = GET_COLOR(COLOR_RED, COLOR_WHITE), + .menu.descsepcolor = GET_COLOR(COLOR_RED, COLOR_WHITE), + .menu.f_shortcutcolor = GET_COLOR(COLOR_RED, COLOR_BLUE) | A_BOLD, + .menu.shortcutcolor = GET_COLOR(COLOR_RED, COLOR_WHITE) | A_BOLD, .form.f_fieldcolor = GET_COLOR(COLOR_WHITE, COLOR_BLUE) | A_BOLD, .form.fieldcolor = GET_COLOR(COLOR_WHITE, COLOR_CYAN) | A_BOLD, @@ -166,79 +178,111 @@ static struct bsddialog_theme dialogtheme = { .button.shortcutcolor = GET_COLOR(COLOR_RED, COLOR_WHITE) | A_BOLD }; -void bsddialog_set_theme(struct bsddialog_theme newtheme) +static void +set_theme(struct bsddialog_theme *dst, struct bsddialog_theme *src) { - t.shadow.color = newtheme.shadow.color; - t.shadow.h = newtheme.shadow.h; - t.shadow.w = newtheme.shadow.w; - - t.terminal.color = newtheme.terminal.color; - t.widget.delimtitle = newtheme.widget.delimtitle; - t.widget.titlecolor = newtheme.widget.titlecolor; - t.widget.lineraisecolor = newtheme.widget.lineraisecolor; - t.widget.linelowercolor = newtheme.widget.linelowercolor; - t.widget.color = newtheme.widget.color; - t.widget.bottomtitlecolor = newtheme.widget.bottomtitlecolor; - - t.text.hmargin = newtheme.text.hmargin; - - t.menu.arrowcolor = newtheme.menu.arrowcolor; - t.menu.f_desccolor = newtheme.menu.f_desccolor; - t.menu.desccolor = newtheme.menu.desccolor; - t.menu.f_namecolor = newtheme.menu.f_namecolor; - t.menu.namecolor = newtheme.menu.namecolor; - t.menu.namesepcolor = newtheme.menu.namesepcolor; - t.menu.descsepcolor = newtheme.menu.descsepcolor; - - t.form.f_fieldcolor = newtheme.form.f_fieldcolor; - t.form.fieldcolor = newtheme.form.fieldcolor; - t.form.readonlycolor = newtheme.form.readonlycolor; - - t.bar.f_color = newtheme.bar.f_color; - t.bar.color = newtheme.bar.color; - - t.button.space = newtheme.button.space; - t.button.leftch = newtheme.button.leftch; - t.button.rightch = newtheme.button.rightch; - t.button.f_delimcolor = newtheme.button.f_delimcolor; - t.button.delimcolor = newtheme.button.delimcolor; - t.button.f_color = newtheme.button.f_color; - t.button.color = newtheme.button.color; - t.button.f_shortcutcolor = newtheme.button.f_shortcutcolor; - t.button.shortcutcolor = newtheme.button.shortcutcolor; - - bkgd(t.terminal.color); - + dst->shadow.color = src->shadow.color; + dst->shadow.h = src->shadow.h; + dst->shadow.w = src->shadow.w; + + dst->terminal.color = src->terminal.color; + dst->dialog.delimtitle = src->dialog.delimtitle; + dst->dialog.titlecolor = src->dialog.titlecolor; + dst->dialog.lineraisecolor = src->dialog.lineraisecolor; + dst->dialog.linelowercolor = src->dialog.linelowercolor; + dst->dialog.color = src->dialog.color; + dst->dialog.bottomtitlecolor = src->dialog.bottomtitlecolor; + + dst->text.hmargin = src->text.hmargin; + + dst->menu.arrowcolor = src->menu.arrowcolor; + dst->menu.selectorcolor = src->menu.selectorcolor; + dst->menu.f_desccolor = src->menu.f_desccolor; + dst->menu.desccolor = src->menu.desccolor; + dst->menu.f_namecolor = src->menu.f_namecolor; + dst->menu.namecolor = src->menu.namecolor; + dst->menu.namesepcolor = src->menu.namesepcolor; + dst->menu.descsepcolor = src->menu.descsepcolor; + dst->menu.f_shortcutcolor = src->menu.f_shortcutcolor; + dst->menu.shortcutcolor = src->menu.shortcutcolor; + + dst->form.f_fieldcolor = src->form.f_fieldcolor; + dst->form.fieldcolor = src->form.fieldcolor; + dst->form.readonlycolor = src->form.readonlycolor; + + dst->bar.f_color = src->bar.f_color; + dst->bar.color = src->bar.color; + + dst->button.space = src->button.space; + dst->button.leftch = src->button.leftch; + dst->button.rightch = src->button.rightch; + dst->button.f_delimcolor = src->button.f_delimcolor; + dst->button.delimcolor = src->button.delimcolor; + dst->button.f_color = src->button.f_color; + dst->button.color = src->button.color; + dst->button.f_shortcutcolor = src->button.f_shortcutcolor; + dst->button.shortcutcolor = src->button.shortcutcolor; + + bkgd(dst->terminal.color); refresh(); } +/* API */ +int bsddialog_get_theme(struct bsddialog_theme *theme) +{ + if (theme == NULL) + RETURN_ERROR("theme is NULL"); + if (sizeof(*theme) != sizeof(struct bsddialog_theme)) + RETURN_ERROR("Bad suze struct bsddialog_theme"); + + set_theme(theme, &t); + + return (0); +} + +int bsddialog_set_theme(struct bsddialog_theme *theme) +{ + if (theme == NULL) + RETURN_ERROR("theme is NULL"); + if (sizeof(*theme) != sizeof(struct bsddialog_theme)) + RETURN_ERROR("Bad size struct bsddialog_theme"); + + set_theme(&t, theme); + + return (0); +} + int bsddialog_set_default_theme(enum bsddialog_default_theme newtheme) { - if (newtheme == BSDDIALOG_THEME_DEFAULT) - bsddialog_set_theme(dialogtheme); + if (newtheme == BSDDIALOG_THEME_DEFAULT) { + bsddialog_set_theme(&dialogtheme); + t.dialog.lineraisecolor = t.dialog.linelowercolor; + } else if (newtheme == BSDDIALOG_THEME_BSDDIALOG) - bsddialog_set_theme(bsddialogtheme); + bsddialog_set_theme(&bsddialogtheme); else if (newtheme == BSDDIALOG_THEME_BLACKWHITE) - bsddialog_set_theme(blackwhite); + bsddialog_set_theme(&blackwhite); else if (newtheme == BSDDIALOG_THEME_DIALOG) - bsddialog_set_theme(dialogtheme); + bsddialog_set_theme(&dialogtheme); else RETURN_ERROR("Unknow default theme"); - return 0; + return (0); } int bsddialog_color(enum bsddialog_color background, - enum bsddialog_color foreground) + enum bsddialog_color foreground, unsigned int flags) { + unsigned int cursesflags = 0; - return GET_COLOR(background, foreground); -} - -struct bsddialog_theme bsddialog_get_theme() -{ + if (flags & BSDDIALOG_BOLD) + cursesflags |= A_BOLD; + if (flags & BSDDIALOG_REVERSE) + cursesflags |= A_REVERSE; + if (flags & BSDDIALOG_UNDERLINE) + cursesflags |= A_UNDERLINE; - return t; + return (GET_COLOR(background, foreground) | cursesflags); } |