direct calculating of the line length to draw
the graph_tell() does not modify directly the line-lenght to draw, rather then calculating the value in percent and in the graph_draw, calculating the line length ouf of that the percent. (while trying to fix something little, a whole new scale thing resulted; also I didn't really understand the old system, my fault that is)
This commit is contained in:
parent
bbc94b97f8
commit
4f05f954d0
101
widgets/graph.c
101
widgets/graph.c
|
@ -37,13 +37,14 @@ typedef struct
|
||||||
XColor fg; /* Foreground color */
|
XColor fg; /* Foreground color */
|
||||||
XColor bg; /* Background color */
|
XColor bg; /* Background color */
|
||||||
XColor bordercolor; /* Border color */
|
XColor bordercolor; /* Border color */
|
||||||
|
int box_height; /* Height of the innerbox */
|
||||||
int *lines; /* keeps the calculated values (line-length); */
|
int *lines; /* keeps the calculated values (line-length); */
|
||||||
int lines_index; /* pointer to current val */
|
int lines_index; /* pointer to current val */
|
||||||
int lines_size; /* size of lines-array */
|
int lines_size; /* size of lines-array */
|
||||||
float *line_values; /* actual values */
|
float *line_values; /* actual values */
|
||||||
int line_max_index; /* index of the current maximum value */
|
int line_max_index; /* index of the current maximum value */
|
||||||
int line_max; /* maximum value */
|
int line_max; /* maximum value */
|
||||||
|
int current_max; /* curent maximum value */
|
||||||
} Data;
|
} Data;
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,12 +53,9 @@ static int
|
||||||
graph_draw(Widget *widget, DrawCtx *ctx, int offset,
|
graph_draw(Widget *widget, DrawCtx *ctx, int offset,
|
||||||
int used __attribute__ ((unused)))
|
int used __attribute__ ((unused)))
|
||||||
{
|
{
|
||||||
int width, height; /* width/height (pixel) to draw the outer box */
|
|
||||||
int margin_top, left_offset;
|
int margin_top, left_offset;
|
||||||
Data *d = widget->data;
|
Data *d = widget->data;
|
||||||
|
|
||||||
width = d->lines_size + 2;
|
|
||||||
|
|
||||||
if(!widget->user_supplied_x)
|
if(!widget->user_supplied_x)
|
||||||
widget->area.x = widget_calculate_offset(widget->statusbar->width,
|
widget->area.x = widget_calculate_offset(widget->statusbar->width,
|
||||||
d->width,
|
d->width,
|
||||||
|
@ -67,27 +65,27 @@ graph_draw(Widget *widget, DrawCtx *ctx, int offset,
|
||||||
widget->area.y = 0;
|
widget->area.y = 0;
|
||||||
|
|
||||||
margin_top = (int) (widget->statusbar->height * (1 - d->height)) / 2 + 0.5 + widget->area.y;
|
margin_top = (int) (widget->statusbar->height * (1 - d->height)) / 2 + 0.5 + widget->area.y;
|
||||||
height = (int) (widget->statusbar->height * d->height + 0.5);
|
|
||||||
left_offset = widget->area.x + d->padding_left;
|
left_offset = widget->area.x + d->padding_left;
|
||||||
|
|
||||||
|
if(!(d->box_height))
|
||||||
|
d->box_height = (int) (widget->statusbar->height * d->height + 0.5) - 2;
|
||||||
|
|
||||||
|
|
||||||
draw_rectangle(ctx,
|
draw_rectangle(ctx,
|
||||||
left_offset, margin_top,
|
left_offset, margin_top,
|
||||||
width, height,
|
d->lines_size + 2, d->box_height + 2,
|
||||||
False, d->bordercolor);
|
False, d->bordercolor);
|
||||||
|
|
||||||
draw_rectangle(ctx,
|
draw_rectangle(ctx,
|
||||||
left_offset + 1, margin_top + 1,
|
left_offset + 1, margin_top + 1,
|
||||||
width - 2, height - 2,
|
d->lines_size, d->box_height,
|
||||||
True, d->bg);
|
True, d->bg);
|
||||||
|
|
||||||
/* computes line-length to draw and store into lines[] */
|
|
||||||
d->lines[d->lines_index] = (int) (d->percent) * (height - 2 ) / 100 + 0.5;
|
|
||||||
|
|
||||||
if(d->lines[d->lines_index] < 0)
|
if(d->lines[d->lines_index] < 0)
|
||||||
d->lines[d->lines_index] = 0;
|
d->lines[d->lines_index] = 0;
|
||||||
|
|
||||||
draw_graph(ctx,
|
draw_graph(ctx,
|
||||||
left_offset + 2, margin_top + height - 1,
|
left_offset + 2, margin_top + d->box_height + 1,
|
||||||
d->lines_size, d->lines, d->lines_index,
|
d->lines_size, d->lines, d->lines_index,
|
||||||
d->fg);
|
d->fg);
|
||||||
|
|
||||||
|
@ -100,9 +98,7 @@ static void
|
||||||
graph_tell(Widget *widget, char *command)
|
graph_tell(Widget *widget, char *command)
|
||||||
{
|
{
|
||||||
Data *d = widget->data;
|
Data *d = widget->data;
|
||||||
int percent, i, height, omax, nmax;
|
int value, i;
|
||||||
|
|
||||||
height = (int) (widget->statusbar->height * d->height + 0.5);
|
|
||||||
|
|
||||||
if(!command || d->width < 1)
|
if(!command || d->width < 1)
|
||||||
return;
|
return;
|
||||||
|
@ -110,50 +106,44 @@ graph_tell(Widget *widget, char *command)
|
||||||
if(++d->lines_index >= d->lines_size) /* cycle inside the array */
|
if(++d->lines_index >= d->lines_size) /* cycle inside the array */
|
||||||
d->lines_index = 0;
|
d->lines_index = 0;
|
||||||
|
|
||||||
if (d->line_values && d->line_max_index == d->lines_index &&
|
value = MAX(atoi(command), 0); /*TODO atofloat */
|
||||||
d->line_values[d->line_max_index]) {
|
|
||||||
omax = d->line_values[d->line_max_index];
|
|
||||||
d->line_values[d->line_max_index] = 0;
|
|
||||||
for (i = 0; i < d->lines_size; i++)
|
|
||||||
if (d->line_values[i] > d->line_values[d->line_max_index]) {
|
|
||||||
d->line_max_index = i;
|
|
||||||
}
|
|
||||||
nmax = MAX(d->line_values[d->line_max_index], d->line_max);
|
|
||||||
if (d->line_values[d->line_max_index]) {
|
|
||||||
for (i = 0; i < d->lines_size; i++) {
|
|
||||||
d->lines[i] = (int) (100*d->line_values[i] / nmax) * (height -
|
|
||||||
2) / 100 + 0.5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
percent = atoi(command);
|
if(d->line_values) /* scale option = true */
|
||||||
if (percent < 0)
|
|
||||||
{
|
{
|
||||||
if (d->line_values)
|
d->line_values[d->lines_index] = value;
|
||||||
d->line_values[d->lines_index] = 0;
|
|
||||||
d->percent = 0;
|
if(value > d->current_max) /* a new maximum value found */
|
||||||
}
|
|
||||||
else if (d->line_values)
|
|
||||||
{
|
{
|
||||||
d->line_values[d->lines_index] = percent;
|
|
||||||
nmax = MAX(d->line_max, d->line_values[d->line_max_index]);
|
|
||||||
if (d->line_values[d->line_max_index] < percent) {
|
|
||||||
// Increase the current max
|
|
||||||
d->line_max_index = d->lines_index;
|
d->line_max_index = d->lines_index;
|
||||||
if (d->line_max < d->line_values[d->line_max_index]) {
|
d->current_max = MAX(value, 1);
|
||||||
for (i = 0; i < d->lines_size; i++) {
|
|
||||||
d->lines[i] = (int)
|
/* recalculate: value * (height-2pixel) / max */
|
||||||
(100*d->line_values[i]/d->line_values[d->line_max_index])
|
for (i = 0; i < d->lines_size; i++)
|
||||||
* (height - 2) / 100 + 0.5;
|
d->lines[i] = (int) ((float)(d->line_values[i]) * (d->box_height) / d->current_max + 0.5);
|
||||||
}
|
}
|
||||||
|
else if(d->line_max_index == d->lines_index) /* old max_index reached, re-check/generate */
|
||||||
|
{
|
||||||
|
/* find the new max */
|
||||||
|
for (i = 0; i < d->lines_size; i++)
|
||||||
|
if (d->line_values[i] > d->line_values[d->line_max_index])
|
||||||
|
d->line_max_index = i;
|
||||||
|
|
||||||
|
d->current_max = MAX(d->line_values[d->line_max_index], d->line_max);
|
||||||
|
|
||||||
|
/* recalculate */
|
||||||
|
for (i = 0; i < d->lines_size; i++)
|
||||||
|
d->lines[i] = (int) ((float)(d->line_values[i]) * d->box_height / d->current_max + 0.5);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
d->lines[d->lines_index] = (int) ((float)(value) * d->box_height / d->current_max + 0.5);
|
||||||
|
|
||||||
}
|
}
|
||||||
d->percent = (int) (100.0 * d->line_values[d->lines_index] / nmax);
|
else /* scale option = false */
|
||||||
}
|
{
|
||||||
else {
|
if (value < d->current_max)
|
||||||
d->percent = (percent > d->line_max ? 100 :
|
d->lines[d->lines_index] = (int) ((float)(value) * d->box_height / d->current_max + 0.5);
|
||||||
(int) (100 * ((float)percent) / d->line_max));
|
else
|
||||||
|
d->lines[d->lines_index] = d->box_height;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,12 +162,10 @@ graph_new(Statusbar *statusbar, cfg_t *config)
|
||||||
w->tell = graph_tell;
|
w->tell = graph_tell;
|
||||||
d = w->data = p_new(Data, 1);
|
d = w->data = p_new(Data, 1);
|
||||||
|
|
||||||
d->height = cfg_getfloat(config, "height");
|
|
||||||
d->width = cfg_getint(config, "width");
|
d->width = cfg_getint(config, "width");
|
||||||
|
d->height = cfg_getfloat(config, "height");
|
||||||
d->padding_left = cfg_getint(config, "padding_left");
|
d->padding_left = cfg_getint(config, "padding_left");
|
||||||
|
|
||||||
d->lines_size = d->width - d->padding_left - 2;
|
d->lines_size = d->width - d->padding_left - 2;
|
||||||
d->lines_index = -1; /* graph_tell will increment it to 0 (to begin with...) */
|
|
||||||
|
|
||||||
if(d->lines_size < 1)
|
if(d->lines_size < 1)
|
||||||
{
|
{
|
||||||
|
@ -186,10 +174,11 @@ graph_new(Statusbar *statusbar, cfg_t *config)
|
||||||
}
|
}
|
||||||
|
|
||||||
d->lines = p_new(int, d->lines_size);
|
d->lines = p_new(int, d->lines_size);
|
||||||
|
|
||||||
if (cfg_getbool(config, "scale"))
|
if (cfg_getbool(config, "scale"))
|
||||||
d->line_values = p_new(float, d->lines_size);
|
d->line_values = p_new(float, d->lines_size);
|
||||||
d->line_max = cfg_getfloat(config, "max");
|
d->line_max = MAX(cfg_getfloat(config, "max"), 0.001); /* prevent div / 0 */
|
||||||
|
d->current_max = d->line_max;
|
||||||
if((color = cfg_getstr(config, "fg")))
|
if((color = cfg_getstr(config, "fg")))
|
||||||
d->fg = initxcolor(phys_screen, color);
|
d->fg = initxcolor(phys_screen, color);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue