From bc3fd8dcba11b49ec100e8bd8b181c73382a2fc5 Mon Sep 17 00:00:00 2001 From: reinelt <> Date: Fri, 23 Jan 2004 04:54:04 +0000 Subject: [lcd4linux @ 2004-01-23 04:53:23 by reinelt] icon widget added (not finished yet!) --- widget_icon.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 widget_icon.c (limited to 'widget_icon.c') diff --git a/widget_icon.c b/widget_icon.c new file mode 100644 index 0000000..e30fbfe --- /dev/null +++ b/widget_icon.c @@ -0,0 +1,183 @@ +/* $Id: widget_icon.c,v 1.1 2004/01/23 04:54:03 reinelt Exp $ + * + * icon widget handling + * + * Copyright 2003,2004 Michael Reinelt + * Copyright 2004 The LCD4Linux Team + * + * 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: widget_icon.c,v $ + * Revision 1.1 2004/01/23 04:54:03 reinelt + * icon widget added (not finished yet!) + * + */ + +/* + * exported functions: + * + * WIDGET_CLASS Widget_Icon + * the icon widget + * + */ + + +#include +#include +#include +#include + +#include "debug.h" +#include "cfg.h" +#include "evaluator.h" +#include "timer.h" +#include "widget.h" +#include "widget_icon.h" + +// icons always are 8 pixels high +#define YRES 8 + +static void widget_icon_read_bitmap (char *section, WIDGET_ICON *Icon) +{ + int row, n; + char key[15]; + char *val, *v; + char *map; + + for (row=0; rowbitmap+row; + n=0; + for (v=val; *v!='\0'; v++) { + if (n>=Icon->maxmap) { + Icon->maxmap++; + Icon->bitmap=realloc(Icon->bitmap, Icon->maxmap*YRES*sizeof(char)); + memset (Icon->bitmap+n*YRES, 0, YRES*sizeof(char)); + map=Icon->bitmap+n*YRES+row; + } + switch (*v) { + case '|': + n++; + map+=YRES; + break; + case '*': + (*map)<<=1; + (*map)|=1; + break; + default: + (*map)<<=1; + } + } + } +} + + +void widget_icon_update (void *Self) +{ + WIDGET *W = (WIDGET*)Self; + WIDGET_ICON *Icon = W->data; + RESULT result = {0, 0.0, NULL}; + + // evaluate expressions + Icon->speed = 100; + if (Icon->speed_expr!=NULL && *Icon->speed_expr!='\0') { + Eval(Icon->speed_expr, &result); + Icon->speed = R2N(&result); + if (Icon->speed<10) Icon->speed=10; + DelResult(&result); + } + + // rotate icon bitmap + Icon->curmap++; + if (Icon->curmap >= Icon->maxmap) + Icon->curmap=0; + + // finally, draw it! + if (W->class->draw) + W->class->draw(W); + + // store currently visible bitmap + Icon->prvmap=Icon->curmap; + + // add a new one-shot timer + timer_add (widget_icon_update, Self, Icon->speed, 1); + +} + + + +int widget_icon_init (WIDGET *Self) +{ + char *section; + WIDGET_ICON *Icon; + + // prepare config section + // strlen("Widget:")=7 + section=malloc(strlen(Self->name)+8); + strcpy(section, "Widget:"); + strcat(section, Self->name); + + Icon=malloc(sizeof(WIDGET_ICON)); + memset (Icon, 0, sizeof(WIDGET_ICON)); + + // get raw expressions (we evaluate them ourselves) + Icon->speed_expr = cfg_get_raw (section, "speed", NULL); + + // sanity check + if (Icon->speed_expr==NULL || *Icon->speed_expr=='\0') { + error ("Icon %s has no speed, using '100'", Self->name); + Icon->speed_expr="100"; + } + + // read bitmap + widget_icon_read_bitmap (section, Icon); + + free (section); + Self->data=Icon; + + // as the speed is evaluatod on every call, we use 'one-shot'-timers. + // The timer will be reactivated on every call to widget_icon_update(). + // We do the initial call here... + Icon->prvmap=-1; + widget_icon_update(Self); + + return 0; +} + + +int widget_icon_quit (WIDGET *Self) +{ + WIDGET_ICON *Icon = Self->data; + + if (Self->data) { + if (Icon->bitmap) free (Icon->bitmap); + free (Self->data); + Self->data=NULL; + } + + return 0; + +} + + + +WIDGET_CLASS Widget_Icon = { + name: "icon", + init: widget_icon_init, + draw: NULL, + quit: widget_icon_quit, +}; -- cgit v1.2.3