From edfd929b78ada012e71b2dee78b9ab96c3fdea1e Mon Sep 17 00:00:00 2001 From: ltoetsch <> Date: Fri, 9 Mar 2001 13:08:11 +0000 Subject: [lcd4linux @ 2001-03-09 13:08:11 by ltoetsch] Added Text driver --- Text.c | 209 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 Text.c (limited to 'Text.c') diff --git a/Text.c b/Text.c new file mode 100644 index 0000000..f20efba --- /dev/null +++ b/Text.c @@ -0,0 +1,209 @@ +/* $Id: Text.c,v 1.1 2001/03/09 13:08:11 ltoetsch Exp $ + * + * pure ncurses based text driver + * + * Copyright 2001 by Leopold Tötsch (lt@toetsch.at) + * + * 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, or (at your option) + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * $Log: Text.c,v $ + * Revision 1.1 2001/03/09 13:08:11 ltoetsch + * Added Text driver + * + * + */ + +/* + * + * exported fuctions: + * + * struct LCD Text[] + * + */ + +#include +#include +#include + +#ifdef STANDALONE + +int main(int argc, char *argv[]) +{ + WINDOW *w; + int x,y; + + w = initscr(); + + for (x=0; x < 255; x++) + addch(acs_map[x]); + refresh(); + sleep(5); + endwin(); + return 0; + +} + +#else + +#include +#include "debug.h" +#include "cfg.h" +#include "display.h" +extern int foreground; + +static LCD Lcd; +static WINDOW *w; +WINDOW *err_win; +#define BARS ( BAR_R | BAR_H2 ) +int err_rows; + +int Text_clear (void) +{ + werase(w); + box(w, 0, 0); + return 0; +} + +int Text_quit(void) { + endwin(); + return 0; +} + +int Text_init (LCD *Self) +{ + int cols=-1, rows=-1; + int scr_cols, scr_rows; + char *s; + if (!foreground) { + error("Text: you want me to display on /dev/null: sorry, I can't"); + return -1; + } + + if (sscanf(s=cfg_get("size")?:"20x4", "%dx%d", &cols, &rows)!=2 || rows<1 || cols<1) { + error ("Raster: bad size '%s'", s); + return -1; + } + Self->rows=rows; + Self->cols=cols; + Self->xres=1; + Self->yres=1; + Lcd=*Self; + + w = initscr(); + scr_cols=COLS; + scr_rows=LINES; + delwin(w); + w = newwin(rows+2,cols+2,0,0); + err_rows = scr_rows-rows-3; + if (err_rows >= 4) { + err_win = newwin(err_rows, scr_cols, rows+3, 0); + err_rows -= 3; + box(err_win, 0, 0); + mvwprintw(err_win,0,3, "Stderr:"); + wmove(err_win, 1 , 0); + wrefresh(err_win); + } + Text_clear(); + return w ? 0 : -1; +} + +/* ncures scroll SIGSEGVs on my system, so this is a workaroud */ + +int curs_err(char *buffer) +{ + static int lines; + static char *lb[100]; + int start, i; + + if (err_win) { + if (lines >= err_rows) { + free(lb[0]); + for (i=1; i<=err_rows; i++) + lb[i-1] = lb[i]; + start = 0; + } + else + start = lines; + lb[lines] = strdup(buffer); + for (i=start; i<=lines; i++) { + mvwprintw(err_win,i+1,1, "%s", lb[i]); + wclrtoeol(err_win); + } + box(err_win, 0, 0); + mvwprintw(err_win,0,3, "Stderr:"); + wrefresh(err_win); + if (lines < err_rows) + lines++; + return 1; + } + return 0; +} + +int Text_put (int row, int col, char *text) +{ + if (col < Lcd.cols) + mvwprintw(w, row+1 , col+1, "%.*s", Lcd.cols-col, text); + return 0; +} + +#define min(x,y) (x)<(y)?x:y +int Text_bar (int type, int row, int col, int max, int len1, int len2) +{ + int len, i; + if (cfg_get("TextBar")) + mvwprintw(w, row+1 , col+1, "%d %d %d", max, len1, len2); + else { + len = min(len1, len2); + len = min(len, Lcd.cols-col-1); + if (len) { + wmove(w, row+1 , col+1); + for (i=0; i