Re: [Powertop] PowerTOP UI navigation enhancement.

Ferron, Chris E <chris.e.ferron at intel.com> Tue, 11 Sep 2012 10:16:47 -0700
Newsgroups dev.linux.lists.powertop
Message-ID <CAMFVxVhQ8tLmYiBbx423Ubr7LJFOT4bfOkBhtBxNa0WxKJbw4Q@mail.gmail.com>
On Tue, Sep 11, 2012 at 10:08 AM, Sergey Senozhatsky
<sergey.senozhatsky(a)gmail.com> wrote:
> On (09/11/12 10:07), Chris Ferron wrote:
>> On 09/11/2012 09:55 AM, Sergey Senozhatsky wrote:
>> >On (09/11/12 09:39), Chris Ferron wrote:
>> >>This patch add more ui navigation features allowing for the scrolling
>> >>of PowerTop content for each tab. This is done by controlling the
>> >>location of the winpad, and refreshing the terminal window when
>> >>needed. To do this, the navigation keys have been updated as follows.
>> >>
>> >>"Arrow Keys" now scroll the tab windows
>> >>"Page up/down" scroll tab windows up and down
>> >>"TAB" cycles the next window tab
>> >>"SHIFT+TAB" cycles the previous window tab
>> >>"ENTER" toggles tunables
>> >>"SPACE BAR" toggles tunables
>> >>"r KEY" refresh results and resets view of tab window.
>> >>
>> >>Known issues:
>> >>There is no handler for terminal re-sizing. The workaround is to use
>> >>"r KEY" to refresh if terminal windows size is changed mid session.
>> >>---
>> >>  src/cpu/abstract_cpu.cpp |  1 -
>> >>  src/display.cpp          | 98
>> >>++++++++++++++++++++++++++++++++++--------------
>> >>  src/display.h            | 13 ++++++-
>> >>  src/main.cpp             | 17 ++++++---
>> >>  4 files changed, 93 insertions(+), 36 deletions(-)
>> >>
>> >>
>> >>diff --git a/src/cpu/abstract_cpu.cpp b/src/cpu/abstract_cpu.cpp
>> >>index 8b4c650..ca6901c 100644
>> >>--- a/src/cpu/abstract_cpu.cpp
>> >>+++ b/src/cpu/abstract_cpu.cpp
>> >>@@ -422,7 +422,6 @@ void abstract_cpu::validate(void)
>> >>            if (children[i]) {
>> >>                    if (my_time != children[i]->total_pstate_time())
>> >>-                           printf("My (%i) time %llu is not the same as child (%i) time %llu\n",
>> >>                                    first_cpu,
>> >>                                    (unsigned long long)my_time,
>> >>                                    children[i]->number,
>> >
>> >not sure this will compile.
>> >
>> >
>> >     -ss
>> Crap thanks, v2 on the way.
>> -C
>
> no problem
>
>
>>
>> >
>> >>diff --git a/src/display.cpp b/src/display.cpp
>> >>index f48b53f..6a119bc 100644
>> >>--- a/src/display.cpp
>> >>+++ b/src/display.cpp
>> >>@@ -95,7 +95,7 @@ static int current_tab;
>> >>  void show_tab(unsigned int tab)
>> >>  {
>> >>-   WINDOW *win;
>> >>+   class tab_window *win;
>> >>    unsigned int i;
>> >>    int tab_pos = 17;
>> >>    const char *c;
>> >>@@ -145,11 +145,11 @@ void show_tab(unsigned int tab)
>> >>    wrefresh(tab_bar);
>> >>    wrefresh(bottom_line);
>> >>-   win = get_ncurses_win(tab_names[tab]);
>> >>+   win = tab_windows[tab_names[tab]];
>> >>    if (!win)
>> >>            return;
>> >>-   prefresh(win, 0, 0, 1, 0, LINES - 3, COLS - 1);
>> >>+   prefresh(win->win, win->ypad_pos, win->xpad_pos, 1, 0, LINES - 3, COLS - 1);
>> >>  }
>> >>  WINDOW *get_ncurses_win(const char *name)
>> >>@@ -185,42 +185,41 @@ WINDOW *get_ncurses_win(const string &name)
>> >>    return get_ncurses_win(name.c_str());
>> >>  }
>> >>-
>> >>-void show_next_tab(void)
>> >>+void show_prev_tab(void)
>> >>  {
>> >>-   class tab_window *w;
>> >>+       class tab_window *w;
>> >>-   if (!display)
>> >>-           return;
>> >>+       if (!display)
>> >>+               return;
>> >>+       w = tab_windows[tab_names[current_tab]];
>> >>+       if (w)
>> >>+               w->hide();
>> >>-   w = tab_windows[tab_names[current_tab]];
>> >>-   if (w)
>> >>-           w->hide();
>> >>+       current_tab --;
>> >>+       if (current_tab < 0)
>> >>+               current_tab = tab_names.size() - 1;
>> >>-   current_tab ++;
>> >>-   if (current_tab >= (int)tab_names.size())
>> >>-           current_tab = 0;
>> >>-
>> >>-   w = tab_windows[tab_names[current_tab]];
>> >>-   if (w)
>> >>-           w->expose();
>> >>+       w = tab_windows[tab_names[current_tab]];
>> >>+       if (w)
>> >>+               w->expose();
>> >>-   show_tab(current_tab);
>> >>+       show_tab(current_tab);
>> >>  }
>> >>-void show_prev_tab(void)
>> >>+void show_next_tab(void)
>> >>  {
>> >>    class tab_window *w;
>> >>    if (!display)
>> >>            return;
>> >>+
>> >>    w = tab_windows[tab_names[current_tab]];
>> >>    if (w)
>> >>            w->hide();
>> >>-   current_tab --;
>> >>-   if (current_tab < 0)
>> >>-           current_tab = tab_names.size() - 1;
>> >>+   current_tab ++;
>> >>+   if (current_tab >= (int)tab_names.size())
>> >>+           current_tab = 0;
>> >>    w = tab_windows[tab_names[current_tab]];
>> >>    if (w)
>> >>@@ -241,8 +240,16 @@ void cursor_down(void)
>> >>    class tab_window *w;
>> >>    w = tab_windows[tab_names[current_tab]];
>> >>-   if (w)
>> >>-           w->cursor_down();
>> >>+   if (w) {
>> >>+           if (tab_names[current_tab] == "Tunables") {
>> >>+                   if ((w->cursor_pos + 7) >= LINES) {
>> >>+                           prefresh(w->win, ++w->ypad_pos, w->xpad_pos, 1, 0, LINES - 3, COLS - 1);
>> >>+                   }
>> >>+                           w->cursor_down();
>> >>+           } else {
>> >>+                   prefresh(w->win, ++w->ypad_pos, w->xpad_pos, 1, 0, LINES - 3, COLS - 1);
>> >>+           }
>> >>+   }
>> >>    show_cur_tab();
>> >>  }
>> >>@@ -253,12 +260,45 @@ void cursor_up(void)
>> >>    w = tab_windows[tab_names[current_tab]];
>> >>-   if (w)
>> >>-           w->cursor_up();
>> >>-
>> >>+   if (w) {
>> >>+           w->cursor_up();
>> >>+           if(w->ypad_pos > 0) {
>> >>+                   if (tab_names[current_tab] == "Tunables") {
>> >>+                          prefresh(w->win, --w->ypad_pos, w->xpad_pos, 1, 0, LINES - 3, COLS - 1);
>> >>+                   } else {
>> >>+                          prefresh(w->win, --w->ypad_pos, w->xpad_pos, 1, 0, LINES - 3, COLS - 1);
>> >>+                   }
>> >>+           }
>> >>+   }
>> >>+
>> >>    show_cur_tab();
>> >>  }
>> >>+void cursor_left(void)
>> >>+{
>> >>+        class tab_window *w;
>> >>+
>> >>+   w = tab_windows[tab_names[current_tab]];
>> >>+
>> >>+   if (w) {
>> >>+           if (w->xpad_pos > 0) {
>> >>+                   prefresh(w->win, w->ypad_pos,--w->xpad_pos, 1, 0, LINES - 3, COLS - 1);
>> >>+           }
>> >>+   }
>> >>+}
>> >>+
>> >>+void cursor_right(void)
>> >>+{
>> >>+        class tab_window *w;
>> >>+
>> >>+   w = tab_windows[tab_names[current_tab]];
>> >>+
>> >>+   if (w) {
>> >>+           prefresh(w->win, w->ypad_pos, ++w->xpad_pos, 1, 0, LINES - 3, COLS - 1);
>> >>+   }
>> >>+
>> >>+}
>> >>+
>> >>  void cursor_enter(void)
>> >>  {
>> >>    class tab_window *w;
>> >>@@ -279,6 +319,8 @@ void window_refresh()
>> >>    w = tab_windows[tab_names[current_tab]];
>> >>    if (w) {
>> >>+           w->ypad_pos = 0;
>> >>+           w->xpad_pos = 0;
>> >>            w->window_refresh();
>> >>            w->repaint();
>> >>    }
>> >>diff --git a/src/display.h b/src/display.h
>> >>index 33aaae1..00887aa 100644
>> >>--- a/src/display.h
>> >>+++ b/src/display.h
>> >>@@ -41,6 +41,8 @@ extern void show_prev_tab(void);
>> >>  extern void show_cur_tab(void);
>> >>  extern void cursor_up(void);
>> >>  extern void cursor_down(void);
>> >>+extern void cursor_right(void);
>> >>+extern void cursor_left(void);
>> >>  extern void cursor_enter(void);
>> >>  extern void window_refresh(void);
>> >>@@ -48,10 +50,17 @@ class tab_window {
>> >>  public:
>> >>    int cursor_pos;
>> >>    int cursor_max;
>> >>+   int xpad_pos, ypad_pos;
>> >>    WINDOW *win;
>> >>-   virtual void cursor_down(void) { if (cursor_pos < cursor_max ) cursor_pos++; repaint(); } ;
>> >>-   virtual void cursor_up(void) { if (cursor_pos > 0) cursor_pos--; repaint(); };
>> >>+   virtual void cursor_down(void) {
>> >>+           if (cursor_pos < cursor_max ) cursor_pos++; repaint();
>> >>+   } ;
>> >>+   virtual void cursor_up(void) {
>> >>+           if (cursor_pos > 0) cursor_pos--; repaint();
>> >>+   };
>> >>+   virtual void cursor_left(void) { };
>> >>+   virtual void cursor_right(void) { };
>> >>    virtual void cursor_enter(void) { };
>> >>    virtual void window_refresh() { };
>> >>diff --git a/src/main.cpp b/src/main.cpp
>> >>index cf47b4e..edc4147 100644
>> >>--- a/src/main.cpp
>> >>+++ b/src/main.cpp
>> >>@@ -135,22 +135,29 @@ static void do_sleep(int seconds)
>> >>            halfdelay(delta * 10);
>> >>            c = getch();
>> >>-
>> >>+           printf("c (%i)", c);
>
>
> could we please push debug output to stderr, for example, and run 'powertop 2 > cursor_pos_log'.
> printf() just messes with ncurses output.
>
>
>         -ss
Yes absolutely.
-C

>
>
>> >>            switch (c) {
>> >>-           case KEY_NPAGE:
>> >>+           case 353:
>> >>+                   show_prev_tab();
>> >>+                   break;
>> >>+           case 9:
>> >>+                   show_next_tab();
>> >>+                   break;
>> >>            case KEY_RIGHT:
>> >>-                   show_next_tab();
>> >>+                   cursor_right();
>> >>                    break;
>> >>-           case KEY_PPAGE:
>> >>            case KEY_LEFT:
>> >>-                   show_prev_tab();
>> >>+                   cursor_left();
>> >>                    break;
>> >>+           case KEY_NPAGE:
>> >>            case KEY_DOWN:
>> >>                    cursor_down();
>> >>                    break;
>> >>+           case KEY_PPAGE:
>> >>            case KEY_UP:
>> >>                    cursor_up();
>> >>                    break;
>> >>+           case 32:
>> >>            case 10:
>> >>                    cursor_enter();
>> >>                    break;
>> >>
>>
> _______________________________________________
> PowerTop mailing list
> PowerTop(a)lists.01.org
> https://lists.01.org/mailman/listinfo/powertop