From 3efadded39d2fc83eddd5405200e42de9fbd4654 Mon Sep 17 00:00:00 2001 From: marco candrian Date: Sun, 17 Feb 2008 08:49:37 +0100 Subject: [PATCH] graph widget handles property arguments now data section values: echo '0 widget_tell progess data title new_value' ... universal settings are width, height, padding_left, bg, bordercolor like: echo '0 widget_tell progess height value' ... --- widgets/graph.c | 165 +++++++++++++++++++++++++++++++----------------- 1 file changed, 107 insertions(+), 58 deletions(-) diff --git a/widgets/graph.c b/widgets/graph.c index 5577a627b..5bbbb7c34 100644 --- a/widgets/graph.c +++ b/widgets/graph.c @@ -30,6 +30,8 @@ extern AwesomeConf globalconf; typedef struct { /* general layout */ + + char **data_title; /** data_title of the data sections */ float *max; /** Represents a full graph */ int width; /** Width of the widget */ float height; /** Height of graph (0-1; 1 = height of statusbar) */ @@ -40,7 +42,7 @@ typedef struct XColor bordercolor; /** Border color */ /* markers... */ - int index; /** Index of current (new) value */ + int *index; /** Index of current (new) value */ int *max_index; /** Index of the actual maximum value */ float *current_max; /** Pointer to current maximum value itself */ @@ -50,17 +52,20 @@ typedef struct float **values; /** Actual values */ /* additional data + a pointer to **lines accordingly */ - int **fillbottom; /** Datatypes holder (data equal to **lines) */ + int **fillbottom; /** Data array pointer (like *lines) */ + int **fillbottom_index; /** Points to some index[i] */ int fillbottom_total; /** Total of them */ XColor *fillbottom_color; /** Color of them */ XColor **fillbottom_pcolor_center; /** Color at middle of graph */ XColor **fillbottom_pcolor_end; /** Color at end of graph */ - int **filltop; /** Datatypes holder */ + int **filltop; /** Data array pointer (like *lines) */ + int **filltop_index; /** Points to some index[i] */ int filltop_total; /** Total of them */ XColor *filltop_color; /** Color of them */ XColor **filltop_pcolor_center; /** Color at center of graph */ XColor **filltop_pcolor_end; /** Color at end of graph */ - int **drawline; /** Datatypes holder */ + int **drawline; /** Data array pointer (like *lines) */ + int **drawline_index; /** Points to some index[i] */ int drawline_total; /** Total of them */ XColor *drawline_color; /** Color of them */ XColor **drawline_pcolor_center; /** Color at middle of graph */ @@ -129,7 +134,7 @@ graph_draw(Widget *widget, DrawCtx *ctx, int offset, } draw_graph(ctx, left_offset + 2, margin_top + d->box_height + 1, - d->size, d->draw_from, d->draw_to, d->index, + d->size, d->draw_from, d->draw_to, *(d->filltop_index[z]), d->filltop_color[z], d->filltop_pcolor_center[z], d->filltop_pcolor_end[z]); } @@ -151,7 +156,7 @@ graph_draw(Widget *widget, DrawCtx *ctx, int offset, draw_graph(ctx, left_offset + 2, margin_top + d->box_height + 1, - d->size, d->draw_from, d->fillbottom[z], d->index, + d->size, d->draw_from, d->fillbottom[z], *(d->fillbottom_index[z]), d->fillbottom_color[z], d->fillbottom_pcolor_center[z], d->fillbottom_pcolor_end[z]); } @@ -160,7 +165,7 @@ graph_draw(Widget *widget, DrawCtx *ctx, int offset, { draw_graph_line(ctx, left_offset + 2, margin_top + d->box_height + 1, - d->size, d->drawline[z], d->index, + d->size, d->drawline[z], *(d->drawline_index[z]), d->drawline_color[z], d->drawline_pcolor_center[z], d->drawline_pcolor_end[z]); } @@ -173,63 +178,97 @@ static void graph_tell(Widget *widget, char *property, char *command) { Data *d = widget->data; - int i, z; - float *value; - char *tok; + int i, u; + float value; + char *title, *setting; if(!property || !command || d->width < 1 || !(d->data_items > 0)) return; - value = p_new(float, d->data_items); - - for (i = 0, tok = strtok(command, ","); tok && i < d->data_items; tok = strtok(NULL, ","), i++) - value[i] = MAX(atof(tok), 0); - - if(++d->index >= d->size) /* cycle inside the arrays (all-in-one) */ - d->index = 0; - - /* add according values and to-draw-line-lenghts to the according data_items */ - for(z = 0; z < d->data_items; z++) + if(!a_strcmp(property, "data")) { - if(d->values[z]) /* scale option is true */ + title = strtok(command, " "); + setting = strtok(NULL, " "); + + for(i = 0; i < d->data_items; i++) { - d->values[z][d->index] = value[z]; - - if(value[z] > d->current_max[z]) /* a new maximum value found */ + if(!a_strcmp(title, d->data_title[i])) { - d->max_index[z] = d->index; - d->current_max[z] = value[z]; + value = MAX(atof(setting), 0); - /* recalculate */ - for (i = 0; i < d->size; i++) - d->lines[z][i] = (int) (d->values[z][i] * (d->box_height) / d->current_max[z] + 0.5); + if(++d->index[i] >= d->size) /* cycle inside the array */ + d->index[i] = 0; + + if(d->values[i]) /* scale option is true */ + { + d->values[i][d->index[i]] = value; + + if(value > d->current_max[i]) /* a new maximum value found */ + { + d->max_index[i] = d->index[i]; + d->current_max[i] = value; + + /* recalculate */ + for (u = 0; u < d->size; u++) + d->lines[i][u] = (int) (d->values[i][u] * (d->box_height) / d->current_max[i] + 0.5); + } + /* old max_index reached + current_max > normal, re-check/generate */ + else if(d->max_index[i] == d->index[i] && d->current_max[i] > d->max[i]) + { + /* find the new max */ + for (u = 0; u < d->size; u++) + if (d->values[i][u] > d->values[i][d->max_index[i]]) + d->max_index[i] = u; + + d->current_max[i] = MAX(d->values[i][d->max_index[i]], d->max[i]); + + /* recalculate */ + for (u = 0; u < d->size; u++) + d->lines[i][u] = (int) (d->values[i][u] * d->box_height / d->current_max[i] + 0.5); + } + else + d->lines[i][d->index[i]] = (int) (value * d->box_height / d->current_max[i] + 0.5); + + } + else /* scale option is false - limit to d->box_height */ + { + if (value < d->current_max[i]) + d->lines[i][d->index[i]] = (int) (value * d->box_height / d->current_max[i] + 0.5); + else + d->lines[i][d->index[i]] = d->box_height; + } + return; } - else if(d->max_index[z] == d->index) /* old max_index reached, re-check/generate */ - { - /* find the new max */ - for (i = 0; i < d->size; i++) - if (d->values[z][i] > d->values[z][d->max_index[z]]) - d->max_index[z] = i; - - d->current_max[z] = MAX(d->values[z][d->max_index[z]], d->max[z]); - - /* recalculate */ - for (i = 0; i < d->size; i++) - d->lines[z][i] = (int) (d->values[z][i] * d->box_height / d->current_max[z] + 0.5); - } - else - d->lines[z][d->index] = (int) (value[z] * d->box_height / d->current_max[z] + 0.5); - - } - else /* scale option is false - limit to d->box_height */ - { - if (value[z] < d->current_max[z]) - d->lines[z][d->index] = (int) (value[z] * d->box_height / d->current_max[z] + 0.5); - else - d->lines[z][d->index] = d->box_height; } + warn("No such data-section title: %s\n", title); } - p_delete(&value); + else if(!a_strcmp(property, "width")) + d->width = atoi(command); + + else if(!a_strcmp(property, "height")) + d->height = atof(command); + + else if(!a_strcmp(property, "padding_left")) + d->padding_left = atoi(command); + + else if(!a_strcmp(property, "bg")) + draw_color_new(globalconf.display, get_phys_screen(widget->statusbar->screen), + command, &d->bg); + + else if(!a_strcmp(property, "bordercolor")) + draw_color_new(globalconf.display, get_phys_screen(widget->statusbar->screen), + command, &d->bordercolor); + + else if(!a_strcmp(property, "fg") || !a_strcmp(property, "fg_center") || + !a_strcmp(property, "fg_end") || !a_strcmp(property, "scale") || + !a_strcmp(property, "max") || !a_strcmp(property, "style") || + !a_strcmp(property, "align") || !a_strcmp(property, "mouse") || + !a_strcmp(property, "x") || !a_strcmp(property, "y")) + warn("Property \"%s\" can't get changed.\n", property); + else + warn("No such property: %s\n", property); + + return; } Widget * @@ -275,9 +314,13 @@ graph_new(Statusbar *statusbar, cfg_t *config) d->draw_to = p_new(int, d->size); d->fillbottom = p_new(int *, d->size); + d->fillbottom_index = p_new(int *, d->size); d->filltop = p_new(int *, d->size); + d->filltop_index = p_new(int *, d->size); d->drawline = p_new(int *, d->size); + d->drawline_index = p_new(int *, d->size); + d->data_title = p_new(char *, d->data_items); d->values = p_new(float *, d->data_items); d->lines = p_new(int *, d->data_items); @@ -292,6 +335,7 @@ graph_new(Statusbar *statusbar, cfg_t *config) d->drawline_pcolor_end = p_new(XColor *, d->data_items); d->max_index = p_new(int, d->data_items); + d->index = p_new(int, d->data_items); d->current_max = p_new(float, d->data_items); d->max = p_new(float, d->data_items); @@ -302,6 +346,8 @@ graph_new(Statusbar *statusbar, cfg_t *config) cfg = cfg_getnsec(config, "data", i); + d->data_title[i] = a_strdup(cfg_title(cfg)); + if((color = cfg_getstr(cfg, "fg"))) draw_color_new(globalconf.display, phys_screen, color, &tmp_color); else @@ -316,7 +362,7 @@ graph_new(Statusbar *statusbar, cfg_t *config) if((color = cfg_getstr(cfg, "fg_end"))) { ptmp_color_end = p_new(XColor, 1); - draw_color_new(globalconf.display, phys_screen, color, ptmp_color_center); + draw_color_new(globalconf.display, phys_screen, color, ptmp_color_end); } if (cfg_getbool(cfg, "scale")) @@ -340,6 +386,7 @@ graph_new(Statusbar *statusbar, cfg_t *config) if(!a_strncmp(type, "bottom", sizeof("bottom"))) { d->fillbottom[d->fillbottom_total] = d->lines[i]; + d->fillbottom_index[d->fillbottom_total] = &d->index[i]; d->fillbottom_color[d->fillbottom_total] = tmp_color; d->fillbottom_pcolor_center[d->fillbottom_total] = ptmp_color_center; d->fillbottom_pcolor_end[d->fillbottom_total] = ptmp_color_end; @@ -348,17 +395,19 @@ graph_new(Statusbar *statusbar, cfg_t *config) else if (!a_strncmp(type, "top", sizeof("top"))) { d->filltop[d->filltop_total] = d->lines[i]; + d->filltop_index[d->filltop_total] = &d->index[i]; d->filltop_color[d->filltop_total] = tmp_color; - d->filltop_pcolor_center[d->fillbottom_total] = ptmp_color_center; - d->filltop_pcolor_end[d->fillbottom_total] = ptmp_color_end; + d->filltop_pcolor_center[d->filltop_total] = ptmp_color_center; + d->filltop_pcolor_end[d->filltop_total] = ptmp_color_end; d->filltop_total++; } else if (!a_strncmp(type, "line", sizeof("line"))) { d->drawline[d->drawline_total] = d->lines[i]; + d->drawline_index[d->drawline_total] = &d->index[i]; d->drawline_color[d->drawline_total] = tmp_color; - d->drawline_pcolor_center[d->fillbottom_total] = ptmp_color_center; - d->drawline_pcolor_end[d->fillbottom_total] = ptmp_color_end; + d->drawline_pcolor_center[d->drawline_total] = ptmp_color_center; + d->drawline_pcolor_end[d->drawline_total] = ptmp_color_end; d->drawline_total++; } }