/* * widget.c * This file is part of LCDd, the lcdproc server. * * This file is released under the GNU General Public License. Refer to the * COPYING file distributed with this package. * * Copyright (c) 1999, William Ferrell, Scott Scriven * 2002, Joris Robijn * * * Does all actions on widgets * */ #include #include #include #include "shared/sockets.h" #include "shared/report.h" #include "screen.h" #include "widget.h" #include "render.h" #include "drivers/lcd.h" char *typenames[] = { "none", "string", "hbar", "vbar", "icon", "title", "scroller", "frame", "num", NULL, }; struct icontable { int icon; char *iconname; } icontable[] = { {ICON_BLOCK_FILLED, "BLOCK_FILLED"}, {ICON_HEART_OPEN, "HEART_OPEN"}, {ICON_HEART_FILLED, "HEART_FILLED"}, {ICON_ARROW_UP, "ARROW_UP"}, {ICON_ARROW_DOWN, "ARROW_DOWN"}, {ICON_ARROW_LEFT, "ARROW_LEFT"}, {ICON_ARROW_RIGHT, "ARROW_RIGHT"}, {ICON_CHECKBOX_OFF, "CHECKBOX_OFF"}, {ICON_CHECKBOX_ON, "CHECKBOX_ON"}, {ICON_CHECKBOX_GRAY, "CHECKBOX_GRAY"}, {ICON_SELECTOR_AT_LEFT, "SELECTOR_AT_LEFT"}, {ICON_SELECTOR_AT_RIGHT, "SELECTOR_AT_RIGHT"}, {ICON_ELLIPSIS, "ELLIPSIS"}, {ICON_PAUSE, "PAUSE"}, {ICON_PLAY, "PLAY"}, {ICON_PLAYR, "PLAYR"}, {ICON_FF, "FF"}, {ICON_FR, "FR"}, {ICON_NEXT, "NEXT"}, {ICON_PREV, "PREV"}, {ICON_REC, "REC"}, {0,NULL} }; Widget * widget_create (char *id, WidgetType type, Screen * screen) { Widget * w; debug (RPT_DEBUG, "%s( id=\"%s\", type=%d, screen=[%s] )", __FUNCTION__, id, type, screen->id ); /* Create it */ w = malloc (sizeof (Widget)); if (!w) { report (RPT_DEBUG, "%s: Error allocating", __FUNCTION__); return NULL; } w->id = strdup(id); if (!w->id) { report (RPT_DEBUG, "%s: Error allocating", __FUNCTION__); return NULL; } w->type = type; w->screen = screen; w->x = 1; w->y = 1; w->width = 0; w->height = 0; w->left = 1; w->top = 1; w->right = 0; w->bottom = 0; w->length = 1; w->speed = 1; w->text = NULL; //w->kids = NULL; if (w->type == WID_FRAME) { /* create a screen for the frame widget */ char * frame_name; frame_name = malloc (strlen("frame_") + strlen(id) + 1); strcpy (frame_name, "frame_"); strcat (frame_name, id); w->frame_screen = screen_create (frame_name, screen->client); free (frame_name); /* not needed anymore */ } return w; } int widget_destroy (Widget * w) { debug (RPT_DEBUG, "%s( w=[%s] )", __FUNCTION__, w->id); if (!w) return -1; if (w->id) free (w->id); if (w->text) free (w->text); /* Free subscreen of frame widget too */ if (w->type == WID_FRAME) { screen_destroy (w->frame_screen); } free (w); return 0; } WidgetType widget_typename_to_type (char * typename) { WidgetType wid_type = WID_NONE; int i; for (i = 0; typenames[i]; i++) { if (strcmp (typenames[i], typename) == 0) { wid_type = i; break; /* it's valid: skip out...*/ } } return wid_type; } char * widget_type_to_typename (WidgetType t) { return typenames[t]; } Widget * widget_search_subs (Widget * w, char * id) { if (w->type == WID_FRAME) { return screen_find_widget (w->frame_screen, id); } else { return NULL; /* no kids */ } } char *widget_icon_to_iconname (int icon) { int i; for (i=0; icontable[i].iconname; i++) { if (icontable[i].icon == icon) { return icontable[i].iconname; } } return NULL; } int widget_iconname_to_icon (char *iconname) { int i; for (i=0; icontable[i].iconname; i++) { if (strcasecmp( icontable[i].iconname, iconname) == 0) { return icontable[i].icon; } } return -1; }