void end_disp() { nocrmode(); echo(); nl(); refresh(); endwin(); }
void sighandler(int signum) { signal(SIGINT, SIG_IGN); nocrmode(); echo(); mvcur(0, COLS-1, LINES-2, 0); endwin(); exit(0); }
/*=============================== * interact_worker -- Interact with user * This is just for browse screens (witness argument "screen") *=============================*/ static INT interact_worker (UIWINDOW uiwin, STRING str, INT screen) { char buffer[4]; /* 3 char cmds max */ INT offset=0; INT cmdnum; INT c, i, n = str ? strlen(str) : 0; /* Menu Loop */ while (TRUE) { INT time_start=time(NULL); crmode(); keypad(uiw_win(uiwin),1); c = wgetch(uiw_win(uiwin)); ui_time_elapsed += time(NULL) - time_start; if (c == EOF) c = 'q'; nocrmode(); /* after they chose off the menu, we wipe any status message still lingering from before they chose */ clear_status_display(); /* return hardware and control keys in case caller handles them */ if (c<0x20) { return translate_control_key(c); } if (has_key(c)) { return translate_hdware_key(c); } if (str) { /* traditional: list of choice letters */ for (i = 0; i < n; i++) { if (c == (uchar)str[i]) return c; } } else { /* new menus (in menuitem.c) */ if (offset < (INT)sizeof(buffer)-1) { buffer[offset] = c; buffer[offset+1] = 0; offset++; } else { buffer[0] = c; buffer[1] = 0; offset = 1; } /* Get Menu Command */ cmdnum = menuset_check_cmd(get_screen_menuset(screen), buffer); /* Act On Menu Command */ if (cmdnum != CMD_NONE && cmdnum != CMD_PARTIAL) { return cmdnum; } if (cmdnum != CMD_PARTIAL) { msg_error(_(qSmn_unkcmd)); offset = 0; } } /* choice was no good, we loop & wait for another choice */ } }
/* * Function to do a complete selection screen */ int iSelect_Browser(int wYSize, int wXSize, int wYPos, int wXPos, int selectpos, int multiselect, int sYSize, int sXSize, int sYPos, int sXPos, char *title, char *name, int mYSize, int mXSize, int mYPos, int mXPos, char **keystr, char *tagbegin, char *tagend) { WINDOW *wField; WINDOW *sField; WINDOW *mField; WINDOW *hField; int i; int nFirstLine, nLastLine; /* first & last line in buffer */ int nAbsFirstLine, nAbsLastLine; /* first & last line of output buffer */ int nRelMarked; /* relative line inside output buffer of marked line */ int nRelFirstDraw, nRelLastDraw; /* relative first & last line inside output buffer */ int c; int bEOI; int bQuit = FALSE; int y; int x; char msg[1024]; char ca[1024]; char ca3[1024]; char *cp; char *cp2; char *cp3; char **cpp; int ok; int bAllowEmpty; /* * Browser field */ wField = newwin(wYSize, wXSize, wYPos, wXPos); werase(wField); crmode(); noecho(); keypad(wField, TRUE); scrollok(wField, FALSE); /* * Status field */ sField = newwin(sYSize, sXSize, sYPos, sXPos); werase(sField); strcpy(msg, ""); /* * Message field */ mField = newwin(mYSize, mXSize, mYPos, mXPos); werase(mField); /* dimension of file */ nFirstLine = 0; nLastLine = nLines-1; /* determine curses select position */ if (selectpos < -1) selectpos = -1; if (selectpos > nLastLine) selectpos = nLastLine; if (selectpos == -1) { selectpos = 0; /* search for first selectable line */ for (i = nFirstLine; i < nLastLine; i++) { if (spaLines[i]->fSelectable) { selectpos = i; break; } } } /* calculate browser view borders */ if (nLastLine < (wYSize-1)) { /* buffer has fewer lines then our browser window */ nAbsFirstLine = nFirstLine; nAbsLastLine = nLastLine; nRelFirstDraw = 0; nRelLastDraw = nLastLine-nFirstLine; nRelMarked = selectpos; } else { /* browser window is smaller then file */ /* find top view position, so adjust the cursor into the middle of the browser window */ y = selectpos - (int)((wYSize-1)/2); if (y <= 0) y = 0; if (y+(wYSize-1) > nLastLine) y = nLastLine-(wYSize-1); nAbsFirstLine = y; nAbsLastLine = y+(wYSize-1); nRelFirstDraw = 0; nRelLastDraw = (wYSize-1); nRelMarked = selectpos-y; } ok = FALSE; for (i = nFirstLine; i < nLastLine; i++) { if (spaLines[i]->fSelectable) { ok = TRUE; break; } } if (!ok) strcpy(msg, "WARNING! No lines selectable."); bEOI = FALSE; while (bEOI == FALSE) { iSelect_Draw(wField, wYSize, wXSize, wYPos, wXPos, nAbsFirstLine, nAbsLastLine, nRelMarked, nRelFirstDraw, nRelLastDraw, nLines, sField, title, name, mField, msg, tagbegin, tagend); wrefresh(wField); strcpy(msg, ""); c = wgetch(wField); *keystr = key2asc(c); c = do_custom_key(c); if (c == KEY_LEFT) c = 'q'; if (c == KEY_RIGHT) c = '\n'; if (c >= KEY_MIN && c <= KEY_MAX) { /* * a curses special function key */ if (c == KEY_DOWN) { if (nAbsFirstLine+nRelMarked < nAbsLastLine) { nRelMarked++; /* nRelFirstDraw=nRelMarked-1; !!OPTIMIZE!! */ /* nRelLastDraw=nRelMarked; !!OPTIMIZE!! */ } else { if (nAbsLastLine < nLastLine) { wscrl(wField, 1); nAbsFirstLine++; nAbsLastLine++; /* nRelFirstDraw=(wYSize-1); !!OPTIMIZE!! */ /* nRelLastDraw=(wYSize-1); !!OPTIMIZE!!*/ } else { strcpy(msg, "Already at End."); } } } else if (c == KEY_UP) { if (nRelMarked > 0) { nRelMarked--; /* nRelLastDraw=nRelMarked; !!OPTIMIZE!! */ /* nRelFirstDraw=nRelMarked+1; !!OPTIMIZE!! */ } else { if (nAbsFirstLine > nFirstLine) { wscrl(wField, -1); nAbsFirstLine--; nAbsLastLine--; /* nRelFirstDraw=0 !!OPTIMIZE!! */ /* nRelLastDraw=0; !!OPTIMIZE!! */ } else { strcpy(msg, "Already at Begin."); } } } else if (c == KEY_NPAGE) { if (nAbsFirstLine+nRelMarked == nLastLine) { strcpy(msg, "Already at End."); } else { for (i = 0; i < (wYSize-1); i++) { if (nAbsFirstLine+nRelMarked < nAbsLastLine) nRelMarked++; else { if (nAbsLastLine < nLastLine) { wscrl(wField, 1); nAbsFirstLine++; nAbsLastLine++; } } } } } else if (c == KEY_PPAGE) { if (nAbsFirstLine+nRelMarked == nFirstLine) { strcpy(msg, "Already at Begin."); } else { for (i = 0; i < (wYSize-1); i++) { if (nRelMarked > 0) nRelMarked--; else { if (nAbsFirstLine > nFirstLine) { wscrl(wField, -1); nAbsFirstLine--; nAbsLastLine--; } } } } } else { strcpy(msg, "Invalid special key. Press 'h' for Help Page!"); } } else { c = c & 0xff; /* strip down to 8bit */ if (c < 32 || c > 126) { /* * a control code */ if (c == '\n' || c == '\r') { /* RETURN */ if (spaLines[nAbsFirstLine+nRelMarked]->fSelectable) { spaLines[nAbsFirstLine+nRelMarked]->fSelected = TRUE; bEOI = TRUE; } else { if (multiselect) { for (i = 0; i < nLines; i++) { if (spaLines[i]->fSelected) { bEOI = TRUE; break; } } if (!bEOI) strcpy(msg, "Line not selectable and still no others selected."); } else { strcpy(msg, "Line not selectable."); } } /* additionally ask for query strings */ if (bEOI == TRUE) { cp = spaLines[nAbsFirstLine+nRelMarked]->cpResult; cp2 = ca; while (bEOI == TRUE && *cp != NUL) { if (strnEQ(cp, "%[", 2)) { cp += 2; for (cp3 = cp; !strniEQ(cp3, "]s", 2); cp3++) ; strncpy(ca3, cp, cp3-cp); ca3[cp3-cp] = NUL; cp = cp3+1; if (*cp == 's') bAllowEmpty = TRUE; else bAllowEmpty = FALSE; cp++; sprintf(msg, "%s: ", ca3); iSelect_Draw(wField, wYSize, wXSize, wYPos, wXPos, nAbsFirstLine, nAbsLastLine, -1, nRelFirstDraw, nRelLastDraw, nLines, sField, title, name, mField, msg, tagbegin, tagend); wrefresh(wField); cp3 = iSelect_InputField(mYSize, mXSize-strlen(msg), mYPos, mXPos+strlen(msg), bAllowEmpty); if (strEQ(cp3, "ESC")) { bEOI = FALSE; spaLines[nAbsFirstLine+nRelMarked]->fSelected = FALSE; strcpy(msg, "Selection cancelled."); continue; } strcpy(msg, ""); strcpy(cp2, cp3); cp2 += strlen(cp3); } else { *cp2++ = *cp++; } } if (bEOI == TRUE) { *cp2 = NUL; if (strNE(spaLines[nAbsFirstLine+nRelMarked]->cpResult, ca)) spaLines[nAbsFirstLine+nRelMarked]->cpResult = strdup(ca); } } } } if (c >= 32 && c <= 126) { /* * a printable character */ if (c == ' ') { if (multiselect) { if (spaLines[nAbsFirstLine+nRelMarked]->fSelectable) { if (spaLines[nAbsFirstLine+nRelMarked]->fSelected == FALSE) spaLines[nAbsFirstLine+nRelMarked]->fSelected = TRUE; else spaLines[nAbsFirstLine+nRelMarked]->fSelected = FALSE; } else { strcpy(msg, "Line not selectable."); } } else { strcpy(msg, "No multi-line selection allowed."); } } else if (c == 'q') { bEOI = TRUE; bQuit = TRUE; } else if (c == 'g') { if (nAbsFirstLine+nRelMarked == nFirstLine) { strcpy(msg, "Already at Begin."); } else { if (nLastLine < (wYSize-1)) { nAbsFirstLine = nFirstLine; nAbsLastLine = nLastLine; nRelFirstDraw = 0; nRelLastDraw = nLastLine-nFirstLine; nRelMarked = 0; } else { nAbsFirstLine = nFirstLine; nAbsLastLine = nFirstLine+(wYSize-1); nRelFirstDraw = 0; nRelLastDraw = (wYSize-1); nRelMarked = 0; } } } else if (c == 'G') { if (nAbsFirstLine+nRelMarked == nLastLine) { strcpy(msg, "Already at End."); } else { if (nLastLine < (wYSize-1)) { nAbsFirstLine = nFirstLine; nAbsLastLine = nLastLine; nRelFirstDraw = 0; nRelLastDraw = nLastLine-nFirstLine; nRelMarked = nLastLine-nFirstLine; } else { nAbsFirstLine = nLastLine-(wYSize-1); nAbsLastLine = nLastLine; nRelFirstDraw = 0; nRelLastDraw = (wYSize-1); nRelMarked = (wYSize-1); } } } else if (c == 'h' || c == 'v') { if (c == 'h') strcpy(msg, "Help Page: Press 'q' to exit"); else strcpy(msg, "Version Page: Press 'q' to exit"); iSelect_Draw(wField, wYSize, wXSize, wYPos, wXPos, nAbsFirstLine, nAbsLastLine, nRelMarked, nRelFirstDraw, nRelLastDraw, nLines, sField, title, name, mField, msg, tagbegin, tagend); wrefresh(wField); hField = newwin(wYSize, wXSize, wYPos, wXPos); werase(hField); if (c == 'h') cpp = iSelect_Help; else cpp = iSelect_README; for (y = 0; y < wYSize && cpp[y] != NULL; y++) { sprintf(ca, cpp[y]); cp = ca; x = 0; while (1) { if ((cp2 = strstr(cp, "<b>")) != NULL) { *cp2 = NUL; wmove(hField, y, x); waddstr(hField, cp); x += strlen(cp); wattrset(hField, A_NORMAL|A_BOLD); cp = cp2+3; cp2 = strstr(cp, "</b>"); *cp2 = NUL; wmove(hField, y, x); waddstr(hField, cp); x += strlen(cp); wattrset(hField, A_NORMAL); cp = cp2+4; } else { wmove(hField, y, x); waddstr(hField, cp); break; } } } wrefresh(hField); while (1) { c = wgetch(wField); c = c & 0xff; /* strip down to 8bit */ if (c == 'q') break; } delwin(hField); nRelFirstDraw = 0; nRelLastDraw = nAbsLastLine-nAbsFirstLine; strcpy(msg, ""); iSelect_Draw(wField, wYSize, wXSize, wYPos, wXPos, nAbsFirstLine, nAbsLastLine, nRelMarked, nRelFirstDraw, nRelLastDraw, nLines, sField, title, name, mField, msg, tagbegin, tagend); #ifndef USE_SLCURSES redrawwin(wField); #endif wrefresh(wField); } else { strcpy(msg, "Invalid key. Press 'h' for Help Page!"); } } } } fflush(stdin); echo(); #ifndef USE_SLCURSES nocrmode(); #endif delwin(wField); if (bQuit) return(-1); else return(nAbsFirstLine+nRelMarked); }