📄 mfbio.c
字号:
mfb->strings.rastCopyEnd = MFBGetStr("RSCPE",&bufPtr); mfb->strings.rastCopySource = MFBGetStr("RSSRC",&bufPtr); mfb->strings.rastCopyDest = MFBGetStr("RSDST",&bufPtr); if(mfb->strings.rastCopyStart == NULL || *mfb->strings.rastCopyStart == NULL) mfb->rastCopyBool = false; else mfb->rastCopyBool = true; /* * display color (intensity) control */ mfb->maxColors = MFBGetNum("MCL"); mfb->strings.screenFlood = MFBGetStr("GCS",&bufPtr); mfb->maxIntensity = MFBGetNum("VTI"); mfb->vltBool = (Bool)MFBGetFlag("VLT"); mfb->vltUseHLSBool = (Bool)MFBGetFlag("HLS"); if(mfb->vltBool) { mfb->lengthOfVLT = MFBGetNum("VTL"); mfb->strings.vltEntry = MFBGetStr("VTE",&bufPtr); } mfb->strings.setForegroundColor = MFBGetStr("SCS",&bufPtr); mfb->strings.channelMaskSet = MFBGetStr("VWM",&bufPtr); if(mfb->strings.channelMaskSet == NULL || *mfb->strings.channelMaskSet == NULL) mfb->channelMaskBool = false; else mfb->channelMaskBool = true; mfb->strings.readMaskSet = MFBGetStr("SRM",&bufPtr); if(mfb->strings.readMaskSet == NULL || *mfb->strings.readMaskSet == NULL) mfb->readMaskBool = false; else mfb->readMaskBool = true; /* * graphics input (pointing device) control */ mfb->PointingDeviceBool = (Bool)MFBGetFlag("POD"); if(mfb->PointingDeviceBool){ mfb->buttonsBool = (Bool)MFBGetFlag("PDB"); if(mfb->buttonsBool){ mfb->numberOfButtons = MFBmin(MFBGetNum("NPB"),12); mfb->buttonMask[0] = MFBGetNum("BU1"); mfb->buttonMask[1] = MFBGetNum("BU2"); mfb->buttonMask[2] = MFBGetNum("BU3"); mfb->buttonMask[3] = MFBGetNum("BU4"); mfb->buttonMask[4] = MFBGetNum("BU5"); mfb->buttonMask[5] = MFBGetNum("BU6"); mfb->buttonMask[6] = MFBGetNum("BU7"); mfb->buttonMask[7] = MFBGetNum("BU8"); mfb->buttonMask[8] = MFBGetNum("BU9"); mfb->buttonMask[9] = MFBGetNum("BU10"); mfb->buttonMask[10] = MFBGetNum("BU11"); mfb->buttonMask[11] = MFBGetNum("BU12"); /* -1 flags an unused and inapplicable button mask */ for(i = mfb->numberOfButtons; i < 12; ++i) mfb->buttonMask[i] = -1; } mfb->readImmediateBool = (Bool)MFBGetFlag("PRI"); mfb->strings.enablePointingDevice = MFBGetStr("PDS",&bufPtr); mfb->strings.disablePointingDevice = MFBGetStr("PDE",&bufPtr); mfb->strings.enableRubberBanding = MFBGetStr("PRBON",&bufPtr); mfb->strings.disableRubberBanding = MFBGetStr("PRBOFF",&bufPtr); mfb->strings.readPointingDevice = MFBGetStr("PDR",&bufPtr); mfb->strings.formatPointingDevice = MFBGetStr("PDF",&bufPtr); } /* * keyboard control */ mfb->keyboardBool = (Bool)MFBGetFlag("KYBRD"); mfb->strings.keyboardStart = MFBGetStr("KYS",&bufPtr); mfb->strings.keyboardEnd = MFBGetStr("KYE",&bufPtr); mfb->strings.keyboardBackspace = MFBGetStr("KYB",&bufPtr); mfb->keyboardXOffset = MFBGetNum("KYX"); mfb->keyboardYOffset = MFBGetNum("KYY"); mfb->strings.audio = MFBGetStr("BELL",&bufPtr); /* * blinker control */ mfb->blinkersBool = (Bool)MFBGetFlag("BLD"); mfb->maxBlinkers = MFBGetNum("NBL"); mfb->numBlinkers = 0; mfb->strings.blinkerON = MFBGetStr("BLS",&bufPtr); mfb->strings.blinkerOFF = MFBGetStr("BLE",&bufPtr); /* * line geometry control */ mfb->maxLineStyles = MFBGetNum("MLS"); mfb->reissueLineStyleBool = (Bool)MFBGetFlag("RLS"); mfb->linePatternDefineBool = (Bool)MFBGetFlag("DLP"); mfb->strings.setLineStyle = MFBGetStr("SLS",&bufPtr); mfb->strings.setSolidLineStyle = MFBGetStr("SSLS",&bufPtr); mfb->strings.movePenSequence = MFBGetStr("MPS",&bufPtr); mfb->strings.drawLineSequence = MFBGetStr("DLS",&bufPtr); mfb->strings.drawSolidLineSequence = MFBGetStr("DSL",&bufPtr); mfb->strings.drawLineToSequence = MFBGetStr("DLT",&bufPtr); mfb->strings.drawSolidLineToSequence = MFBGetStr("DSLT",&bufPtr); if(mfb->linePatternDefineBool) { mfb->strings.lineDefineStart = MFBGetStr("LDS",&bufPtr); mfb->strings.lineDefineFormat = MFBGetStr("LDF",&bufPtr); mfb->strings.lineDefineEnd = MFBGetStr("LDE",&bufPtr); mfb->lineDefineLength = MFBGetNum("LDL"); } /* * box geometry control */ mfb->strings.drawBoxSequence = MFBGetStr("DBS",&bufPtr); mfb->strings.drawSolidBoxSequence = MFBGetStr("DSB",&bufPtr); /* * polygon geometry control */ mfb->filledPlygnBool = (Bool)MFBGetFlag("FPOLY"); mfb->strings.beginPlygnSequence = MFBGetStr("PLS",&bufPtr); mfb->strings.beginSolidPlygnSequence = MFBGetStr("PLSOL",&bufPtr); mfb->strings.sendPlygnVertex = MFBGetStr("PLV",&bufPtr); mfb->strings.endPlygnSequence = MFBGetStr("PLE",&bufPtr); /* * fill pattern control */ mfb->maxFillPatterns = MFBGetNum("MFP"); mfb->fillPtrnDefineBool = (Bool)MFBGetFlag("DFP"); mfb->strings.setFillPattern = MFBGetStr("SFP",&bufPtr); mfb->strings.setSolidFillPattern = MFBGetStr("SSFP",&bufPtr); if(mfb->fillPtrnDefineBool) { mfb->fillDefineHeight = MFBGetNum("FDH"); mfb->fillDefineWidth = MFBGetNum("FDW"); mfb->fillDefineRowMajorBool = (Bool)MFBGetFlag("FDR"); mfb->strings.fillDefineStart = MFBGetStr("FDS",&bufPtr); mfb->strings.fillDefineFormat = MFBGetStr("FDF",&bufPtr); mfb->strings.fillDefineEnd = MFBGetStr("FDE",&bufPtr); } /* * Circle geometry control */ mfb->strings.drawCircleSequence = MFBGetStr("DCS",&bufPtr); /* * ALU modes */ mfb->strings.setALUJAM = MFBGetStr("ALUJAM",&bufPtr); mfb->strings.setALUOR = MFBGetStr("ALUOR",&bufPtr); mfb->strings.setALUNOR = MFBGetStr("ALUNOR",&bufPtr); mfb->strings.setALUEOR = MFBGetStr("ALUEOR",&bufPtr); /* * set defaults in mfb tty structure */ mfb->cursorColor1Id = 0; mfb->cursorColor2Id = 1; mfb->fgColorId = UNINITIALIZED; mfb->fillPattern = UNINITIALIZED; mfb->lineStyle = UNINITIALIZED; mfb->channelMask = UNINITIALIZED; mfb->readMask = UNINITIALIZED; mfb->textMode = UNINITIALIZED; /*this is changed by MFBInitialize*/ mfb->ttyIsSet = false; mfb->lastX = -1; mfb->lastY = -1; } else{ /* * Hardcopy devices not yet implemented. */ mfb->deviceType = HCOPY; } /* * Now try to initialize everything,return status. */ *errorcode = MFBInitialize(); mfb->initializedBool = true; return(mfb); }intMFBInitialize() /* * Notes: * Called to reinitialize a graphics terminal. * TTY mode is reset if necessary (UNIX only). */ { int i; if(MFBCurrent->deviceType == TTY) { i = MFBInitTTY(); if(i < 0) return(i); /* * Output initialization start string */ MFBGenCode(MFBFORMAT.startSequence); /* * Flush the buffer */ MFBUpdate(); /* * Output initialization */ MFBGenCode(MFBFORMAT.initLineStyles); MFBGenCode(MFBFORMAT.initColorStyles); MFBGenCode(MFBFORMAT.initFillPatterns); MFBCurrent->lastX = -1; MFBCurrent->lastY = -1; /* * And flush the buffer again */ MFBUpdate(); return(MFBOK); } else{ return(MFBOK); } }intMFBInitTTY(){ /* * Notes: * Initialize TTY and save current state in MFB structure. * Also,the output buffer is flushed. */#ifndef vms long litout = LLITOUT;#endif if(MFBCurrent->deviceType != TTY) return(MFBBADTTY); MFBCurrent->numTtyBuffer = 0; if(!MFBCurrent->ttyIsSet) {#ifndef vms if(*MFBCurrent->name == NULL) { /* => stdout not in /dev */ return(MFBBADTTY); } /* * Set keyboard tty options if necessary. * We put the terminal in CBREAK so that any keyboard * input will be echoed on the graphics display. */ /* the isatty() is necessary because user may be piping output */ if(MFBCurrent->fileDesc != 1 && isatty(1)){ /* * Disable user messages by changing the fstats of stdin. * Yes, this is necessary; the user may open his own terminal * as the graphics device in which case user messages will * still interrupt the graphics via stdio. */ if(fstat(1,&MFBCurrent->oldstat.kybrdstat) < 0) return(MFBBADOPT); /* 0022 corresponds to write by group and others */ /* This is bad -- Wayne if(chmod(ttyname(2),MFBCurrent->oldstat.kybrdstat.st_mode & ~0022) < 0) return(MFBBADOPT); */ if(ioctl(1,TIOCGETP,(char *) &MFBCurrent->kybrdTtyb.oldttyb) < 0) return(MFBBADOPT); if(ioctl(1,TIOCLGET,(char *) &MFBCurrent->oldstat.kybrdttyw) < 0) return(MFBBADOPT); MFBCurrent->kybrdTtyb.newttyb = MFBCurrent->kybrdTtyb.oldttyb; MFBCurrent->kybrdTtyb.newttyb.sg_flags &= (ALLDELAY & ~XTABS); MFBCurrent->kybrdTtyb.newttyb.sg_flags |= ODDP | EVENP | CBREAK; MFBCurrent->kybrdTtyb.newttyb.sg_erase = 8; /* ctrl-h */ MFBCurrent->kybrdTtyb.newttyb.sg_kill = 24; /* ctrl-x */ if(ioctl(1,TIOCSETP,(char *) &MFBCurrent->kybrdTtyb.newttyb) < 0) return(MFBBADOPT); } /* * Set graphics device tty options */ /* the isatty() is necessary because user may be piping output */ if(isatty(MFBCurrent->fileDesc)){ /* Disable user messages */ if(stat(MFBCurrent->name,&MFBCurrent->oldstat.graphstat) < 0) return(MFBBADOPT); /* 0022 corresponds to write by group and others */ /* if(chmod(MFBCurrent->name, MFBCurrent->oldstat.graphstat.st_mode & ~0022) < 0) return(MFBBADOPT); */ if(ioctl(MFBCurrent->fileDesc,TIOCGETP, (char *) &MFBCurrent->graphTtyb.oldttyb) < 0) return(MFBBADOPT); if(ioctl(MFBCurrent->fileDesc,TIOCLGET, (char *) &MFBCurrent->oldstat.graphttyw) < 0) return(MFBBADOPT); MFBCurrent->graphTtyb.newttyb = MFBCurrent->graphTtyb.oldttyb; MFBCurrent->graphTtyb.newttyb.sg_flags &= (ALLDELAY & ~XTABS); MFBCurrent->graphTtyb.newttyb.sg_flags |= ODDP | EVENP | CBREAK; if(MFBCurrent->fileDesc != 1){ if(MFBCurrent->graphTtyb.newttyb.sg_ispeed < B1200) MFBCurrent->graphTtyb.newttyb.sg_ispeed = B9600; if(MFBCurrent->graphTtyb.newttyb.sg_ospeed < B1200) MFBCurrent->graphTtyb.newttyb.sg_ospeed = B9600; } if(MFBCurrent->litout){ if(ioctl(MFBCurrent->fileDesc,TIOCLBIS,(char *) &litout) < 0) return(MFBBADOPT); } if(MFBCurrent->raw) MFBCurrent->graphTtyb.newttyb.sg_flags |= RAW; MFBCurrent->graphTtyb.newttyb.sg_erase = 8; /* ctrl-h */ MFBCurrent->graphTtyb.newttyb.sg_kill = 24; /* ctrl-x */ if(ioctl(MFBCurrent->fileDesc,TIOCSETP, (char *) &MFBCurrent->graphTtyb.newttyb) < 0) return(MFBBADOPT); }#endif MFBCurrent->outchar = MFBPutchar; MFBCurrent->outstr = MFBPutstr; MFBCurrent->dsply_getchar = MFBGetchar; MFBCurrent->dsply_ungetchar = MFBUngetchar; if(MFBCurrent->keyboardBool){ MFBCurrent->kybrd_getchar = MFBGetchar; MFBCurrent->kybrd_ungetchar = MFBUngetchar; } else{ MFBCurrent->kybrd_getchar = OldGetchar; MFBCurrent->kybrd_ungetchar = OldUngetchar; } MFBCurrent->ttyIsSet = true; } return(MFBOK); }/***************************************************************************** * * TERMINATION ROUTINES * *****************************************************************************/intMFBClose(){ /* * Notes: * Called to end the graphics sequence. Must be last procedure * invoked because it frees the MFB struct. */ /* * Flush the buffer */ MFBUpdate(); if(!MFBCurrent->initializedBool) { free((char *) MFBCurrent); return(MFBOK); } /* * Put terminal in the state that existed before MFBOpen */ if(MFBCurrent->deviceType == TTY) { /* * Output initialization end string */ MFBGenCode(MFBFORMAT.endSequence); /* * Flush the buffer */ MFBUpdate();#ifndef vms /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -