perf tools tui: Display multiple header lines
[cascardo/linux.git] / tools / perf / ui / browsers / hists.c
index 13d4143..4a7aac8 100644 (file)
@@ -69,8 +69,11 @@ static u32 hist_browser__nr_entries(struct hist_browser *hb)
 static void hist_browser__update_rows(struct hist_browser *hb)
 {
        struct ui_browser *browser = &hb->b;
-       u16 header_offset = hb->show_headers ? 1 : 0, index_row;
+       struct hists *hists = hb->hists;
+       struct perf_hpp_list *hpp_list = hists->hpp_list;
+       u16 header_offset, index_row;
 
+       header_offset = hb->show_headers ? hpp_list->nr_header_lines : 0;
        browser->rows = browser->height - header_offset;
        /*
         * Verify if we were at the last line and that line isn't
@@ -99,8 +102,11 @@ static void hist_browser__refresh_dimensions(struct ui_browser *browser)
 
 static void hist_browser__gotorc(struct hist_browser *browser, int row, int column)
 {
-       u16 header_offset = browser->show_headers ? 1 : 0;
+       struct hists *hists = browser->hists;
+       struct perf_hpp_list *hpp_list = hists->hpp_list;
+       u16 header_offset;
 
+       header_offset = browser->show_headers ? hpp_list->nr_header_lines : 0;
        ui_browser__gotorc(&browser->b, row + header_offset, column);
 }
 
@@ -1496,7 +1502,9 @@ static int advance_hpp_check(struct perf_hpp *hpp, int inc)
        return hpp->size <= 0;
 }
 
-static int hists_browser__scnprintf_headers(struct hist_browser *browser, char *buf, size_t size)
+static int
+hists_browser__scnprintf_headers(struct hist_browser *browser, char *buf,
+                                size_t size, int line)
 {
        struct hists *hists = browser->hists;
        struct perf_hpp dummy_hpp = {
@@ -1517,7 +1525,7 @@ static int hists_browser__scnprintf_headers(struct hist_browser *browser, char *
                if (perf_hpp__should_skip(fmt, hists)  || column++ < browser->b.horiz_scroll)
                        continue;
 
-               ret = fmt->header(fmt, &dummy_hpp, hists);
+               ret = fmt->header(fmt, &dummy_hpp, hists, line);
                if (advance_hpp_check(&dummy_hpp, ret))
                        break;
 
@@ -1554,7 +1562,7 @@ static int hists_browser__scnprintf_hierarchy_headers(struct hist_browser *brows
                if (column++ < browser->b.horiz_scroll)
                        continue;
 
-               ret = fmt->header(fmt, &dummy_hpp, hists);
+               ret = fmt->header(fmt, &dummy_hpp, hists, 0);
                if (advance_hpp_check(&dummy_hpp, ret))
                        break;
 
@@ -1591,7 +1599,7 @@ static int hists_browser__scnprintf_hierarchy_headers(struct hist_browser *brows
                        }
                        first_col = false;
 
-                       ret = fmt->header(fmt, &dummy_hpp, hists);
+                       ret = fmt->header(fmt, &dummy_hpp, hists, 0);
                        dummy_hpp.buf[ret] = '\0';
 
                        start = trim(dummy_hpp.buf);
@@ -1622,14 +1630,21 @@ static void hists_browser__hierarchy_headers(struct hist_browser *browser)
 
 static void hists_browser__headers(struct hist_browser *browser)
 {
-       char headers[1024];
+       struct hists *hists = browser->hists;
+       struct perf_hpp_list *hpp_list = hists->hpp_list;
 
-       hists_browser__scnprintf_headers(browser, headers,
-                                        sizeof(headers));
+       int line;
 
-       ui_browser__gotorc(&browser->b, 0, 0);
-       ui_browser__set_color(&browser->b, HE_COLORSET_ROOT);
-       ui_browser__write_nstring(&browser->b, headers, browser->b.width + 1);
+       for (line = 0; line < hpp_list->nr_header_lines; line++) {
+               char headers[1024];
+
+               hists_browser__scnprintf_headers(browser, headers,
+                                                sizeof(headers), line);
+
+               ui_browser__gotorc(&browser->b, line, 0);
+               ui_browser__set_color(&browser->b, HE_COLORSET_ROOT);
+               ui_browser__write_nstring(&browser->b, headers, browser->b.width + 1);
+       }
 }
 
 static void hist_browser__show_headers(struct hist_browser *browser)
@@ -1656,10 +1671,13 @@ static unsigned int hist_browser__refresh(struct ui_browser *browser)
        u16 header_offset = 0;
        struct rb_node *nd;
        struct hist_browser *hb = container_of(browser, struct hist_browser, b);
+       struct hists *hists = hb->hists;
 
        if (hb->show_headers) {
+               struct perf_hpp_list *hpp_list = hists->hpp_list;
+
                hist_browser__show_headers(hb);
-               header_offset = 1;
+               header_offset = hpp_list->nr_header_lines;
        }
 
        ui_browser__hists_init_top(browser);