summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 44e296d)
raw | patch | inline | side by side (parent: 44e296d)
author | Antoine Beaupré <anarcat@koumbit.org> | |
Fri, 6 Dec 2013 04:35:00 +0000 (23:35 -0500) | ||
committer | Antoine Beaupré <anarcat@koumbit.org> | |
Fri, 6 Dec 2013 04:48:58 +0000 (23:48 -0500) |
this is fairly ugly - we use a hidden ncurses function to detect
unicode (but at least we don't reimplement it), then we mess around
with the character arrays to display the rights symbols
i am not sure i like this, but i prefer to braindump than to stall, so
let's move forward.
unicode (but at least we don't reimplement it), then we mess around
with the character arrays to display the rights symbols
i am not sure i like this, but i prefer to braindump than to stall, so
let's move forward.
src/oping.c | patch | blob | history |
diff --git a/src/oping.c b/src/oping.c
index 068c55d18964a67e5a2dcfb73768cd6d1c3f64e8..0cb084f18ec3634ddc97e9a23798d933c03f9c10 100644 (file)
--- a/src/oping.c
+++ b/src/oping.c
# define _X_OPEN_SOURCE_EXTENDED
# include <ncursesw/ncurses.h>
+/* some evilness: ncurses knows how to detect unicode, but won't
+ expose it, yet there's this function that does what we want, so we
+ steal it away from it */
+extern int _nc_unicode_locale(void);
+
# define OPING_GREEN 1
# define OPING_YELLOW 2
# define OPING_RED 3
# define OPING_YELLOW_HIST 5
# define OPING_RED_HIST 6
-static char const * const hist_symbols[] = {
+static char const * const hist_symbols_utf8[] = {
"▁", "▂", "▃", "▄", "▅", "▆", "▇", "█" };
-static size_t const hist_symbols_num = sizeof (hist_symbols)
- / sizeof (hist_symbols[0]);
-
-static int const hist_colors[] = {
+static size_t const hist_symbols_utf8_num = sizeof (hist_symbols_utf8)
+ / sizeof (hist_symbols_utf8[0]);
+
+/* scancodes for 6 levels of horizontal bars, ncurses-specific */
+/* those are not the usual constants because those are not constant */
+static int const hist_symbols_acs[] = {
+ 115, /* ACS_S9 "⎽" */
+ 114, /* ACS_S7 "⎼" */
+ 113, /* ACS_S5 "─" */
+ 112, /* ACS_S3 "⎻" */
+ 111 /* ACS_S1 "⎺" */
+};
+static size_t const hist_symbols_acs_num = sizeof (hist_symbols_acs)
+ / sizeof (hist_symbols_acs[0]);
+
+/* use different colors without a background for scancodes */
+static int const hist_colors_utf8[] = {
OPING_GREEN_HIST, OPING_YELLOW_HIST, OPING_RED_HIST };
-static size_t const hist_colors_num = sizeof (hist_colors)
- / sizeof (hist_colors[0]);
+static int const hist_colors_acs[] = {
+ OPING_GREEN, OPING_YELLOW, OPING_RED };
+/* assuming that both arrays are the same size */
+static size_t const hist_colors_num = sizeof (hist_colors_utf8)
+ / sizeof (hist_colors_utf8[0]);
#endif
#include "oping.h"
{
int color = OPING_RED;
char const *symbol = "!";
+ int symbolc = '!';
+ size_t hist_symbols_num;
+ size_t index_symbols;
int x_max;
int x_pos;
x_max = getmaxx (ctx->window);
x_pos = ((sequence - 1) % (x_max - 4)) + 2;
+ if (_nc_unicode_locale())
+ {
+ hist_symbols_num = hist_symbols_utf8_num;
+ }
+ else {
+ hist_symbols_num = hist_symbols_acs_num;
+ }
+
if (latency >= 0.0)
{
double ratio;
size_t intensity;
size_t index_colors;
- size_t index_symbols;
ratio = latency / PING_DEF_TTL;
if (ratio > 1) {
index_colors = intensity / hist_symbols_num;
assert (index_colors < hist_colors_num);
- color = hist_colors[index_colors];
index_symbols = intensity % hist_symbols_num;
- symbol = hist_symbols[index_symbols];
- }
+ if (_nc_unicode_locale())
+ {
+ color = hist_colors_utf8[index_colors];
+ symbol = hist_symbols_utf8[index_symbols];
+ }
+ else
+ {
+ color = hist_colors_acs[index_colors];
+ symbolc = hist_symbols_acs[index_symbols] | A_ALTCHARSET;
+ }
+ }
else /* if (!(latency >= 0.0)) */
wattron (ctx->window, A_BOLD);
wattron (ctx->window, COLOR_PAIR(color));
- mvwprintw (ctx->window,
- /* y = */ 3,
- /* x = */ x_pos,
- symbol);
+ if (_nc_unicode_locale())
+ {
+ mvwprintw (ctx->window,
+ /* y = */ 3,
+ /* x = */ x_pos,
+ symbol);
+ }
+ else {
+ mvwaddch (ctx->window,
+ /* y = */ 3,
+ /* x = */ x_pos,
+ symbolc);
+ }
wattroff (ctx->window, COLOR_PAIR(color));
/* Use negation here to handle NaN correctly. */