summaryrefslogtreecommitdiff
path: root/ui.c
diff options
context:
space:
mode:
authorVadim Kochan <vadim4j@gmail.com>2016-04-21 21:47:39 +0300
committerTobias Klauser <tklauser@distanz.ch>2016-04-22 15:29:03 +0200
commitaef19410e1346cea962d838894785eef96182312 (patch)
tree6e52cbf4dd5ae027afd701dcd299cbb3cf236f7c /ui.c
parent627b1d172d19372dc43248cfe680521743efd826 (diff)
ui: Implement UI table for flows printing
Add new module ui.c which is responsible to render different kinds of UI widgets - tables, etc. Implemented generic API for print table-like list of elements. This table API might be used for print flows in curses or text mode. Signed-off-by: Vadim Kochan <vadim4j@gmail.com> [tk: change bug_on(true) to bug(), whitespace fix] Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Diffstat (limited to 'ui.c')
-rw-r--r--ui.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/ui.c b/ui.c
new file mode 100644
index 0000000..5e52efd
--- /dev/null
+++ b/ui.c
@@ -0,0 +1,141 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Subject to the GPL, version 2.
+ */
+
+#include <curses.h>
+
+#include "ui.h"
+#include "xmalloc.h"
+
+void ui_table_init(struct ui_table *tbl)
+{
+ memset(tbl, 0, sizeof(*tbl));
+
+ getsyx(tbl->y, tbl->x);
+
+ tbl->rows_y = tbl->y;
+ tbl->width = COLS;
+ tbl->col_pad = 1;
+
+ INIT_LIST_HEAD(&tbl->cols);
+}
+
+void ui_table_uninit(struct ui_table *tbl)
+{
+ struct ui_col *col, *tmp;
+
+ list_for_each_entry_safe(col, tmp, &tbl->cols, entry)
+ xfree(col);
+}
+
+void ui_table_pos_set(struct ui_table *tbl, int y, int x)
+{
+ tbl->y = y;
+ tbl->x = x;
+ tbl->rows_y = y;
+}
+
+static struct ui_col *ui_table_col_get(struct ui_table *tbl, uint32_t id)
+{
+ struct ui_col *col;
+
+ list_for_each_entry(col, &tbl->cols, entry) {
+ if (col->id == id)
+ return col;
+ }
+
+ bug();
+}
+
+static void __ui_table_pos_update(struct ui_table *tbl)
+{
+ struct ui_col *col;
+ uint32_t pos = tbl->x;
+
+ list_for_each_entry(col, &tbl->cols, entry) {
+ col->pos = pos;
+ pos += col->len + tbl->col_pad;
+ }
+}
+
+void ui_table_col_add(struct ui_table *tbl, uint32_t id, char *name, uint32_t len)
+{
+ struct ui_col *col = xzmalloc(sizeof(*col));
+
+ col->id = id;
+ col->name = name;
+ col->len = len;
+ col->align = UI_ALIGN_LEFT;
+
+ list_add_tail(&col->entry, &tbl->cols);
+
+ __ui_table_pos_update(tbl);
+}
+
+void ui_table_col_color_set(struct ui_table *tbl, int col_id, int color)
+{
+ struct ui_col *col = ui_table_col_get(tbl, col_id);
+
+ col->color = color;
+}
+
+void ui_table_col_align_set(struct ui_table *tbl, int col_id, enum ui_align align)
+{
+ struct ui_col *col = ui_table_col_get(tbl, col_id);
+
+ col->align = align;
+}
+
+void ui_table_row_add(struct ui_table *tbl)
+{
+ tbl->rows_y++;
+}
+
+void ui_table_clear(struct ui_table *tbl)
+{
+ tbl->rows_y = tbl->y;
+}
+
+#define UI_ALIGN_COL(col) (((col)->align == UI_ALIGN_LEFT) ? "%-*.*s" : "%*.*s")
+
+static void __ui_table_row_print(struct ui_table *tbl, struct ui_col *col,
+ const char *str)
+{
+ mvprintw(tbl->rows_y, col->pos, UI_ALIGN_COL(col), col->len, col->len, str);
+ mvprintw(tbl->rows_y, col->pos + col->len, "%*s", tbl->col_pad, " ");
+}
+
+void ui_table_row_print(struct ui_table *tbl, uint32_t col_id, const char *str)
+{
+ struct ui_col *col = ui_table_col_get(tbl, col_id);
+
+ attron(col->color);
+ __ui_table_row_print(tbl, col, str);
+ attroff(col->color);
+}
+
+void ui_table_header_color_set(struct ui_table *tbl, int color)
+{
+ tbl->hdr_color = color;
+}
+
+void ui_table_header_print(struct ui_table *tbl)
+{
+ struct ui_col *col;
+ int max_width = tbl->width;
+ int width = 0;
+
+ attron(tbl->hdr_color);
+
+ mvprintw(tbl->y, tbl->x, "%-*.*s", max_width - tbl->x, max_width - tbl->x, "");
+ mvprintw(tbl->y, tbl->x, "");
+
+ list_for_each_entry(col, &tbl->cols, entry) {
+ __ui_table_row_print(tbl, col, col->name);
+ width += col->len + tbl->col_pad;
+ }
+
+ mvprintw(tbl->y, width, "%*s", max_width - width, " ");
+ attroff(tbl->hdr_color);
+}