void wclrtoborder(WINDOW *win) { int x, y; getyx(win, y, x); mvwclrtoborder(win, y, x); }
void waddbar(WINDOW *win, int y, float v, float min, float max, char *cscale, bool rev) { chtype ch = '=' | A_BOLD | cp_from_scale(v, cscale, rev); int len = MAXXLEN * interpolate(v, min, max); mvwhline(win, y, 1, ch, len); mvwclrtoborder(win, y, len + 1); }
static void display_aplist(WINDOW *w_aplst) { char s[IW_ESSID_MAX_SIZE << 3]; const char *sort_type[] = { [SO_CHAN] = "Chan", [SO_SIGNAL] = "Sig", [SO_MAC] = "Mac", [SO_ESSID] = "Essid", [SO_OPEN] = "Open", [SO_CHAN_SIG] = "Ch/Sg", [SO_OPEN_SIG] = "Op/Sg" }; int i, col, line = START_LINE; struct scan_entry *cur; /* Scanning can take several seconds - do not refresh if locked. */ if (pthread_mutex_trylock(&sr.mutex)) return; if (sr.head || *sr.msg) for (i = 1; i <= MAXYLEN; i++) mvwclrtoborder(w_aplst, i, 1); if (!sr.head) waddstr_center(w_aplst, WAV_HEIGHT/2 - 1, sr.msg); sort_scan_list(&sr.head); /* Truncate overly long access point lists to match screen height. */ for (cur = sr.head; cur && line < MAXYLEN; line++, cur = cur->next) { col = CP_SCAN_NON_AP; if (!WLAN_CAPABILITY_IS_STA_BSS(cur->bss_capa) && (cur->bss_capa & WLAN_CAPABILITY_ESS)) { col = cur->has_key ? CP_SCAN_CRYPT : CP_SCAN_UNENC; } wmove(w_aplst, line, 1); if (!*cur->essid) { sprintf(s, "%-*s ", sr.max_essid_len, "<hidden ESSID>"); wattron(w_aplst, COLOR_PAIR(col)); waddstr(w_aplst, s); } else if (str_is_ascii(cur->essid)) { sprintf(s, "%-*s ", sr.max_essid_len, cur->essid); waddstr_b(w_aplst, s); wattron(w_aplst, COLOR_PAIR(col)); } else { sprintf(s, "%-*s ", sr.max_essid_len, "<cryptic ESSID>"); wattron(w_aplst, COLOR_PAIR(col)); waddstr(w_aplst, s); } waddstr(w_aplst, ether_addr(&cur->ap_addr)); wattroff(w_aplst, COLOR_PAIR(col)); fmt_scan_entry(cur, s, sizeof(s)); waddstr(w_aplst, " "); waddstr(w_aplst, s); } if (sr.num.entries < MAX_CH_STATS) goto done; wmove(w_aplst, MAXYLEN, 1); wadd_attr_str(w_aplst, A_REVERSE, "total:"); sprintf(s, " %d ", sr.num.entries); waddstr(w_aplst, s); sprintf(s, "%s %ssc", sort_type[conf.scan_sort_order], conf.scan_sort_asc ? "a" : "de"); wadd_attr_str(w_aplst, A_REVERSE, s); if (sr.num.entries + START_LINE > line) { sprintf(s, ", %d not shown", sr.num.entries + START_LINE - line); waddstr(w_aplst, s); } if (sr.num.open) { sprintf(s, ", %d open", sr.num.open); waddstr(w_aplst, s); } if (sr.num.two_gig && sr.num.five_gig) { waddch(w_aplst, ' '); wadd_attr_str(w_aplst, A_REVERSE, "5/2GHz:"); sprintf(s, " %d/%d", sr.num.five_gig, sr.num.two_gig); waddstr(w_aplst, s); } if (sr.channel_stats) { waddch(w_aplst, ' '); if (conf.scan_sort_order == SO_CHAN && !conf.scan_sort_asc) sprintf(s, "bottom-%d:", (int)sr.num.ch_stats); else sprintf(s, "top-%d:", (int)sr.num.ch_stats); wadd_attr_str(w_aplst, A_REVERSE, s); for (i = 0; i < sr.num.ch_stats; i++) { waddstr(w_aplst, i ? ", " : " "); sprintf(s, "ch#%d", sr.channel_stats[i].val); wadd_attr_str(w_aplst, A_BOLD, s); sprintf(s, " (%d)", sr.channel_stats[i].count); waddstr(w_aplst, s); } } done: pthread_mutex_unlock(&sr.mutex); wrefresh(w_aplst); }