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; }
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); }
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; } } }
void doscrreg (int c) { switch (c) { case meta ('h'): /* home */ cur->d.curfile = cur->d.topfile = 0; break; case meta ('e'): /* end */ cur->d.curfile = cur->d.num - 1; cur->d.topfile = cur->d.num - PAGELEN (cur); if (cur->d.topfile < 0) cur->d.topfile = 0; break; case meta ('u'): /* up */ if (cur->d.curfile <= 0) return; if (cur->d.curfile > cur->d.topfile) { --cur->d.curfile; return; } cur->d.topfile = --cur->d.curfile; break; case meta ('d'): /* down */ if (cur->d.curfile >= cur->d.num-1) return; if (cur->d.topfile + PAGELEN (cur) - 1 > cur->d.curfile) { ++cur->d.curfile; return; } cur->d.topfile = ++cur->d.curfile - PAGELEN (cur) + 1; break; case meta ('l'): /* left */ if (cur->d.curfile < H) { if (cur->d.topfile <= 0) return; cur->d.curfile -= cur->d.topfile; cur->d.topfile = 0; break; } cur->d.curfile -= H; if (cur->d.topfile <= cur->d.curfile) return; cur->d.topfile -= H; if (cur->d.topfile <= 0) { cur->d.curfile -= cur->d.topfile; cur->d.topfile = 0; } break; case meta ('r'): /* right */ if (cur->d.curfile + H < cur->d.num) { cur->d.curfile += H; if (cur->d.topfile + PAGELEN (cur) > cur->d.curfile) return; cur->d.topfile += H; break; } if (cur->d.topfile + PAGELEN (cur) < cur->d.num) { cur->d.curfile = cur->d.num-1; cur->d.topfile += H; break; } if ((cur->d.curfile - cur->d.topfile) / H < (cur->d.num - cur->d.topfile - 1) / H) cur->d.curfile = cur->d.num-1; return; case meta ('n'): /* next page */ if (cur->d.topfile + PAGELEN (cur) >= cur->d.num) { cur->d.curfile = cur->d.num-1; } else if (cur->d.topfile + 2 * PAGELEN (cur) >= cur->d.num) { cur->d.curfile = cur->d.num-1; cur->d.topfile = cur->d.num - PAGELEN (cur); } else { cur->d.curfile += PAGELEN (cur); cur->d.topfile += PAGELEN (cur); } break; case meta ('p'): /* prev page */ if (cur->d.topfile == 0) { cur->d.curfile = 0; } else { cur->d.curfile -= PAGELEN (cur); if (cur->d.topfile > cur->d.curfile) cur->d.topfile -= PAGELEN (cur); if (cur->d.topfile < 0) { cur->d.curfile -= cur->d.topfile; cur->d.topfile = 0; } } break; case cntrl ('K'): /* find file */ findname (); break; case cntrl ('R'): /* reread catalog */ reread (cur); break; case cntrl ('T'): /* tag file */ if ((cur->d.cat[cur->d.curfile].mode & S_IFMT) == (unsigned) S_IFREG) { cur->d.cat[cur->d.curfile].tag ^= 1; counttag (cur); } if (cur->d.curfile < cur->d.num-1) { /* move down */ ++cur->d.curfile; if (cur->d.topfile + PAGELEN (cur) - 1 < cur->d.curfile) cur->d.topfile = cur->d.curfile - PAGELEN (cur) + 1; } break; // case meta ('C'): /* f3 */ // if ((cur->d.cat[cur->d.curfile].mode & S_IFMT) != (unsigned) S_IFREG) // return; // view (); // draw.draw(cur, &left, &right); // return; // case meta ('D'): /* f4 */ // edit (); // setdir (cur==&left ? &right : &left, NULL); // setdir (cur, NULL); // draw.draw(cur, &left, &right); // return; case meta ('E'): /* f5 */ copy (); draw.draw(cur, left, right); return; // case meta ('F'): /* f6 */ // renmove (); // draw.draw(cur, &left, &right); // return; // case meta ('H'): /* f8 */ // mydelete (); // draw.draw(cur, &left, &right); // return; case cntrl ('L'): /* status */ setstatus (); draw.draw(cur, left, right); return; } draw.drawdir(cur, 1, left, right); }
//extern char *home; extern char *username (), *groupname (); static struct KeyMap keymap [] = { "kl", 0, meta ('l'), "kr", 0, meta ('r'), "ku", 0, meta ('u'), "kd", 0, meta ('d'), "kN", 0, meta ('n'), "kP", 0, meta ('p'), "kh", 0, meta ('h'), "kH", 0, meta ('e'), "@7", 0, meta ('e'), "kI", 0, cntrl ('T'), "k.", 0, cntrl ('G'), "kD", 0, cntrl ('G'), "kE", 0, meta ('h'), "kS", 0, meta ('e'), "k1", 0, meta ('A'), "k2", 0, meta ('B'), "k3", 0, meta ('C'), "k4", 0, meta ('D'), "k5", 0, meta ('E'), "k6", 0, meta ('F'), "k7", 0, meta ('G'), "k8", 0, meta ('H'), "k9", 0, meta ('I'), "k0", 0, meta ('J'), "k;", 0, meta ('J'),
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; } } }