From f93e6dec47bd12fb89e99efd286825b219102ac6 Mon Sep 17 00:00:00 2001 From: marschap Date: Tue, 9 Oct 2007 07:28:21 +0000 Subject: [PATCH] curses driver: new option DrawBorder (Bruno Schwander) --- ChangeLog | 1 + LCDd.conf | 2 + docs/lcdproc-user/drivers/curses.docbook | 15 +++ server/drivers/curses_drv.c | 119 ++++++++++++----------- server/drivers/curses_drv.h | 16 +-- 5 files changed, 89 insertions(+), 64 deletions(-) diff --git a/ChangeLog b/ChangeLog index 939fd71..4fd81f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -31,6 +31,7 @@ v.0.5dev (ongoing development) * a bit more Doxygen-ation and documentation * hd44780 driver: make ConnectionType 4bit more fool-proof (M. Dolze) * picolcd driver: overhaul USB init for more portability (M. Dolze) + + curses driver: new option DrawBorder (Bruno Schwander) v.0.5.2 * fix switching on/off the Load screen in lcdproc client using the menu diff --git a/LCDd.conf b/LCDd.conf index fe57113..b59de64 100644 --- a/LCDd.conf +++ b/LCDd.conf @@ -252,6 +252,8 @@ TopLeftY=7 # use ASC symbols for icons & bars [default: no; legal, yes, no] UseACS=no +# draw Border [default: yes; legal: yes, no] +DrawBorder=yes ## Cwlinux driver ## diff --git a/docs/lcdproc-user/drivers/curses.docbook b/docs/lcdproc-user/drivers/curses.docbook index 75fd690..3f4f7d3 100644 --- a/docs/lcdproc-user/drivers/curses.docbook +++ b/docs/lcdproc-user/drivers/curses.docbook @@ -117,6 +117,21 @@ curses chipset. instead of simple ASCII characters. + + + + DrawBorder= + + + yes + no + + + + + Tell whether to draw a border around the screen. + + diff --git a/server/drivers/curses_drv.c b/server/drivers/curses_drv.c index d4061ba..c5a778d 100644 --- a/server/drivers/curses_drv.c +++ b/server/drivers/curses_drv.c @@ -22,21 +22,21 @@ /* Different implementations of (n)curses available on: -OpenBSD: + - OpenBSD: http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libcurses/ ncurses -NetBSD: + - NetBSD: http://cvsweb.netbsd.org/bsdweb.cgi/basesrc/lib/libcurses/ curses : does not define ACS_S3, ACS_S7, wcolor_set() or redrawwin(). it is possible to make a: #define ACS_S3 (_acs_char['p']) #define ACS_S7 (_acs_char['r']) -FreeBSD: + - FreeBSD: http://www.freebsd.org/cgi/cvsweb.cgi/src/ ncurses -RedHat, Debian, (most distros) Linux: + - RedHat, Debian, (most distros) Linux: ncurses -SunOS (5.5.1): + - SunOS (5.5.1): curses : does not define ACS_S3, ACS_S7 or wcolor_set(). it is possible to make a: #define ACS_S3 (acs_map['p']) @@ -97,18 +97,10 @@ SunOS (5.5.1): # endif #endif -// Character used for title bars... -#define PAD '#' -// #define PAD ACS_BLOCK - /* A few different nice pairs of colors to use... */ #define DEFAULT_FOREGROUND_COLOR COLOR_CYAN #define DEFAULT_BACKGROUND_COLOR COLOR_BLUE -/* What position (X,Y) to start the left top corner at... */ -#define TOP_LEFT_X 7 -#define TOP_LEFT_Y 7 - typedef struct driver_private_data { WINDOW *win; @@ -126,6 +118,8 @@ typedef struct driver_private_data { int yoffs; int useACS; + + int drawBorder; } PrivateData; @@ -135,54 +129,37 @@ MODULE_EXPORT int stay_in_foreground = 1; MODULE_EXPORT int supports_multiple = 0; MODULE_EXPORT char *symbol_prefix = "curses_"; - -void curses_restore_screen (Driver *drvthis); +// local helper functions +static chtype get_color_by_name (char *colorname, chtype default_color); +static void curses_restore_screen (Driver *drvthis); ////////////////////////////////////////////////////////////////////////// ////////////////////// For Curses Terminal Output //////////////////////// ////////////////////////////////////////////////////////////////////////// -chtype get_color (char *colorstr) { - if (strcasecmp(colorstr, "red") == 0) +static chtype +get_color_by_name (char *colorname, chtype default_color) { + if (strcasecmp(colorname, "red") == 0) return COLOR_RED; - else if (strcasecmp(colorstr, "black") == 0) + else if (strcasecmp(colorname, "black") == 0) return COLOR_BLACK; - else if (strcasecmp(colorstr, "green") == 0) + else if (strcasecmp(colorname, "green") == 0) return COLOR_GREEN; - else if (strcasecmp(colorstr, "yellow") == 0) + else if (strcasecmp(colorname, "yellow") == 0) return COLOR_YELLOW; - else if (strcasecmp(colorstr, "blue") == 0) + else if (strcasecmp(colorname, "blue") == 0) return COLOR_BLUE; - else if (strcasecmp(colorstr, "magenta") == 0) + else if (strcasecmp(colorname, "magenta") == 0) return COLOR_MAGENTA; - else if (strcasecmp(colorstr, "cyan") == 0) + else if (strcasecmp(colorname, "cyan") == 0) return COLOR_CYAN; - else if (strcasecmp(colorstr, "white") == 0) + else if (strcasecmp(colorname, "white") == 0) return COLOR_WHITE; - else - return -1; + + return default_color; } -chtype -set_foreground_color (char * buf) { - chtype color; - - if ((color = get_color(buf)) < 0) - color = DEFAULT_FOREGROUND_COLOR; - - return color; -} - -chtype -set_background_color (char * buf) { - chtype color; - - if ((color = get_color(buf)) < 0) - color = DEFAULT_BACKGROUND_COLOR; - - return color; -} MODULE_EXPORT int curses_init (Driver *drvthis) @@ -214,7 +191,7 @@ curses_init (Driver *drvthis) p->yoffs = CONF_DEF_TOP_LEFT_Y; p->cellwidth = LCD_DEFAULT_CELLWIDTH; p->cellheight = LCD_DEFAULT_CELLHEIGHT; - + p->drawBorder = CONF_DEF_DRAWBORDER; /* Get settings from config file */ @@ -223,25 +200,29 @@ curses_init (Driver *drvthis) /* foreground color */ strncpy(buf, drvthis->config_get_string(drvthis->name, "Foreground", 0, CONF_DEF_FOREGR), sizeof(buf)); buf[sizeof(buf)-1] = '\0'; - fore_color = set_foreground_color(buf); + fore_color = get_color_by_name(buf, DEFAULT_FOREGROUND_COLOR); debug(RPT_DEBUG, "%s: using foreground color %s", drvthis->name, buf); /* background color */ strncpy(buf, drvthis->config_get_string(drvthis->name, "Background", 0, CONF_DEF_BACKGR), sizeof(buf)); buf[sizeof(buf)-1] = '\0'; - back_color = set_background_color(buf); + back_color = get_color_by_name(buf, DEFAULT_BACKGROUND_COLOR); debug(RPT_DEBUG, "%s: using background color %s", drvthis->name, buf); /* backlight color */ strncpy(buf, drvthis->config_get_string(drvthis->name, "Backlight", 0, CONF_DEF_BACKLIGHT), sizeof(buf)); buf[sizeof(buf)-1] = '\0'; - backlight_color = set_background_color(buf); + backlight_color = get_color_by_name(buf, DEFAULT_BACKGROUND_COLOR); debug(RPT_DEBUG, "%s: using backlight color %s", drvthis->name, buf); /* use ACS characters? */ - p->useACS = drvthis->config_get_bool(drvthis->name, "UseACS", 0, 0); + p->useACS = drvthis->config_get_bool(drvthis->name, "UseACS", 0, CONF_DEF_USEACS); debug(RPT_DEBUG, "%s: using ACS %s", drvthis->name, (p->useACS) ? "ON" : "OFF"); + /* draw border ? */ + p->drawBorder = drvthis->config_get_bool(drvthis->name, "DrawBorder", 0, CONF_DEF_DRAWBORDER); + debug(RPT_DEBUG, "%s: drawing Border %s", drvthis->name, (p->drawBorder) ? "ON" : "OFF"); + /* Get size settings */ if ((drvthis->request_display_width() > 0) && (drvthis->request_display_height() > 0)) { @@ -291,10 +272,18 @@ curses_init (Driver *drvthis) intrflush(stdscr, FALSE); keypad(stdscr, TRUE); - p->win = newwin(p->height + 2, /* +2 for the border */ - p->width + 2, /* +2 for the border */ - p->yoffs, - p->xoffs); + if (p->drawBorder) { + p->win = newwin(p->height + 2, /* +2 for the border */ + p->width + 2, /* +2 for the border */ + p->yoffs, + p->xoffs); + } + else{ + p->win = newwin(p->height, + p->width, + p->yoffs, + p->xoffs); + } //nodelay(p->win, TRUE); //intrflush(p->win, FALSE); @@ -396,7 +385,10 @@ curses_clear (Driver *drvthis) PrivateData *p = drvthis->private_data; wbkgdset(p->win, COLOR_PAIR(p->current_color_pair) | ' '); - curses_wborder(drvthis); + + if (p->drawBorder) + curses_wborder(drvthis); + werase(p->win); } @@ -437,6 +429,11 @@ curses_string (Driver *drvthis, int x, int y, const char string[]) if ((x <= 0) || (y <= 0) || (x > p->width) || (y > p->height)) return; + if (!p->drawBorder) { + x--; + y--; + } + mvwaddstr(p->win, y, x, string); } @@ -452,6 +449,11 @@ curses_chr (Driver *drvthis, int x, int y, char c) if ((x <= 0) || (y <= 0) || (x > p->width) || (y > p->height)) return; + if (!p->drawBorder) { + x--; + y--; + } + mvwaddch(p->win, y, x, c); } @@ -601,7 +603,9 @@ curses_flush (Driver *drvthis) ungetch(c); } - curses_wborder(drvthis); + if (p->drawBorder) + curses_wborder(drvthis); + wrefresh(p->win); } @@ -642,7 +646,7 @@ curses_get_key (Driver *drvthis) } } -void +static void curses_restore_screen (Driver *drvthis) { PrivateData *p = drvthis->private_data; @@ -655,3 +659,4 @@ curses_restore_screen (Driver *drvthis) wrefresh(p->win); } +/* EOF */ diff --git a/server/drivers/curses_drv.h b/server/drivers/curses_drv.h index 78a8cb3..8528fb2 100644 --- a/server/drivers/curses_drv.h +++ b/server/drivers/curses_drv.h @@ -22,12 +22,14 @@ MODULE_EXPORT void curses_backlight (Driver *drvthis, int on); MODULE_EXPORT const char *curses_get_key (Driver *drvthis); -/*Default settings for config file parsing*/ -#define CONF_DEF_FOREGR "blue" -#define CONF_DEF_BACKGR "cyan" -#define CONF_DEF_BACKLIGHT "red" -#define CONF_DEF_SIZE "20x4" -#define CONF_DEF_TOP_LEFT_X 7 -#define CONF_DEF_TOP_LEFT_Y 7 +/* Default settings for config file parsing */ +#define CONF_DEF_FOREGR "blue" +#define CONF_DEF_BACKGR "cyan" +#define CONF_DEF_BACKLIGHT "red" +#define CONF_DEF_SIZE "20x4" +#define CONF_DEF_TOP_LEFT_X 7 +#define CONF_DEF_TOP_LEFT_Y 7 +#define CONF_DEF_USEACS 0 +#define CONF_DEF_DRAWBORDER 1 #endif