aboutsummaryrefslogtreecommitdiffstats
path: root/ui.c
blob: 14e47d1255975818acc39b3c619b5807a668ada7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { co
/*
 * 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 wadd_attr_str(WINDOW *win, const int attrs, const char *s)
{
	wattron(win, attrs);
	waddstr(win, s);
	wattroff(win, attrs);
}

/* 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;

	if (len >= sizeof(out_buf))
		len = sizeof(out_buf) - 1;

	if (sep == NULL || *sep == '\0')
		sep = fallback_sep;
	mid = strlen(sep);
	if (mid > len) {
		sep = fallback_sep;
		mid = strlen(sep);
	}

	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);
	}
}