unsigned LoginBox (acclist_t al, char* password) { CursesInit(); if (!(_loginbox = newwin (LOGIN_WINDOW_HEIGHT, LOGIN_WINDOW_WIDTH, (LINES-LOGIN_WINDOW_HEIGHT)/2, (COLS-LOGIN_WINDOW_WIDTH)/2))) ExitWithMessage ("failed to create login window"); keypad (_loginbox, true); nodelay (_loginbox, false); wbkgd (_loginbox, COLOR_PAIR(1)|' '); int key; unsigned pwlen = 0; const unsigned aln = NAccounts(); if (!aln) ExitWithMessage ("no usable accounts found"); memset (password, 0, MAX_PW_LEN); // Make last logged in user default unsigned ali = 0; for (unsigned i = 0; i < aln; ++i) if (al[ali]->ltime <= al[i]->ltime) ali = i; do { wattrset (_loginbox, COLOR_PAIR(1)); werase (_loginbox); box (_loginbox, 0, 0); mvwaddstr (_loginbox, 1,2, USERNAME_PROMPT); mvwaddstr (_loginbox, 2,2, PASSWORD_PROMPT); wattrset (_loginbox, COLOR_PAIR(2)); mvwaddnstr (_loginbox, 1,2+sizeof(USERNAME_PROMPT), al[ali]->name, MAX_INPUT_WIDTH); mvwaddnstr (_loginbox, 2,2+sizeof(PASSWORD_PROMPT), PASSWORD_MASKSTR, min(strlen(PASSWORD_MASKSTR),pwlen)); wrefresh (_loginbox); key = wgetch (_loginbox); if (isprint(key) && pwlen < MAX_PW_LEN-1) password[pwlen++] = key; else if (key == KEY_BACKSPACE && pwlen > 0) password[--pwlen] = 0; else if (key == KEY_UP) ali = (ali-1) % aln; else if (key == KEY_DOWN || key == '\t') ali = (ali+1) % aln; } while (key != '\n'); delwin (_loginbox); CursesCleanup(); return ali; }
static void CursesInit (void) { if (!initscr()) ExitWithMessage ("failed to initialize curses"); atexit (CursesCleanup); start_color(); use_default_colors(); init_pair (1, COLOR_GREEN, COLOR_DEFAULT); init_pair (2, COLOR_CYAN, COLOR_DEFAULT); noecho(); }
bool HandleAssert(const char *pMsg, const char *pFile, int line) { const int CBuffSize = 120; const int CBuffMaxMsg = 80; const char *p = (pMsg == 0) ? "<none>" : pMsg; if (std::strlen(p) > CBuffMaxMsg) p = "<too long>"; char buff[CBuffSize]; buff[0] = 0; std::sprintf(buff, "ASSERT %s @ %s:%i", p, pFile, line); ExitWithMessage(buff); // never goes here return true; }