[Powertop] [PATCH] tuninig: resize scaling support (v1)

Sergey Senozhatsky <sergey.senozhatsky at gmail.com> Thu, 23 Aug 2012 01:47:03 +0300
Newsgroups dev.linux.lists.powertop
Message-ID <[email protected]>
--===============7690496166095949276==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable

tuninig: resize scaling support v1

Initial version of terminal window resize support for tuning tab.
Supports both X and Y scalings:
-- X scaling: truncation (*)
* tunable result and description strings are now stored in dynamic
array, limited in size to current window X (mod MAX_LEN).

-- Y scaling: paging and scrolling


Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky(a)gmail.com>

---

 src/tuning/tuning.cpp | 87 +++++++++++++++++++++++++++++++++++------------=
----
 1 file changed, 60 insertions(+), 27 deletions(-)

diff --git a/src/tuning/tuning.cpp b/src/tuning/tuning.cpp
index 4893597..541e9e0 100644
--- a/src/tuning/tuning.cpp
+++ b/src/tuning/tuning.cpp
@@ -28,7 +28,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <ncurses.h>
-
+#include <math.h>
 =

 #include "tuning.h"
 #include "tuningsysfs.h"
@@ -79,48 +79,81 @@ void initialize_tuning(void)
 	create_tab("Tunables", _("Tunables"), w, _(" <ESC> Exit | <Enter> Toggle =
tunable | <r> Window refresh"));
 =

 	init_tuning();
-
 	w->cursor_max =3D all_tunables.size() - 1;
 }
 =

+#define XINDENT	3
+#define YINDENT	4
+#define MAX_LEN	4096
 =

+static void redraw_window(WINDOW *win, int begin, int end, int cursor_pos)
+{
+	int x, y, i;
+	getmaxyx(stdscr, y, x);
+	=

+	wclrtoeol(win);
+	wmove(win, 1, 0);
+	x %=3D MAX_LEN;
+
+	for (y =3D 0, i =3D begin; i < end; i++, y++) {
+		char truncate =3D 0;
+		size_t sz =3D 0;
+		char line[x + 1];
+		if ((int)(y) !=3D cursor_pos) {
+			wattrset(win, A_NORMAL);
+			sz =3D snprintf(line, x, "   ");
+		} else {
+			wattrset(win, A_REVERSE);
+			sz =3D snprintf(line, x, ">> ");
+		}
+		sz +=3D snprintf(line + sz, x, "%s", all_tunables[i]->result_string());
+		while (sz < 12)
+			sz +=3D snprintf(line + sz, x, " ");
+		sz +=3D snprintf(line + sz, x, "%s", all_tunables[i]->description());
+		if ((int)sz > x - XINDENT)
+			truncate =3D 1;
+		while ((int)sz < x - XINDENT)
+			sz +=3D snprintf(line + sz, x, " ");
+		if (truncate)
+			sz +=3D snprintf(line + x - XINDENT - 1, x, "~\n");
+		else
+			sz +=3D snprintf(line + sz, x, "\n");
+
+		waddnstr(win, line, sz);
+	}
+}
 =

 static void __tuning_update_display(int cursor_pos)
 {
+	static int last_frame_nr =3D 0;
+	int x, y, begin, end, frame_nr;
 	WINDOW *win;
-	unsigned int i;
-
+        =

 	win =3D get_ncurses_win("Tunables");
-
 	if (!win)
 		return;
+	getmaxyx(stdscr, y, x);
+
+	y -=3D YINDENT;
+	frame_nr =3D ceil(cursor_pos / y);
+	end =3D (frame_nr + 1) * y;
+	if (end > (int)all_tunables.size())
+		end =3D all_tunables.size();
+
+	begin =3D frame_nr * y;
+	/* actual cursor position is frame-dependent */
+	cursor_pos -=3D frame_nr * y;
+	if (frame_nr !=3D last_frame_nr)
+		should_clear =3D TRUE;
+	last_frame_nr =3D frame_nr;
 =

 	if (should_clear) {
-		should_clear =3D false;
+		should_clear =3D FALSE;
 		wclear(win);
 	}
 =

-	wmove(win, 2,0);
-
-	for (i =3D 0; i < all_tunables.size(); i++) {
-		char res[128];
-		char desc[4096];
-		strcpy(res, all_tunables[i]->result_string());
-		strcpy(desc, all_tunables[i]->description());
-		while (strlen(res) < 12)
-			strcat(res, " ");
-
-		while (strlen(desc) < 103)
-			strcat(desc, " ");
-		if ((int)i !=3D cursor_pos) {
-			wattrset(win, A_NORMAL);
-			wprintw(win, "   ");
-		} else {
-			wattrset(win, A_REVERSE);
-			wprintw(win, ">> ");
-		}
-		wprintw(win, "%s  %s\n", _(res), _(desc));
-	}
+	redraw_window(win, begin, end, cursor_pos);
+	wnoutrefresh(win);
 }
 =

 void tuning_update_display(void)


--===============7690496166095949276==--