char *getstring (int w, char *str, char *head, char *mesg) { register r, c, h; int len; BOX *box; static char buf [81]; len = strlen (mesg); if (len > w) w = len; len = strlen (head); if (len > w) w = len; h = 4; w += 4; r = LINES/4; c = (78 - w) / 2; box = VGetBox (r-1, c-2, h+2, w+4); /* save box */ VStandOut (); VSetDim (); VFillBox (r-1, c-2, h+2, w+4, ' '); /* clear */ VDrawBox (r, c, h, w); /* draw margins */ VMPutString (r, c + (w-strlen(head)) / 2, head); /* head */ VMPutString (r+1, c+2, mesg); /* message */ VStandEnd (); VSetNormal (); strncpy (buf, str ? str : "", 80); str = editstring (r+2, c+2, w-4, buf, 0); VUngetBox (box); VFreeBox (box); return (str); }
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); }
drawcmd () { int c; CURSOR cursor; if (H==LINES-7 && strlen (cur->shortcwd) + 3 + esclen (command) > 79) { fullscreen (); draw (); } for (c=H+5; c<LINES-1; ++c) { VMove (c, 0); VClearLine (); } VSetDim (); VMPutString (H+5, 0, cur->shortcwd); VSetBold (); VPutString (" > "); VSetNormal (); cursor = VGetCursor (); putescstr (command); if (c = command [cpos]) { VSetCursor (cursor); command [cpos] = 0; putescstr (command); command [cpos] = c; } }
void big_menu (m) { struct b_field *b; register i, j = 1; BOX *left_box; b = batch_entry[batch_n]; lines = cols = wid_h = wid_e = 0; for (i = 0; b[i].header != NULL; i++) { lines++; wid_h = max( wid_h, (int) strlen( b[i].header )); wid_e = max( wid_e, b[i].width ); } cols = wid_h + 2 + wid_e; cols = max (cols, (int) strlen(batch_name[batch_n])); r = (LINES - lines) - 5; c = m ? 3 : (COLS - cols) - 5; endmesg (); if (m) { if (lines == 0) return; left_box = VGetBox (r - 1, c - 1, lines + 4, cols + 4); } else { if (right_box != 0) { VUngetBox (right_box); VFreeBox (right_box); } right_box = VGetBox (r - 1, c - 1, lines + 4, cols + 4); } VStandOut (); VFillBox (r - 1, c - 1, lines + 4, cols + 4, ' '); VStandEnd (); VDrawBox (r, c, lines+2, cols+2); VMPutString (r, (c + (cols + 2 - strlen(batch_name[batch_n])) / 2), batch_name[batch_n]); if (lines == 0) return; drawhdr (b); if (m) { for (i = 0; j != 0; i += j) { if (i >= lines) i = 0; else if (i < 0) i = lines - 1; j = editval1 (b + i, i); VStandOut (); printval (b + i, i); VStandEnd (); } VUngetBox (left_box); VFreeBox (left_box); } VSync (); }
static void drawchoice (int ch) { register i; for (i=0; i<cnum; ++i) { if (i == ch) { if (attron) (*attron) (); VMPutString (tab[i].r, tab[i].c, tab[i].name); if (! attron) { VMPutChar (tab[i].r, tab[i].c, '['); VMPutChar (tab[i].r, tab[i].c + strlen (tab[i].name) - 1, ']'); } if (attroff) (*attroff) (); } else VMPutString (tab[i].r, tab[i].c, tab[i].name); } }
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; } } }
static void printudm () { register n; for (n=0; n<nm; ++n) { VMove (menurow+n, menucol+1); switch (um[n].key) { case 1: VPutString ("F1"); break; case 2: VPutString ("F2"); break; case 3: VPutString ("F3"); break; case 4: VPutString ("F4"); break; case 5: VPutString ("F5"); break; case 6: VPutString ("F6"); break; case 7: VPutString ("F7"); break; case 8: VPutString ("F8"); break; case 9: VPutString ("F9"); break; default: VPutChar (um[n].key); break; } if (um[n].menu) VMPutString (menurow+n, menucol+3, "->"); if (um[n].str) VMPutString (menurow+n, menucol+5, um[n].str); } }
int getchoice (int bold, char *head, char *msg, char *mesg2, char *c1, char *c2, char *c3) { int len, ch; int isattr; register r, c, w, h; BOX *box; char mesg[67]; strncpy(mesg, msg, sizeof (mesg)); mesg[sizeof(mesg)-1] = 0; w = strlen (mesg); if (mesg2) { len = strlen (mesg2); if (len > w) w = len; } len = strlen (head); if (len > w) w = len; len = 0; if (c1) len += strlen (c1); if (c2) len += strlen (c2); if (c3) len += strlen (c3); if (len > w) w = len; h = 6; w += 10; if (bold) r = LINES/2; else r = LINES/4; c = (80 - w) / 2; box = VGetBox (r-1, c-2, h+2, w+4); /* save box */ isattr = VStandOut (); if (bold) VSetBold (); else VSetDim (); VFillBox (r-1, c-2, h+2, w+4, ' '); /* clear */ VDrawBox (r, c, h, w); /* draw margins */ VMPutString (r, c + (w-strlen(head)) / 2, head); /* head */ if (mesg2) { VMPutString (r+1, c + (w-strlen(mesg)) / 2, mesg); VMPutString (r+2, c + (w-strlen(mesg2)) / 2, mesg2); } else VMPutString (r+2, c + (w-strlen(mesg)) / 2, mesg); if (c1) { if (isattr) { attron = VStandEnd; attroff = VStandOut; } else { attron = 0; attroff = 0; } initchoice (r+4, c+w/2, c1, c2, c3); ch = menuchoice (); VStandEnd (); VSetNormal (); VUngetBox (box); VFreeBox (box); return (ch); } else { /* message */ VStandEnd (); VSetNormal (); mbox = box; hidecursor (); VSync (); #ifdef DOC KeyGet (); #endif return (0); } }
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; } } }