diff options
author | Jonathan McCrohan <jmccrohan@gmail.com> | 2012-02-05 19:03:25 +0000 |
---|---|---|
committer | Jonathan McCrohan <jmccrohan@gmail.com> | 2012-02-05 19:03:25 +0000 |
commit | 03dfbc2efa31d3c4fd7e576111883ea488e3e179 (patch) | |
tree | 6f227b085f675e294edd98d66ccbf190e898f544 /ui.c | |
download | wavemon-6d314215d33f4a69a984b853156c2191c7f171f2.tar.gz |
Imported Upstream version 0.6.10upstream/0.6.10
Diffstat (limited to 'ui.c')
-rw-r--r-- | ui.c | 136 |
1 files changed, 136 insertions, 0 deletions
@@ -0,0 +1,136 @@ +/* + * wavemon - a wireless network monitoring aplication + * + * Copyright (c) 2001-2002 Jan Morgenstern <jan@jm-music.de> + * + * wavemon is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2, or (at your option) any later + * version. + * + * wavemon is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along + * with wavemon; see the file COPYING. If not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#include "wavemon.h" + +/** + * newwin_title - Create a new bordered window at (y, 0) + * @y: vertical row position to start at + * @h: height of the new window in lines + * @title: name of the window + * @nobottom: whether to keep the bottom of the box open + */ +WINDOW *newwin_title(int y, int h, const char *title, bool nobottom) +{ + WINDOW *win = newwin(h, WAV_WIDTH, y, 0); + + chtype top_left = y > 0 ? ACS_LTEE : ACS_ULCORNER; + chtype top_right = y > 0 ? ACS_RTEE : ACS_URCORNER; + + if (nobottom) { + mvwaddch(win, 0, 0, top_left); + mvwhline(win, 0, 1, ACS_HLINE, MAXXLEN); + mvwvline(win, 1, 0, ACS_VLINE, h); + mvwaddch(win, 0, WAV_WIDTH - 1, top_right); + mvwvline(win, 1, WAV_WIDTH - 1, ACS_VLINE, h); + } else { + wborder(win, ACS_VLINE, ACS_VLINE, ACS_HLINE, ACS_HLINE, + top_left, top_right, ACS_LLCORNER, ACS_LRCORNER); + } + wattrset(win, COLOR_PAIR(CP_WTITLE)); + mvwaddstr(win, 0, 2, title); + wattroff(win, COLOR_PAIR(CP_WTITLE)); + + return win; +} + +/* clear inside window content up to the right border */ +void mvwclrtoborder(WINDOW *win, int y, int x) +{ + if (x >= 1 && x <= MAXXLEN) + mvwhline(win, y, x, ' ', 1 + MAXXLEN - x); +} + +void wclrtoborder(WINDOW *win) +{ + int x, y; + + getyx(win, y, x); + mvwclrtoborder(win, y, x); +} + +void waddstr_center(WINDOW *win, int y, const char *s) +{ + mvwaddstr(win, y, (WAV_WIDTH - strlen(s)) / 2, s); +} + +void waddstr_b(WINDOW *win, const char *s) +{ + wattron(win, A_BOLD); + waddstr(win, s); + wattroff(win, A_BOLD); +} + +/* Enforce that @str is at most @len characters (excluding the terminal '\0') */ +const char *curtail(const char *str, const char *sep, int len) +{ + static char out_buf[128]; + const char fallback_sep[] = "~"; + int l = 0, front, mid, back; + + assert(len < sizeof(out_buf)); + + if (sep == NULL) + sep = fallback_sep; + mid = strlen(sep); + assert(len >= mid); + + if (str != NULL) + l = strlen(str); + if (l <= len) + return str; + + front = (len - mid)/2.0 + 0.5; + back = len - front - mid; + + strncpy(out_buf, str, front); + strncpy(out_buf + front, sep, mid); + strncpy(out_buf + front + mid, str + l - back, back + 1); + + return out_buf; +} + +static double interpolate(const double val, const double min, const double max) +{ + return val < min ? 0 : + val > max ? 1 : (val - min) / (max - min); +} + +void waddbar(WINDOW *win, int y, float v, float min, float max, + char *cscale, bool rev) +{ + chtype ch = '=' | A_BOLD | cp_from_scale(v, cscale, rev); + int len = MAXXLEN * interpolate(v, min, max); + + mvwhline(win, y, 1, ch, len); + mvwclrtoborder(win, y, len + 1); +} + +void waddthreshold(WINDOW *win, int y, float v, float tv, + float minv, float maxv, char *cscale, chtype tch) +{ + if (tv > minv && tv < maxv) { + if (v > tv) + tch |= COLOR_PAIR(CP_STANDARD); + else + tch |= cp_from_scale(v, cscale, true); + + mvwaddch(win, y, 1 + MAXXLEN * interpolate(tv, minv, maxv), tch); + } +} |