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
>> 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;
>>