On (08/23/12 01:47), Sergey Senozhatsky wrote:
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 = 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 %= MAX_LEN;
+
+ for (y = 0, i = begin; i < end; i++, y++) {
+ char truncate = 0;
+ size_t sz = 0;
+ char line[x + 1];
+ if ((int)(y) != cursor_pos) {
+ wattrset(win, A_NORMAL);
+ sz = snprintf(line, x, " ");
+ } else {
+ wattrset(win, A_REVERSE);
+ sz = snprintf(line, x, ">> ");
+ }
+ sz += snprintf(line + sz, x, "%s", all_tunables[i]->result_string());
Hm, I guess the correct way is
_(all_tunables[i]->result_string())
+ while (sz < 12)
+ sz += snprintf(line + sz, x, " ");
+ sz += snprintf(line + sz, x, "%s", all_tunables[i]->description());
the same
_(all_tunables[i]->description())
+ if ((int)sz > x - XINDENT)
+ truncate = 1;
+ while ((int)sz < x - XINDENT)
+ sz += snprintf(line + sz, x, " ");
+ if (truncate)
+ sz += snprintf(line + x - XINDENT - 1, x, "~\n");
+ else
+ sz += snprintf(line + sz, x, "\n");
+
+ waddnstr(win, line, sz);
+ }
+}
static void __tuning_update_display(int cursor_pos)
{
+ static int last_frame_nr = 0;
+ int x, y, begin, end, frame_nr;
WINDOW *win;
- unsigned int i;
-
+
win = get_ncurses_win("Tunables");
-
if (!win)
return;
+ getmaxyx(stdscr, y, x);
+
+ y -= YINDENT;
+ frame_nr = ceil(cursor_pos / y);
+ end = (frame_nr + 1) * y;
+ if (end > (int)all_tunables.size())
+ end = all_tunables.size();
+
+ begin = frame_nr * y;
+ /* actual cursor position is frame-dependent */
+ cursor_pos -= frame_nr * y;
+ if (frame_nr != last_frame_nr)
+ should_clear = TRUE;
+ last_frame_nr = frame_nr;
if (should_clear) {
- should_clear = false;
+ should_clear = FALSE;
wclear(win);
}
- wmove(win, 2,0);
-
- for (i = 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 != 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)