In the previous patch, horizontal scrolling was added to TUI browser.
However it lacks support for callchains.  This patch adds it.

Signed-off-by: Namhyung Kim <[email protected]>
---
 tools/perf/ui/browsers/hists.c | 46 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 41 insertions(+), 5 deletions(-)

diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 9f6e960be3a6..10af42f5283e 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -526,6 +526,7 @@ struct callchain_print_arg {
        /* for file dump */
        FILE    *fp;
        int     printed;
+       int     skip_cols;
 };
 
 typedef void (*print_callchain_entry_fn)(struct hist_browser *browser,
@@ -534,6 +535,30 @@ typedef void (*print_callchain_entry_fn)(struct 
hist_browser *browser,
                                         unsigned short row,
                                         struct callchain_print_arg *arg);
 
+static int callchain_print_skip(struct callchain_print_arg *arg,
+                               const char *str, int width)
+{
+       if (arg->skip_cols) {
+               int len = strlen(str);
+
+               if (width <= arg->skip_cols) {
+                       arg->skip_cols -= width;
+                       return 0;
+               }
+
+               if (arg->skip_cols < len)
+                       str += arg->skip_cols;
+               else
+                       str = " ";
+
+               width -= arg->skip_cols;
+               arg->skip_cols = 0;
+       }
+
+       slsmg_write_nstring(str, width);
+       return width;
+}
+
 static void hist_browser__show_callchain_entry(struct hist_browser *browser,
                                               struct callchain_list *chain,
                                               const char *str, int offset,
@@ -543,9 +568,10 @@ static void hist_browser__show_callchain_entry(struct 
hist_browser *browser,
        int color, width;
        char folded_sign = callchain_list__folded(chain);
        bool show_annotated = browser->show_dso && chain->ms.sym && 
symbol__annotation(chain->ms.sym)->src;
+       char buf[2] = { folded_sign, 0 };
 
        color = HE_COLORSET_NORMAL;
-       width = browser->b.width - (offset + 2);
+       width = browser->b.width;
        if (ui_browser__is_current_entry(&browser->b, row)) {
                browser->selection = &chain->ms;
                color = HE_COLORSET_SELECTED;
@@ -554,10 +580,17 @@ static void hist_browser__show_callchain_entry(struct 
hist_browser *browser,
 
        ui_browser__set_color(&browser->b, color);
        hist_browser__gotorc(browser, row, 0);
-       slsmg_write_nstring(" ", offset);
-       slsmg_printf("%c", folded_sign);
-       ui_browser__write_graph(&browser->b, show_annotated ? SLSMG_RARROW_CHAR 
: ' ');
-       slsmg_write_nstring(str, width);
+       width -= callchain_print_skip(arg, " ", offset);
+       width -= callchain_print_skip(arg, buf, 1);
+       if (arg->skip_cols > 0)
+               arg->skip_cols--;
+       else {
+               ui_browser__write_graph(&browser->b,
+                                       show_annotated ? SLSMG_RARROW_CHAR : ' 
');
+               width--;
+       }
+       width -= callchain_print_skip(arg, str, width);
+       slsmg_write_nstring("", width);
 }
 
 static void hist_browser__fprintf_callchain_entry(struct hist_browser *b 
__maybe_unused,
@@ -642,6 +675,7 @@ static int hist_browser__show_callchain(struct hist_browser 
*browser,
                                        str = alloc_str;
                        }
 
+                       arg->skip_cols = browser->skip_cols;
                        print(browser, chain, str, offset + extra_offset, row, 
arg);
 
                        free(alloc_str);
@@ -661,6 +695,7 @@ do_next:
                        else
                                new_total = total;
 
+                       arg->skip_cols = browser->skip_cols;
                        row += hist_browser__show_callchain(browser, 
&child->rb_root,
                                                            new_level, row, 
new_total,
                                                            print, arg, 
is_output_full);
@@ -867,6 +902,7 @@ static int hist_browser__show_entry(struct hist_browser 
*browser,
                struct callchain_print_arg arg = {
                        .row_offset = row_offset,
                        .is_current_entry = current_entry,
+                       .skip_cols = browser->skip_cols,
                };
 
                if (callchain_param.mode == CHAIN_GRAPH_REL) {
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to