draw_rectangle_gradient() for the progressbar widget; + fg_full option
Adds an optional additional foreground color option to a bar: fg_full = <color> A value of 0 represents the fg-color, and a value of 100 (a full graph) the fg_full-color. Example: progressbar xy { bar { fg = "#111155" fg_full = "#3333cc" bg = "#000000" bordercolor = "#4444cc"} .... } Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
91d6a11fd3
commit
b024b0c0cf
|
@ -152,6 +152,7 @@ cfg_opt_t widget_graph_opts[] =
|
||||||
cfg_opt_t widget_progressbar_bar_opts[] =
|
cfg_opt_t widget_progressbar_bar_opts[] =
|
||||||
{
|
{
|
||||||
CFG_STR((char *) "fg", (char *) NULL, CFGF_NONE),
|
CFG_STR((char *) "fg", (char *) NULL, CFGF_NONE),
|
||||||
|
CFG_STR((char *) "fg_full", (char *) NULL, CFGF_NONE),
|
||||||
CFG_STR((char *) "bg", (char *) NULL, CFGF_NONE),
|
CFG_STR((char *) "bg", (char *) NULL, CFGF_NONE),
|
||||||
CFG_STR((char *) "bordercolor", (char *) NULL, CFGF_NONE),
|
CFG_STR((char *) "bordercolor", (char *) NULL, CFGF_NONE),
|
||||||
CFG_END()
|
CFG_END()
|
||||||
|
|
|
@ -151,9 +151,42 @@ draw_rectangle(DrawCtx *ctx, Area geometry, Bool filled, XColor color)
|
||||||
cairo_fill(ctx->cr);
|
cairo_fill(ctx->cr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
cairo_rectangle(ctx->cr, geometry.x + 1, geometry.y, geometry.width - 1, geometry.height - 1);
|
cairo_rectangle(ctx->cr, geometry.x + 1, geometry.y, geometry.width - 1, geometry.height - 1);
|
||||||
|
cairo_stroke(ctx->cr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cairo_stroke(ctx->cr);
|
/* 'fullwidth' represents a full color-pattern range */
|
||||||
|
void
|
||||||
|
draw_rectangle_gradient(DrawCtx *ctx, Area geometry, int fullwidth, Bool filled,
|
||||||
|
XColor color, XColor color_full)
|
||||||
|
{
|
||||||
|
cairo_pattern_t *pat;
|
||||||
|
|
||||||
|
cairo_set_antialias(ctx->cr, CAIRO_ANTIALIAS_NONE);
|
||||||
|
cairo_set_line_width(ctx->cr, 1.0);
|
||||||
|
|
||||||
|
pat = cairo_pattern_create_linear(geometry.x, geometry.y, geometry.x + fullwidth, geometry.y);
|
||||||
|
cairo_pattern_add_color_stop_rgb(pat, 0, color.red / 65535.0,
|
||||||
|
color.green / 65535.0, color.blue / 65535.0);
|
||||||
|
cairo_pattern_add_color_stop_rgb(pat, 1, color_full.red / 65535.0,
|
||||||
|
color_full.green / 65535.0, color_full.blue / 65535.0);
|
||||||
|
|
||||||
|
cairo_set_source(ctx->cr, pat);
|
||||||
|
|
||||||
|
if(filled)
|
||||||
|
{
|
||||||
|
cairo_rectangle(ctx->cr, geometry.x, geometry.y, geometry.width, geometry.height);
|
||||||
|
cairo_fill(ctx->cr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cairo_rectangle(ctx->cr, geometry.x + 1, geometry.y, geometry.width - 1, geometry.height - 1);
|
||||||
|
cairo_set_source(ctx->cr, pat);
|
||||||
|
}
|
||||||
|
|
||||||
|
cairo_pattern_destroy(pat);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draw_graph functions */
|
/* draw_graph functions */
|
||||||
|
|
|
@ -95,6 +95,7 @@ void draw_context_delete(DrawCtx *);
|
||||||
|
|
||||||
void draw_text(DrawCtx *, Area, Alignment, int, XftFont *, const char *, XColor fg, XColor bg);
|
void draw_text(DrawCtx *, Area, Alignment, int, XftFont *, const char *, XColor fg, XColor bg);
|
||||||
void draw_rectangle(DrawCtx *, Area, Bool, XColor);
|
void draw_rectangle(DrawCtx *, Area, Bool, XColor);
|
||||||
|
void draw_rectangle_gradient(DrawCtx *, Area, int, Bool, XColor, XColor);
|
||||||
|
|
||||||
void draw_graph_setup(DrawCtx *);
|
void draw_graph_setup(DrawCtx *);
|
||||||
void draw_graph(DrawCtx *, int, int, int, int *, int *, int, XColor);
|
void draw_graph(DrawCtx *, int, int, int, int *, int *, int, XColor);
|
||||||
|
|
|
@ -42,6 +42,8 @@ typedef struct
|
||||||
float height;
|
float height;
|
||||||
/** Foreground color */
|
/** Foreground color */
|
||||||
XColor *fg;
|
XColor *fg;
|
||||||
|
/** Foreground color when bar is full */
|
||||||
|
XColor *fg_full;
|
||||||
/** Background color */
|
/** Background color */
|
||||||
XColor *bg;
|
XColor *bg;
|
||||||
/** Border color */
|
/** Border color */
|
||||||
|
@ -92,7 +94,7 @@ progressbar_draw(Widget *widget, DrawCtx *ctx, int offset,
|
||||||
rectangle.y = margin_top + 1;
|
rectangle.y = margin_top + 1;
|
||||||
rectangle.width = pwidth;
|
rectangle.width = pwidth;
|
||||||
rectangle.height = pb_height - 2;
|
rectangle.height = pb_height - 2;
|
||||||
draw_rectangle(ctx, rectangle, True, d->fg[i]);
|
draw_rectangle_gradient(ctx, rectangle, width - 2, True, d->fg[i], d->fg_full[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(width - 2 - pwidth > 0) /* not filled area */
|
if(width - 2 - pwidth > 0) /* not filled area */
|
||||||
|
@ -152,8 +154,9 @@ progressbar_new(Statusbar *statusbar, cfg_t *config)
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
d->bg = p_new(XColor, d->bars);
|
|
||||||
d->fg = p_new(XColor, d->bars);
|
d->fg = p_new(XColor, d->bars);
|
||||||
|
d->fg_full = p_new(XColor, d->bars);
|
||||||
|
d->bg = p_new(XColor, d->bars);
|
||||||
d->bordercolor = p_new(XColor, d->bars);
|
d->bordercolor = p_new(XColor, d->bars);
|
||||||
d->percent = p_new(int, d->bars);
|
d->percent = p_new(int, d->bars);
|
||||||
|
|
||||||
|
@ -166,6 +169,11 @@ progressbar_new(Statusbar *statusbar, cfg_t *config)
|
||||||
else
|
else
|
||||||
d->fg[i] = globalconf.screens[statusbar->screen].colors_normal[ColFG];
|
d->fg[i] = globalconf.screens[statusbar->screen].colors_normal[ColFG];
|
||||||
|
|
||||||
|
if((color = cfg_getstr(cfg, "fg_full")))
|
||||||
|
d->fg_full[i] = draw_color_new(globalconf.display, phys_screen, color);
|
||||||
|
else
|
||||||
|
d->fg_full[i] = d->fg[i];
|
||||||
|
|
||||||
if((color = cfg_getstr(cfg, "bg")))
|
if((color = cfg_getstr(cfg, "bg")))
|
||||||
d->bg[i] = draw_color_new(globalconf.display, phys_screen, color);
|
d->bg[i] = draw_color_new(globalconf.display, phys_screen, color);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue