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 <vadi...@gmail.com>
---
 ui.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ui.h |  53 +++++++++++++++++++++++++
 2 files changed, 195 insertions(+)
 create mode 100644 ui.c
 create mode 100644 ui.h

diff --git a/ui.c b/ui.c
new file mode 100644
index 0000000..d5fe1a7
--- /dev/null
+++ b/ui.c
@@ -0,0 +1,142 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Subject to the GPL, version 2.
+ */
+
+#include "ui.h"
+#include "xmalloc.h"
+
+#include <curses.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;
+       }
+
+       /* Should not happen in normal case */
+       panic("Invalid column id %u\n", id);
+}
+
+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);
+}
diff --git a/ui.h b/ui.h
new file mode 100644
index 0000000..02d1da2
--- /dev/null
+++ b/ui.h
@@ -0,0 +1,53 @@
+#ifndef UI_H
+#define UI_H
+
+#include "list.h"
+
+#include <stdbool.h>
+#include <inttypes.h>
+
+#define UI_MAX_WIDTH   (-1)
+
+enum ui_align {
+       UI_ALIGN_LEFT,
+       UI_ALIGN_RIGHT,
+};
+
+struct ui_col {
+       struct list_head entry;
+       uint32_t id;
+       char *name;
+       uint32_t len;
+       int pos;
+       int color;
+       enum ui_align align;
+};
+
+struct ui_table {
+       int y;
+       int x;
+       int rows_y;
+       struct list_head cols;
+       int hdr_color;
+       int col_pad;
+       int width;
+};
+
+extern void ui_table_init(struct ui_table *tbl);
+extern void ui_table_uninit(struct ui_table *tbl);
+extern void ui_table_pos_set(struct ui_table *tbl, int y, int x);
+extern void ui_table_clear(struct ui_table *tbl);
+
+extern void ui_table_col_add(struct ui_table *tbl, uint32_t id, char *name,
+                            uint32_t len);
+extern void ui_table_col_color_set(struct ui_table *tbl, int col_id, int 
color);
+extern void ui_table_col_align_set(struct ui_table *tbl, int col_id, enum 
ui_align align);
+
+extern void ui_table_row_add(struct ui_table *tbl);
+extern void ui_table_row_print(struct ui_table *tbl, uint32_t col_id,
+                              const char *str);
+
+extern void ui_table_header_color_set(struct ui_table *tbl, int color);
+extern void ui_table_header_print(struct ui_table *tbl);
+
+#endif /* UI_H */
-- 
2.6.3

-- 
You received this message because you are subscribed to the Google Groups 
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to netsniff-ng+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to