perf ui browser: Optional horizontal scrolling key binding
authorArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 11 Aug 2015 20:14:40 +0000 (17:14 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 5 Oct 2015 20:59:49 +0000 (17:59 -0300)
If the classes derived from ui_browser want to do some sort of
horizontal scrolling, they have just to set ui_browser->columns to
the number of columns available.

Those columns can be the number of characters on the screen, if what is
desired is to scroll character by character, or the number of columns in
a spreadsheet like table.

This is what the hist_browser will do, skipping ui_browser->horiz_scroll
columns when rendering each of its lines.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-q6a22bpmpgcr1awgzrmd4jrs@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/ui/browser.c
tools/perf/ui/browser.h

index c6c7e5189214fb7f8df1c3fb3659a673d80e8ffa..e9703c0829f104bf9d7819d04831306cfd31dbe8 100644 (file)
@@ -393,6 +393,7 @@ int ui_browser__run(struct ui_browser *browser, int delay_secs)
 
                if (browser->use_navkeypressed && !browser->navkeypressed) {
                        if (key == K_DOWN || key == K_UP ||
+                           (browser->columns && (key == K_LEFT || key == K_RIGHT)) ||
                            key == K_PGDN || key == K_PGUP ||
                            key == K_HOME || key == K_END ||
                            key == ' ') {
@@ -421,6 +422,18 @@ int ui_browser__run(struct ui_browser *browser, int delay_secs)
                                browser->seek(browser, -1, SEEK_CUR);
                        }
                        break;
+               case K_RIGHT:
+                       if (!browser->columns)
+                               goto out;
+                       if (browser->horiz_scroll < browser->columns - 1)
+                               ++browser->horiz_scroll;
+                       break;
+               case K_LEFT:
+                       if (!browser->columns)
+                               goto out;
+                       if (browser->horiz_scroll != 0)
+                               --browser->horiz_scroll;
+                       break;
                case K_PGDN:
                case ' ':
                        if (browser->top_idx + browser->rows > browser->nr_entries - 1)
@@ -459,6 +472,7 @@ int ui_browser__run(struct ui_browser *browser, int delay_secs)
                        browser->seek(browser, -offset, SEEK_END);
                        break;
                default:
+               out:
                        return key;
                }
        }
index f3cef564de02e7262c820d52b3063543adf9c2fc..01781de59532ce9c9fd1ff7f8c7fdf97d45fa105 100644 (file)
@@ -14,7 +14,7 @@
 struct ui_browser {
        u64           index, top_idx;
        void          *top, *entries;
-       u16           y, x, width, height, rows;
+       u16           y, x, width, height, rows, columns, horiz_scroll;
        int           current_color;
        void          *priv;
        const char    *title;