Re: [Powertop] PowerTOP UI navigation enhancement.

Chris Ferron <chris.e.ferron at linux.intel.com> Tue, 11 Sep 2012 10:07:57 -0700
Newsgroups dev.linux.lists.powertop
Message-ID <[email protected]>
--===============5096045722373087109==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable

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 !=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
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 =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_=
pos++; repaint(); } ;
>> -	virtual void cursor_up(void) { if (cursor_pos > 0) cursor_pos--; repai=
nt(); };
>> +	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;
>>


--===============5096045722373087109==--