Re: [Powertop] PowerTOP UI navigation enhancement.

Sergey Senozhatsky <sergey.senozhatsky at gmail.com> Tue, 11 Sep 2012 20:08:29 +0300
Newsgroups dev.linux.lists.powertop
Message-ID <[email protected]>
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;
> >>
>