📄 mfbio.c
字号:
/* * Put terminal in the state that existed before MFBOpen */ if(MFBCurrent->deviceType == TTY) { /* * Output initialization end string */ MFBGenCode(MFBFORMAT.endSequence); /* * Flush the buffer */ MFBUpdate();#ifdef HAS_TTY_ /* * Reset graphics tty options * * NOTE: we must reset these options in just the opposite order * in which they were set. The user might have opened his own * terminal, in which case the fileDesc is not unity, but we * are still setting the standard i/o device. */ /* the isatty() is necessary because user may be piping output */ if(isatty(MFBCurrent->fileDesc)){ /* if(chmod(MFBCurrent->name, MFBCurrent->oldstat.graphstat.st_mode) < 0) return(MFBBADOPT); */ if(ioset(MFBCurrent->fileDesc, &MFBCurrent->graphTtyb.oldttyb) < 0) return(MFBBADOPT); if(iosetl(MFBCurrent->fileDesc, &MFBCurrent->oldstat.graphttyw) < 0) return(MFBBADOPT); } /* the isatty() is necessary because user may be piping output */ if(MFBCurrent->fileDesc != 1 && isatty(1)){ /* if(chmod(ttyname(2),MFBCurrent->oldstat.kybrdstat.st_mode) < 0) return(MFBBADOPT); */ if (ioset(1, &MFBCurrent->kybrdTtyb.oldttyb) < 0) return(MFBBADOPT); if (iosetl(1, &MFBCurrent->oldstat.kybrdttyw) < 0) return(MFBBADOPT); return(MFBBADOPT); }#endif /* * don't close stdout */ if(MFBCurrent->fileDesc != 1) if(close(MFBCurrent->fileDesc) < 0) return(MFBBADDEV); } /* * Deinitialize the mfb structure */ MFBCurrent->initializedBool = false; free((char *) MFBCurrent); return(MFBOK); }intMFBHalt(){ /* * Notes: * Called to disable the graphics sequence. * Has same effect as MFBHalt, except that the MFBCurrent is not freed. * * PERFECT FOR SUSPENDING A JOB IN UNIX! */ /* * Put terminal in the state that existed before MFBOpen */ if(MFBCurrent->deviceType == TTY) { /* * Clear the output buffer */ MFBUpdate(); /* * Output initialization end string */ MFBGenCode(MFBFORMAT.endSequence); /* * Flush the buffer */ MFBUpdate();#ifdef HAS_TTY_ /* * Reset graphics tty options * * NOTE: we must reset these options in just the opposite order * in which they were set. The user might have opened his own * terminal, in which case the fileDesc is not unity, but we * are still setting the standard i/o device. */ /* the isatty() is necessary because user may be piping output */ if(isatty(MFBCurrent->fileDesc)){ /* if(chmod(MFBCurrent->name, MFBCurrent->oldstat.graphstat.st_mode) < 0) return(MFBBADOPT); */ if(ioset(MFBCurrent->fileDesc, &MFBCurrent->graphTtyb.oldttyb) < 0) return(MFBBADOPT); if(iosetl(MFBCurrent->fileDesc, &MFBCurrent->oldstat.graphttyw) < 0) return(MFBBADOPT); } /* the isatty() is necessary because user may be piping output */ if(MFBCurrent->fileDesc != 1 && isatty(1)){ /* if(chmod(ttyname(2),MFBCurrent->oldstat.kybrdstat.st_mode) < 0) return(MFBBADOPT); */ if(ioset(1, &MFBCurrent->kybrdTtyb.oldttyb) < 0) return(MFBBADOPT); if(iosetl(1, &MFBCurrent->oldstat.kybrdttyw) < 0) return(MFBBADOPT); }#endif MFBCurrent->ttyIsSet = false; } return(MFBOK); } /***************************************************************************** * * INPUT ROUTINES * *****************************************************************************/intMFBPoint(x,y,key,button) int *x,*y,*button; char *key; /* * Notes: * None at this time. */ { int status; int retrnd; if(!MFBCurrent->PointingDeviceBool) return(MFBNOPNT); if((retrnd = MFBFlushInput()) < 0) return(retrnd); /* * Enable Pointing Device */ MFBCurrent->X = MFBCurrent->cursorColor1Id; MFBCurrent->Y = MFBCurrent->cursorColor2Id; MFBGenCode(MFBFORMAT.enablePointingDevice); MFBCurrent->X = MFBCurrent->Y = -1; MFBCurrent->Z = MFBCurrent->T = 0; /* * If Read Will Cause Immediate Transfer,Wait For a Character */ if(MFBCurrent->readImmediateBool) { MFBUpdate(); MFBCurrent->Z = (*MFBCurrent->dsply_getchar)(); } /* * Trigger Pointing Device Read */ MFBGenCode(MFBFORMAT.readPointingDevice); /* * And Flush The Buffer */ MFBUpdate(); /* * Read and Format Cursor Data */ /* MFBDecode returns >= 0 if OK, character barfed on if ERROR. */ status = MFBDecode(MFBFORMAT.formatPointingDevice); *button = MFBCurrent->T; *key = (char)MFBCurrent->Z; *x = MFBCurrent->X; *y = MFBCurrent->Y; /* * Disable Pointing Device */ MFBGenCode(MFBFORMAT.disablePointingDevice); /* * MFBPoint may destroy last x/y,so be safe about it. */ MFBCurrent->lastX = MFBCurrent->lastY = -1; if((retrnd = MFBFlushInput()) < 0) return(retrnd); if(status >= 0) { /* character returned */ *key = (char)status; return(MFBOK); } else if(status == MFBCAPNOFORMAT) return(MFBNOPTFT); else if(status == MFBCAPOK) return(MFBOK); else return(MFBPNTERR); }char*MFBKeyboard(x,y,background,foreground) int x,y; int background; int foreground; { /* * Notes: * Read type-in from keyboard until user types return key. * Do rub-out processing--rub out and ctrl-h keys. */ int Int1; int X,Y; int MaxX,MaxY; int OldTextMode; int OldForeground; int OldFillPattern; static char MFBTypeIn[161]; char c[2]; if(MFBCurrent->deviceType != TTY) return(NULL); Int1 = 0; c[1] = NULL; OldTextMode = MFBCurrent->textMode; OldForeground = MFBCurrent->fgColorId; OldFillPattern = MFBCurrent->fillPattern; MFBSetFillPattern(0); MFBSetTextMode(true); MFBSetColor(foreground); if(MFBFORMAT.keyboardStart == NULL || *MFBFORMAT.keyboardStart == 0) { /* * NAIVE KEYBOARD */ if(!MFBCurrent->textPositionableBool) return(NULL); MaxX = MFBCurrent->maxX - MFBCurrent->keyboardXOffset; MaxY = MFBCurrent->maxY - MFBCurrent->keyboardYOffset; /* echo characters using graphtext */ X = x + MFBCurrent->keyboardXOffset; Y = y + MFBCurrent->keyboardYOffset; for(;;){ X += (MFBCurrent->fontWidth + MFBCurrent->fontXOffset); MFBUpdate(); if((*c = (*MFBCurrent->kybrd_getchar)()) == 13 || *c == 10){ MFBTypeIn[Int1] = 0; break; } else if(*c == 8 || *c == 0177){ /* ctrl-h or del */ X -= (MFBCurrent->fontWidth + MFBCurrent->fontXOffset); if(Int1 > 0){ /* can't bs further . . . */ MFBSetColor(background); MFBBox(X+MFBCurrent->keyboardXOffset, Y+MFBCurrent->keyboardYOffset-MFBCurrent->fontYOffset, X+MFBCurrent->keyboardXOffset+MFBCurrent->fontWidth +MFBCurrent->fontXOffset, Y+MFBCurrent->keyboardYOffset+MFBCurrent->fontHeight); MFBSetColor(foreground); X -= (MFBCurrent->fontWidth + MFBCurrent->fontXOffset); Int1--; } } else if(*c == 24 || *c == 21){ /* ctrl-x or ctrl-u */ MFBSetColor(background); MFBBox(x+MFBCurrent->keyboardXOffset, Y+MFBCurrent->keyboardYOffset-MFBCurrent->fontYOffset, X+MFBCurrent->keyboardXOffset, Y+MFBCurrent->keyboardYOffset+MFBCurrent->fontHeight); MFBSetColor(foreground); X = x + MFBCurrent->keyboardXOffset; Int1 = 0; } else if(*c == 27){ /* esc */ MFBText(" ESCAPE",X,Y,0); MFBTypeIn[0] = 0; Int1 = 0; break; } else{ MFBTypeIn[Int1++] = *c; X = MFBmin(MaxX,X); Y = MFBmin(MaxY,Y); if(*c >= ' ' && *c <= '~') MFBText(c,X,Y,0); else MFBText("^",X,Y,0); } } } else { MFBCurrent->X = x + MFBCurrent->keyboardXOffset; MFBCurrent->Y = y + MFBCurrent->keyboardYOffset; MFBGenCode(MFBFORMAT.keyboardStart); MFBPutchar(' '); for(;;){ MFBPutchar(' '); MFBGenCode(MFBFORMAT.keyboardBackspace); MFBUpdate(); if((*c = (*MFBCurrent->kybrd_getchar)()) == 13 || *c == 10){ MFBTypeIn[Int1] = 0; break; } else if(*c == 8 || *c == 0177){ if(Int1 == 0) /* can't bs further . . . */ MFBPutchar(7); else{ MFBPutchar(' '); MFBGenCode(MFBFORMAT.keyboardBackspace); MFBGenCode(MFBFORMAT.keyboardBackspace); Int1--; } } else if(*c == 24 || *c == 21){ /* ctrl-x or ctrl-u */ for(; Int1 > 0; Int1--){ MFBPutchar(' '); MFBGenCode(MFBFORMAT.keyboardBackspace); MFBGenCode(MFBFORMAT.keyboardBackspace); } MFBPutchar(' '); MFBGenCode(MFBFORMAT.keyboardBackspace); } else if(*c == 27){ /* esc */ MFBTypeIn[0] = 0; break; } else{ MFBTypeIn[Int1++] = *c; if(*c >= ' ' && *c <= '~') MFBPutchar(*c); else MFBPutchar('^'); } } MFBGenCode(MFBFORMAT.keyboardEnd); } MFBSetTextMode(OldTextMode); MFBSetColor(OldForeground); MFBSetFillPattern(OldFillPattern); /* * MFBKeyboard may destroy last x/y,so be safe about it. */ MFBCurrent->lastX = MFBCurrent->lastY = -1; return(MFBTypeIn); }/***************************************************************************** * * ERROR HANDLING ROUTINES * *****************************************************************************/char *MFBError(errnum) int errnum; { int i; static char result[200]; for(i = 0; i < NUMERRORS; i++) { if(errors[i].errnum == errnum) { (void) strcpy(result,errors[i].message); return(result); } } (void) sprintf(result,"Illegal Error Number %d in MFBError!",errnum); return(result); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -