/* * Show status line temporarily */ static void showtemp(void) { if (st) return; st = mc_wopen(0, LINES - 1, COLS - 1, LINES - 1, BNONE, st_attr, sfcolor, sbcolor, 1, 0, 1); show_status(); tempst = 1; }
/* * Initialize the file directory. */ static int init_filedir(void) { int x1, x2; int retstat = -1; dirflush = 0; x1 = (COLS / 2) - 37; x2 = (COLS / 2) + 37; dsub = mc_wopen(x1 - 1, LINES - 3, x2 + 1, LINES - 3, BNONE, stdattr, mfcolor, mbcolor, 0, 0, 1); main_w = mc_wopen(x1, 2, x2, LINES - 6, BSINGLE, stdattr, mfcolor, mbcolor, 0, 0, 1); if (ret_buf != NULL || (retstat = ((ret_buf = (char *)malloc(BUFSIZ)) == NULL)? -1 : 0) == 0) { retstat = new_filedir(NULL, 0); dirflush = 1; mc_wredraw(dsub, 1); } return retstat; }
/* * fmg 8/20/97 * Search history - main function that started the C-code blasphemy :-) * This function doesn't care about case/case-less status... */ void searchhist(WIN *w_hist, wchar_t *str) { int y; WIN *w_new; const char *hline; size_t i; /* Find out how big a window we must open. */ y = w_hist->y2; if (st == (WIN *)0 || (st && tempst)) y--; /* Open a Search line window. */ w_new = mc_wopen(0, y+1, w_hist->x2, y+1, 0, st_attr, sfcolor, sbcolor, 0, 0, 1); w_new->doscroll = 0; w_new->wrap = 0; hline = _("SEARCH FOR (ESC=Exit)"); mc_wprintf(w_new, "%s(%d):",hline,MAX_SEARCH); mc_wredraw(w_new, 1); mc_wflush(); mc_wlocate(w_new, mbslen(hline)+6, 0); for (i = 0; str[i] != 0; i++) mc_wputc(w_new, str[i]); mc_wlocate(w_new, mbslen(hline)+6, 0); mc_wgetwcs(w_new, str, MAX_SEARCH, MAX_SEARCH); #if 0 if (!str[0]) { /* then unchanged... must have pressed ESC... get out */ mc_wflush(); mc_wclose(w_new, 0); return; } #endif mc_wredraw(w_hist, 1); mc_wclose(w_new, 1); mc_wflush(); return; }
/* * Initialize screen and status line. */ void init_emul(int type, int do_init) { int x = -1, y = -1; char attr = 0; int maxy; int ypos; if (st) { mc_wclose(st, 1); tempst = 0; st = NULL; } if (us) { x = us->curx; y = us->cury; attr = us->attr; mc_wclose(us, 0); } /* See if we have space for a fixed status line */ maxy = LINES - 1; if ((use_status || LINES > 24) && P_STATLINE[0] == 'e') { if (use_status) { ypos = LINES; maxy = LINES - 1; } else { ypos = LINES - 1; maxy = LINES - 2; } st = mc_wopen(0, ypos, COLS - 1, ypos, BNONE, st_attr, sfcolor, sbcolor, 1, 0, 1); mc_wredraw(st, 1); } /* MARK updated 02/17/95 - Customizable size for history buffer */ num_hist_lines = atoi(P_HISTSIZE); if (num_hist_lines < 0) num_hist_lines = 0; if (num_hist_lines > 5000) num_hist_lines = 5000; /* Open a new main window, and define the configured history buffer size. */ us = mc_wopen(0, 0, COLS - 1, maxy, BNONE, XA_NORMAL, tfcolor, tbcolor, 1, num_hist_lines, 0); if (x >= 0) { mc_wlocate(us, x, y); mc_wsetattr(us, attr); } us->autocr = 0; us->wrap = wrapln; terminal = type; lines = LINES - (st != NULL); cols = COLS; /* Install and reset the terminal emulator. */ if (do_init) { vt_install(do_output, kb_handler, us); vt_init(type, tfcolor, tbcolor, us->wrap, addlf, addcr); } else vt_pinit(us, -1, -1); show_status(); }
/* Scroll back */ static void scrollback(void) { int y,c; WIN *b_us, *b_st; ELM *tmp_e; int case_matters=0; /* fmg: case-importance, needed for 'N' */ static wchar_t look_for[MAX_SEARCH]; /* fmg: last used search pattern */ wchar_t tmp_line[MAXCOLS]; int citemode = 0; int cite_ystart = 1000000, cite_yend = -1, cite_y = 0; int inverse; int loop = 1; char hline0[128], hline1[128], *hline; static int hit=0; /* Find out how big a window we must open. */ y = us->y2; if (st == (WIN *)0 || (st && tempst)) y--; /* Open a window. */ b_us = mc_wopen(0, 0, us->x2, y, 0, us->attr, COLFG(us->color), COLBG(us->color), 0, 0, 0); mc_wcursor(b_us, CNONE); /* Open a help line window. */ b_st = mc_wopen(0, y+1, us->x2, y+1, 0, st_attr, sfcolor, sbcolor, 0, 0, 1); b_st->doscroll = 0; b_st->wrap = 0; /* Make sure help line is as wide as window. */ /* * fmg 8/20/97 * added /=Srch, \=CaseLess, and N=Next and changed rest of line... * Hope you like it :-) */ strcpy(hline0, _("HISTORY: U=Up D=Down F=PgDn B=PgUp s=Srch S=CaseLess N=Next C=Cite ESC=Exit ")); if (b_st->xs < 127) hline0[b_st->xs] = 0; hline = hline0; mc_wprintf(b_st, "%s", hline); mc_wredraw(b_st, 1); mc_wflush(); /* And do the job. */ y = us->histlines; /* fmg 8/20/97 * Needed for N)extSearch, keeps track of line on which current "hit" * is... we advance it to 'N'ext hit in find_next(). We start at "top" * of history stack */ hit = 0; drawhist(b_us, y, 0); while (loop) { c = wxgetch(); switch (c) { /* * fmg 8/22/97 * Take care of the search key: Caseless */ case '\\': case 'S': case_matters = 0; /* case-importance, ie. none :-) */ /* * fmg 8/22/97 * Take care of the search key: Exact Match */ case '/': case 's': if (!us->histlines) { mc_wbell(); werror(_("History buffer Disabled!")); break; } if (!us->histline) { mc_wbell(); werror(_("History buffer empty!")); break; } if (citemode) break; /* we need this for the case-importance-toggle to work.. */ if (c == '/' || c == 's') case_matters=1; /* case-importance, ie. DOES */ /* open up new search window... */ searchhist(b_us, look_for); /* must redraw status line... */ mc_wlocate(b_st, 0, 0); /* move back to column 0! */ mc_wprintf(b_st, "%s", hline); /* and show the above-defined hline */ mc_wredraw(b_st, 1); /* again... */ /* highlight any matches */ if (wcslen(look_for) > 1) { hit = find_next(us, b_us, y, look_for, case_matters); if (hit == -1) { mc_wbell(); mc_wflush(); hit = 0; break; } drawhist_look(b_us, hit, 1, look_for, case_matters); y = hit; } else { mc_wbell(); break; } mc_wflush(); break; /* * fmg 8/22/97 * Take care of the Next Hit key... * Popup an error window if no previous... why not start a new * search? How do we know which case-importance they wanted? */ case 'n': case 'N': /* highlight NEXT match */ if (citemode) break; if (wcslen(look_for) > 1) { hit = find_next(us, b_us, y, look_for, case_matters); if (hit == -1) { mc_wbell(); mc_wflush(); hit = 0; break; } drawhist_look(b_us, hit, 1, look_for, case_matters); y = hit; } else { /* no search pattern... */ mc_wbell(); werror(_("No previous search!\n Please 's' or 'S' first!")); } mc_wflush(); break; case 'u': case 'U': case K_UP: if (citemode && cite_y) { cite_y--; if (cite_ystart != 1000000) { cite_yend = y + cite_y; drawcite(b_us, cite_y+1, y, cite_ystart, cite_yend); drawcite(b_us, cite_y, y, cite_ystart, cite_yend); } mc_wlocate(b_us, 0, cite_y); break; } if (y <= 0) break; y--; if (cite_ystart != 1000000) cite_yend = y + cite_y; mc_wscroll(b_us, S_DOWN); /* * fmg 8/20/97 * This is needed so that the movement in window will HIGHLIGHT * the lines that have the pattern we wanted... it's just nice. * This almost beggs for a function :-) */ if (citemode) { inverse = (y+cite_y >= cite_ystart && y+cite_y <= cite_yend); } else { tmp_e = mc_getline(b_us, y); if (wcslen(look_for) > 1) { /* quick scan for pattern match */ mc_wdrawelm_var(b_us, tmp_e, tmp_line); inverse = (wcslen(tmp_line)>1 && StrStr(tmp_line, look_for, case_matters)); } else inverse = 0; } if (inverse) mc_wdrawelm_inverse(b_us, 0, mc_getline(b_us, y)); else mc_wdrawelm(b_us, 0, mc_getline(b_us, y)); if (citemode) mc_wlocate(b_us, 0, cite_y); mc_wflush(); break; case 'd': case 'D': case K_DN: if (citemode && cite_y < b_us->ys-1) { cite_y++; if (cite_ystart != 1000000) { cite_yend = y + cite_y; drawcite(b_us, cite_y-1, y, cite_ystart, cite_yend); drawcite(b_us, cite_y, y, cite_ystart, cite_yend); } mc_wlocate(b_us, 0, cite_y); break; } if (y >= us->histlines) break; y++; if (cite_ystart != 1000000) cite_yend = y + cite_y; mc_wscroll(b_us, S_UP); /* * fmg 8/20/97 * This is needed so that the movement in window will HIGHLIGHT * the lines that have the pattern we wanted... it's just nice. * This almost beggs for a function :-) */ if (citemode) { inverse = (y+cite_y >= cite_ystart && y+cite_y <= cite_yend); } else { tmp_e = mc_getline(b_us, y + b_us->ys - 1); if (wcslen(look_for) > 1) { /* quick scan for pattern match */ mc_wdrawelm_var(b_us, tmp_e, tmp_line); inverse = (wcslen(tmp_line)>1 && StrStr(tmp_line, look_for, case_matters)); } else inverse = 0; } if (inverse) mc_wdrawelm_inverse(b_us, b_us->ys - 1, mc_getline(b_us, y + b_us->ys - 1)); else mc_wdrawelm(b_us, b_us->ys - 1, mc_getline(b_us, y + b_us->ys - 1)); if (citemode) mc_wlocate(b_us, 0, cite_y); mc_wflush(); break; case 'b': case 'B': case K_PGUP: if (y <= 0) break; y -= b_us->ys; if (y < 0) y = 0; if (cite_ystart != 1000000) cite_yend = y + cite_y; /* * fmg 8/20/97 * This is needed so that the movement in window will HIGHLIGHT * the lines that have the pattern we wanted... it's just nice. * Highlight any matches */ if (wcslen(look_for) > 1 && us->histline) drawhist_look(b_us, y, 1, look_for, case_matters); else drawhist(b_us, y, 1); if (citemode) mc_wlocate(b_us, 0, cite_y); break; case 'f': case 'F': case ' ': /* filipg: space bar will go page-down... pager-like */ case K_PGDN: if (y >= us->histlines) break; y += b_us->ys; if (y > us->histlines) y=us->histlines; if (cite_ystart != 1000000) cite_yend = y + cite_y; /* * fmg 8/20/97 * This is needed so that the movement in window will HIGHLIGHT * the lines that have the pattern we wanted... it's just nice. * Highlight any matches */ if (wcslen(look_for) > 1 && us->histline) drawhist_look(b_us, y, 1, look_for, case_matters); else drawhist(b_us, y, 1); if (citemode) mc_wlocate(b_us, 0, cite_y); break; case 'C': case 'c': /* start citation mode */ if (citemode ^= 1) { cite_y = 0; cite_ystart = 1000000; cite_yend = -1; strcpy(hline1, _(" CITATION: ENTER=select start line ESC=exit ")); if (b_st->xs < 127) hline1[b_st->xs]=0; hline = hline1; } else { hline = hline0; } mc_wlocate(b_st, 0, 0); mc_wprintf(b_st, "%s", hline); mc_wredraw(b_st, 1); if (citemode) mc_wlocate(b_us, 0, cite_y); break; case 10: case 13: if (!citemode) break; if (cite_ystart == 1000000) { cite_yend = cite_ystart = y + cite_y; strcpy(hline1, _(" CITATION: ENTER=select end line ESC=exit ")); if (b_st->xs < 127) hline1[b_st->xs]=0; } else { if (cite_ystart > cite_yend) break; drawcite_whole(b_us, y, 1000000, -1); loop = 0; break; } mc_wlocate(b_st, 0, 0); mc_wprintf(b_st, "%s", hline); mc_wredraw(b_st, 1); mc_wdrawelm_inverse(b_us, cite_y, mc_getline(b_us, cite_ystart)); mc_wlocate(b_us, 0, cite_y); break; case K_ESC: if (!citemode) { loop = 0; break; } if (cite_ystart == 1000000) { citemode = 0; hline = hline0; } else { cite_ystart = 1000000; strcpy(hline1, _(" CITATION: ENTER=select start line ESC=exit ")); } drawcite_whole(b_us, y, cite_ystart, cite_yend); mc_wlocate(b_st, 0, 0); mc_wprintf(b_st, "%s", hline); mc_wredraw(b_st, 1); if (citemode) mc_wlocate(b_us, 0, cite_y); break; } } /* Cleanup. */ if (citemode) do_cite(b_us, cite_ystart, cite_yend); mc_wclose(b_us, y == us->histlines ? 0 : 1); mc_wclose(b_st, 1); mc_wlocate(us, us->curx, us->cury); mc_wflush(); mc_wredraw(us, 1); }
/* * Run an external script. * ask = 1 if first ask for confirmation. * s = scriptname, l=loginname, p=password. */ void runscript(int ask, const char *s, const char *l, const char *p) { int status; int n, i; int pipefd[2]; char buf[81]; char scr_lines[5]; char cmdline[128]; struct pollfd fds[2]; char *translated_cmdline; char *ptr; WIN *w; int done = 0; char *msg = _("Same as last"); char *username = _(" A - Username :"******" B - Password :"******" C - Name of script :"), *question = _("Change which setting? (Return to run, ESC to stop)"); if (ask) { w = mc_wopen(10, 5, 70, 10, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1); mc_wtitle(w, TMID, _("Run a script")); mc_wputs(w, "\n"); mc_wprintf(w, "%s %s\n", username, scr_user[0] ? msg : ""); mc_wprintf(w, "%s %s\n", password, scr_passwd[0] ? msg : ""); mc_wprintf(w, "%s %s\n", name_of_script, scr_name); mc_wlocate(w, 4, 5); mc_wputs(w, question); mc_wredraw(w, 1); while (!done) { mc_wlocate(w, mbslen (question) + 5, 5); n = wxgetch(); if (islower(n)) n = toupper(n); switch (n) { case '\r': case '\n': if (scr_name[0] == '\0') { mc_wbell(); break; } mc_wclose(w, 1); done = 1; break; case 27: /* ESC */ mc_wclose(w, 1); return; case 'A': mc_wlocate(w, mbslen (username) + 1, 1); mc_wclreol(w); scr_user[0] = 0; mc_wgets(w, scr_user, 32, 32); break; case 'B': mc_wlocate(w, mbslen (password) + 1, 2); mc_wclreol(w); scr_passwd[0] = 0; mc_wgets(w, scr_passwd, 32, 32); break; case 'C': mc_wlocate(w, mbslen (name_of_script) + 1, 3); mc_wgets(w, scr_name, 32, 32); break; default: break; } } } else { strncpy(scr_user, l, sizeof(scr_user)); strncpy(scr_name, s, sizeof(scr_name)); strncpy(scr_passwd, p, sizeof(scr_passwd)); } sprintf(scr_lines, "%d", (int) lines); /* jl 13.09.97 */ /* Throw away status line if temporary */ if (tempst) { mc_wclose(st, 1); tempst = 0; st = NULL; } scriptname(scr_name); pipe(pipefd); if (mcd(P_SCRIPTDIR) < 0) return; snprintf(cmdline, sizeof(cmdline), "%s %s %s %s", P_SCRIPTPROG, scr_name, logfname, logfname[0]==0? "": homedir); switch (udpid = fork()) { case -1: werror(_("Out of memory: could not fork()")); close(pipefd[0]); close(pipefd[1]); mcd(""); return; case 0: /* Child */ dup2(portfd, 0); dup2(portfd, 1); dup2(pipefd[1], 2); close(pipefd[0]); close(pipefd[1]); for (n = 1; n < _NSIG; n++) signal(n, SIG_DFL); mc_setenv("LOGIN", scr_user); mc_setenv("PASS", scr_passwd); mc_setenv("TERMLIN", scr_lines); /* jl 13.09.97 */ translated_cmdline = translate(cmdline); if (translated_cmdline != NULL) { fastexec(translated_cmdline); free(translated_cmdline); } exit(1); default: /* Parent */ break; } setcbreak(1); /* Cbreak, no echo */ enab_sig(1, 0); /* But enable SIGINT */ signal(SIGINT, udcatch); close(pipefd[1]); /* pipe output from "runscript" program to terminal emulator */ fds[0].fd = pipefd[0]; /* runscript */ fds[0].events = POLLIN; fds[1].fd = STDIN_FILENO; /* stdin */ fds[1].events = POLLIN; script_running = 1; while (script_running && poll(fds, 2, -1) > 0) for (i = 0; i < 2; i++) { if (fds[i].revents & (POLLERR | POLLHUP | POLLNVAL)) script_running = 0; else if ((fds[i].revents & POLLIN) && (n = read(fds[i].fd, buf, sizeof(buf)-1)) > 0) { ptr = buf; while (n--) if (i) vt_send(*ptr++); else vt_out(*ptr++); timer_update(); mc_wflush(); } } /* Collect status, and clean up. */ m_wait(&status); enab_sig(0, 0); signal(SIGINT, SIG_IGN); setcbreak(2); /* Raw, no echo */ close(pipefd[0]); scriptname(""); mcd(""); }
void updown(int what, int nr) { #ifdef LOG_XFER #warning LOG_XFER defined! FILE *xfl; #endif const char *name[13]; int idx[13]; int r, f, g = 0; char *t = what == 'U' ? _("Upload") : _("Download"); char buf[160]; char buffirst[20]; char xfrstr[160] = ""; char trimbuf[160] = ""; char title[64]; const char *s =""; int pipefd[2]; int n, status; char * cmdline = NULL; char * translated_cmdline = NULL; WIN *win = (WIN *)NULL; if (mcd(what == 'U' ? P_UPDIR : P_DOWNDIR) < 0) return; /* Automatic? */ if (nr == 0) { for (f = 0; f < 12; f++) { if (P_PNAME(f)[0] && P_PUD(f) == what) { name[g] = P_PNAME(f); idx[g++] = f; } } name[g] = NULL; if (g == 0) return; r = mc_wselect(30, 7, name, NULL, t, stdattr, mfcolor, mbcolor) - 1; if (r < 0) return; g = idx[r]; } else g = nr; buf[0] = 0; /* jseymour file selector with choice of dir on zmodem, etc. download */ #if 1 { int multiple; /* 0:only directory, 1:one file, -1:any number */ size_t cmdline_length; if (P_MUL(g)=='Y') /* need file(s), or just a directory? */ multiple = what == 'U'? -1 : 0; else multiple = 1; /* only one allowed */ if (P_FSELW[0] == 'Y' && (what == 'U' || P_ASKDNDIR[0] == 'Y')) { s = filedir(multiple, what == 'U'? 0 : 1); if (s == NULL) return; } else if (P_PNN(g) == 'Y') { s = input(_("Please enter file names"), buf); if (s == NULL) return; } /* discard directory if "multiple" == 0 */ cmdline_length = strlen(P_PPROG(g)) + strlen((char*) (multiple == 0 ? "" : s)) + 1; /* + 1 for ' ' */ cmdline = malloc(cmdline_length + 1); /* + 1 for NUL */ if (cmdline == NULL) { werror(_("Out of memory: could allocate buffer for command line")); return; } snprintf(cmdline, cmdline_length + 1, "%s %s", P_PPROG(g), multiple == 0 ? "" : s); } #endif if (P_LOGXFER[0] == 'Y') do_log("%s", cmdline); /* jl 22.06.97 */ if (P_PFULL(g) == 'N') { win = mc_wopen(10, 7, 70, 13, BSINGLE, stdattr, mfcolor, mbcolor, 1, 0, 1); snprintf(title, sizeof(title), _("%.30s %s - Press CTRL-C to quit"), P_PNAME(g), what == 'U' ? _("upload") : _("download")); mc_wtitle(win, TMID, title); pipe(pipefd); } else mc_wleave(); m_flush(portfd); switch (udpid = fork()) { case -1: werror(_("Out of memory: could not fork()")); if (win) { close(pipefd[0]); close(pipefd[1]); mc_wclose(win, 1); } else mc_wreturn(); mcd(""); if(cmdline) free(cmdline); return; case 0: /* Child */ if (P_PIORED(g) == 'Y') { dup2(portfd, 0); dup2(portfd, 1); } if (win) { dup2(pipefd[1], 2); close(pipefd[0]); if (pipefd[1] != 2) close(pipefd[1]); } lockfile_remove(); for (n = 1; n < _NSIG; n++) signal(n, SIG_DFL); translated_cmdline = translate(cmdline); if (translated_cmdline != NULL) { fastexec(translated_cmdline); free(translated_cmdline); } if(cmdline) free(cmdline); exit(1); default: /* Parent */ break; } if(cmdline) free(cmdline); if (win) { setcbreak(1); /* Cbreak, no echo. */ enab_sig(1, 0); /* But enable SIGINT */ } signal(SIGINT, udcatch); if (P_PIORED(g) == 'Y') { close(pipefd[1]); #ifdef LOG_XFER xfl=fopen("xfer.log","wb"); #endif while ((n = read(pipefd[0], buf, sizeof(buf))) > 0) { buf[n] = '\0'; mc_wputs(win, buf); timer_update(); /* Log the filenames & sizes jl 14.09.97 */ if (P_LOGXFER[0] == 'Y') { #ifdef LOG_XFER if (xfl) fprintf(xfl,">%s<\n",buf); #endif if (sscanf(buf, "%19s", buffirst)) { /* if / jl 29.09.97 */ if (!strncmp (buffirst, "Receiving", 9) || !strncmp (buffirst, "Sending", 7)) { if (xfrstr[0]) { trim (trimbuf, xfrstr, sizeof(trimbuf)); do_log ("%s", trimbuf); xfrstr[0] = 0; } trim (trimbuf, buf, sizeof(trimbuf)); do_log("%s", trimbuf); } else if (!strncmp (buffirst, "Bytes", 5)) { strncpy (xfrstr, buf, sizeof(xfrstr)); } buffirst[0] = 0; trimbuf[0] = 0; } } } #ifdef LOG_XFER if (xfl) fclose(xfl); #endif } /* Log the last file size jl 14.09.97 */ if (P_LOGXFER[0] == 'Y' && xfrstr[0]) { trim (trimbuf, xfrstr, sizeof(trimbuf)); do_log ("%s", trimbuf); xfrstr[0] = 0; } while (udpid != m_wait(&status)); if (win) { enab_sig(0, 0); signal(SIGINT, SIG_IGN); } if (win == (WIN *)0) mc_wreturn(); lockfile_create(); /* MARK updated 02/17/94 - Flush modem port before displaying READY msg */ /* because a BBS often displays menu text right after a download, and we */ /* don't want the modem buffer to be lost while waiting for key to be hit */ m_flush(portfd); port_init(); setcbreak(2); /* Raw, no echo. */ if (win) close(pipefd[0]); mcd(""); timer_update(); /* If we got interrupted, status != 0 */ if (win && (status & 0xFF00) == 0) { #if VC_MUSIC if (P_SOUND[0] == 'Y') { mc_wprintf(win, _("\n READY: press any key to continue...")); music(); } else sleep(1); #else /* MARK updated 02/17/94 - If there was no VC_MUSIC capability, */ /* then at least make some beeps! */ if (P_SOUND[0] == 'Y') mc_wprintf(win, "\007\007\007"); sleep(1); #endif } if (win) mc_wclose(win, 1); }
/* ESC [? ... [hl] seen. */ static void dec_mode(int on_off) { int i; for (i = 0; i <= ptr; i++) { switch (escparms[i]) { case 1: /* Cursor keys in cursor/appl mode */ vt_cursor = on_off ? APPL : NORMAL; if (vt_keyb) (*vt_keyb)(vt_keypad, vt_cursor); break; case 6: /* Origin mode. */ vt_om = on_off; mc_wlocate(vt_win, 0, newy1); break; case 7: /* Auto wrap */ vt_win->wrap = on_off; break; case 25: /* Cursor on/off */ mc_wcursor(vt_win, on_off ? CNORMAL : CNONE); break; case 67: /* Backspace key sends. (FIXME: vt420) */ /* setbackspace(on_off ? 8 : 127); */ break; case 47: /* Alternate screen */ case 1047: case 1049: if ((us_alternate && on_off) || !on_off) { vt_win = us; mc_clear_window_simple(us_alternate); mc_wclose(us_alternate, 1); us_alternate = NULL; } if (on_off) { us_alternate = mc_wopen(0, 0, COLS - 1, us->y2, BNONE, XA_NORMAL, tfcolor, tbcolor, 1, 0, 0); vt_win = us_alternate; } { char b[10]; snprintf(b, sizeof(b), "\e[?%d%c", escparms[i], on_off ? 'h' : 'l'); b[sizeof(b) - 1] = 0; mc_wputs(stdwin, b); } if (on_off) mc_clear_window_simple(us_alternate); break; default: /* Mostly set up functions */ /* IGNORED */ break; } } }