graph: stop matching tooltips if X diff is too large
[fio.git] / graph.c
diff --git a/graph.c b/graph.c
index 3f2ee6aff2d6d35f5f505a0ef21c8c3bbb82969a..d8f1ba45ab9df005a3c6266278fe7d09dd2c0e25 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -525,6 +525,15 @@ void line_graph_draw(struct graph *g, cairo_t *cr)
        minx = find_xy_value(g, getx, mindouble);
        maxx = find_xy_value(g, getx, maxdouble);
        miny = find_xy_value(g, gety, mindouble);
+
+       /*
+        * Start graphs at zero, unless we have a value below. Otherwise
+        * it's hard to visually compare the read and write graph, since
+        * the lowest valued one will be the floor of the graph view.
+        */
+       if (miny > 0)
+               miny = 0;
+
        maxy = find_xy_value(g, gety, maxdouble);
 
        if (fabs(maxx - minx) < 1e-20 || fabs(maxy - miny) < 1e-20) {
@@ -837,12 +846,18 @@ int graph_contains_xy(struct graph *g, int x, int y)
        return (x >= first_x && x <= last_x) && (y >= first_y && y <= last_y);
 }
 
+/*
+ * Allowable difference to show tooltip
+ */
+#define TOOLTIP_XDIFF  10
+#define TOOLTIP_YDIFF  10
+
 static int xy_match(struct xyvalue *xy, int x, int y)
 {
        int xdiff = abs(xy->gx - x);
        int ydiff = abs(xy->gy - y);
 
-       return xdiff <= 20 && ydiff <= 10;
+       return xdiff <= TOOLTIP_XDIFF && ydiff <= TOOLTIP_YDIFF;
 }
 
 const char *graph_find_tooltip(struct graph *g, int x, int y)
@@ -853,9 +868,17 @@ const char *graph_find_tooltip(struct graph *g, int x, int y)
        for (i = g->labels; i; i = i->next) {
                for (j = i->values; j; j = j->next) {
                        struct xyvalue *xy = j->value;
-
-                       if (xy_match(xy, x - g->xoffset, y))
+                       int graphx = x - g->xoffset;
+
+                       /*
+                        * Return match if close enough. Take advantage
+                        * of the X axis being monotonically increasing,
+                        * so we can break out if we exceed it.
+                        */
+                       if (xy_match(xy, graphx, y))
                                return j->tooltip;
+                       else if (xy->gx - graphx > TOOLTIP_XDIFF)
+                               break;
                }
        }