graph: stop matching tooltips if X diff is too large
authorJens Axboe <axboe@kernel.dk>
Wed, 21 Mar 2012 12:36:46 +0000 (13:36 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 21 Mar 2012 12:36:46 +0000 (13:36 +0100)
Signed-off-by: Jens Axboe <axboe@kernel.dk>
graph.c

diff --git a/graph.c b/graph.c
index 837211dacebdb4f47defcc6e5b02ce9149c0b25c..d8f1ba45ab9df005a3c6266278fe7d09dd2c0e25 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -846,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 <= 10 && ydiff <= 10;
+       return xdiff <= TOOLTIP_XDIFF && ydiff <= TOOLTIP_YDIFF;
 }
 
 const char *graph_find_tooltip(struct graph *g, int x, int y)
@@ -862,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;
                }
        }