void run_unix () { static char command[COMMAND_LENGTH] = ""; register char *s; register ret, o_errno; CURSOR Old; if ((s = getstring(COMMAND_LENGTH, command, "Выполнение команды SHELL", "Введите команду SHELL")) != NULL) { strncpy (command, s, COMMAND_LENGTH); Old = VGetCursor (); VMove (0, 0); VSync (); VIClear (); VFlush (); s = strcmp (command, "") == 0 ? "/bin/sh" : command; TtyReset (); ret = system (s); o_errno = errno; /* VRedraw () портит errno */ fprintf (stderr, "Нажмите 'Enter' для продолжения."); (void) getchar (); TtySet (); VSetCursor( Old ); VRedraw (); if (ret == -1) error ("SHELL : %s", sys_errlist[o_errno]); } }
void run_dos () { static char command[COMMAND_LENGTH] = ""; register char *s; register ret, o_errno; CURSOR Old; if ((s = getstring(COMMAND_LENGTH, command, "Выполнение команды DOS", "Введите команду DOS")) != NULL) { strncpy (command, s, COMMAND_LENGTH); _dos_setvect (0x1C, old_timer); Old = VGetCursor (); VMove (0, 0); VSync (); VIClear (); s = strcmp (command, "") == 0 ? "COMMAND.COM" : command; ret = system (s); o_errno = errno; /* VRedraw () портит errno */ fprintf (stderr, "Нажмите 'Enter' для продолжения."); (void) getchar (); VSetCursor( Old ); VRedraw (); _dos_setvect (0x1C, timer_int); old_addr = -1; if (ret == -1) error ("DOS : %s", sys_errlist[o_errno]); } }
void runhelp (char *name) { register r, c, w, h; BOX *box; register struct helptab *p; struct help *hp; hp = findhelp (name); if (! hp) return; p = hp->htab; if (! p->str) inithelp (hp); w = 72; h = 21; r = 2; c = 4; box = VGetBox (r, c-1, h, w+2); /* save box */ VStandOut (); VSetDim (); VFillBox (r, c-1, h, w+2, ' '); /* clear */ VDrawBox (r, c, h, w); /* draw margins */ VMPutString (r, c + (w-6) / 2, " Help "); /* head */ for (; p->row; ++p) { if (p->row >= h) continue; if (p->bold) { VSetBold (); VStandEnd (); } if (! p->col) VMPutString (r+p->row, c + (w-strlen(p->str))/2, p->str); else VMPutString (r+p->row, c + p->col, p->str); if (p->bold) { VSetDim (); VStandOut (); } } VStandEnd (); VSetNormal (); for (;;) { hidecursor (); VSync (); switch (KeyGet ()) { default: break; case cntrl (']'): /* redraw screen */ VRedraw (); continue; } break; } VUngetBox (box); VFreeBox (box); }
getmenu () { if (! menu[0].len) initmenu (); getboxes (); VMPutString (LINES-1, 0, "\0011\16 \17 2\16 \17 3\16 \17 4\16 \17 5\16 \17 6\16 \17 7\16 \17 8\16 \17 9\16 \01710\16Quit \17\2"); for (;;) { drawhead (nmenu); for (;;) { drawmenu (&menu[nmenu]); hidecursor (); VSync (); switch (KeyGet ()) { default: VBeep (); continue; case cntrl (']'): /* redraw screen */ VRedraw (); continue; case cntrl ('M'): clrmenu (&menu[nmenu]); return (1); case cntrl ('J'): clrmenu (&menu[nmenu]); return (2); case cntrl ('C'): case cntrl ('['): case meta ('J'): /* f0 */ clrmenu (&menu[nmenu]); return (0); case meta ('r'): /* right */ clrmenu (&menu[nmenu]); if (! menu[++nmenu].mname) nmenu = 0; break; case meta ('l'): /* left */ clrmenu (&menu[nmenu]); if (--nmenu < 0) { for (nmenu=0; menu[nmenu].mname; ++nmenu); --nmenu; } break; case meta ('u'): /* up */ upmenu (&menu[nmenu]); continue; case meta ('d'): /* down */ downmenu (&menu[nmenu]); continue; } break; } } }
dowin () { register c; loop: Jmove (LINES-1, COLS-1); switch (c = getch ()) { default: goto loop; case cntrl (']'): VRedraw (); goto loop; case cntrl ('_'): if (! daemonflag) return; goto loop; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': curgroup = c - '0'; curwin = 0; break; case '*': /* step */ step (); break; case meta ('h'): if (funchome) (*funchome) (); goto loop; case meta ('e'): if (funcend) (*funcend) (); goto loop; case meta ('p'): if (funcpgup) (*funcpgup) (); goto loop; case meta ('n'): if (funcpgdn) (*funcpgdn) (); goto loop; case meta ('u'): if (funcup) (*funcup) (); goto loop; case meta ('d'): if (funcdown) (*funcdown) (); goto loop; case meta ('l'): if (funcleft) (*funcleft) (); goto loop; case meta ('r'): if (funcright) (*funcright) (); goto loop; case meta ('J'): curwin = 0; break; case meta ('A'): case meta ('B'): case meta ('C'): case meta ('D'): case meta ('E'): case meta ('F'): case meta ('G'): case meta ('H'): case meta ('I'): curwin = c - meta ('A') + 1; break; } funcclear (); pultwin (curgroup, curwin); goto loop; }
/* local */ void editfnam (register char *name) { register d; register char *p; char buf [80]; struct stat st; if (stat (name, &st) >= 0) { if ((st.st_mode & S_IFMT) != S_IFREG) { error ("Cannot edit special files"); return; } } else { d = creat (name, 0644); if (d < 0) { error ("Cannot create %s", name); return; } close (d); } if (useredit) { strcpy (buf, editname); strcat (buf, " "); strcat (buf, name); VRestore (); syscmd (buf); VReopen (); VRedraw (); setdir (cur == left ? right : left, NULL); setdir (cur, NULL); return; } if ((d = open (name, 2)) < 0) { error ("Cannot open %s for writing", name); return; } /* skip directory name */ for (p=name; *p; ++p); for (; p>=name && *p!='/'; --p); EDITFILE editfile(d, name, p+1); close (d); }
void run_pult () { register ret, o_errno; struct wordb word; _dos_setvect (0x1C, old_timer); VIClear (); ret = spawnlp (P_WAIT, pult_file, pult_file, NULL); o_errno = errno; /* VRedraw () портит errno */ VRedraw (); _dos_setvect (0x1C, timer_int); if (ret == -1) error ("%s : %s", pult_file, sys_errlist[o_errno]); else { ptinitialize(); old_addr = -1; _disable (); int_tab [0].ticks = TICK_CHK; _enable (); } }
/* main, menu */ void view (void) { char buf [80]; register char *name = cur->d.cat[cur->d.curfile].name; register d; if (userview) { strcpy (buf, viewname); strcat (buf, " "); strcat (buf, name); VRestore (); syscmd (buf); VReopen (); VRedraw (); setdir (cur == left ? right : left, NULL); setdir (cur, NULL); return; } if ((d = open (name, 0)) < 0) { error ("Cannot open %s", name); return; } VIEWFILE viewfile(d, name); close (d); }
static int menuchoice () { int ch = 0; for (;;) { drawchoice (ch); hidecursor (); VSync (); switch (KeyGet ()) { default: VBeep (); continue; case cntrl (']'): /* redraw screen */ VRedraw (); continue; case cntrl ('['): case cntrl ('C'): case meta ('J'): /* f0 */ return (-1); case cntrl ('M'): case cntrl ('J'): return (ch); case ' ': case cntrl ('I'): case meta ('r'): /* right */ if (++ch >= cnum) ch = 0; continue; case meta ('b'): /* backspace */ case meta ('l'): /* left */ if (--ch < 0) ch = cnum-1; continue; } } }
static char *runudm (char *scale) { /* user defined menu */ register key, cm; BOX *box, *curbox; box = VGetBox (menurow-2, menucol-4, nm+4, menuwid+8); VSetDim (); VStandOut (); VFillBox (menurow-2, menucol-4, nm+4, menuwid+8, ' '); VDrawBox (menurow-1, menucol-1, nm+2, menuwid+2); mvcaddstr (menurow-1, 40, " User Menu "); printudm (); VSetNormal (); VStandEnd (); cm = 0; for (;;) { curbox = VGetBox (menurow+cm, menucol, 1, menuwid); VPrintBox (curbox); hidecursor (); VSync (); key = KeyGet (); VUngetBox (curbox); VFreeBox (curbox); switch (key) { default: findmenu: if (key>0 && key<0200 && scale [key] < MENUSZ) { cm = scale [key]; break; } VBeep (); continue; case meta ('A'): key = 1; goto findmenu; case meta ('B'): key = 2; goto findmenu; case meta ('C'): key = 3; goto findmenu; case meta ('D'): key = 4; goto findmenu; case meta ('E'): key = 5; goto findmenu; case meta ('F'): key = 6; goto findmenu; case meta ('G'): key = 7; goto findmenu; case meta ('H'): key = 8; goto findmenu; case meta ('I'): key = 9; goto findmenu; case cntrl (']'): /* redraw screen */ VRedraw (); continue; case cntrl ('M'): case cntrl ('J'): break; case cntrl ('C'): case cntrl ('['): case meta ('J'): /* f0 */ cm = -1; break; case meta ('u'): /* up */ if (--cm < 0) cm = nm-1; continue; case meta ('d'): /* down */ if (++cm >= nm) cm = 0; continue; } break; } VUngetBox (box); VFreeBox (box); if (cm >= 0 && um[cm].cex) { if (um[cm].menu) return (um[cm].cex); /* execute command from menu */ expand (command, um[cm].cex, cur->cat[cur->curfile].name); cpos = strlen (command); if (command [0]) execmd (um[cm].wait, um[cm].hist); } return ((char *) 0); }
main (int argc, char **argv, char **envp) { register c; if (argc > 2) { outerr("Usage: deco [dirname]\n",0); exit (1); } outerr("Demos Commander, Copyright (C) 1989-1994 Serge Vakulenko\n",0); palette = dflt_palette; EnvInit (envp); uid = getuid (); gid = getgid (); # ifdef GROUPS gidnum = getgroups (sizeof(gidlist)/sizeof(gidlist[0]), (unsigned int *)gidlist); # endif ppid = getppid (); user = username (uid); group = groupname (gid); tty = ttyname (0); machine = getmachine (); #if 0 sigign(); #else signal(SIGTERM, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGINT, SIG_IGN); # ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); # endif #endif init (); // inithome (); VClear (); /* init class dir */ if (argc > 1) // chdir (argv [1]); left = new dir(argv [1]); else left = new dir; right = new dir; left->d.basecol = 0; right->d.basecol = 40; /*-----------*/ initfile.read(); if (uid == 0) palette.dimfg = 6; v.VSetPalette (palette.fg, palette.bg, palette.revfg, palette.revbg, palette.boldfg, palette.boldbg, palette.boldrevfg, palette.boldrevbg, palette.dimfg, palette.dimbg, palette.dimrevfg, palette.dimrevbg); setdir (left, "."); setdir (right, "."); left->chdir(left->d.cwd); cur = left; draw.draw(cur, left, right); for (;;) { if (! cmdreg) draw.drawcursor(cur); // cmd.drawcmd(cur, &left, &right); VSync (); c = KeyGet (); if (! cmdreg) draw.undrawcursor(cur); switch (c) { case '+': /* select */ case '-': /* unselect */ if (! cpos && ! cmdreg && ! cur->d.status) { if (c == '+') tagall (); else untagall (); draw.draw(cur, left, right); continue; } default: // if (c>=' ' && c<='~' || c>=0300 && c<=0376) { // if (cpos || c!=' ') // cmd.inscmd(c); // continue; // } VBeep (); continue; // case cntrl ('V'): /* quote next char */ // cmd.inscmd(quote ()); // continue; // case cntrl ('J'): /* insert file name */ // if (! cmdreg && ! cur->status) // cmd.namecmd(cur); // continue; // case cntrl ('G'): // cmd.delcmd(); // continue; // case meta ('b'): /* backspace */ // if (cpos) { // cmd.leftcmd(); // cmd.delcmd(); // } // continue; case cntrl ('O'): /* set/unset command mode */ case cntrl ('P'): /* set/unset command mode */ switchcmdreg (); if (! cmdreg) visualwin = 1; draw.draw(cur, left, right); continue; case cntrl ('M'): /* return */ // if (command [0]) { // cmd.exec(cur, &left, &right, 1, 1); // draw.draw(cur, &left, &right); // continue; // } if (cmdreg) { cmdreg = 0; if (! visualwin) { visualwin = 1; setdir (cur==left ? right : left, NULL); setdir (cur, NULL); } draw.draw(cur, left, right); continue; } execute (); continue; case cntrl (']'): /* redraw screen */ VRedraw (); continue; // case cntrl ('B'): /* history */ // if (! visualwin) // VClearBox (1, 0, LINES-2, 80); // cmd.histmenu(cur, &left, &right); // draw.draw(cur, &left, &right); // continue; case meta ('A'): /* f1 */ genhelp (); draw.draw(cur, left, right); continue; case meta ('B'): /* f2 */ udm.menu(); draw.draw(cur, left, right); continue; case meta ('I'): /* f9 */ mymenu.runmenu (cur==left ? 'l' : 'r'); draw.draw(cur, left, right); continue; case meta ('J'): /* f0 */ case cntrl ('C'): /* quit */ quit (); continue; case cntrl ('U'): /* swap panels */ swappanels (); draw.draw(cur, left, right); continue; case cntrl ('F'): /* full screen */ fullscreen (); draw.draw(cur, left, right); continue; case cntrl ('^'): /* cd / */ directory (0, 'r'); if (! cur->d.status) draw.drawdir(cur, 1, left, right); continue; case cntrl ('\\'): /* cd $HOME */ directory (0, 'o'); if (! cur->d.status) draw.drawdir(cur, 1, left, right); continue; // case cntrl ('Y'): /* clear line */ // command [cpos = 0] = 0; // continue; // case cntrl ('X'): /* next history */ // cmd.nextcmd(); // continue; // case cntrl ('E'): /* prev history */ // cmd.prevcmd(); // continue; // case cntrl ('S'): /* char left */ // case cntrl ('A'): /* char left */ // cmd.leftcmd(); // continue; // case cntrl ('D'): /* char right */ // cmd.rightcmd(); // continue; case cntrl ('I'): /* tab */ if (cmdreg) {} // if (command [cpos]) // cmd.endcmd(); // else // cmd.homecmd(); else { switchpanels (); if (fullwin) { draw.drawbanners(); draw.drawdir(cur, 0, left, right); break; } } continue; case cntrl ('W'): /* double width */ if (! cmdreg) { setdwid (); draw.draw(cur, left, right); } continue; // case meta ('G'): /* f7 */ // makedir (); // draw.draw(cur, &left, &right); // continue; case meta ('h'): /* home */ case meta ('e'): /* end */ case meta ('u'): /* up */ case meta ('d'): /* down */ case meta ('l'): /* left */ case meta ('r'): /* right */ case meta ('n'): /* next page */ case meta ('p'): /* prev page */ case cntrl ('K'): /* find file */ case cntrl ('R'): /* reread catalog */ case cntrl ('T'): /* tag file */ case meta ('C'): /* f3 */ case meta ('D'): /* f4 */ case meta ('E'): /* f5 */ case meta ('F'): /* f6 */ case meta ('H'): /* f8 */ case cntrl ('L'): /* status */ if (cmdreg || cur->d.status) {} // docmdreg (c); else doscrreg (c); continue; } } }
static char *editstring (int r, int c, int w, char *str, int cp) { register key, k; int firstkey = 1; if (cp) { for (cp=0; str[cp]; ++cp); firstkey = 0; } for (; ; firstkey=0) { VClearBox (r, c, 1, w); VMPutString (r, c, str); VMove (r, c+cp); VSync (); switch (key = KeyGet ()) { default: if (key<' ' || (key>'~' && key<0300) || key>0377) { VBeep (); continue; } if (firstkey) { str[0] = key; str[1] = 0; cp = 1; continue; } for (k=cp; str[k]; ++k) SWAP (key, str[k]); str [k] = key; str [w] = str [k+1] = 0; /* fall through */ case meta ('r'): /* right */ if (str [cp]) { ++cp; if (cp >= w) cp = w-1; } continue; case meta ('l'): /* left */ if (--cp < 0) cp = 0; continue; case cntrl (']'): /* redraw screen */ VRedraw (); continue; case cntrl ('C'): case cntrl ('['): case meta ('J'): /* f0 */ return (0); case cntrl ('M'): case cntrl ('J'): return (str); case cntrl ('I'): if (str [cp]) while (str [++cp]); else cp = 0; continue; case meta ('h'): /* home */ cp = 0; continue; case meta ('e'): /* end */ while (str [cp]) ++cp; continue; case meta ('b'): /* back space */ if (cp) { for (k=cp--; str[k]; ++k) str[k-1] = str[k]; str [k-1] = 0; } continue; case cntrl ('G'): /* delete */ if (! str [cp]) continue; for (k=cp+1; str[k]; ++k) str[k-1] = str[k]; str [k-1] = 0; continue; case cntrl ('Y'): /* clear line */ str [cp = 0] = 0; continue; } } }