/* trafvol_section_init This function creates the trafvol section window and the fields inside it. Returncodes: 0: ok -1: error */ static int trafvol_section_init(const int debuglvl, int height, int width, int startx, int starty, unsigned int ifac_num) { size_t i = 0; int rows = 0, cols = 0; int max_height = 0, max_width = 0, toprow = 0, num_rows = (int)ifac_num; unsigned int ifacs = 0, ifac_fields = 0, ifac_start = 4; /* get and check the screen dimentions */ getmaxyx(stdscr, max_height, max_width); if(width > max_width) return(-1); /* set the number of fields: interfacename, today in, today out, yesterday in, yesterday out, 7 days in, 7 days out, this month in, this month out, last month in, last month out */ TrafVolSection.n_fields = 11 * (size_t)ifac_num; /* alloc the needed memory */ if(!(TrafVolSection.fields = (FIELD **)calloc(TrafVolSection.n_fields + 1, sizeof(FIELD *)))) { (void)vrprint.error(-1, VR_ERR, gettext("calloc failed: %s (in: %s:%d)."), strerror(errno), __FUNC__, __LINE__); return(-1); } /* create iface stats fields */ for(ifacs = 0, ifac_fields = 0; ifacs < ifac_num; ifacs++) { toprow = (int)(ifac_start+ifacs); /* interface name */ TrafVolSection.fields[ifac_fields] = new_field(1, 15, toprow, 0, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "ifacname"); ifac_fields++; TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 16, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "t-in"); ifac_fields++; TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 22, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "t-ou"); ifac_fields++; TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 28, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "y-in"); ifac_fields++; TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 34, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "y-ou"); ifac_fields++; TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 40, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "7-in"); ifac_fields++; TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 46, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "7-ou"); ifac_fields++; TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 52, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "t-in"); ifac_fields++; TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 58, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "t-ou"); ifac_fields++; TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 64, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "l-in"); ifac_fields++; TrafVolSection.fields[ifac_fields] = new_field(1, 5, toprow, 70, 0, 1); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[ifac_fields], 1, "l-ou"); ifac_fields++; } /* terminate the field array */ TrafVolSection.fields[TrafVolSection.n_fields] = NULL; /* create the window and the panel */ if(!(TrafVolSection.win = create_newwin(height, width, startx, starty, gettext("Traffic Volume Section"), vccnf.color_win))) { (void)vrprint.error(-1, VR_ERR, gettext("creating window failed.")); return(-1); } if(!(TrafVolSection.panel[0] = new_panel(TrafVolSection.win))) { (void)vrprint.error(-1, VR_ERR, gettext("creating panel failed.")); return(-1); } /* field options */ for(i = 0; i < TrafVolSection.n_fields; i++) { if(debuglvl >= LOW) set_field_back(TrafVolSection.fields[i], vccnf.color_win); else set_field_back(TrafVolSection.fields[i], vccnf.color_win); field_opts_off(TrafVolSection.fields[i], O_AUTOSKIP); /* set status to false */ set_field_status(TrafVolSection.fields[i], FALSE); } /* Create the form and post it */ if(!(TrafVolSection.form = new_form(TrafVolSection.fields))) { (void)vrprint.error(-1, VR_ERR, gettext("creating form failed.")); return(-1); } /* Calculate the area required for the form */ scale_form(TrafVolSection.form, &rows, &cols); keypad(TrafVolSection.win, TRUE); /* Set main window and sub window */ set_form_win(TrafVolSection.form, TrafVolSection.win); set_form_sub(TrafVolSection.form, derwin(TrafVolSection.win, rows, cols, 1, 2)); if(post_form(TrafVolSection.form) != E_OK) { (void)vrprint.error(-1, VR_ERR, gettext("posting the form failed.")); return(-1); } mvwprintw(TrafVolSection.win, 3, 2, gettext("Interface")); mvwprintw(TrafVolSection.win, 2, 18, gettext("Today")); mvwprintw(TrafVolSection.win, 3, 18, gettext("In")); mvwprintw(TrafVolSection.win, 3, 24, gettext("Out")); mvwprintw(TrafVolSection.win, 2, 30, gettext("Yesterday")); mvwprintw(TrafVolSection.win, 3, 30, gettext("In")); mvwprintw(TrafVolSection.win, 3, 36, gettext("Out")); mvwprintw(TrafVolSection.win, 2, 42, gettext("7-days")); mvwprintw(TrafVolSection.win, 3, 42, gettext("In")); mvwprintw(TrafVolSection.win, 3, 48, gettext("Out")); mvwprintw(TrafVolSection.win, 2, 54, gettext("This month")); mvwprintw(TrafVolSection.win, 3, 54, gettext("In")); mvwprintw(TrafVolSection.win, 3, 60, gettext("Out")); mvwprintw(TrafVolSection.win, 2, 66, gettext("Last month")); mvwprintw(TrafVolSection.win, 3, 66, gettext("In")); mvwprintw(TrafVolSection.win, 3, 72, gettext("Out")); mvwhline(TrafVolSection.win, 4, 1, ACS_HLINE, 76); mvwaddch(TrafVolSection.win, 4, 0, ACS_LTEE); mvwaddch(TrafVolSection.win, 4, 77, ACS_RTEE); mvwvline(TrafVolSection.win, 5, 17, ACS_VLINE, num_rows); mvwaddch(TrafVolSection.win, 4, 17, ACS_TTEE); mvwvline(TrafVolSection.win, 5, 23, ACS_VLINE, num_rows); mvwaddch(TrafVolSection.win, 4, 23, ACS_TTEE); mvwvline(TrafVolSection.win, 5, 29, ACS_VLINE, num_rows); mvwaddch(TrafVolSection.win, 4, 29, ACS_TTEE); mvwvline(TrafVolSection.win, 5, 35, ACS_VLINE, num_rows); mvwaddch(TrafVolSection.win, 4, 35, ACS_TTEE); mvwvline(TrafVolSection.win, 5, 41, ACS_VLINE, num_rows); mvwaddch(TrafVolSection.win, 4, 41, ACS_TTEE); mvwvline(TrafVolSection.win, 5, 47, ACS_VLINE, num_rows); mvwaddch(TrafVolSection.win, 4, 47, ACS_TTEE); mvwvline(TrafVolSection.win, 5, 53, ACS_VLINE, num_rows); mvwaddch(TrafVolSection.win, 4, 53, ACS_TTEE); mvwvline(TrafVolSection.win, 5, 59, ACS_VLINE, num_rows); mvwaddch(TrafVolSection.win, 4, 59, ACS_TTEE); mvwvline(TrafVolSection.win, 5, 65, ACS_VLINE, num_rows); mvwaddch(TrafVolSection.win, 4, 65, ACS_TTEE); mvwvline(TrafVolSection.win, 5, 71, ACS_VLINE, num_rows); mvwaddch(TrafVolSection.win, 4, 71, ACS_TTEE); /* don't print this line if it overlaps with the window border */ if(5 + num_rows + 1 < height) { mvwhline(TrafVolSection.win, 5 + num_rows, 1, ACS_HLINE, 76); mvwaddch(TrafVolSection.win, 5 + num_rows, 0, ACS_LTEE); mvwaddch(TrafVolSection.win, 5 + num_rows, 77, ACS_RTEE); } mvwaddch(TrafVolSection.win, 5 + num_rows, 17, ACS_BTEE); mvwaddch(TrafVolSection.win, 5 + num_rows, 23, ACS_BTEE); mvwaddch(TrafVolSection.win, 5 + num_rows, 29, ACS_BTEE); mvwaddch(TrafVolSection.win, 5 + num_rows, 35, ACS_BTEE); mvwaddch(TrafVolSection.win, 5 + num_rows, 41, ACS_BTEE); mvwaddch(TrafVolSection.win, 5 + num_rows, 47, ACS_BTEE); mvwaddch(TrafVolSection.win, 5 + num_rows, 53, ACS_BTEE); mvwaddch(TrafVolSection.win, 5 + num_rows, 59, ACS_BTEE); mvwaddch(TrafVolSection.win, 5 + num_rows, 65, ACS_BTEE); mvwaddch(TrafVolSection.win, 5 + num_rows, 71, ACS_BTEE); return(0); }
/* trafvol_section This section shows bandwidth usage of the system. Returncodes: 0: ok -1: error */ int trafvol_section(const int debuglvl, Zones *zones, Interfaces *interfaces, Services *services) { int retval = 0; int quit = 0, ch; int max_onscreen = 0, max_height = 0, max_width = 0; unsigned int i = 0; unsigned int ifac_num = 0; struct InterfaceData_ *iface_ptr=NULL; d_list_node *d_node = NULL, *bw_d_node = NULL; struct TrafVol_ *bw_ptr = NULL; d_list bw_list; int year = 0, month = 0; time_t cur_time, yesterday_time, lastweek_time; struct tm cur_tm, yesterday_tm, lastweek_tm; char bw_str[6] = ""; int result=0; int update_interval = 10000000; /* weird, in pratice this seems to be twenty sec */ int slept_so_far = 10000000; /* time slept since last update */ /* top menu */ char *key_choices[] = { "F12", "F10"}; int key_choices_n = 2; char *cmd_choices[] = { gettext("help"), gettext("back")}; int cmd_choices_n = 2; if(interfaces->list.len == 0) { (void)vrprint.warning(VR_WARN, gettext("no interfaces found. Please define an interface first.")); return(0); } if(strcmp(vccnf.iptrafvol_location, "") == 0) { (void)vrprint.error(-1, VR_ERR, gettext("please set the location of the iptrafvol.pl command in the Settings.")); return(-1); } getmaxyx(stdscr, max_height, max_width); max_onscreen = max_height - 6 - 6; /* count the number of non virtual interfaces */ for(ifac_num = 0, d_node = interfaces->list.top; d_node; d_node = d_node->next) { if(!(iface_ptr = d_node->data)) { (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__); return(-1); } if(iface_ptr->device_virtual == FALSE) { ifac_num++; } } if(ifac_num > (unsigned int)max_onscreen) ifac_num = (unsigned int)max_onscreen; /* init */ if(trafvol_section_init(debuglvl, max_height - 6, 78, 3, 1, ifac_num) < 0) return(-1); /* make sure wgetch doesn't block */ nodelay(TrafVolSection.win, TRUE); keypad(TrafVolSection.win, TRUE); draw_top_menu(debuglvl, top_win, gettext("Traffic Volume"), key_choices_n, key_choices, cmd_choices_n, cmd_choices); update_panels(); doupdate(); /* the main loop */ while(quit == 0 && retval == 0) { if(debuglvl >= LOW) (void)vrprint.debug(__FUNC__, "slept_so_far: %d, update_interval: %d.", slept_so_far, update_interval); /* check if we have slept long enough */ if(slept_so_far >= update_interval) { if(debuglvl >= HIGH) (void)vrprint.debug(__FUNC__, "slept_so_far: %d -> now print.", slept_so_far); slept_so_far = 0; /* get the time */ cur_time = time(NULL); if(cur_time == -1) { (void)vrprint.error(-1, VR_INTERR, "getting current time failed (in: %s:%d).", __FUNC__, __LINE__); return(-1); } yesterday_time = cur_time - 86400; lastweek_time = cur_time - (86400 * 7); if(localtime_r(&cur_time, &cur_tm) == NULL) { (void)vrprint.error(-1, VR_INTERR, "converting current time failed (in: %s:%d).", __FUNC__, __LINE__); return(-1); } if(localtime_r(&yesterday_time, &yesterday_tm) == NULL) { (void)vrprint.error(-1, VR_INTERR, "converting yesterday's time failed (in: %s:%d).", __FUNC__, __LINE__); return(-1); } if(localtime_r(&lastweek_time, &lastweek_tm) == NULL) { (void)vrprint.error(-1, VR_INTERR, "converting lastweeks's time failed (in: %s:%d).", __FUNC__, __LINE__); return(-1); } /* update data here */ for(d_node = interfaces->list.top, i = 0; d_node && i < ifac_num; d_node = d_node->next) { if(!(iface_ptr = d_node->data)) { (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__); return(-1); } if(iface_ptr->device_virtual == FALSE) { /* interface name */ set_field_buffer_wrap(debuglvl, TrafVolSection.fields[11 * i], 0, iface_ptr->name); /* get the bw for today */ result = bandwidth_get_iface(debuglvl, iface_ptr->device, cur_tm.tm_year + 1900, cur_tm.tm_mon + 1, cur_tm.tm_mday, 1, 1, &bw_list); if(result == 1) { for(bw_d_node = bw_list.top; bw_d_node; bw_d_node = bw_d_node->next) { if(!(bw_ptr = bw_d_node->data)) { (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__); return(-1); } //printf("%2d/%2d/%4d: in: %u, out: %u %s\n", bw_ptr->day, bw_ptr->month, bw_ptr->year, bw_ptr->recv_mb, bw_ptr->send_mb, bw_ptr->total ? "(total)" : ""); create_bw_string(debuglvl, bw_ptr->recv_mb, bw_str, sizeof(bw_str)); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[1 + (11 * i)], 0, bw_str); create_bw_string(debuglvl, bw_ptr->send_mb, bw_str, sizeof(bw_str)); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[2 + (11 * i)], 0, bw_str); } d_list_cleanup(debuglvl, &bw_list); } else if(result == 0) { set_field_buffer_wrap(debuglvl, TrafVolSection.fields[1 + (11 * i)], 0, " - "); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[2 + (11 * i)], 0, " - "); } else { set_field_buffer_wrap(debuglvl, TrafVolSection.fields[1 + (11 * i)], 0, gettext("error")); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[2 + (11 * i)], 0, gettext("error")); } /* get the bw for yesterday */ result = bandwidth_get_iface(debuglvl, iface_ptr->device, yesterday_tm.tm_year + 1900, yesterday_tm.tm_mon + 1, yesterday_tm.tm_mday, 1, 1, &bw_list); if(result == 1) { for(bw_d_node = bw_list.top; bw_d_node; bw_d_node = bw_d_node->next) { if(!(bw_ptr = bw_d_node->data)) { (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__); return(-1); } //printf("%2d/%2d/%4d: in: %u, out: %u %s\n", bw_ptr->day, bw_ptr->month, bw_ptr->year, bw_ptr->recv_mb, bw_ptr->send_mb, bw_ptr->total ? "(total)" : ""); create_bw_string(debuglvl, bw_ptr->recv_mb, bw_str, sizeof(bw_str)); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[3 + (11 * i)], 0, bw_str); create_bw_string(debuglvl, bw_ptr->send_mb, bw_str, sizeof(bw_str)); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[4 + (11 * i)], 0, bw_str); } d_list_cleanup(debuglvl, &bw_list); } else if(result == 0) { set_field_buffer_wrap(debuglvl, TrafVolSection.fields[3 + (11 * i)], 0, " - "); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[4 + (11 * i)], 0, " - "); } else { set_field_buffer_wrap(debuglvl, TrafVolSection.fields[3 + (11 * i)], 0, gettext("error")); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[4 + (11 * i)], 0, gettext("error")); } /* get the bw for past 7 days */ result = bandwidth_get_iface(debuglvl, iface_ptr->device, lastweek_tm.tm_year + 1900, lastweek_tm.tm_mon + 1, lastweek_tm.tm_mday, 7, 1, &bw_list); if(result == 1) { for(bw_d_node = bw_list.top; bw_d_node; bw_d_node = bw_d_node->next) { if(!(bw_ptr = bw_d_node->data)) { (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__); return(-1); } //printf("%2d/%2d/%4d: in: %u, out: %u %s\n", bw_ptr->day, bw_ptr->month, bw_ptr->year, bw_ptr->recv_mb, bw_ptr->send_mb, bw_ptr->total ? "(total)" : ""); create_bw_string(debuglvl, bw_ptr->recv_mb, bw_str, sizeof(bw_str)); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[5 + (11 * i)], 0, bw_str); create_bw_string(debuglvl, bw_ptr->send_mb, bw_str, sizeof(bw_str)); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[6 + (11 * i)], 0, bw_str); } d_list_cleanup(debuglvl, &bw_list); } else if(result == 0) { set_field_buffer_wrap(debuglvl, TrafVolSection.fields[5 + (11 * i)], 0, " - "); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[6 + (11 * i)], 0, " - "); } else { set_field_buffer_wrap(debuglvl, TrafVolSection.fields[5 + (11 * i)], 0, gettext("error")); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[6 + (11 * i)], 0, gettext("error")); } /* get the bw for the current month */ result = bandwidth_get_iface(debuglvl, iface_ptr->device, cur_tm.tm_year + 1900, cur_tm.tm_mon + 1, 1, 0, 1, &bw_list); if(result == 1) { for(bw_d_node = bw_list.top; bw_d_node; bw_d_node = bw_d_node->next) { if(!(bw_ptr = bw_d_node->data)) { (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__); return(-1); } //printf("%2d/%2d/%4d: in: %u, out: %u %s\n", bw_ptr->day, bw_ptr->month, bw_ptr->year, bw_ptr->recv_mb, bw_ptr->send_mb, bw_ptr->total ? "(total)" : ""); create_bw_string(debuglvl, bw_ptr->recv_mb, bw_str, sizeof(bw_str)); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[7 + (11 * i)], 0, bw_str); create_bw_string(debuglvl, bw_ptr->send_mb, bw_str, sizeof(bw_str)); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[8 + (11 * i)], 0, bw_str); } d_list_cleanup(debuglvl, &bw_list); } else if(result == 0) { set_field_buffer_wrap(debuglvl, TrafVolSection.fields[7 + (11 * i)], 0, " - "); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[8 + (11 * i)], 0, " - "); } else { set_field_buffer_wrap(debuglvl, TrafVolSection.fields[7 + (11 * i)], 0, gettext("error")); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[8 + (11 * i)], 0, gettext("error")); } /* get the bw for the last month */ year = cur_tm.tm_year + 1900; /* get prev month (by not adding +1) */ month = cur_tm.tm_mon; /* if month = 0 (Jan), set it to 12 (Dec) and subtract one of the year. */ if(month == 0) { month = 12; year = year - 1; } result = bandwidth_get_iface(debuglvl, iface_ptr->device, year, month, 1, 0, 1, &bw_list); if(result == 1) { for(bw_d_node = bw_list.top; bw_d_node; bw_d_node = bw_d_node->next) { if(!(bw_ptr = bw_d_node->data)) { (void)vrprint.error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__); return(-1); } //printf("%2d/%2d/%4d: in: %u, out: %u %s\n", bw_ptr->day, bw_ptr->month, bw_ptr->year, bw_ptr->recv_mb, bw_ptr->send_mb, bw_ptr->total ? "(total)" : ""); create_bw_string(debuglvl, bw_ptr->recv_mb, bw_str, sizeof(bw_str)); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[9 + (11 * i)], 0, bw_str); create_bw_string(debuglvl, bw_ptr->send_mb, bw_str, sizeof(bw_str)); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[10 + (11 * i)], 0, bw_str); } d_list_cleanup(debuglvl, &bw_list); } else if(result == 0) { set_field_buffer_wrap(debuglvl, TrafVolSection.fields[9 + (11 * i)], 0, " - "); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[10 + (11 * i)], 0, " - "); } else { set_field_buffer_wrap(debuglvl, TrafVolSection.fields[9 + (11 * i)], 0, gettext("error")); set_field_buffer_wrap(debuglvl, TrafVolSection.fields[10 + (11 * i)], 0, gettext("error")); } /* finally draw the screen */ wrefresh(TrafVolSection.win); /* update the line */ i++; } } } /* finally draw the screen */ wrefresh(TrafVolSection.win); /* process the keyboard input */ ch = wgetch(TrafVolSection.win); switch(ch) { /* quit */ case 27: case 'q': case 'Q': case KEY_F(10): quit = 1; break; case KEY_F(12): case 'h': case 'H': case '?': print_help(debuglvl, ":[VUURMUUR:TRAFVOL]:"); break; } if(quit == 0) { usleep(10000); slept_so_far = slept_so_far + 10000; if(debuglvl >= HIGH) (void)vrprint.debug(__FUNC__, "just slept: slept_so_far '%d'.", slept_so_far); } } /* EXIT: cleanup */ nodelay(TrafVolSection.win, FALSE); /* destroy the window and form */ trafvol_section_destroy(); update_panels(); doupdate(); return(retval); }
int filter_input_box(const int debuglvl, struct vrmr_filter *filter) { WINDOW *ib_win = NULL; PANEL *my_panels[1]; FIELD *cur = NULL, *prev = NULL; FORM *my_form = NULL; int height = 0, width = 0, startx = 0, starty = 0, max_height = 0, max_width = 0, ch = 0, rows = 0, cols = 0, quit = 0; size_t i = 0; char not_defined = FALSE; /* init fields */ memset(&FiFi, 0, sizeof(struct FilterFields_)); /* set the window size */ getmaxyx(stdscr, max_height, max_width); height = 9; width = 48; /* print on the center of the screen */ starty = (max_height - height) / 2; startx = (max_width - width) / 2; /* create window */ ib_win = create_newwin(height, width, starty, startx, gettext("Filter"), vccnf.color_win); if(ib_win == NULL) { vrmr_error(-1, VR_ERR, gettext("creating window failed.")); return(-1); } my_panels[0] = new_panel(ib_win); if(my_panels[0] == NULL) { vrmr_error(-1, VR_ERR, gettext("creating panel failed.")); return(-1); } FiFi.n_fields = 2; FiFi.fields = (FIELD **)calloc(FiFi.n_fields + 1, sizeof(FIELD *)); if(FiFi.fields == NULL) { vrmr_error(-1, VR_ERR, gettext("calloc failed: %s (in: %s:%d)."), strerror(errno), __FUNC__, __LINE__); return(-1); } FiFi.string_fld = (FiFi.fields[0] = new_field(1, 31, 3, 4, 0, 0)); FiFi.check_fld = (FiFi.fields[1] = new_field(1, 1, 5, 5, 0, 0)); set_field_back(FiFi.string_fld, vccnf.color_win_rev); field_opts_off(FiFi.string_fld, O_AUTOSKIP); set_field_status(FiFi.string_fld, FALSE); set_field_buffer_wrap(debuglvl, FiFi.string_fld, 0, filter->str); set_field_back(FiFi.check_fld, vccnf.color_win); field_opts_off(FiFi.check_fld, O_AUTOSKIP); set_field_status(FiFi.check_fld, FALSE); set_field_buffer_wrap(debuglvl, FiFi.check_fld, 0, filter->neg ? "X" : " "); my_form = new_form(FiFi.fields); scale_form(my_form, &rows, &cols); keypad(ib_win, TRUE); set_form_win(my_form, ib_win); set_form_sub(my_form, derwin(ib_win, rows, cols, 1, 2)); post_form(my_form); /* XXX: we really should have a wrapper function to just print * in the middle of a window to prevent hacks like this. */ char *s = gettext("Enter filter (leave empty for no filter)"); mvwprintw(ib_win, 2, (width - StrLen(s))/2, s); mvwprintw(ib_win, 6, 6, "["); mvwprintw(ib_win, 6, 8, "]"); mvwprintw(ib_win, 6, 11, gettext("show lines that don't match")); update_panels(); doupdate(); if(!(cur = current_field(my_form))) { vrmr_error(-1, VR_INTERR, "NULL pointer (in: %s:%d).", __FUNC__, __LINE__); return(-1); } while(quit == 0) { /* draw nice markers */ draw_field_active_mark(cur, prev, ib_win, my_form, vccnf.color_win_mark|A_BOLD); not_defined = 0; /* get user input */ ch = wgetch(ib_win); if(cur == FiFi.check_fld) { if(nav_field_toggleX(debuglvl, my_form, ch) < 0) not_defined = 1; } else if(cur == FiFi.string_fld) { if(nav_field_simpletext(debuglvl, my_form, ch) < 0) not_defined = 1; } else { not_defined = 1; } /* the rest is handled here */ if(not_defined) { switch(ch) { case KEY_UP: form_driver(my_form, REQ_PREV_FIELD); form_driver(my_form, REQ_END_LINE); break; case KEY_DOWN: case 9: // tab form_driver(my_form, REQ_NEXT_FIELD); form_driver(my_form, REQ_END_LINE); break; case 10: // enter if(cur == FiFi.check_fld) { quit = 1; } else { form_driver(my_form, REQ_NEXT_FIELD); form_driver(my_form, REQ_END_LINE); } break; case 27: case KEY_F(10): case 'q': case 'Q': quit = 1; break; } } /* before we get the new 'cur', store cur in prev */ prev = cur; if(!(cur = current_field(my_form))) { vrmr_error(-1, VR_INTERR, "NULL pointer (in: %s).", __FUNC__); return(-1); } /* draw and set cursor */ wrefresh(ib_win); pos_form_cursor(my_form); } /* save here */ if(filter_save(debuglvl, filter) < 0) { vrmr_error(-1, VR_ERR, gettext("setting filter failed.")); } unpost_form(my_form); free_form(my_form); for(i=0; i < FiFi.n_fields; i++) { free_field(FiFi.fields[i]); } free(FiFi.fields); del_panel(my_panels[0]); destroy_win(ib_win); update_panels(); doupdate(); return(0); }