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); }