aboutsummaryrefslogtreecommitdiffstats
path: root/ui.c
diff options
context:
space:
mode:
authorJonathan McCrohan <jmccrohan@gmail.com>2012-02-05 19:03:25 +0000
committerJonathan McCrohan <jmccrohan@gmail.com>2012-02-05 19:03:25 +0000
commit03dfbc2efa31d3c4fd7e576111883ea488e3e179 (patch)
tree6f227b085f675e294edd98d66ccbf190e898f544 /ui.c
downloadwavemon-03dfbc2efa31d3c4fd7e576111883ea488e3e179.tar.gz
Imported Upstream version 0.6.10upstream/0.6.10
Diffstat (limited to 'ui.c')
-rw-r--r--ui.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/ui.c b/ui.c
new file mode 100644
index 0000000..979cb00
--- /dev/null
+++ b/ui.c
@@ -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);
+ }
+}