Re: [Powertop] [PATCH] tuninig: resize scaling support (v1)
Sergey Senozhatsky <sergey.senozhatsky at gmail.com> Thu, 23 Aug 2012 11:04:50 +0300
| Newsgroups | dev.linux.lists.powertop |
|---|---|
| Message-ID | <[email protected]> |
--===============0068304524744691411==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
On (08/23/12 06:22), Magnus Fromreide wrote:
> On Thu, 2012-08-23 at 01:47 +0300, 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
> =
> Have you tested this patch in a locale that are using multibyte
> characters?
> =
> The len argument to snprintf is the number of bytes in the result string
> and strlen also returns the number of bytes in the string.
>
well, line is just a stream of bytes limited in size. it was never
intended to be a stream of characters. at this point we just work
with bytes, it's waddnstr() who should care. the same way as
"strcpy()/strlen()/strcat()-->wprintw()" worked before.
probably, we should truncate carefully, I need to think how. any
input is welcome.
-ss
=
> /MF
> =
> > =
> > 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> Tog=
gle 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)
> > =
> > _______________________________________________
> > PowerTop mailing list
> > PowerTop(a)lists.01.org
> > https://lists.01.org/mailman/listinfo/powertop
> =
>=20
--===============0068304524744691411==--