aboutsummaryrefslogtreecommitdiff
path: root/lib/theme.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/theme.c')
-rw-r--r--lib/theme.c266
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);
}