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