On 2017-01-18 at 14:00:24 +0100, Vadim Kochan <vadi...@gmail.com> wrote: > Add ui_tab API to create ui tab control to switch between > different ui tables which may contain different aggregated > info per unique pid/port/proto/dst/src. > > Meanwhile there is only 1 ui tab entry for flows table. > > Added some missing cds_list_{next,prev,last}_entry functions > into list.h header. > > Signed-off-by: Vadim Kochan <vadi...@gmail.com>
Some small remarks below, otherwise looks good from a first sight. > --- > flowtop.c | 26 +++++++++++++++-- > list.h | 19 +++++++++++++ > ui.c | 95 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > ui.h | 30 ++++++++++++++++++++ > 4 files changed, 166 insertions(+), 4 deletions(-) > create mode 100644 list.h > > diff --git a/flowtop.c b/flowtop.c > index b2d6546..78ac253 100644 > --- a/flowtop.c > +++ b/flowtop.c > @@ -133,6 +133,8 @@ static struct flow_list flow_list; > static struct sysctl_params_ctx sysctl = { -1, -1 }; > > static unsigned int cols, rows; > +static WINDOW *screen; > +static int skip_lines; > > static unsigned int interval = 1; > static bool show_src = false; > @@ -156,6 +158,10 @@ enum tbl_flow_col { > > static struct ui_table flows_tbl; > > +enum tab_entry { > + TAB_FLOWS, > +}; > + > static const char *short_options = "vhTUsDIS46ut:nGb"; > static const struct option long_options[] = { > {"ipv4", no_argument, NULL, '4'}, > @@ -1197,11 +1203,15 @@ static void flows_table_init(struct ui_table *tbl) > ui_table_header_color_set(&flows_tbl, COLOR(BLACK, GREEN)); > } > > +static void tab_main_on_open(struct ui_tab *tab, enum ui_tab_event_t evt, > uint32_t id) > +{ > + draw_flows(screen, &flow_list, skip_lines); > +} > + > static void presenter(void) > { > bool show_help = false; > - int skip_lines = 0; > - WINDOW *screen; > + struct ui_tab *tab_main; > > lookup_init(LT_PORTS_TCP); > lookup_init(LT_PORTS_UDP); > @@ -1219,6 +1229,12 @@ static void presenter(void) > > flows_table_init(&flows_tbl); > > + tab_main = ui_tab_create(); > + ui_tab_event_cb_set(tab_main, tab_main_on_open); > + ui_tab_pos_set(tab_main, 2, 0); > + ui_tab_active_color_set(tab_main, COLOR(BLACK, GREEN)); > + ui_tab_entry_add(tab_main, TAB_FLOWS, "Flows"); > + > rcu_register_thread(); > while (!sigint) { > int ch; > @@ -1278,6 +1294,9 @@ static void presenter(void) > show_option_toggle(ch); > do_reload_flows = true; > break; > + case '\t': > + ui_tab_event_send(tab_main, UI_EVT_SELECT_NEXT); > + break; > default: > fflush(stdin); > break; > @@ -1288,13 +1307,14 @@ static void presenter(void) > if (show_help) > draw_help(); > else > - draw_flows(screen, &flow_list, skip_lines); > + ui_tab_show(tab_main); > > draw_footer(); > } > rcu_unregister_thread(); > > ui_table_uninit(&flows_tbl); > + ui_tab_destroy(tab_main); > > screen_end(); > lookup_cleanup(LT_PORTS_UDP); > diff --git a/list.h b/list.h > new file mode 100644 > index 0000000..44dc8a2 > --- /dev/null > +++ b/list.h How about naming this something like list-compat.h or urcu-list-compat.h to make its propose a bit clearer? > @@ -0,0 +1,19 @@ > +#ifndef LIST_H > +#define LIST_H Please #include <urcu/list.h> here. > + > +#ifndef cds_list_last_entry > +#define cds_list_last_entry(ptr, type, member) \ > + cds_list_entry((ptr)->prev, type, member) > +#endif > + > +#ifndef cds_list_next_entry > +#define cds_list_next_entry(pos, member) \ > + cds_list_entry((pos)->member.next, typeof(*(pos)), member) > +#endif > + > +#ifndef cds_list_prev_entry > +#define cds_list_prev_entry(pos, member) \ > + cds_list_entry((pos)->member.prev, typeof(*(pos)), member) > +#endif > + > +#endif /* LIST_H */ > diff --git a/ui.c b/ui.c > index 78d1560..d8e0213 100644 > --- a/ui.c > +++ b/ui.c > @@ -7,6 +7,8 @@ > > #include "ui.h" > #include "str.h" > +#include "list.h" > +#include "screen.h" > #include "xmalloc.h" > > static struct ui_text *ui_text_alloc(size_t len) > @@ -62,6 +64,7 @@ void ui_table_init(struct ui_table *tbl) > tbl->height = LINES - 2; > tbl->col_pad = 1; > tbl->row = ui_text_alloc(tbl->width); > + tbl->delim = " "; > > CDS_INIT_LIST_HEAD(&tbl->cols); > } > @@ -134,6 +137,11 @@ void ui_table_col_align_set(struct ui_table *tbl, int > col_id, enum ui_align alig > col->align = align; > } > > +void ui_table_col_delim_set(struct ui_table *tbl, char *delim) const char *delim? > +{ > + tbl->delim = delim; > +} > + > void ui_table_row_add(struct ui_table *tbl) > { > tbl->rows_y++; > @@ -166,7 +174,7 @@ static void __ui_table_row_print(struct ui_table *tbl, > struct ui_col *col, > slprintf(tmp, sizeof(tmp), UI_ALIGN_COL(col), col->len, col->len, str); > ui_text_attr_insert(tbl->row, col->pos, color, tmp); > > - slprintf(tmp, sizeof(tmp), "%*s", tbl->col_pad, " "); > + slprintf(tmp, sizeof(tmp), "%*s", tbl->col_pad, tbl->delim); > ui_text_attr_insert(tbl->row, col->pos + col->len, color, tmp); > } > > @@ -214,3 +222,88 @@ void ui_table_event_send(struct ui_table *tbl, enum > ui_event_id evt_id) > tbl->scroll_x = 0; > } > } > + > +struct ui_tab *ui_tab_create(void) > +{ > + struct ui_tab *tab; > + > + tab = xzmalloc(sizeof(*tab)); > + > + ui_table_init(&tab->tbl); > + ui_table_col_delim_set(&tab->tbl, "|"); > + tab->tbl.width = 0; > + > + return tab; > +} > + > +void ui_tab_destroy(struct ui_tab *tab) > +{ > + ui_table_uninit(&tab->tbl); > + xfree(tab); > +} > + > +void ui_tab_pos_set(struct ui_tab *tab, int y, int x) > +{ > + ui_table_pos_set(&tab->tbl, y, x); > +} > + > +void ui_tab_event_cb_set(struct ui_tab *tab, ui_tab_event_cb cb) > +{ > + tab->on_tab_event = cb; > +} > + > +void ui_tab_active_color_set(struct ui_tab *tab, int color) > +{ > + ui_table_header_color_set(&tab->tbl, color); > + tab->color = color; > +} > + > +void ui_tab_show(struct ui_tab *tab) > +{ > + struct ui_col *col; > + > + if (tab->on_tab_event) > + tab->on_tab_event(tab, UI_TAB_EVT_OPEN, tab->active->id); > + > + cds_list_for_each_entry(col, &tab->tbl.cols, entry) > + __ui_table_row_print(&tab->tbl, col, col->color, col->name); > + > + ui_table_row_show(&tab->tbl); > +} > + > +void ui_tab_entry_add(struct ui_tab *tab, uint32_t id, char *name) const char *name? > +{ > + struct ui_col *col; > + > + ui_table_col_add(&tab->tbl, id, name, strlen(name) + 1); > + > + col = ui_table_col_get(&tab->tbl, id); > + > + if (!tab->active) > + tab->active = col; > + > + if (tab->active == col) > + ui_table_col_color_set(&tab->tbl, id, tab->color); > + else > + ui_table_col_color_set(&tab->tbl, id, tab->color | A_REVERSE); > +} > + > +void ui_tab_event_send(struct ui_tab *tab, uint32_t id) > +{ > + struct ui_col *curr, *next; > + > + if (id != UI_EVT_SELECT_NEXT) > + return; > + > + curr = tab->active; > + > + if (curr == cds_list_last_entry(&tab->tbl.cols, struct ui_col, entry)) > + next = cds_list_first_entry(&tab->tbl.cols, struct ui_col, > entry); > + else > + next = cds_list_next_entry(curr, entry); > + > + curr->color = tab->color | A_REVERSE; > + next->color = tab->color; > + > + tab->active = next; > +} > diff --git a/ui.h b/ui.h > index 9db3c08..eaa68e9 100644 > --- a/ui.h > +++ b/ui.h > @@ -9,6 +9,7 @@ > enum ui_event_id { > UI_EVT_SCROLL_LEFT, > UI_EVT_SCROLL_RIGHT, > + UI_EVT_SELECT_NEXT, > }; > > enum ui_align { > @@ -43,6 +44,25 @@ struct ui_table { > int width; > int height; > int scroll_x; > + char *delim; Couldn't this be const char*? > +}; > + > +struct ui_tab; > + > +enum ui_tab_event_t { > + UI_TAB_EVT_OPEN, > + UI_TAB_EVT_CLOSE, > +}; > + > +typedef void (* ui_tab_event_cb) (struct ui_tab *tab, enum ui_tab_event_t > evt, > + uint32_t id); > + > +struct ui_tab { > + struct ui_col *active; > + struct ui_table tbl; > + int color; > + > + ui_tab_event_cb on_tab_event; > }; > > extern void ui_table_init(struct ui_table *tbl); > @@ -55,6 +75,7 @@ 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_col_delim_set(struct ui_table *tbl, char *delim); > > extern void ui_table_row_add(struct ui_table *tbl); > extern void ui_table_row_show(struct ui_table *tbl); > @@ -66,4 +87,13 @@ extern void ui_table_header_print(struct ui_table *tbl); > > extern void ui_table_event_send(struct ui_table *tbl, enum ui_event_id id); > > +extern struct ui_tab *ui_tab_create(void); > +extern void ui_tab_destroy(struct ui_tab *tab); > +extern void ui_tab_pos_set(struct ui_tab *tab, int y, int x); > +extern void ui_tab_event_cb_set(struct ui_tab *tab, ui_tab_event_cb cb); > +extern void ui_tab_active_color_set(struct ui_tab *tab, int color); > +extern void ui_tab_show(struct ui_tab *tab); > +extern void ui_tab_entry_add(struct ui_tab *tab, uint32_t id, char *name); > +extern void ui_tab_event_send(struct ui_tab *tab, uint32_t id); > + > #endif /* UI_H */ > -- > 2.11.0 > -- 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.