Re: [Powertop] PowerTOP UI navigation enhancement.
Sergey Senozhatsky <sergey.senozhatsky at gmail.com> Tue, 11 Sep 2012 19:55:42 +0300
| Newsgroups | dev.linux.lists.powertop |
|---|---|
| Message-ID | <[email protected]> |
--===============8879067603530677839==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
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 !=3D 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
> 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 =3D 17;
> const char *c;
> @@ -145,11 +145,11 @@ void show_tab(unsigned int tab)
> wrefresh(tab_bar);
> wrefresh(bottom_line);
> =
> - win =3D get_ncurses_win(tab_names[tab]);
> + win =3D 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 =3D tab_windows[tab_names[current_tab]];
> + if (w)
> + w->hide();
> =
> - w =3D tab_windows[tab_names[current_tab]];
> - if (w)
> - w->hide();
> + current_tab --;
> + if (current_tab < 0)
> + current_tab =3D tab_names.size() - 1;
> =
> - current_tab ++;
> - if (current_tab >=3D (int)tab_names.size())
> - current_tab =3D 0;
> -
> - w =3D tab_windows[tab_names[current_tab]];
> - if (w)
> - w->expose();
> + w =3D 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 =3D tab_windows[tab_names[current_tab]];
> if (w)
> w->hide();
> =
> - current_tab --;
> - if (current_tab < 0)
> - current_tab =3D tab_names.size() - 1;
> + current_tab ++;
> + if (current_tab >=3D (int)tab_names.size())
> + current_tab =3D 0;
> =
> w =3D tab_windows[tab_names[current_tab]];
> if (w)
> @@ -241,8 +240,16 @@ void cursor_down(void)
> class tab_window *w;
> =
> w =3D tab_windows[tab_names[current_tab]];
> - if (w)
> - w->cursor_down();
> + if (w) {
> + if (tab_names[current_tab] =3D=3D "Tunables") {
> + if ((w->cursor_pos + 7) >=3D 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 =3D 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] =3D=3D "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 =3D 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 =3D 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 =3D tab_windows[tab_names[current_tab]];
> =
> if (w) {
> + w->ypad_pos =3D 0;
> + w->xpad_pos =3D 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_p=
os++; repaint(); } ;
> - virtual void cursor_up(void) { if (cursor_pos > 0) cursor_pos--; repain=
t(); };
> + 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 =3D 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;
> =
--===============8879067603530677839==--