📄 mac.c
字号:
if (M->menu_id == 0) return; M->Mn = NewMenu(M->menu_id,CtoPstr(M->Name)); PtoCstr(M->Name); for (i = 0; i < NMENUITEMS; i++) { d = (M->m[i]); if (d == NULL) break; /* last item... */ switch (d->Type & TYPEMASK) { case (STRING): AppendMenu(M->Mn,CtoPstr(d->Name)); PtoCstr(d->Name); break; case (VARIABLE): SetItemMark(M->Mn,i + 1, 0x12); /* ??? fall through? */ case (FUNCTION): CtoPstr(name = ((data_obj *) d)->Name); AppendMenu(M->Mn,name); PtoCstr(name); break; } } InsertMenu(M->Mn,0);}private voidProcMenu(menuno,itemno)int menuno,itemno;{ void MacSetVar(); int i; data_obj *d; for (i = 0; i < NMENUS && Menus[i].menu_id != menuno; i++) ; if (i < NMENUS) { /* found the menu */ itemno--; d = Menus[i].m[itemno]; switch(d->Type & TYPEMASK) { case FUNCTION: ExecCmd((data_obj *) d); break; case BUFFER: SetABuf(curbuf); tiewind(curwind,(Buffer *) d); SetBuf((Buffer *) d); break; case VARIABLE: MacSetVar((struct variable *) d,i,itemno); break; default: break; } }}private voidmake_edits(menu) /* add dummy edit menu */int menu;{ MenuHandle M; int item; char *fname; M = NewMenu((menu),"\pEdit"); AppendMenu(M,"\pUndo/Z;(-;Cut/X;Copy/C;Paste/V;Clear;Select All;(-;Show Clipboard"); InsertMenu(M,0); DisableItem(M,0);}voidmenus_off(){ int i; if (Keyonly || EventCmd) return;#ifdef MENU_DISABLE /* NOBODY likes this, but it's here if you want it... */ DisableItem(SysMenu,0); for (i = 0; i < NMENUS; i++) if (Menus[i].Mn) DisableItem(Menus[i].Mn,0); DrawMenuBar();#endif Keyonly = YES;}voidmenus_on(){ int i; if (!Keyonly) return;#ifdef MENU_DISABLE EnableItem(SysMenu,0); for (i = 0; i < NMENUS; i++) if (Menus[i].Mn) EnableItem(Menus[i].Mn,0); DrawMenuBar();#endif Keyonly = NO;}private char *BufMPrint(b,i)Buffer *b;int i;{ char *p; char *nm = filename(b); char t[35]; if (strlen(nm) > 30) { strcpy(t,"..."); strcat(t,nm + strlen(nm) - 30); } else strcpy(t,nm); nm = t; while (*nm) { switch(*nm) { /* ugh... these are metacharacter for Menus */ case '/': *nm = ':'; break; case '^': case '!': case '<': case '(': case ';': *nm = '.'; break; /* that will confuse everybody */ } nm++; } p = sprint("%-2d %-11s \"%-s\"",i,b->b_name,t); return p;}private voidSetBufMenu(){ register Buffer *b; data_obj *d; int i,j,stop; struct menu *M; Bufchange = NO; for (i = 0; i < NMENUS && strcmp(Menus[i].Name,"Buffer"); i++) ; if (i < NMENUS) { M = &Menus[i]; for (j = 0; j < NMENUITEMS && (d = Menus[i].m[j]) && (d->Type & TYPEMASK) != BUFFER; j++) ; if (j < NMENUITEMS) { for (i = j, b = world; i < NMENUITEMS && b != NULL; i++, b = b->b_next) { if (M->m[i] == NULL) AppendMenu(M->Mn,CtoPstr(BufMPrint(b,i-j+1))); /* add the item */ else SetItem(M->Mn,i + 1,CtoPstr(BufMPrint(b,i-j+1))); /* or change it */ M->m[i] = (data_obj *) b; } stop = i; /* out of buffers? */ for (;i < NMENUITEMS && M->m[i];i++) { DelMenuItem(M->Mn,stop + 1); /* take off last item */ M->m[i] = NULL; } } }}private voidMacSetVar(vp,mnu,itm) /* Set a variable from the menu */struct variable *vp; /* Liberally taken from SetVar() in extend.c */int mnu,itm;{ void MarkVar(); char *prompt; prompt = sprint("Set %s: ", vp->Name); switch (vp->v_flags & V_TYPEMASK) { case V_BASE10: case V_BASE8: { int value; value = ask_int(prompt, ((vp->v_flags & V_TYPEMASK) == V_BASE10) ? 10 : 8); *(vp->v_value) = value; break; } case V_BOOL: /* toggle the value */ *(vp->v_value) = (*vp->v_value == ON ? OFF : ON); MarkVar(vp,mnu,itm); break; case V_FILENAME: case V_STRING: { char *str; /* Do_ask() so you can set string to "" if you so desire. */ str = do_ask("\r\n", (bool (*) ptrproto((int))) NULL, (char *) vp->v_value, prompt); if (str == NULL) str = NullStr; strcpy((char *) vp->v_value, str); /* ... and hope there is enough room. */ break; } case V_CHAR: f_mess(prompt); *(vp->v_value) = addgetc(); break; } if (vp->v_flags & V_MODELINE) UpdModLine = YES; if (vp->v_flags & V_CLRSCREEN) ClAndRedraw(); if (vp->v_flags & V_TTY_RESET) tty_reset(); /* probably none on a Mac */}private voidMarkModes(){ int mnu,itm; data_obj *d; Modechange = NO; for (mnu = 0; mnu < NMENUS; mnu++) for (itm = 0; itm < NMENUITEMS; itm++) { if ((d = Menus[mnu].m[itm]) == NULL) break; if ((d->Type & (MAJOR_MODE | MINOR_MODE)) || ((d->Type & TYPEMASK) == BUFFER)) { bool checked; if (d->Type & (MAJOR_MODE)) checked = curbuf->b_major == (d->Type >> 8); else if (d->Type & (MINOR_MODE)) checked = (curbuf->b_minor & (d->Type >> 8)) != 0; else checked = d == (data_obj *) curbuf; CheckItem(Menus[mnu].Mn, itm + 1, checked); } }}voidMarkVar(vp,mnu,itm) /* mark a boolean menu item */struct variable *vp;int mnu,itm;{ if (mnu == -1) { /* we don't know the item... slow */ for (mnu = 0; mnu < NMENUS; mnu++) { for (itm = 0; (itm < NMENUITEMS); itm++) { if ((struct variable *) (Menus[mnu].m[itm]) == vp) { CheckItem(Menus[mnu].Mn, itm + 1, *(vp->v_value) == ON); return; } } } }}private voidMarkAllVar() /* slow, but only do it once */{ int mnu,itm; data_obj *d; for (mnu = 0; mnu < NMENUS; mnu++) for (itm = 0; itm < NMENUITEMS; itm++) { if ((d = Menus[mnu].m[itm]) == NULL) break; if ((d->Type & TYPEMASK) == VARIABLE) MarkVar((struct variable *)Menus[mnu].m[itm],mnu,itm); }}/* Screen routines and driver. The Macinitosh Text Edit routines are not utilized, as they are slow and cumbersome for a terminal emulator. Instead, direct QuickDraw calls are used. The fastest output is obtained writing a line at a time, rather than on a character basis, so the major output routine is writechr(), which takes a pascal-style string as an argument. See do_sputc() in screen.c. */voidPlacur(line,col)int line, col;{ CapCol = col; CapLine = line; putcurs(line,col,ON);}voidNPlacur(line,col)int line, col;{ CapCol = col; CapLine = line; putcurs(line,col,OFF);}voidi_lines(top, bottom, num)int top, bottom, num;{ Placur(bottom - num + 1, 0); dellines(num,bottom); Placur(top, 0); inslines(num,bottom);}voidd_lines(top, bottom, num)int top, bottom, num;{ Placur(top, 0); dellines(num,bottom); Placur(bottom + 1 - num, 0); inslines(num,bottom);}/* (ORIGINALLY IN) tn.c *//* window driver for MacIntosh using windows. *//* K. Mitchum 9/86 *//*#define VARFONT*/#ifdef VARFONTprivate height,width,theight,twidth,descent;#else#define height HEIGHT#define width WIDTH#define theight THEIGHT#define twidth TWIDTH#define descent DESCENT#endifprivate int trow, tcol, insert, cursor;private bool tattr; /* ??? never fetched */private Rect cursor_rect;private char *p_scr, *p_curs; /* physical screen and cursor */private int p_size;private Rect vRect;private WindowRecord myWindowRec;#define active() SetPort(theScreen)#define maxadjust(r) OffsetRect((r),0,2);char *conv_p_curs(row,col)int row, col;{ return p_scr + (row * (CO)) + col;}private voidINSmode(new)bool new;{ insert = new;}private voidHLmode(new)bool new;{ tattr = new;}voidSO_on(){ HLmode(TRUE);}voidSO_off(){ HLmode(FALSE);}private voidtn_init(){ void INSmode proto((bool)), init_slate(); HLmode(FALSE); INSmode(OFF); init_slate(); ShowPen();}voidclr_page() /* clear and home function */{ Rect r; setmem(p_scr,p_size,' '); active(); SetRect(&r, 0,0,WINDWIDTH,WINDHEIGHT); EraseRect(&r); cursor = OFF; putcurs(0,0,OFF); /* ??? "OFF" guess by DHR */ drawfluff();}private voidputcurs(row,col,vis)unsigned row, col;bool vis;{ active(); curset(OFF); trow = row; tcol = col; curset(vis);}private voidcurset(desired)bool desired;{ p_curs = conv_p_curs(trow,tcol); if (trow == MAXROW) MoveTo(tcol * width, (trow +1) * height + 2 -descent ); else MoveTo(tcol * width, (trow +1) * height - descent); DrawChar(*p_curs); if (desired) { SetRect(&cursor_rect, tcol * width, (trow) * height , (tcol + 1) * width - 1, (trow +1) * height -1); if (trow == MAXROW) maxadjust(&cursor_rect); InvertRect(&cursor_rect); } if (trow == MAXROW) MoveTo(tcol * width, (trow +1) * height + 2 -descent ); else MoveTo(tcol * width, (trow +1) * height - descent);}voidputp(p) /* put one character, advance cursor */int p;{ static Rect r; static RgnHandle updateRgn; active(); curset(OFF); if (insert) { updateRgn = NewRgn(); SetRect(&r, tcol * width, trow * height, WINDWIDTH, (trow +1) * height -1); if (trow == MAXROW) maxadjust(&r); ScrollRect(&r, width, 0, updateRgn); DisposeRgn(updateRgn); } if (p == '0') p = 0xAF; /* slashed zero */ if (insert) BlockMove(p_curs, p_curs + 1, (long) (MAXCOL - tcol)); *p_curs = (char) p; DrawChar(p); if (tcol >= MAXCOL) putcurs(trow,MAXCOL, ON); /* ??? "ON" guess by DHR */ else putcurs(trow,tcol+1, ON); /* ??? "ON" guess by DHR */}voidclr_eoln(){ static Rect r; active(); cursor = OFF; SetRect(&r, tcol * width, trow * height, WINDWIDTH, (trow +1) * height); if (trow == MAXROW) maxadjust(&r); EraseRect(&r); setmem(p_curs,CO - tcol, ' '); curset(ON);}private voiddelchars(){ static Rect r; static RgnHandle updateRgn; active(); curset(OFF); updateRgn = NewRgn(); SetRect(&r, tcol * width, trow * height, twidth - width, (trow +1) * height); if (trow == MAXROW) maxadjust(&r); ScrollRect(&r, 0 - width, 0, updateRgn); DisposeRgn(updateRgn); BlockMove(p_curs + 1, p_curs, (long) (MAXCOL - tcol)); *(conv_p_curs(trow,MAXCOL)) = ' '; curset(ON);}private voiddellines(n,bot)int n,bot;{ Rect r; RgnHandle updateRgn; long len; updateRgn = NewRgn(); active(); curset(OFF); SetRect(&r, 0, ((trow) * height), WINDWIDTH, ((bot + 1) * height)); ScrollRect(&r, 0, 0 - (n * height), updateRgn); DisposeRgn(updateRgn); len = ((bot - trow - n + 1) * CO); BlockMove(conv_p_curs((trow + n),0), conv_p_curs(trow,0), len); setmem(conv_p_curs((bot - n + 1),0),(n * CO),' '); putcurs(trow, 0, ON); /* ??? "ON" guess by DHR */}private voidinslines(n,bot)int n,bot;{ Rect r; RgnHandle updateRgn; long len; updateRgn = NewRgn(); active(); curset(OFF); SetRect(&r, 0, trow * height, WINDWIDTH, (bot +1) * height); ScrollRect(&r, 0, (n * height), updateRgn); DisposeRgn(updateRgn); len = ((bot - trow - n +1) * CO); BlockMove(conv_p_curs(trow,0), conv_p_curs((trow + n),0), len); setmem(conv_p_curs(trow,0),(n * CO),' '); putcurs(trow,0, ON); /* ??? "ON" guess by DHR */}voidwritechr(start)char *start; /* actually, a Str255 type string */{ static Rect r; static RgnHandle updateRgn; register len; register char save; len = (int) start[0] & 0xff; /* adjusted 6/86 K. M. in td.c*/ active(); curset(OFF); if (insert) { updateRgn = NewRgn(); SetRect(&r, tcol * width, trow * height, twidth - width * len, (trow +1) * height -1); if (trow == MAXROW) maxadjust(&r); ScrollRect(&r, width * len, 0, updateRgn); DisposeRgn(updateRgn); } DrawString(start); if (insert) BlockMove(p_curs,p_curs + len, (long) (CO - tcol - len)); strncpy(p_curs,start + 1,len); if (tcol >= MAXCOL) putcurs(trow, MAXCOL, ON); /* ??? "ON" guess by DHR */ else putcurs(trow, tcol+len, ON); /* ??? "ON" guess by DHR */}private Rect myBoundsRect;private voidinit_slate(){ FontInfo f; char *Name = "Jove "; char *Title; InitGraf(&thePort); InitWindows(); InitCursor(); InitFonts(); InitMenus(); InitDialogs((ProcPtr)NULL); /* no restart proc */ /* figure limiting rectangle for window moves */ SetRect(&LimitRect, screenBits.bounds.left + 3, screenBits.bounds.top + 20, screenBits.bounds.right - 3, screenBits.bounds.bottom -3); Set_std(); SetBounds(); /* initialize char array for updates */ p_scr = emalloc(p_size = wc_std.w_cols * wc_std.w_rows); /* only once */ p_curs = p_scr; Title = sprint("%s%s",Name,version); theScreen = NewWindow(&myWindowRec, &myBoundsRect,CtoPstr(Title), 1,8,(WindowPtr) -1, 1, 0L); /* figure an initial window configuration and adjust it */ wc = &wc_std; wc_user = wc_std; /* initially, only one configuration to toggle */ user_state(theScreen) = std_state(theScreen); SetPort(theScreen); (theScreen)->txFont = FONT; (theScreen)->txSize = TEXTSIZE;#ifdef VARFONT GetFontInfo(&f); height = f.ascent+f.descent+f.leading; width = f.widMax; twidth = width * wc->w_cols; theight = height * wc->w_rows; descent = f.descent;#endif theScreen->txMode = patCopy; theScreen->pnMode = patCopy; PenNormal(); cursor = OFF;}private voidp_refresh(){ int lineno; char *curs, *buf; buf = emalloc(CO + 1); for (lineno = 0; lineno < LI; lineno++) { curs = conv_p_curs(lineno,0); if (lineno == MAXROW) MoveTo(0, (lineno +1) * height + 2 -descent ); else MoveTo(0, (lineno +1) * height - descent); strncpy(buf + 1, curs, CO); buf[0] = (char) CO; DrawString(buf); } putcurs(trow,tcol,OFF); free(buf);}private boolwc_adjust(w,h,wcf,init) /* adjust window config to look nice */int w, h;struct wind_config *wcf;int init;{ static int LIMIT_R, LIMIT_C; int rows, cols; if (init) { LIMIT_R = (h - 4) / HEIGHT; LIMIT_C = (w - SCROLLWIDTH - 1) / WIDTH + 1; } if ((w < WIDTH * 40) ||(h < HEIGHT * 10) /* too small */ || ((rows = (h - 4) / HEIGHT) > LIMIT_R) /* too big */ || ((cols = (w - SCROLLWIDTH - 1) / WIDTH + 1) > LIMIT_C)) return NO; wcf->w_rows = rows; wcf->w_cols = cols; wcf->w_width = wcf->w_cols * WIDTH + 1 + SCROLLWIDTH; wcf->w_height = wcf->w_rows * HEIGHT + 4; return YES;}intgetCO() /* so that jove knows params */{ return wc->w_cols;}intgetLI(){ return wc->w_rows;}private voidSetBounds(){ SetRect(&myBoundsRect, screenBits.bounds.left + 3, screenBits.bounds.top + 40, screenBits.bounds.left + 3 + wc_std.w_width, screenBits.bounds.top + 40 + wc_std.w_height);}private voidSet_std(){ (void) wc_adjust(screenBits.bounds.right - screenBits.bounds.left - 6, screenBits.bounds.bottom - screenBits.bounds.top - 42, &wc_std,1);}private voidReset_std(){ Set_std(); std_state(theScreen) = myBoundsRect;}#endif /* MAC */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -