summaryrefslogtreecommitdiff
path: root/src/overlays.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/overlays.c')
-rw-r--r--src/overlays.c798
1 files changed, 399 insertions, 399 deletions
diff --git a/src/overlays.c b/src/overlays.c
index 3edda0b..01d9fe1 100644
--- a/src/overlays.c
+++ b/src/overlays.c
@@ -34,20 +34,20 @@
#include "vwm.h"
#include "xwindow.h"
-#define OVERLAY_MASK_DEPTH 8 /* XXX: 1 would save memory, but Xorg isn't good at it */
-#define OVERLAY_FIXED_FONT "-misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1"
-#define OVERLAY_ROW_HEIGHT 15 /* this should always be larger than the font height */
-#define OVERLAY_GRAPH_MIN_WIDTH 200 /* always create graphs at least this large */
-#define OVERLAY_GRAPH_MIN_HEIGHT (4 * OVERLAY_ROW_HEIGHT)
-#define OVERLAY_ISTHREAD_ARGV "~" /* use this string to mark threads in the argv field */
-#define OVERLAY_NOCOMM_ARGV "#missed it!" /* use this string to substitute the command when missing in argv field */
-#define OVERLAY_MAX_ARGC 512 /* this is a huge amount */
-#define OVERLAY_VMON_PROC_WANTS (VMON_WANT_PROC_STAT | VMON_WANT_PROC_FOLLOW_CHILDREN | VMON_WANT_PROC_FOLLOW_THREADS)
-#define OVERLAY_VMON_SYS_WANTS (VMON_WANT_SYS_STAT)
-
-/* the global overlays state, supplied to vwm_overlay_create() which keeps a reference for future use. */
-typedef struct _vwm_overlays_t {
- vwm_xserver_t *xserver; /* xserver supplied to vwm_overlays_init() */
+#define CHART_MASK_DEPTH 8 /* XXX: 1 would save memory, but Xorg isn't good at it */
+#define CHART_FIXED_FONT "-misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1"
+#define CHART_ROW_HEIGHT 15 /* this should always be larger than the font height */
+#define CHART_GRAPH_MIN_WIDTH 200 /* always create graphs at least this large */
+#define CHART_GRAPH_MIN_HEIGHT (4 * CHART_ROW_HEIGHT)
+#define CHART_ISTHREAD_ARGV "~" /* use this string to mark threads in the argv field */
+#define CHART_NOCOMM_ARGV "#missed it!" /* use this string to substitute the command when missing in argv field */
+#define CHART_MAX_ARGC 512 /* this is a huge amount */
+#define CHART_VMON_PROC_WANTS (VMON_WANT_PROC_STAT | VMON_WANT_PROC_FOLLOW_CHILDREN | VMON_WANT_PROC_FOLLOW_THREADS)
+#define CHART_VMON_SYS_WANTS (VMON_WANT_SYS_STAT)
+
+/* the global charts state, supplied to vwm_chart_create() which keeps a reference for future use. */
+typedef struct _vwm_charts_t {
+ vwm_xserver_t *xserver; /* xserver supplied to vwm_charts_init() */
/* libvmon */
struct timeval maybe_sample, last_sample, this_sample;
@@ -60,7 +60,7 @@ typedef struct _vwm_overlays_t {
int sampling_paused, contiguous_drops;
/* X */
- XFontStruct *overlay_font;
+ XFontStruct *chart_font;
GC text_gc;
Picture shadow_fill,
text_fill,
@@ -69,28 +69,28 @@ typedef struct _vwm_overlays_t {
grapha_fill,
graphb_fill,
finish_fill;
-} vwm_overlays_t;
+} vwm_charts_t;
-/* everything needed by the per-window overlay's context */
-typedef struct _vwm_overlay_t {
+/* everything needed by the per-window chart's context */
+typedef struct _vwm_chart_t {
vmon_proc_t *monitor; /* vmon process monitor handle */
- Pixmap text_pixmap; /* pixmap for overlayed text (kept around for XDrawText usage) */
+ Pixmap text_pixmap; /* pixmap for charted text (kept around for XDrawText usage) */
Picture text_picture; /* picture representation of text_pixmap */
Picture shadow_picture; /* text shadow layer */
Picture grapha_picture; /* graph A layer */
Picture graphb_picture; /* graph B layer */
Picture tmp_picture; /* 1 row worth of temporary picture space */
- Picture picture; /* overlay picture derived from the pixmap, for render compositing */
- int width; /* current width of the overlay */
- int height; /* current height of the overlay */
- int visible_width; /* currently visible width of the overlay */
- int visible_height; /* currently visible height of the overlay */
+ Picture picture; /* chart picture derived from the pixmap, for render compositing */
+ int width; /* current width of the chart */
+ int height; /* current height of the chart */
+ int visible_width; /* currently visible width of the chart */
+ int visible_height; /* currently visible height of the chart */
int phase; /* current position within the (horizontally scrolling) graphs */
int heirarchy_end; /* row where the process heirarchy currently ends */
int snowflakes_cnt; /* count of snowflaked rows (reset to zero to truncate snowflakes display) */
int gen_last_composed; /* the last composed vmon generation */
int redraw_needed; /* if a redraw is required (like when the window is resized...) */
-} vwm_overlay_t;
+} vwm_chart_t;
/* space we need for every process being monitored */
typedef struct _vwm_perproc_ctxt_t {
@@ -110,14 +110,14 @@ static float sampling_intervals[] = {
.025, /* ~40Hz */
.01666}; /* ~60Hz */
-static XRenderColor overlay_visible_color = { 0xffff, 0xffff, 0xffff, 0xffff },
- overlay_shadow_color = { 0x0000, 0x0000, 0x0000, 0x8800},
- overlay_bg_color = { 0x0, 0x1000, 0x0, 0x9000},
- overlay_div_color = { 0x2000, 0x3000, 0x2000, 0x9000},
- overlay_snowflakes_visible_color = { 0xd000, 0xd000, 0xd000, 0x8000 },
- overlay_trans_color = {0x00, 0x00, 0x00, 0x00},
- overlay_grapha_color = { 0xff00, 0x0000, 0x0000, 0x3000 }, /* ~red */
- overlay_graphb_color = { 0x0000, 0xffff, 0xffff, 0x3000 }; /* ~cyan */
+static XRenderColor chart_visible_color = { 0xffff, 0xffff, 0xffff, 0xffff },
+ chart_shadow_color = { 0x0000, 0x0000, 0x0000, 0x8800},
+ chart_bg_color = { 0x0, 0x1000, 0x0, 0x9000},
+ chart_div_color = { 0x2000, 0x3000, 0x2000, 0x9000},
+ chart_snowflakes_visible_color = { 0xd000, 0xd000, 0xd000, 0x8000 },
+ chart_trans_color = {0x00, 0x00, 0x00, 0x00},
+ chart_grapha_color = { 0xff00, 0x0000, 0x0000, 0x3000 }, /* ~red */
+ chart_graphb_color = { 0x0000, 0xffff, 0xffff, 0x3000 }; /* ~cyan */
static XRenderPictureAttributes pa_repeat = { .repeat = 1 };
static XRenderPictureAttributes pa_no_repeat = { .repeat = 0 };
@@ -125,16 +125,16 @@ static XRenderPictureAttributes pa_no_repeat = { .repeat = 0 };
/* this callback gets invoked at sample time once "per sys" */
static void sample_callback(vmon_t *vmon, void *arg)
{
- vwm_overlays_t *overlays = arg;
+ vwm_charts_t *charts = arg;
vmon_sys_stat_t *sys_stat = vmon->stores[VMON_STORE_SYS_STAT];
- overlays->this_total = sys_stat->user + sys_stat->nice + sys_stat->system +
+ charts->this_total = sys_stat->user + sys_stat->nice + sys_stat->system +
sys_stat->idle + sys_stat->iowait + sys_stat->irq +
sys_stat->softirq + sys_stat->steal + sys_stat->guest;
- overlays->total_delta = overlays->this_total - overlays->last_total;
- overlays->idle_delta = sys_stat->idle - overlays->last_idle;
- overlays->iowait_delta = sys_stat->iowait - overlays->last_iowait;
+ charts->total_delta = charts->this_total - charts->last_total;
+ charts->idle_delta = sys_stat->idle - charts->last_idle;
+ charts->iowait_delta = sys_stat->iowait - charts->last_iowait;
}
@@ -157,18 +157,18 @@ static void vmon_dtor_cb(vmon_t *vmon, vmon_proc_t *proc)
/* convenience helper for creating a pixmap */
-static Pixmap create_pixmap(vwm_overlays_t *overlays, unsigned width, unsigned height, unsigned depth)
+static Pixmap create_pixmap(vwm_charts_t *charts, unsigned width, unsigned height, unsigned depth)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
return XCreatePixmap(xserver->display, XSERVER_XROOT(xserver), width, height, depth);
}
/* convenience helper for creating a picture, supply res_pixmap to keep a reference to the pixmap drawable. */
-static Picture create_picture(vwm_overlays_t *overlays, unsigned width, unsigned height, unsigned depth, unsigned long attr_mask, XRenderPictureAttributes *attr, Pixmap *res_pixmap)
+static Picture create_picture(vwm_charts_t *charts, unsigned width, unsigned height, unsigned depth, unsigned long attr_mask, XRenderPictureAttributes *attr, Pixmap *res_pixmap)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
Pixmap pixmap;
Picture picture;
int format;
@@ -185,7 +185,7 @@ static Picture create_picture(vwm_overlays_t *overlays, unsigned width, unsigned
assert(0);
}
- pixmap = create_pixmap(overlays, width, height, depth);
+ pixmap = create_pixmap(charts, width, height, depth);
picture = XRenderCreatePicture(xserver->display, pixmap, XRenderFindStandardFormat(xserver->display, format), attr_mask, attr);
if (res_pixmap) {
@@ -199,143 +199,143 @@ static Picture create_picture(vwm_overlays_t *overlays, unsigned width, unsigned
/* convenience helper for creating a filled picture, supply res_pixmap to keep a reference to the pixmap drawable. */
-static Picture create_picture_fill(vwm_overlays_t *overlays, unsigned width, unsigned height, unsigned depth, unsigned long attrs_mask, XRenderPictureAttributes *attrs, XRenderColor *color, Pixmap *res_pixmap)
+static Picture create_picture_fill(vwm_charts_t *charts, unsigned width, unsigned height, unsigned depth, unsigned long attrs_mask, XRenderPictureAttributes *attrs, XRenderColor *color, Pixmap *res_pixmap)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
Picture picture;
- picture = create_picture(overlays, width, height, depth, attrs_mask, attrs, res_pixmap);
+ picture = create_picture(charts, width, height, depth, attrs_mask, attrs, res_pixmap);
XRenderFillRectangle(xserver->display, PictOpSrc, picture, color, 0, 0, width, height);
return picture;
}
-/* initialize overlays system */
-vwm_overlays_t * vwm_overlays_create(vwm_xserver_t *xserver)
+/* initialize charts system */
+vwm_charts_t * vwm_charts_create(vwm_xserver_t *xserver)
{
- vwm_overlays_t *overlays;
+ vwm_charts_t *charts;
Pixmap bitmask;
- overlays = calloc(1, sizeof(vwm_overlays_t));
- if (!overlays) {
- VWM_PERROR("unable to allocate vwm_overlays_t");
+ charts = calloc(1, sizeof(vwm_charts_t));
+ if (!charts) {
+ VWM_PERROR("unable to allocate vwm_charts_t");
goto _err;
}
- overlays->xserver = xserver;
- overlays->prev_sampling_interval = overlays->sampling_interval = 0.1f; /* default to 10Hz */
+ charts->xserver = xserver;
+ charts->prev_sampling_interval = charts->sampling_interval = 0.1f; /* default to 10Hz */
- if (!vmon_init(&overlays->vmon, VMON_FLAG_2PASS, OVERLAY_VMON_SYS_WANTS, OVERLAY_VMON_PROC_WANTS)) {
+ if (!vmon_init(&charts->vmon, VMON_FLAG_2PASS, CHART_VMON_SYS_WANTS, CHART_VMON_PROC_WANTS)) {
VWM_ERROR("unable to initialize libvmon");
- goto _err_overlays;
+ goto _err_charts;
}
- overlays->vmon.proc_ctor_cb = vmon_ctor_cb;
- overlays->vmon.proc_dtor_cb = vmon_dtor_cb;
- overlays->vmon.sample_cb = sample_callback;
- overlays->vmon.sample_cb_arg = overlays;
- gettimeofday(&overlays->this_sample, NULL);
+ charts->vmon.proc_ctor_cb = vmon_ctor_cb;
+ charts->vmon.proc_dtor_cb = vmon_dtor_cb;
+ charts->vmon.sample_cb = sample_callback;
+ charts->vmon.sample_cb_arg = charts;
+ gettimeofday(&charts->this_sample, NULL);
- /* get all the text and graphics stuff setup for overlays */
- overlays->overlay_font = XLoadQueryFont(xserver->display, OVERLAY_FIXED_FONT);
- if (!overlays->overlay_font) {
- VWM_ERROR("unable to load overlay font \"%s\"", OVERLAY_FIXED_FONT);
+ /* get all the text and graphics stuff setup for charts */
+ charts->chart_font = XLoadQueryFont(xserver->display, CHART_FIXED_FONT);
+ if (!charts->chart_font) {
+ VWM_ERROR("unable to load chart font \"%s\"", CHART_FIXED_FONT);
goto _err_vmon;
}
- /* create a GC for rendering the text using Xlib into the text overlay stencils */
- bitmask = create_pixmap(overlays, 1, 1, OVERLAY_MASK_DEPTH);
- overlays->text_gc = XCreateGC(xserver->display, bitmask, 0, NULL);
- XSetForeground(xserver->display, overlays->text_gc, WhitePixel(xserver->display, xserver->screen_num));
+ /* create a GC for rendering the text using Xlib into the text chart stencils */
+ bitmask = create_pixmap(charts, 1, 1, CHART_MASK_DEPTH);
+ charts->text_gc = XCreateGC(xserver->display, bitmask, 0, NULL);
+ XSetForeground(xserver->display, charts->text_gc, WhitePixel(xserver->display, xserver->screen_num));
XFreePixmap(xserver->display, bitmask);
/* create some repeating source fill pictures for drawing through the text and graph stencils */
- overlays->text_fill = create_picture_fill(overlays, 1, 1, 32, CPRepeat, &pa_repeat, &overlay_visible_color, NULL);
- overlays->shadow_fill = create_picture_fill(overlays, 1, 1, 32, CPRepeat, &pa_repeat, &overlay_shadow_color, NULL);
+ charts->text_fill = create_picture_fill(charts, 1, 1, 32, CPRepeat, &pa_repeat, &chart_visible_color, NULL);
+ charts->shadow_fill = create_picture_fill(charts, 1, 1, 32, CPRepeat, &pa_repeat, &chart_shadow_color, NULL);
- overlays->bg_fill = create_picture(overlays, 1, OVERLAY_ROW_HEIGHT, 32, CPRepeat, &pa_repeat, NULL);
- XRenderFillRectangle(xserver->display, PictOpSrc, overlays->bg_fill, &overlay_bg_color, 0, 0, 1, OVERLAY_ROW_HEIGHT);
- XRenderFillRectangle(xserver->display, PictOpSrc, overlays->bg_fill, &overlay_div_color, 0, OVERLAY_ROW_HEIGHT - 1, 1, 1);
+ charts->bg_fill = create_picture(charts, 1, CHART_ROW_HEIGHT, 32, CPRepeat, &pa_repeat, NULL);
+ XRenderFillRectangle(xserver->display, PictOpSrc, charts->bg_fill, &chart_bg_color, 0, 0, 1, CHART_ROW_HEIGHT);
+ XRenderFillRectangle(xserver->display, PictOpSrc, charts->bg_fill, &chart_div_color, 0, CHART_ROW_HEIGHT - 1, 1, 1);
- overlays->snowflakes_text_fill = create_picture_fill(overlays, 1, 1, 32, CPRepeat, &pa_repeat, &overlay_snowflakes_visible_color, NULL);
- overlays->grapha_fill = create_picture_fill(overlays, 1, 1, 32, CPRepeat, &pa_repeat, &overlay_grapha_color, NULL);
- overlays->graphb_fill = create_picture_fill(overlays, 1, 1, 32, CPRepeat, &pa_repeat, &overlay_graphb_color, NULL);
+ charts->snowflakes_text_fill = create_picture_fill(charts, 1, 1, 32, CPRepeat, &pa_repeat, &chart_snowflakes_visible_color, NULL);
+ charts->grapha_fill = create_picture_fill(charts, 1, 1, 32, CPRepeat, &pa_repeat, &chart_grapha_color, NULL);
+ charts->graphb_fill = create_picture_fill(charts, 1, 1, 32, CPRepeat, &pa_repeat, &chart_graphb_color, NULL);
- overlays->finish_fill = create_picture(overlays, 1, 2, 32, CPRepeat, &pa_repeat, NULL);
- XRenderFillRectangle(xserver->display, PictOpSrc, overlays->finish_fill, &overlay_visible_color, 0, 0, 1, 1);
- XRenderFillRectangle(xserver->display, PictOpSrc, overlays->finish_fill, &overlay_trans_color, 0, 1, 1, 1);
+ charts->finish_fill = create_picture(charts, 1, 2, 32, CPRepeat, &pa_repeat, NULL);
+ XRenderFillRectangle(xserver->display, PictOpSrc, charts->finish_fill, &chart_visible_color, 0, 0, 1, 1);
+ XRenderFillRectangle(xserver->display, PictOpSrc, charts->finish_fill, &chart_trans_color, 0, 1, 1, 1);
- return overlays;
+ return charts;
_err_vmon:
- vmon_destroy(&overlays->vmon);
+ vmon_destroy(&charts->vmon);
-_err_overlays:
- free(overlays);
+_err_charts:
+ free(charts);
_err:
return NULL;
}
-/* teardown overlays system */
-void vwm_overlays_destroy(vwm_overlays_t *overlays)
+/* teardown charts system */
+void vwm_charts_destroy(vwm_charts_t *charts)
{
/* TODO: free rest of stuff.. */
- free(overlays);
+ free(charts);
}
/* copies a row from src to dest */
-static void copy_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int src_row, Picture src, int dest_row, Picture dest)
+static void copy_row(vwm_charts_t *charts, vwm_chart_t *chart, int src_row, Picture src, int dest_row, Picture dest)
{
- XRenderComposite(overlays->xserver->display, PictOpSrc, src, None, dest,
- 0, src_row * OVERLAY_ROW_HEIGHT, /* src */
+ XRenderComposite(charts->xserver->display, PictOpSrc, src, None, dest,
+ 0, src_row * CHART_ROW_HEIGHT, /* src */
0, 0, /* mask */
- 0, dest_row * OVERLAY_ROW_HEIGHT, /* dest */
- overlay->width, OVERLAY_ROW_HEIGHT); /* dimensions */
+ 0, dest_row * CHART_ROW_HEIGHT, /* dest */
+ chart->width, CHART_ROW_HEIGHT); /* dimensions */
}
/* fills a row with the specified color */
-static void fill_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int row, Picture pic, XRenderColor *color)
+static void fill_row(vwm_charts_t *charts, vwm_chart_t *chart, int row, Picture pic, XRenderColor *color)
{
- XRenderFillRectangle(overlays->xserver->display, PictOpSrc, pic, color,
- 0, row * OVERLAY_ROW_HEIGHT, /* dest */
- overlay->width, OVERLAY_ROW_HEIGHT); /* dimensions */
+ XRenderFillRectangle(charts->xserver->display, PictOpSrc, pic, color,
+ 0, row * CHART_ROW_HEIGHT, /* dest */
+ chart->width, CHART_ROW_HEIGHT); /* dimensions */
}
/* copy what's below a given row up the specified amount within the same picture */
-static void shift_below_row_up(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int row, Picture pic, int rows)
+static void shift_below_row_up(vwm_charts_t *charts, vwm_chart_t *chart, int row, Picture pic, int rows)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
XRenderChangePicture(xserver->display, pic, CPRepeat, &pa_no_repeat);
XRenderComposite(xserver->display, PictOpSrc, pic, None, pic,
- 0, (rows + row) * OVERLAY_ROW_HEIGHT, /* src */
- 0, 0, /* mask */
- 0, row * OVERLAY_ROW_HEIGHT, /* dest */
- overlay->width, (rows + overlay->heirarchy_end) * OVERLAY_ROW_HEIGHT - (rows + row) * OVERLAY_ROW_HEIGHT); /* dimensions */
+ 0, (rows + row) * CHART_ROW_HEIGHT, /* src */
+ 0, 0, /* mask */
+ 0, row * CHART_ROW_HEIGHT, /* dest */
+ chart->width, (rows + chart->heirarchy_end) * CHART_ROW_HEIGHT - (rows + row) * CHART_ROW_HEIGHT); /* dimensions */
XRenderChangePicture(xserver->display, pic, CPRepeat, &pa_repeat);
}
/* moves what's below a given row up above it if specified, the row becoming discarded */
-static void snowflake_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay, Picture pic, int copy, int row)
+static void snowflake_row(vwm_charts_t *charts, vwm_chart_t *chart, Picture pic, int copy, int row)
{
- VWM_TRACE("pid=%i overlay=%p row=%i copy=%i heirarhcy_end=%i", overlay->monitor->pid, overlay, row, copy, overlay->heirarchy_end);
+ VWM_TRACE("pid=%i chart=%p row=%i copy=%i heirarhcy_end=%i", chart->monitor->pid, chart, row, copy, chart->heirarchy_end);
if (copy)
- copy_row(overlays, overlay, row, pic, 0, overlay->tmp_picture);
+ copy_row(charts, chart, row, pic, 0, chart->tmp_picture);
- shift_below_row_up(overlays, overlay, row, pic, 1);
+ shift_below_row_up(charts, chart, row, pic, 1);
if (copy) {
- copy_row(overlays, overlay, 0, overlay->tmp_picture, overlay->heirarchy_end, pic);
+ copy_row(charts, chart, 0, chart->tmp_picture, chart->heirarchy_end, pic);
} else {
- fill_row(overlays, overlay, overlay->heirarchy_end, pic, &overlay_trans_color);
+ fill_row(charts, chart, chart->heirarchy_end, pic, &chart_trans_color);
}
}
@@ -344,55 +344,55 @@ static void snowflake_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay, Pict
*/
-static void shift_below_row_down(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int row, Picture pic, int rows)
+static void shift_below_row_down(vwm_charts_t *charts, vwm_chart_t *chart, int row, Picture pic, int rows)
{
- XRenderComposite(overlays->xserver->display, PictOpSrc, pic, None, pic,
- 0, row * OVERLAY_ROW_HEIGHT, /* src */
- 0, 0, /* mask */
- 0, (row + rows) * OVERLAY_ROW_HEIGHT, /* dest */
- overlay->width, overlay->height - (rows + row) * OVERLAY_ROW_HEIGHT); /* dimensions */
+ XRenderComposite(charts->xserver->display, PictOpSrc, pic, None, pic,
+ 0, row * CHART_ROW_HEIGHT, /* src */
+ 0, 0, /* mask */
+ 0, (row + rows) * CHART_ROW_HEIGHT, /* dest */
+ chart->width, chart->height - (rows + row) * CHART_ROW_HEIGHT); /* dimensions */
}
/* shifts what's below a given row down a row, and clears the row, preparing it for populating */
-static void allocate_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay, Picture pic, int row)
+static void allocate_row(vwm_charts_t *charts, vwm_chart_t *chart, Picture pic, int row)
{
- VWM_TRACE("pid=%i overlay=%p row=%i", overlay->monitor->pid, overlay, row);
+ VWM_TRACE("pid=%i chart=%p row=%i", chart->monitor->pid, chart, row);
- shift_below_row_down(overlays, overlay, row, pic, 1);
- fill_row(overlays, overlay, row, pic, &overlay_trans_color);
+ shift_below_row_down(charts, chart, row, pic, 1);
+ fill_row(charts, chart, row, pic, &chart_trans_color);
}
/* shadow a row from the text layer in the shadow layer */
-static void shadow_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int row)
+static void shadow_row(vwm_charts_t *charts, vwm_chart_t *chart, int row)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
/* the current technique for creating the shadow is to simply render the text at +1/-1 pixel offsets on both axis in translucent black */
- XRenderComposite(xserver->display, PictOpSrc, overlays->shadow_fill, overlay->text_picture, overlay->shadow_picture,
+ XRenderComposite(xserver->display, PictOpSrc, charts->shadow_fill, chart->text_picture, chart->shadow_picture,
0, 0,
- -1, row * OVERLAY_ROW_HEIGHT,
- 0, row * OVERLAY_ROW_HEIGHT,
- overlay->visible_width, OVERLAY_ROW_HEIGHT);
+ -1, row * CHART_ROW_HEIGHT,
+ 0, row * CHART_ROW_HEIGHT,
+ chart->visible_width, CHART_ROW_HEIGHT);
- XRenderComposite(xserver->display, PictOpOver, overlays->shadow_fill, overlay->text_picture, overlay->shadow_picture,
+ XRenderComposite(xserver->display, PictOpOver, charts->shadow_fill, chart->text_picture, chart->shadow_picture,
0, 0,
- 0, -1 + row * OVERLAY_ROW_HEIGHT,
- 0, row * OVERLAY_ROW_HEIGHT,
- overlay->visible_width, OVERLAY_ROW_HEIGHT);
+ 0, -1 + row * CHART_ROW_HEIGHT,
+ 0, row * CHART_ROW_HEIGHT,
+ chart->visible_width, CHART_ROW_HEIGHT);
- XRenderComposite(xserver->display, PictOpOver, overlays->shadow_fill, overlay->text_picture, overlay->shadow_picture,
+ XRenderComposite(xserver->display, PictOpOver, charts->shadow_fill, chart->text_picture, chart->shadow_picture,
0, 0,
- 1, row * OVERLAY_ROW_HEIGHT,
- 0, row * OVERLAY_ROW_HEIGHT,
- overlay->visible_width, OVERLAY_ROW_HEIGHT);
+ 1, row * CHART_ROW_HEIGHT,
+ 0, row * CHART_ROW_HEIGHT,
+ chart->visible_width, CHART_ROW_HEIGHT);
- XRenderComposite(xserver->display, PictOpOver, overlays->shadow_fill, overlay->text_picture, overlay->shadow_picture,
+ XRenderComposite(xserver->display, PictOpOver, charts->shadow_fill, chart->text_picture, chart->shadow_picture,
0, 0,
- 0, 1 + row * OVERLAY_ROW_HEIGHT,
- 0, row * OVERLAY_ROW_HEIGHT,
- overlay->visible_width, OVERLAY_ROW_HEIGHT);
+ 0, 1 + row * CHART_ROW_HEIGHT,
+ 0, row * CHART_ROW_HEIGHT,
+ chart->visible_width, CHART_ROW_HEIGHT);
}
@@ -403,8 +403,8 @@ static void argv2xtext(vmon_proc_t *proc, XTextItem *items, int max_items, int *
int nr = 0;
if (proc->is_thread) { /* stick the thread marker at the start of threads */
- items[0].nchars = sizeof(OVERLAY_ISTHREAD_ARGV) - 1;
- items[0].chars = OVERLAY_ISTHREAD_ARGV;
+ items[0].nchars = sizeof(CHART_ISTHREAD_ARGV) - 1;
+ items[0].chars = CHART_ISTHREAD_ARGV;
items[0].delta = 4;
items[0].font = None;
nr++;
@@ -415,8 +415,8 @@ static void argv2xtext(vmon_proc_t *proc, XTextItem *items, int max_items, int *
items[nr].chars = ((vmon_proc_stat_t *)proc->stores[VMON_STORE_PROC_STAT])->comm.array;
} else {
/* sometimes a process is so ephemeral we don't manage to sample its comm, XXX TODO: we always have a pid, stringify it? */
- items[nr].nchars = sizeof(OVERLAY_NOCOMM_ARGV) - 1;
- items[nr].chars = OVERLAY_NOCOMM_ARGV;
+ items[nr].nchars = sizeof(CHART_NOCOMM_ARGV) - 1;
+ items[nr].chars = CHART_NOCOMM_ARGV;
}
items[nr].delta = 4;
items[nr].font = None;
@@ -476,14 +476,14 @@ static int proc_heirarchy_changed(vmon_proc_t *proc)
/* helper for drawing the vertical bars in the graph layers */
-static void draw_bars(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int row, double a_fraction, double a_total, double b_fraction, double b_total)
+static void draw_bars(vwm_charts_t *charts, vwm_chart_t *chart, int row, double a_fraction, double a_total, double b_fraction, double b_total)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
int a_height, b_height;
/* compute the bar heights for this sample */
- a_height = (a_fraction / a_total * (double)(OVERLAY_ROW_HEIGHT - 1)); /* give up 1 pixel for the div */
- b_height = (b_fraction / b_total * (double)(OVERLAY_ROW_HEIGHT - 1));
+ a_height = (a_fraction / a_total * (double)(CHART_ROW_HEIGHT - 1)); /* give up 1 pixel for the div */
+ b_height = (b_fraction / b_total * (double)(CHART_ROW_HEIGHT - 1));
/* round up to 1 pixel when the scaled result is a fraction less than 1,
* I want to at least see 1 pixel blips for the slightest cpu utilization */
@@ -494,51 +494,51 @@ static void draw_bars(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int row,
b_height = 1;
/* draw the two bars for this sample at the current phase in the graphs, note the first is ceiling-based, second floor-based */
- XRenderFillRectangle(xserver->display, PictOpSrc, overlay->grapha_picture, &overlay_visible_color,
- overlay->phase, row * OVERLAY_ROW_HEIGHT, /* dst x, y */
- 1, a_height); /* dst w, h */
- XRenderFillRectangle(xserver->display, PictOpSrc, overlay->graphb_picture, &overlay_visible_color,
- overlay->phase, row * OVERLAY_ROW_HEIGHT + (OVERLAY_ROW_HEIGHT - b_height) - 1, /* dst x, y */
+ XRenderFillRectangle(xserver->display, PictOpSrc, chart->grapha_picture, &chart_visible_color,
+ chart->phase, row * CHART_ROW_HEIGHT, /* dst x, y */
+ 1, a_height); /* dst w, h */
+ XRenderFillRectangle(xserver->display, PictOpSrc, chart->graphb_picture, &chart_visible_color,
+ chart->phase, row * CHART_ROW_HEIGHT + (CHART_ROW_HEIGHT - b_height) - 1, /* dst x, y */
1, b_height); /* dst w, h */
}
/* helper for marking a finish line at the current phase for the specified row */
-static void mark_finish(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int row)
+static void mark_finish(vwm_charts_t *charts, vwm_chart_t *chart, int row)
{
- vwm_xserver_t *xserver = overlays->xserver;
-
- XRenderComposite(xserver->display, PictOpSrc, overlays->finish_fill, None, overlay->grapha_picture,
- 0, 0, /* src x, y */
- 0, 0, /* mask x, y */
- overlay->phase, row * OVERLAY_ROW_HEIGHT, /* dst x, y */
- 1, OVERLAY_ROW_HEIGHT - 1);
- XRenderComposite(xserver->display, PictOpSrc, overlays->finish_fill, None, overlay->graphb_picture,
- 0, 0, /* src x, y */
- 0, 0, /* mask x, y */
- overlay->phase, row * OVERLAY_ROW_HEIGHT, /* dst x, y */
- 1, OVERLAY_ROW_HEIGHT - 1);
+ vwm_xserver_t *xserver = charts->xserver;
+
+ XRenderComposite(xserver->display, PictOpSrc, charts->finish_fill, None, chart->grapha_picture,
+ 0, 0, /* src x, y */
+ 0, 0, /* mask x, y */
+ chart->phase, row * CHART_ROW_HEIGHT, /* dst x, y */
+ 1, CHART_ROW_HEIGHT - 1);
+ XRenderComposite(xserver->display, PictOpSrc, charts->finish_fill, None, chart->graphb_picture,
+ 0, 0, /* src x, y */
+ 0, 0, /* mask x, y */
+ chart->phase, row * CHART_ROW_HEIGHT, /* dst x, y */
+ 1, CHART_ROW_HEIGHT - 1);
}
-/* helper for drawing a proc's argv @ specified x offset and row on the overlay */
-static void print_argv(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int x, int row, vmon_proc_t *proc)
+/* helper for drawing a proc's argv @ specified x offset and row on the chart */
+static void print_argv(vwm_charts_t *charts, vwm_chart_t *chart, int x, int row, vmon_proc_t *proc)
{
- vwm_xserver_t *xserver = overlays->xserver;
- XTextItem items[OVERLAY_MAX_ARGC];
+ vwm_xserver_t *xserver = charts->xserver;
+ XTextItem items[CHART_MAX_ARGC];
int nr_items;
argv2xtext(proc, items, NELEMS(items), &nr_items);
- XDrawText(xserver->display, overlay->text_pixmap, overlays->text_gc,
- x, (row + 1) * OVERLAY_ROW_HEIGHT - 3, /* dst x, y */
+ XDrawText(xserver->display, chart->text_pixmap, charts->text_gc,
+ x, (row + 1) * CHART_ROW_HEIGHT - 3, /* dst x, y */
items, nr_items);
}
/* draws proc in a row of the process heirarchy */
-static void draw_heirarchy_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay, vmon_proc_t *proc, int depth, int row, int heirarchy_changed)
+static void draw_heirarchy_row(vwm_charts_t *charts, vwm_chart_t *chart, vmon_proc_t *proc, int depth, int row, int heirarchy_changed)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
vmon_proc_stat_t *proc_stat = proc->stores[VMON_STORE_PROC_STAT];
vmon_proc_t *child;
char str[256];
@@ -547,7 +547,7 @@ static void draw_heirarchy_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay,
/* process heirarchy text and accompanying per-process details like wchan/pid/state... */
/* skip if obviously unnecessary (this can be further improved, but this makes a big difference as-is) */
- if (!overlay->redraw_needed &&
+ if (!chart->redraw_needed &&
!heirarchy_changed &&
!BITTEST(proc_stat->changed, VMON_PROC_STAT_WCHAN) &&
!BITTEST(proc_stat->changed, VMON_PROC_STAT_PID) &&
@@ -558,9 +558,9 @@ static void draw_heirarchy_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay,
/* TODO: make the columns interactively configurable @ runtime */
if (!proc->is_new)
/* XXX for now always clear the row, this should be capable of being optimized in the future (if the datums driving the text haven't changed...) */
- XRenderFillRectangle(xserver->display, PictOpSrc, overlay->text_picture, &overlay_trans_color,
- 0, row * OVERLAY_ROW_HEIGHT, /* dst x, y */
- overlay->width, OVERLAY_ROW_HEIGHT); /* dst w, h */
+ XRenderFillRectangle(xserver->display, PictOpSrc, chart->text_picture, &chart_trans_color,
+ 0, row * CHART_ROW_HEIGHT, /* dst x, y */
+ chart->width, CHART_ROW_HEIGHT); /* dst w, h */
/* put the process' wchan, state, and PID columns @ the far right */
if (proc->is_thread || list_empty(&proc->threads)) { /* only threads or non-threaded processes include the wchan and state */
@@ -573,42 +573,42 @@ static void draw_heirarchy_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay,
} else { /* we're a process having threads, suppress the wchan and state, as they will be displayed for the thread of same pid */
snprintf(str, sizeof(str), " %5i %n", proc->pid, &str_len);
}
- str_width = XTextWidth(overlays->overlay_font, str, str_len);
+ str_width = XTextWidth(charts->chart_font, str, str_len);
/* the process' comm label indented according to depth, followed with their respective argv's */
- print_argv(overlays, overlay, depth * (OVERLAY_ROW_HEIGHT / 2), row, proc);
+ print_argv(charts, chart, depth * (CHART_ROW_HEIGHT / 2), row, proc);
/* ensure the area for the rest of the stuff is cleared, we don't put much text into thread rows so skip it for those. */
if (!proc->is_thread)
- XRenderFillRectangle(xserver->display, PictOpSrc, overlay->text_picture, &overlay_trans_color,
- overlay->visible_width - str_width, row * OVERLAY_ROW_HEIGHT, /* dst x,y */
- overlay->width - (overlay->visible_width - str_width), OVERLAY_ROW_HEIGHT); /* dst w,h */
+ XRenderFillRectangle(xserver->display, PictOpSrc, chart->text_picture, &chart_trans_color,
+ chart->visible_width - str_width, row * CHART_ROW_HEIGHT, /* dst x,y */
+ chart->width - (chart->visible_width - str_width), CHART_ROW_HEIGHT); /* dst w,h */
- XDrawString(xserver->display, overlay->text_pixmap, overlays->text_gc,
- overlay->visible_width - str_width, (row + 1) * OVERLAY_ROW_HEIGHT - 3, /* dst x, y */
+ XDrawString(xserver->display, chart->text_pixmap, charts->text_gc,
+ chart->visible_width - str_width, (row + 1) * CHART_ROW_HEIGHT - 3, /* dst x, y */
str, str_len);
/* only if this process isn't the root process @ the window shall we consider all relational drawing conditions */
- if (proc != overlay->monitor) {
+ if (proc != chart->monitor) {
vmon_proc_t *ancestor, *sibling, *last_sibling = NULL;
struct list_head *rem;
int needs_tee = 0;
- int bar_x = 0, bar_y = (row + 1) * OVERLAY_ROW_HEIGHT;
+ int bar_x = 0, bar_y = (row + 1) * CHART_ROW_HEIGHT;
int sub;
- /* XXX: everything done in this code block only dirties _this_ process' row in the rendered overlay output */
+ /* XXX: everything done in this code block only dirties _this_ process' row in the rendered chart output */
- /* walk up the ancestors until reaching overlay->monitor, any ancestors we encounter which have more siblings we draw a vertical bar for */
+ /* walk up the ancestors until reaching chart->monitor, any ancestors we encounter which have more siblings we draw a vertical bar for */
/* this draws the |'s in something like: | | | | comm */
- for (sub = 1, ancestor = proc->parent; ancestor && ancestor != overlay->monitor; ancestor = ancestor->parent) {
+ for (sub = 1, ancestor = proc->parent; ancestor && ancestor != chart->monitor; ancestor = ancestor->parent) {
sub++;
- bar_x = (depth - sub) * (OVERLAY_ROW_HEIGHT / 2) + 4;
+ bar_x = (depth - sub) * (CHART_ROW_HEIGHT / 2) + 4;
/* determine if the ancestor has remaining siblings which are not stale, if so, draw a connecting bar at its depth */
for (rem = ancestor->siblings.next; rem != &ancestor->parent->children; rem = rem->next) {
if (!(list_entry(rem, vmon_proc_t, siblings)->is_stale)) {
- XDrawLine(xserver->display, overlay->text_pixmap, overlays->text_gc,
- bar_x, bar_y - OVERLAY_ROW_HEIGHT, /* dst x1, y1 */
+ XDrawLine(xserver->display, chart->text_pixmap, charts->text_gc,
+ bar_x, bar_y - CHART_ROW_HEIGHT, /* dst x1, y1 */
bar_x, bar_y); /* dst x2, y2 (vertical line) */
break; /* stop looking for more siblings at this ancestor when we find one that isn't stale */
}
@@ -654,20 +654,20 @@ static void draw_heirarchy_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay,
/* found a tee is necessary, all that's left is to determine if the tee is a corner and draw it accordingly, stopping the search. */
if (needs_tee) {
- bar_x = (depth - 1) * (OVERLAY_ROW_HEIGHT / 2) + 4;
+ bar_x = (depth - 1) * (CHART_ROW_HEIGHT / 2) + 4;
/* if we're the last sibling, corner the tee by shortening the vbar */
if (proc == last_sibling) {
- XDrawLine(xserver->display, overlay->text_pixmap, overlays->text_gc,
- bar_x, bar_y - OVERLAY_ROW_HEIGHT, /* dst x1, y1 */
+ XDrawLine(xserver->display, chart->text_pixmap, charts->text_gc,
+ bar_x, bar_y - CHART_ROW_HEIGHT, /* dst x1, y1 */
bar_x, bar_y - 4); /* dst x2, y2 (vertical bar) */
} else {
- XDrawLine(xserver->display, overlay->text_pixmap, overlays->text_gc,
- bar_x, bar_y - OVERLAY_ROW_HEIGHT, /* dst x1, y1 */
+ XDrawLine(xserver->display, chart->text_pixmap, charts->text_gc,
+ bar_x, bar_y - CHART_ROW_HEIGHT, /* dst x1, y1 */
bar_x, bar_y); /* dst x2, y2 (vertical bar) */
}
- XDrawLine(xserver->display, overlay->text_pixmap, overlays->text_gc,
+ XDrawLine(xserver->display, chart->text_pixmap, charts->text_gc,
bar_x, bar_y - 4, /* dst x1, y1 */
bar_x + 2, bar_y - 4); /* dst x2, y2 (horizontal bar) */
@@ -677,12 +677,12 @@ static void draw_heirarchy_row(vwm_overlays_t *overlays, vwm_overlay_t *overlay,
}
}
- shadow_row(overlays, overlay, row);
+ shadow_row(charts, chart, row);
}
-/* recursive draw function for "rest" of overlay: the per-process rows (heirarchy, argv, state, wchan, pid...) */
-static void draw_overlay_rest(vwm_overlays_t *overlays, vwm_overlay_t *overlay, vmon_proc_t *proc, int *depth, int *row, int heirarchy_changed)
+/* recursive draw function for "rest" of chart: the per-process rows (heirarchy, argv, state, wchan, pid...) */
+static void draw_chart_rest(vwm_charts_t *charts, vwm_chart_t *chart, vmon_proc_t *proc, int *depth, int *row, int heirarchy_changed)
{
vmon_proc_stat_t *proc_stat = proc->stores[VMON_STORE_PROC_STAT];
vwm_perproc_ctxt_t *proc_ctxt = proc->foo;
@@ -691,7 +691,7 @@ static void draw_overlay_rest(vwm_overlays_t *overlays, vwm_overlay_t *overlay,
/* Some parts of this we must do on every sample to maintain coherence in the graphs, since they're incrementally kept
* in sync with the process heirarchy, allocating and shifting the rows as processes are created and destroyed. Everything
- * else we should be able to skip doing unless overlay.redraw_needed or their contents changed.
+ * else we should be able to skip doing unless chart.redraw_needed or their contents changed.
*/
if (proc->is_stale) {
@@ -704,20 +704,20 @@ static void draw_overlay_rest(vwm_overlays_t *overlays, vwm_overlay_t *overlay,
/* This does require that I do a separate forward recursion to determine the number of rows
* so I can correctly snowflake in reverse */
if (!in_stale) {
- VWM_TRACE("entered stale at overlay=%p depth=%i row=%i", overlay, *depth, *row);
+ VWM_TRACE("entered stale at chart=%p depth=%i row=%i", chart, *depth, *row);
in_stale_entrypoint = in_stale = 1;
(*row) += count_rows(proc) - 1;
}
(*depth)++;
list_for_each_entry_prev(child, &proc->children, siblings) {
- draw_overlay_rest(overlays, overlay, child, depth, row, heirarchy_changed);
+ draw_chart_rest(charts, chart, child, depth, row, heirarchy_changed);
(*row)--;
}
if (!proc->is_thread) {
list_for_each_entry_prev(child, &proc->threads, threads) {
- draw_overlay_rest(overlays, overlay, child, depth, row, heirarchy_changed);
+ draw_chart_rest(charts, chart, child, depth, row, heirarchy_changed);
(*row)--;
}
}
@@ -728,23 +728,23 @@ static void draw_overlay_rest(vwm_overlays_t *overlays, vwm_overlay_t *overlay,
((vmon_proc_stat_t *)proc->stores[VMON_STORE_PROC_STAT])->comm.array,
(*depth), (*row), proc->is_thread);
- mark_finish(overlays, overlay, (*row));
+ mark_finish(charts, chart, (*row));
/* extract the row from the various layers */
- snowflake_row(overlays, overlay, overlay->grapha_picture, 1, (*row));
- snowflake_row(overlays, overlay, overlay->graphb_picture, 1, (*row));
- snowflake_row(overlays, overlay, overlay->text_picture, 0, (*row));
- snowflake_row(overlays, overlay, overlay->shadow_picture, 0, (*row));
- overlay->snowflakes_cnt++;
+ snowflake_row(charts, chart, chart->grapha_picture, 1, (*row));
+ snowflake_row(charts, chart, chart->graphb_picture, 1, (*row));
+ snowflake_row(charts, chart, chart->text_picture, 0, (*row));
+ snowflake_row(charts, chart, chart->shadow_picture, 0, (*row));
+ chart->snowflakes_cnt++;
- /* stamp the name (and whatever else we include) into overlay.text_picture */
- print_argv(overlays, overlay, 5, overlay->heirarchy_end, proc);
- shadow_row(overlays, overlay, overlay->heirarchy_end);
+ /* stamp the name (and whatever else we include) into chart.text_picture */
+ print_argv(charts, chart, 5, chart->heirarchy_end, proc);
+ shadow_row(charts, chart, chart->heirarchy_end);
- overlay->heirarchy_end--;
+ chart->heirarchy_end--;
if (in_stale_entrypoint) {
- VWM_TRACE("exited stale at overlay=%p depth=%i row=%i", overlay, *depth, *row);
+ VWM_TRACE("exited stale at chart=%p depth=%i row=%i", chart, *depth, *row);
in_stale = 0;
}
@@ -753,37 +753,37 @@ static void draw_overlay_rest(vwm_overlays_t *overlays, vwm_overlay_t *overlay,
/* what to do when a process has been introduced */
VWM_TRACE("%i is new", proc->pid);
- allocate_row(overlays, overlay, overlay->grapha_picture, (*row));
- allocate_row(overlays, overlay, overlay->graphb_picture, (*row));
- allocate_row(overlays, overlay, overlay->text_picture, (*row));
- allocate_row(overlays, overlay, overlay->shadow_picture, (*row));
+ allocate_row(charts, chart, chart->grapha_picture, (*row));
+ allocate_row(charts, chart, chart->graphb_picture, (*row));
+ allocate_row(charts, chart, chart->text_picture, (*row));
+ allocate_row(charts, chart, chart->shadow_picture, (*row));
- overlay->heirarchy_end++;
+ chart->heirarchy_end++;
}
/* CPU utilization graphs */
/* use the generation number to avoid recomputing this stuff for callbacks recurring on the same process in the same sample */
- if (proc_ctxt->generation != overlays->vmon.generation) {
+ if (proc_ctxt->generation != charts->vmon.generation) {
proc_ctxt->stime_delta = proc_stat->stime - proc_ctxt->last_stime;
proc_ctxt->utime_delta = proc_stat->utime - proc_ctxt->last_utime;
proc_ctxt->last_utime = proc_stat->utime;
proc_ctxt->last_stime = proc_stat->stime;
- proc_ctxt->generation = overlays->vmon.generation;
+ proc_ctxt->generation = charts->vmon.generation;
}
if (proc->is_new) {
/* we need a minimum of two samples before we can compute a delta to plot,
* so we suppress that and instead mark the start of monitoring with an impossible 100% of both graph contexts, a starting line. */
- stime_delta = utime_delta = overlays->total_delta;
+ stime_delta = utime_delta = charts->total_delta;
} else {
stime_delta = proc_ctxt->stime_delta;
utime_delta = proc_ctxt->utime_delta;
}
- draw_bars(overlays, overlay, *row, stime_delta, overlays->total_delta, utime_delta, overlays->total_delta);
+ draw_bars(charts, chart, *row, stime_delta, charts->total_delta, utime_delta, charts->total_delta);
- draw_heirarchy_row(overlays, overlay, proc, *depth, *row, heirarchy_changed);
+ draw_heirarchy_row(charts, chart, proc, *depth, *row, heirarchy_changed);
(*row)++;
@@ -791,83 +791,83 @@ static void draw_overlay_rest(vwm_overlays_t *overlays, vwm_overlay_t *overlay,
(*depth)++;
if (!proc->is_thread) { /* XXX: the threads member serves as the list head only when not a thread */
list_for_each_entry(child, &proc->threads, threads) {
- draw_overlay_rest(overlays, overlay, child, depth, row, heirarchy_changed);
+ draw_chart_rest(charts, chart, child, depth, row, heirarchy_changed);
}
}
list_for_each_entry(child, &proc->children, siblings) {
- draw_overlay_rest(overlays, overlay, child, depth, row, heirarchy_changed);
+ draw_chart_rest(charts, chart, child, depth, row, heirarchy_changed);
}
(*depth)--;
}
-/* recursive draw function entrypoint, draws the IOWait/Idle/HZ row, then enters draw_overlay_rest() */
-static void draw_overlay(vwm_overlays_t *overlays, vwm_overlay_t *overlay, vmon_proc_t *proc, int *depth, int *row)
+/* recursive draw function entrypoint, draws the IOWait/Idle/HZ row, then enters draw_chart_rest() */
+static void draw_chart(vwm_charts_t *charts, vwm_chart_t *chart, vmon_proc_t *proc, int *depth, int *row)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
int heirarchy_changed = 0;
int str_len, str_width;
char str[256];
/* CPU utilization graphs */
/* IOWait and Idle % @ row 0 */
- draw_bars(overlays, overlay, *row, overlays->iowait_delta, overlays->total_delta, overlays->idle_delta, overlays->total_delta);
+ draw_bars(charts, chart, *row, charts->iowait_delta, charts->total_delta, charts->idle_delta, charts->total_delta);
/* only draw the \/\/\ and HZ if necessary */
- if (overlay->redraw_needed || overlays->prev_sampling_interval != overlays->sampling_interval) {
- snprintf(str, sizeof(str), "\\/\\/\\ %2iHz %n", (int)(overlays->sampling_interval == INFINITY ? 0 : 1 / overlays->sampling_interval), &str_len);
- XRenderFillRectangle(xserver->display, PictOpSrc, overlay->text_picture, &overlay_trans_color,
+ if (chart->redraw_needed || charts->prev_sampling_interval != charts->sampling_interval) {
+ snprintf(str, sizeof(str), "\\/\\/\\ %2iHz %n", (int)(charts->sampling_interval == INFINITY ? 0 : 1 / charts->sampling_interval), &str_len);
+ XRenderFillRectangle(xserver->display, PictOpSrc, chart->text_picture, &chart_trans_color,
0, 0, /* dst x, y */
- overlay->visible_width, OVERLAY_ROW_HEIGHT); /* dst w, h */
- str_width = XTextWidth(overlays->overlay_font, str, str_len);
- XDrawString(xserver->display, overlay->text_pixmap, overlays->text_gc,
- overlay->visible_width - str_width, OVERLAY_ROW_HEIGHT - 3, /* dst x, y */
+ chart->visible_width, CHART_ROW_HEIGHT); /* dst w, h */
+ str_width = XTextWidth(charts->chart_font, str, str_len);
+ XDrawString(xserver->display, chart->text_pixmap, charts->text_gc,
+ chart->visible_width - str_width, CHART_ROW_HEIGHT - 3, /* dst x, y */
str, str_len);
- shadow_row(overlays, overlay, 0);
+ shadow_row(charts, chart, 0);
}
(*row)++;
- if (!overlay->redraw_needed)
+ if (!chart->redraw_needed)
heirarchy_changed = proc_heirarchy_changed(proc);
- draw_overlay_rest(overlays, overlay, proc, depth, row, heirarchy_changed);
+ draw_chart_rest(charts, chart, proc, depth, row, heirarchy_changed);
- overlay->redraw_needed = 0;
+ chart->redraw_needed = 0;
return;
}
-/* consolidated version of overlay text and graph rendering, makes snowflakes integration cleaner, this always gets called regardless of the overlays mode */
-static void maintain_overlay(vwm_overlays_t *overlays, vwm_overlay_t *overlay)
+/* consolidated version of chart text and graph rendering, makes snowflakes integration cleaner, this always gets called regardless of the charts mode */
+static void maintain_chart(vwm_charts_t *charts, vwm_chart_t *chart)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
int row = 0, depth = 0;
- if (!overlay->monitor || !overlay->monitor->stores[VMON_STORE_PROC_STAT])
+ if (!chart->monitor || !chart->monitor->stores[VMON_STORE_PROC_STAT])
return;
/* TODO:
* A side effect of responding to window resizes in this function is there's a latency proportional to the current sample_interval.
- * Something to fix is to resize the overlays when the window resizes.
- * However, simply resizing the overlays is insufficient. Their contents need to be redrawn in the new dimensions, this is where it
- * gets annoying. The current maintain/draw_overlay makes assumptions about being run from the periodic vmon per-process callback.
- * There needs to be a redraw mode added where draw_overlay is just reconstructing the current state, which requires that we suppress
- * the phase advance and in maintain_overlay() and just enter draw_overlay() to redraw everything for the same generation.
- * So this probably requires some tweaking of draw_overlay() as well as maintain_overlay(). I want to be able tocall mainta_overlays()
+ * Something to fix is to resize the charts when the window resizes.
+ * However, simply resizing the charts is insufficient. Their contents need to be redrawn in the new dimensions, this is where it
+ * gets annoying. The current maintain/draw_chart makes assumptions about being run from the periodic vmon per-process callback.
+ * There needs to be a redraw mode added where draw_chart is just reconstructing the current state, which requires that we suppress
+ * the phase advance and in maintain_chart() and just enter draw_chart() to redraw everything for the same generation.
+ * So this probably requires some tweaking of draw_chart() as well as maintain_chart(). I want to be able tocall mainta_charts()
* from anywhere, and have it detect if it's being called on the same generation or if the generation has advanced.
* For now, the monitors will just be a little latent in window resizes which is pretty harmless artifact.
*/
- overlay->phase += (overlay->width - 1); /* simply change this to .phase++ to scroll the other direction */
- overlay->phase %= overlay->width;
- XRenderFillRectangle(xserver->display, PictOpSrc, overlay->grapha_picture, &overlay_trans_color, overlay->phase, 0, 1, overlay->height);
- XRenderFillRectangle(xserver->display, PictOpSrc, overlay->graphb_picture, &overlay_trans_color, overlay->phase, 0, 1, overlay->height);
+ chart->phase += (chart->width - 1); /* simply change this to .phase++ to scroll the other direction */
+ chart->phase %= chart->width;
+ XRenderFillRectangle(xserver->display, PictOpSrc, chart->grapha_picture, &chart_trans_color, chart->phase, 0, 1, chart->height);
+ XRenderFillRectangle(xserver->display, PictOpSrc, chart->graphb_picture, &chart_trans_color, chart->phase, 0, 1, chart->height);
- /* recursively draw the monitored processes to the overlay */
- draw_overlay(overlays, overlay, overlay->monitor, &depth, &row);
+ /* recursively draw the monitored processes to the chart */
+ draw_chart(charts, chart, chart->monitor, &depth, &row);
}
@@ -876,60 +876,60 @@ static void maintain_overlay(vwm_overlays_t *overlays, vwm_overlay_t *overlay)
* It's also where we compose the graphs and text for visible windows into a picture ready for compositing with the window contents */
static void proc_sample_callback(vmon_t *vmon, void *sys_cb_arg, vmon_proc_t *proc, void *proc_cb_arg)
{
- vwm_overlays_t *overlays = sys_cb_arg;
- vwm_overlay_t *overlay = proc_cb_arg;
+ vwm_charts_t *charts = sys_cb_arg;
+ vwm_chart_t *chart = proc_cb_arg;
- VWM_TRACE("proc=%p overlay=%p", proc, overlay);
+ VWM_TRACE("proc=%p chart=%p", proc, chart);
- /* render the various always-updated overlays, this is the component we do regardless of the overlays mode and window visibility,
+ /* render the various always-updated charts, this is the component we do regardless of the charts mode and window visibility,
* essentially the incrementally rendered/historic components */
- maintain_overlay(overlays, overlay);
+ maintain_chart(charts, chart);
- /* XXX TODO: we used to mark repaint as being needed if this overlay's window was mapped, but
- * since extricating overlays from windows that's no longer convenient, and repaint is
+ /* XXX TODO: we used to mark repaint as being needed if this chart's window was mapped, but
+ * since extricating charts from windows that's no longer convenient, and repaint is
* always performed after a sample. Make sure the repainting isn't costly when nothing
- * overlayed is mapped (the case that code optimized)
+ * charted is mapped (the case that code optimized)
*/
}
-/* return the composed height of the overlay */
-static int vwm_overlay_composed_height(vwm_overlays_t *overlays, vwm_overlay_t *overlay)
+/* return the composed height of the chart */
+static int vwm_chart_composed_height(vwm_charts_t *charts, vwm_chart_t *chart)
{
- int snowflakes = overlay->snowflakes_cnt ? 1 + overlay->snowflakes_cnt : 0; /* don't include the separator row if there are no snowflakes */
+ int snowflakes = chart->snowflakes_cnt ? 1 + chart->snowflakes_cnt : 0; /* don't include the separator row if there are no snowflakes */
- return MIN((overlay->heirarchy_end + snowflakes) * OVERLAY_ROW_HEIGHT, overlay->visible_height);
+ return MIN((chart->heirarchy_end + snowflakes) * CHART_ROW_HEIGHT, chart->visible_height);
}
-/* reset snowflakes on the specified overlay */
-void vwm_overlay_reset_snowflakes(vwm_overlays_t *overlays, vwm_overlay_t *overlay)
+/* reset snowflakes on the specified chart */
+void vwm_chart_reset_snowflakes(vwm_charts_t *charts, vwm_chart_t *chart)
{
- if (overlay->snowflakes_cnt) {
- overlay->snowflakes_cnt = 0;
- overlay->redraw_needed = 1;
+ if (chart->snowflakes_cnt) {
+ chart->snowflakes_cnt = 0;
+ chart->redraw_needed = 1;
}
}
-static void free_overlay_pictures(vwm_overlays_t *overlays, vwm_overlay_t *overlay)
+static void free_chart_pictures(vwm_charts_t *charts, vwm_chart_t *chart)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
- XRenderFreePicture(xserver->display, overlay->grapha_picture);
- XRenderFreePicture(xserver->display, overlay->graphb_picture);
- XRenderFreePicture(xserver->display, overlay->tmp_picture);
- XRenderFreePicture(xserver->display, overlay->text_picture);
- XFreePixmap(xserver->display, overlay->text_pixmap);
- XRenderFreePicture(xserver->display, overlay->shadow_picture);
- XRenderFreePicture(xserver->display, overlay->picture);
+ XRenderFreePicture(xserver->display, chart->grapha_picture);
+ XRenderFreePicture(xserver->display, chart->graphb_picture);
+ XRenderFreePicture(xserver->display, chart->tmp_picture);
+ XRenderFreePicture(xserver->display, chart->text_picture);
+ XFreePixmap(xserver->display, chart->text_pixmap);
+ XRenderFreePicture(xserver->display, chart->shadow_picture);
+ XRenderFreePicture(xserver->display, chart->picture);
}
-static void copy_overlay_pictures(vwm_overlays_t *overlays, vwm_overlay_t *src, vwm_overlay_t *dest)
+static void copy_chart_pictures(vwm_charts_t *charts, vwm_chart_t *src, vwm_chart_t *dest)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
if (!src->width)
return;
@@ -963,190 +963,190 @@ static void copy_overlay_pictures(vwm_overlays_t *overlays, vwm_overlay_t *src,
}
-/* (re)size the specified overlay's visible dimensions */
-int vwm_overlay_set_visible_size(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int width, int height)
+/* (re)size the specified chart's visible dimensions */
+int vwm_chart_set_visible_size(vwm_charts_t *charts, vwm_chart_t *chart, int width, int height)
{
- if (width != overlay->visible_width || height != overlay->visible_height)
- overlay->redraw_needed = 1;
+ if (width != chart->visible_width || height != chart->visible_height)
+ chart->redraw_needed = 1;
- /* TODO error handling: if a create failed but we had an overlay, free whatever we created and leave it be, succeed.
+ /* TODO error handling: if a create failed but we had an chart, free whatever we created and leave it be, succeed.
* if none existed it's a hard error and we must propagate it. */
- /* if larger than the overlays currently are, enlarge them */
- if (width > overlay->width || height > overlay->height) {
- vwm_overlay_t existing = *overlay;
+ /* if larger than the charts currently are, enlarge them */
+ if (width > chart->width || height > chart->height) {
+ vwm_chart_t existing = *chart;
- overlay->width = MAX(overlay->width, MAX(width, OVERLAY_GRAPH_MIN_WIDTH));
- overlay->height = MAX(overlay->height, MAX(height, OVERLAY_GRAPH_MIN_HEIGHT));
+ chart->width = MAX(chart->width, MAX(width, CHART_GRAPH_MIN_WIDTH));
+ chart->height = MAX(chart->height, MAX(height, CHART_GRAPH_MIN_HEIGHT));
- overlay->grapha_picture = create_picture_fill(overlays, overlay->width, overlay->height, OVERLAY_MASK_DEPTH, CPRepeat, &pa_repeat, &overlay_trans_color, NULL);
- overlay->graphb_picture = create_picture_fill(overlays, overlay->width, overlay->height, OVERLAY_MASK_DEPTH, CPRepeat, &pa_repeat, &overlay_trans_color, NULL);
- overlay->tmp_picture = create_picture(overlays, overlay->width, OVERLAY_ROW_HEIGHT, OVERLAY_MASK_DEPTH, 0, NULL, NULL);
+ chart->grapha_picture = create_picture_fill(charts, chart->width, chart->height, CHART_MASK_DEPTH, CPRepeat, &pa_repeat, &chart_trans_color, NULL);
+ chart->graphb_picture = create_picture_fill(charts, chart->width, chart->height, CHART_MASK_DEPTH, CPRepeat, &pa_repeat, &chart_trans_color, NULL);
+ chart->tmp_picture = create_picture(charts, chart->width, CHART_ROW_HEIGHT, CHART_MASK_DEPTH, 0, NULL, NULL);
/* keep the text_pixmap reference around for XDrawText usage */
- overlay->text_picture = create_picture_fill(overlays, overlay->width, overlay->height, OVERLAY_MASK_DEPTH, 0, NULL, &overlay_trans_color, &overlay->text_pixmap);
+ chart->text_picture = create_picture_fill(charts, chart->width, chart->height, CHART_MASK_DEPTH, 0, NULL, &chart_trans_color, &chart->text_pixmap);
- overlay->shadow_picture = create_picture_fill(overlays, overlay->width, overlay->height, OVERLAY_MASK_DEPTH, 0, NULL, &overlay_trans_color, NULL);
- overlay->picture = create_picture(overlays, overlay->width, overlay->height, 32, 0, NULL, NULL);
+ chart->shadow_picture = create_picture_fill(charts, chart->width, chart->height, CHART_MASK_DEPTH, 0, NULL, &chart_trans_color, NULL);
+ chart->picture = create_picture(charts, chart->width, chart->height, 32, 0, NULL, NULL);
- copy_overlay_pictures(overlays, &existing, overlay);
- free_overlay_pictures(overlays, &existing);
+ copy_chart_pictures(charts, &existing, chart);
+ free_chart_pictures(charts, &existing);
}
- overlay->visible_width = width;
- overlay->visible_height = height;
+ chart->visible_width = width;
+ chart->visible_height = height;
return 1;
}
-/* create an overlay and start monitoring for the supplied pid */
-vwm_overlay_t * vwm_overlay_create(vwm_overlays_t *overlays, int pid, int width, int height)
+/* create an chart and start monitoring for the supplied pid */
+vwm_chart_t * vwm_chart_create(vwm_charts_t *charts, int pid, int width, int height)
{
- vwm_overlay_t *overlay;
+ vwm_chart_t *chart;
- overlay = calloc(1, sizeof(vwm_overlay_t));
- if (!overlay) {
- VWM_PERROR("Unable to allocate vwm_overlay_t");
+ chart = calloc(1, sizeof(vwm_chart_t));
+ if (!chart) {
+ VWM_PERROR("Unable to allocate vwm_chart_t");
goto _err;
}
/* add the client process to the monitoring heirarchy */
/* XXX note libvmon here maintains a unique callback for each unique callback+xwin pair, so multi-window processes work */
- overlay->monitor = vmon_proc_monitor(&overlays->vmon, NULL, pid, VMON_WANT_PROC_INHERIT, (void (*)(vmon_t *, void *, vmon_proc_t *, void *))proc_sample_callback, overlay);
- if (!overlay->monitor) {
+ chart->monitor = vmon_proc_monitor(&charts->vmon, NULL, pid, VMON_WANT_PROC_INHERIT, (void (*)(vmon_t *, void *, vmon_proc_t *, void *))proc_sample_callback, chart);
+ if (!chart->monitor) {
VWM_ERROR("Unable to establish proc monitor");
goto _err_free;
}
/* FIXME: count_rows() isn't returning the right count sometimes (off by ~1), it seems to be related to racing with the automatic child monitoring */
/* the result is an extra row sometimes appearing below the process heirarchy */
- overlay->heirarchy_end = 1 + count_rows(overlay->monitor);
- overlay->gen_last_composed = -1;
+ chart->heirarchy_end = 1 + count_rows(chart->monitor);
+ chart->gen_last_composed = -1;
- if (!vwm_overlay_set_visible_size(overlays, overlay, width, height)) {
- VWM_ERROR("Unable to set initial overlay size");
+ if (!vwm_chart_set_visible_size(charts, chart, width, height)) {
+ VWM_ERROR("Unable to set initial chart size");
goto _err_unmonitor;
}
- return overlay;
+ return chart;
_err_unmonitor:
- vmon_proc_unmonitor(&overlays->vmon, overlay->monitor, (void (*)(vmon_t *, void *, vmon_proc_t *, void *))proc_sample_callback, overlay);
+ vmon_proc_unmonitor(&charts->vmon, chart->monitor, (void (*)(vmon_t *, void *, vmon_proc_t *, void *))proc_sample_callback, chart);
_err_free:
- free(overlay);
+ free(chart);
_err:
return NULL;
}
-/* stop monitoring and destroy the supplied overlay */
-void vwm_overlay_destroy(vwm_overlays_t *overlays, vwm_overlay_t *overlay)
+/* stop monitoring and destroy the supplied chart */
+void vwm_chart_destroy(vwm_charts_t *charts, vwm_chart_t *chart)
{
- vmon_proc_unmonitor(&overlays->vmon, overlay->monitor, (void (*)(vmon_t *, void *, vmon_proc_t *, void *))proc_sample_callback, overlay);
- free_overlay_pictures(overlays, overlay);
- free(overlay);
+ vmon_proc_unmonitor(&charts->vmon, chart->monitor, (void (*)(vmon_t *, void *, vmon_proc_t *, void *))proc_sample_callback, chart);
+ free_chart_pictures(charts, chart);
+ free(chart);
}
-/* this composes the maintained overlay into the base overlay picture, this gets called from paint_all() on every repaint of xwin */
+/* this composes the maintained chart into the base chart picture, this gets called from paint_all() on every repaint of xwin */
/* we noop the call if the gen_last_composed and monitor->proc.generation numbers match, indicating there's nothing new to compose. */
-void vwm_overlay_compose(vwm_overlays_t *overlays, vwm_overlay_t *overlay, XserverRegion *res_damaged_region)
+void vwm_chart_compose(vwm_charts_t *charts, vwm_chart_t *chart, XserverRegion *res_damaged_region)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
int height;
- if (!overlay->width || !overlay->height)
+ if (!chart->width || !chart->height)
return;
- if (overlay->gen_last_composed == overlay->monitor->generation)
+ if (chart->gen_last_composed == chart->monitor->generation)
return; /* noop if no sampling occurred since last compose */
- overlay->gen_last_composed = overlay->monitor->generation; /* remember this generation */
+ chart->gen_last_composed = chart->monitor->generation; /* remember this generation */
- //VWM_TRACE("composing %p", overlay);
+ //VWM_TRACE("composing %p", chart);
- height = vwm_overlay_composed_height(overlays, overlay);
+ height = vwm_chart_composed_height(charts, chart);
- /* fill the overlay picture with the background */
- XRenderComposite(xserver->display, PictOpSrc, overlays->bg_fill, None, overlay->picture,
+ /* fill the chart picture with the background */
+ XRenderComposite(xserver->display, PictOpSrc, charts->bg_fill, None, chart->picture,
0, 0,
0, 0,
0, 0,
- overlay->visible_width, height);
+ chart->visible_width, height);
- /* draw the graphs into the overlay through the stencils being maintained by the sample callbacks */
- XRenderComposite(xserver->display, PictOpOver, overlays->grapha_fill, overlay->grapha_picture, overlay->picture,
+ /* draw the graphs into the chart through the stencils being maintained by the sample callbacks */
+ XRenderComposite(xserver->display, PictOpOver, charts->grapha_fill, chart->grapha_picture, chart->picture,
0, 0,
- overlay->phase, 0,
+ chart->phase, 0,
0, 0,
- overlay->visible_width, height);
- XRenderComposite(xserver->display, PictOpOver, overlays->graphb_fill, overlay->graphb_picture, overlay->picture,
+ chart->visible_width, height);
+ XRenderComposite(xserver->display, PictOpOver, charts->graphb_fill, chart->graphb_picture, chart->picture,
0, 0,
- overlay->phase, 0,
+ chart->phase, 0,
0, 0,
- overlay->visible_width, height);
+ chart->visible_width, height);
- /* draw the shadow into the overlay picture using a translucent black source drawn through the shadow mask */
- XRenderComposite(xserver->display, PictOpOver, overlays->shadow_fill, overlay->shadow_picture, overlay->picture,
+ /* draw the shadow into the chart picture using a translucent black source drawn through the shadow mask */
+ XRenderComposite(xserver->display, PictOpOver, charts->shadow_fill, chart->shadow_picture, chart->picture,
0, 0,
0, 0,
0, 0,
- overlay->visible_width, height);
+ chart->visible_width, height);
- /* render overlay text into the overlay picture using a white source drawn through the overlay text as a mask, on top of everything */
- XRenderComposite(xserver->display, PictOpOver, overlays->text_fill, overlay->text_picture, overlay->picture,
+ /* render chart text into the chart picture using a white source drawn through the chart text as a mask, on top of everything */
+ XRenderComposite(xserver->display, PictOpOver, charts->text_fill, chart->text_picture, chart->picture,
0, 0,
0, 0,
0, 0,
- overlay->visible_width, (overlay->heirarchy_end * OVERLAY_ROW_HEIGHT));
+ chart->visible_width, (chart->heirarchy_end * CHART_ROW_HEIGHT));
- XRenderComposite(xserver->display, PictOpOver, overlays->snowflakes_text_fill, overlay->text_picture, overlay->picture,
+ XRenderComposite(xserver->display, PictOpOver, charts->snowflakes_text_fill, chart->text_picture, chart->picture,
0, 0,
- 0, overlay->heirarchy_end * OVERLAY_ROW_HEIGHT,
- 0, overlay->heirarchy_end * OVERLAY_ROW_HEIGHT,
- overlay->visible_width, height - (overlay->heirarchy_end * OVERLAY_ROW_HEIGHT));
+ 0, chart->heirarchy_end * CHART_ROW_HEIGHT,
+ 0, chart->heirarchy_end * CHART_ROW_HEIGHT,
+ chart->visible_width, height - (chart->heirarchy_end * CHART_ROW_HEIGHT));
- /* damage the window to ensure the updated overlay is drawn (TODO: this can be done more selectively/efficiently) */
+ /* damage the window to ensure the updated chart is drawn (TODO: this can be done more selectively/efficiently) */
if (res_damaged_region) {
XRectangle damage = {};
- damage.width = overlay->visible_width;
- damage.height = overlay->visible_height;
+ damage.width = chart->visible_width;
+ damage.height = chart->visible_height;
*res_damaged_region = XFixesCreateRegion(xserver->display, &damage, 1);
}
}
-/* render the overlay into a picture at the specified coordinates and dimensions */
-void vwm_overlay_render(vwm_overlays_t *overlays, vwm_overlay_t *overlay, int op, Picture dest, int x, int y, int width, int height)
+/* render the chart into a picture at the specified coordinates and dimensions */
+void vwm_chart_render(vwm_charts_t *charts, vwm_chart_t *chart, int op, Picture dest, int x, int y, int width, int height)
{
- vwm_xserver_t *xserver = overlays->xserver;
+ vwm_xserver_t *xserver = charts->xserver;
- if (!overlay->width || !overlay->height)
+ if (!chart->width || !chart->height)
return;
- /* draw the monitoring overlay atop dest, note we stay within the window borders here. */
- XRenderComposite(xserver->display, op, overlay->picture, None, dest,
- 0, 0, 0, 0, /* src x,y, maxk x, y */
- x, /* dst x */
- y, /* dst y */
- width, MIN(vwm_overlay_composed_height(overlays, overlay), height) /* FIXME */); /* w, h */
+ /* draw the monitoring chart atop dest, note we stay within the window borders here. */
+ XRenderComposite(xserver->display, op, chart->picture, None, dest,
+ 0, 0, 0, 0, /* src x,y, maxk x, y */
+ x, /* dst x */
+ y, /* dst y */
+ width, MIN(vwm_chart_composed_height(charts, chart), height) /* FIXME */); /* w, h */
}
/* increase the sample rate relative to current using the table of intervals */
-void vwm_overlays_rate_increase(vwm_overlays_t *overlays)
+void vwm_charts_rate_increase(vwm_charts_t *charts)
{
int i;
- assert(overlays);
+ assert(charts);
for (i = 0; i < NELEMS(sampling_intervals); i++) {
- if (sampling_intervals[i] < overlays->sampling_interval) {
- overlays->sampling_interval = sampling_intervals[i];
+ if (sampling_intervals[i] < charts->sampling_interval) {
+ charts->sampling_interval = sampling_intervals[i];
break;
}
}
@@ -1154,15 +1154,15 @@ void vwm_overlays_rate_increase(vwm_overlays_t *overlays)
/* decrease the sample rate relative to current using the table of intervals */
-void vwm_overlays_rate_decrease(vwm_overlays_t *overlays)
+void vwm_charts_rate_decrease(vwm_charts_t *charts)
{
int i;
- assert(overlays);
+ assert(charts);
for (i = NELEMS(sampling_intervals) - 1; i >= 0; i--) {
- if (sampling_intervals[i] > overlays->sampling_interval) {
- overlays->sampling_interval = sampling_intervals[i];
+ if (sampling_intervals[i] > charts->sampling_interval) {
+ charts->sampling_interval = sampling_intervals[i];
break;
}
}
@@ -1170,12 +1170,12 @@ void vwm_overlays_rate_decrease(vwm_overlays_t *overlays)
/* set an arbitrary sample rate rather than using one of the presets, 0 to pause */
-void vwm_overlays_rate_set(vwm_overlays_t *overlays, unsigned hertz)
+void vwm_charts_rate_set(vwm_charts_t *charts, unsigned hertz)
{
- assert(overlays);
+ assert(charts);
/* XXX: note floating point divide by 0 simply results in infinity */
- overlays->sampling_interval = 1.0f / (float)hertz;
+ charts->sampling_interval = 1.0f / (float)hertz;
}
@@ -1195,36 +1195,36 @@ static float delta(struct timeval *cur, struct timeval *prev)
}
-/* update the overlays if necessary, return if updating occurred, and duration before another update needed in *desired_delay */
-int vwm_overlays_update(vwm_overlays_t *overlays, int *desired_delay)
+/* update the charts if necessary, return if updating occurred, and duration before another update needed in *desired_delay */
+int vwm_charts_update(vwm_charts_t *charts, int *desired_delay)
{
float this_delta = 0.0f;
int ret = 0;
- gettimeofday(&overlays->maybe_sample, NULL);
- if ((overlays->sampling_interval == INFINITY && !overlays->sampling_paused) || /* XXX this is kind of a kludge to get the 0 Hz indicator drawn before pausing */
- (overlays->sampling_interval != INFINITY && ((this_delta = delta(&overlays->maybe_sample, &overlays->this_sample)) >= overlays->sampling_interval))) {
+ gettimeofday(&charts->maybe_sample, NULL);
+ if ((charts->sampling_interval == INFINITY && !charts->sampling_paused) || /* XXX this is kind of a kludge to get the 0 Hz indicator drawn before pausing */
+ (charts->sampling_interval != INFINITY && ((this_delta = delta(&charts->maybe_sample, &charts->this_sample)) >= charts->sampling_interval))) {
vmon_sys_stat_t *sys_stat;
/* automatically lower the sample rate if we can't keep up with the current sample rate */
- if (overlays->sampling_interval < INFINITY &&
- overlays->sampling_interval <= overlays->prev_sampling_interval &&
- this_delta >= (overlays->sampling_interval * 1.5)) {
+ if (charts->sampling_interval < INFINITY &&
+ charts->sampling_interval <= charts->prev_sampling_interval &&
+ this_delta >= (charts->sampling_interval * 1.5)) {
/* require > 1 contiguous drops before lowering the rate, tolerates spurious one-off stalls */
- if (++overlays->contiguous_drops > 2)
- vwm_overlays_rate_decrease(overlays);
+ if (++charts->contiguous_drops > 2)
+ vwm_charts_rate_decrease(charts);
} else {
- overlays->contiguous_drops = 0;
+ charts->contiguous_drops = 0;
}
/* age the sys-wide sample data into "last" variables, before the new sample overwrites them. */
- overlays->last_sample = overlays->this_sample;
- overlays->this_sample = overlays->maybe_sample;
- if ((sys_stat = overlays->vmon.stores[VMON_STORE_SYS_STAT])) {
- overlays->last_user_cpu = sys_stat->user;
- overlays->last_system_cpu = sys_stat->system;
- overlays->last_total = sys_stat->user +
+ charts->last_sample = charts->this_sample;
+ charts->this_sample = charts->maybe_sample;
+ if ((sys_stat = charts->vmon.stores[VMON_STORE_SYS_STAT])) {
+ charts->last_user_cpu = sys_stat->user;
+ charts->last_system_cpu = sys_stat->system;
+ charts->last_total = sys_stat->user +
sys_stat->nice +
sys_stat->system +
sys_stat->idle +
@@ -1234,19 +1234,19 @@ int vwm_overlays_update(vwm_overlays_t *overlays, int *desired_delay)
sys_stat->steal +
sys_stat->guest;
- overlays->last_idle = sys_stat->idle;
- overlays->last_iowait = sys_stat->iowait;
+ charts->last_idle = sys_stat->idle;
+ charts->last_iowait = sys_stat->iowait;
}
- ret = vmon_sample(&overlays->vmon); /* XXX: calls proc_sample_callback() for explicitly monitored processes after sampling their descendants */
+ ret = vmon_sample(&charts->vmon); /* XXX: calls proc_sample_callback() for explicitly monitored processes after sampling their descendants */
/* XXX: also calls sample_callback() per invocation after sampling the sys wants */
- overlays->sampling_paused = (overlays->sampling_interval == INFINITY);
- overlays->prev_sampling_interval = overlays->sampling_interval;
+ charts->sampling_paused = (charts->sampling_interval == INFINITY);
+ charts->prev_sampling_interval = charts->sampling_interval;
}
/* TODO: make some effort to compute how long to sleep, but this is perfectly fine for now. */
- *desired_delay = overlays->sampling_interval == INFINITY ? -1 : overlays->sampling_interval * 300.0;
+ *desired_delay = charts->sampling_interval == INFINITY ? -1 : charts->sampling_interval * 300.0;
return ret;
}
© All Rights Reserved