From 78d8886c47f2d059985f5f9bca2d49f0fb123a9e Mon Sep 17 00:00:00 2001 From: robijn Date: Mon, 20 May 2002 21:25:17 +0000 Subject: [PATCH] Icon command is now really processed and icons are rendered. Also updated icon code in curses_drv a bit. --- server/commands/widget_commands.c | 16 +++++++--- server/driver.c | 12 +++++++ server/drivers.c | 2 +- server/drivers/curses_drv.c | 33 ++++++++++++++------ server/render.c | 12 ++++--- server/widget.c | 52 +++++++++++++++++++++++++++++++ server/widget.h | 6 ++++ 7 files changed, 113 insertions(+), 20 deletions(-) diff --git a/server/commands/widget_commands.c b/server/commands/widget_commands.c index 5e9b484..62c815a 100644 --- a/server/commands/widget_commands.c +++ b/server/commands/widget_commands.c @@ -314,7 +314,7 @@ widget_set_func (Client * c, int argc, char **argv) sock_send_string(c->sock, "success\n"); } break; - case WID_ICON: /* Icon takes "x y binary_data"*/ + case WID_ICON: /* Icon takes "x y icon"*/ if (argc != i + 3) sock_send_string (c->sock, "huh? Wrong number of arguments\n"); else { @@ -322,14 +322,20 @@ widget_set_func (Client * c, int argc, char **argv) (!isdigit ((unsigned int) argv[i + 1][0]))) { sock_send_string (c->sock, "huh? Invalid coordinates\n"); } else { + int icon; x = atoi (argv[i]); y = atoi (argv[i + 1]); - w->x = x; - w->y = y; - /* TODO: Parse binary data and copy it to widget's data...*/ + icon = widget_iconname_to_icon (argv[i + 2]); + if (icon == -1) { + sock_send_string (c->sock, "huh? Invalid icon name\n"); + } else { + w->x = x; + w->y = y; + w->length = icon; + sock_send_string(c->sock, "success\n"); + } } } - sock_send_string (c->sock, "huh? Widget type not yet implemented\n"); break; case WID_TITLE: /* title takes "text"*/ if (argc != i + 1) diff --git a/server/driver.c b/server/driver.c index 08cc3fa..58d80f7 100644 --- a/server/driver.c +++ b/server/driver.c @@ -29,6 +29,7 @@ #include "shared/report.h" #include "configfile.h" +#include "widget.h" #include "driver.h" #include "drivers.h" #include "drivers/lcd.h" @@ -311,6 +312,8 @@ driver_alt_vbar( Driver * drv, int x, int y, int len, int promille, int pattern { int pos; + debug (RPT_DEBUG, "%s( drv=[%.40s], x=%d, y=%d, len=%d, promille=%d, pattern=%d", __FILE__, drv->name, x, y, len, promille, pattern); + if (!drv->chr) return; for ( pos=0; posname, x, y, len, promille, pattern); + if (!drv->chr) return; @@ -401,6 +406,8 @@ driver_alt_num( Driver * drv, int x, int num ) int y, dx; + debug (RPT_DEBUG, "%s( drv=[%.40s], x=%d, num=%d", __FILE__, drv->name, x, num); + if (!drv->chr) return; @@ -414,6 +421,7 @@ driver_alt_heartbeat( Driver * drv, int state ) { int icon; + debug (RPT_DEBUG, "%s( drv=[%.40s], state=%d", __FILE__, drv->name, state); if (state == HEARTBEAT_OFF) return; @@ -439,6 +447,8 @@ driver_alt_icon( Driver * drv, int x, int y, int icon ) char ch1 = '?'; char ch2 = 0; + debug (RPT_DEBUG, "%s( drv=[%.40s], x=%d, y=%d, icon=ICON_%s", __FILE__, drv->name, x, y, widget_icon_to_iconname (icon) ); + if (!drv->chr) return; @@ -469,6 +479,8 @@ void driver_alt_cursor( Driver * drv, int x, int y, int state ) { /* Same question about timer in this function... */ + debug (RPT_DEBUG, "%s( drv=[%.40s], x=%d, y=%d, state=%d", __FILE__, drv->name, x, y, state); + switch( state ) { case CURSOR_BLOCK: case CURSOR_DEFAULT_ON: diff --git a/server/drivers.c b/server/drivers.c index 825e84a..19e7dc9 100644 --- a/server/drivers.c +++ b/server/drivers.c @@ -294,7 +294,7 @@ drivers_icon( int x, int y, int icon ) { Driver *drv; - report( RPT_INFO, "drivers_icon( x=%d, y=%d, icon=%d )", x, y, icon ); + report( RPT_INFO, "drivers_icon( x=%d, y=%d, icon=ICON_%s )", x, y, widget_icon_to_iconname (icon) ); ForAllDrivers(drv) { if( drv->icon ) diff --git a/server/drivers/curses_drv.c b/server/drivers/curses_drv.c index 00994e9..1722d8f 100644 --- a/server/drivers/curses_drv.c +++ b/server/drivers/curses_drv.c @@ -543,17 +543,32 @@ curses_drv_hbar (Driver *drvthis, int x, int y, int len, int promille, int optio MODULE_EXPORT void curses_drv_icon (Driver *drvthis, int x, int y, int icon) { + char ch1 = '?'; + char ch2 = 0; + switch (icon) { - case ICON_HEART_OPEN: - curses_drv_chr( drvthis, x, y, '+'); - break; - case ICON_HEART_FILLED: - curses_drv_chr( drvthis, x, y, '*'); - break; - case ICON_BLOCK_FILLED: - curses_drv_chr( drvthis, x, y, ACS_BLOCK); - break; + case ICON_BLOCK_FILLED: ch1 = ACS_BLOCK; break; + case ICON_HEART_OPEN: ch1 = '-'; break; + case ICON_HEART_FILLED: ch1 = '+'; break; + case ICON_ARROW_UP: ch1 = '^'; break; /* or does curses do real arrows ? */ + case ICON_ARROW_DOWN: ch1 = 'v'; break; + case ICON_ARROW_LEFT: ch1 = '<'; break; + case ICON_ARROW_RIGHT: ch1 = '>'; break; + case ICON_STOP: ch1 = '['; ch2 = ']'; break; + case ICON_PAUSE: ch1 = '|'; ch2 = '|'; break; + case ICON_PLAY: ch1 = '>'; ch2 = ' '; break; + case ICON_PLAYR: ch1 = '<'; ch2 = ' '; break; + case ICON_FF: ch1 = '>'; ch2 = '>'; break; + case ICON_FR: ch1 = '<'; ch2 = '<'; break; + case ICON_NEXT: ch1 = '>'; ch2 = '|'; break; + case ICON_PREV: ch1 = '|'; ch2 = '<'; break; + case ICON_REC: ch1 = '('; ch2 = ')'; break; } + curses_drv_chr( drvthis, x, y, ch1); + if (ch2) { + curses_drv_chr( drvthis, x+1, y, ch2); + } + /* There was something with placing PAD * What wasthat ever for ? */ diff --git a/server/render.c b/server/render.c index c45b7c8..1180fbb 100644 --- a/server/render.c +++ b/server/render.c @@ -305,7 +305,9 @@ draw_frame (LinkedList * list, } } break; - case WID_ICON: /* FIXME: Not implemented*/ + case WID_ICON: + drivers_icon (w->x, w->y, w->length); + break; case WID_TITLE: /* FIXME: Doesn't work quite right in frames...*/ if (!w->text) @@ -313,8 +315,8 @@ draw_frame (LinkedList * list, if (vis_width < 8) break; - drivers_icon (w->x, w->y, ICON_BLOCK_FILLED); - drivers_icon (w->x+1, w->y, ICON_BLOCK_FILLED); + drivers_icon (w->x + left, w->y + top, ICON_BLOCK_FILLED); + drivers_icon (w->x + 1 + left, w->y + top, ICON_BLOCK_FILLED); str[0] = ' '; length = strlen (w->text); @@ -353,10 +355,10 @@ draw_frame (LinkedList * list, } str[vis_width-4] = 0; - drivers_string (3 + left, 1 + top, str); + drivers_string (w->x + 2 + left, w->y + top, str); for (; xx+x, w->y, ICON_BLOCK_FILLED); + drivers_icon (w->x + x + left, w->y + top, ICON_BLOCK_FILLED); } break; diff --git a/server/widget.c b/server/widget.c index eef7f0b..3114a7c 100644 --- a/server/widget.c +++ b/server/widget.c @@ -22,6 +22,7 @@ #include "screen.h" #include "widget.h" #include "render.h" +#include "drivers/lcd.h" char *typenames[] = { "none", @@ -36,9 +37,33 @@ char *typenames[] = { 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_STOP, "STOP"}, + {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} +}; + //static widget *widget_finder (LinkedList * list, char *id); //static int widget_remover (LinkedList * list, widget * w); + Widget * widget_create (char *id, WidgetType type, Screen * screen) { @@ -148,3 +173,30 @@ widget_search_subs (Widget * w, char * id) 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; +} + diff --git a/server/widget.h b/server/widget.h index d66bd61..c2f79bf 100644 --- a/server/widget.h +++ b/server/widget.h @@ -60,4 +60,10 @@ char *widget_type_to_typename (WidgetType t); /* Search subwidgets of a widget */ Widget * widget_search_subs (Widget * w, char * id); +/* Convert icon number to icon name */ +char *widget_icon_to_iconname (int icon); + +/* Convert iconname to icon number */ +int widget_iconname_to_icon (char *iconname); + #endif