📄 seset.c
字号:
/* * This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M. * Saggaf. All rights reserved. * * See the file COPYING (1-COPYING) or the manual page seyon(1) for a full * statement of rights and permissions for this program.*/#include <math.h>#include <X11/Intrinsic.h>#include <X11/StringDefs.h>#include <X11/Xaw/Toggle.h>#include <X11/Xaw/Dialog.h>#include "seyon.h"#include "SeDecl.h"extern int param_pipe[2];int DetNewlineTrMode(), ToggleNewlineMode(), SetIStrip(), ToggleDelMode(), ToggleMetaKeyTr(), ToggleXOffMode(), ToggleRtsctsMode(), ToggleZmodemAutoDownload(), ToggleIdleGuard(), MenuSetGetBaud(), MenuSetGetCSize(), MenuSetGetParity(), MenuSetGetStopBits(), MenuSetGetParamSCut(), MenuSetGetNewlineTrMode();void UpdateToggleSettings(), UpdateStates(), SetGetRadioVal(), SetDoGetRadioVal(), SetGetValue(), SetDoGetValue();int SetBaud(), SetPort();int newlineTrMode;struct _setToggle { Widget widget; char *name; int state; int (*call_back)();};struct _setRadio { String name; String button[10]; int activeIndex; int (*call_back)();};struct _setValue { char *name; char value[SM_BUF]; int(*call_back)();};static struct _setToggle set_toggle[] ={ {NULL, "stripHighBit", 0, SetIStrip}, {NULL, "del", 0, ToggleDelMode}, {NULL, "meta_tr", 0, ToggleMetaKeyTr}, {NULL, "xoff", 0, ToggleXOffMode}, {NULL, "rtscts", 0, ToggleRtsctsMode}, {NULL, "autozm", 0, ToggleZmodemAutoDownload}, {NULL, "idle", 0, ToggleIdleGuard}, {NULL, NULL, 0, NULL}};static struct _setRadio setRadio[] ={ {"baud", {"300", "1200", "2400", "4800", "9600", "19200", "38400",#if USE_NONSTD_BAUD "57600", "115200",#endif NULL}, 1, MenuSetGetBaud}, {"bits", {"5", "6", "7", "8", NULL}, 1, MenuSetGetCSize}, {"parity", {"none", "odd", "even", NULL}, 1, MenuSetGetParity}, {"stopBits", {"1", "2", NULL}, 1, MenuSetGetStopBits}, {"cut", {"8n1", "7e1", "other", NULL}, 1, MenuSetGetParamSCut}, {"nl_tr", {"nl", "cr", "cr_lf", NULL}, 1, MenuSetGetNewlineTrMode}, {NULL, {NULL}, 0, NULL}};static struct _setValue set_value[] ={ {"port", "", SetPort}, {NULL, "", NULL}};struct _setRadio *curRadObjPtr;struct _setValue *curValObjPtr;voidTopSet(w) Widget w;{ Widget popup, mBox, uBox, lBox; struct _setToggle *tptr; struct _setRadio *rPtr; struct _setValue *vptr; ErrorIfBusy() tptr = set_toggle; tptr->state = qres.stripHighBit; tptr++; tptr->state = qres.backspaceTranslation; tptr++; tptr->state = qres.metaKeyTranslation; tptr++; tptr->state = qres.xonxoffFlowControl; tptr++; tptr->state = qres.rtsctsFlowControl; tptr++; tptr->state = qres.autoZmodem; tptr++; tptr->state = qres.idleGuard; tptr++; popup = SeAddPopup("set", w); mBox = AddPaned("mBox", popup); uBox = AddBox("uBox", mBox); lBox = AddBox("lBox", mBox); for (tptr = set_toggle; tptr->name != NULL; tptr++) { tptr->widget = SeAddToggleWCD(tptr->name, uBox, UpdateToggleSettings, (XtPointer)(tptr->call_back)); SeSetUnsetToggle(tptr->widget, tptr->state); } for (rPtr = setRadio; rPtr->name != NULL; rPtr++) SeAddButtonWCD(rPtr->name, uBox, SetGetRadioVal, (XtPointer) rPtr); for (vptr = set_value; vptr->name != NULL; vptr++) SeAddButtonWCD(vptr->name, uBox, SetGetValue, (XtPointer) vptr); SeAddButtonWCD("dismiss", lBox, DestroyShellCallBack, (XtPointer) mBox); XtPopup(popup, XtGrabExclusive);}voidSetGetRadioVal(widget, client_data) Widget widget; XtPointer client_data;{ struct _setRadio *rPtr = (struct _setRadio*)client_data; rPtr->activeIndex = (*rPtr->call_back)(-1); SePopupRadio(rPtr->name, widget, rPtr->button, rPtr->activeIndex, SetDoGetRadioVal, (XtPointer)rPtr);}voidSetDoGetRadioVal(widget, client_data) Widget widget; XtPointer client_data;{ int TerminalRefreshParameters(); struct _setRadio *rPtr = (struct _setRadio *)client_data; Boolean state; XtVaGetValues(widget, XtNradioData, &(rPtr->activeIndex), XtNstate, &state, NULL); /* The callback routine is called both when the widget is set or unset, so we make sure we do nothing if the widget is unset */ if (state == False) return; (void)(*rPtr->call_back) (rPtr->activeIndex); TerminalRefreshParameters(); SeyonMessage("Parameter Change Performed");}voidSetGetValue(widget, client_data) Widget widget; XtPointer client_data;{ struct _setValue *vptr; vptr = set_value; strcpy(vptr->value, modem_port); vptr++; curValObjPtr = (vptr = (struct _setValue *)client_data); SePopupDialogGetStringE("set_value", widget, SetDoGetValue, client_data, vptr->value, True);}voidSetDoGetValue(widget, client_data) Widget widget; XtPointer client_data;{ int TerminalRefreshParameters(); Widget dialog = XtParent(widget); struct _setValue *vptr = (struct _setValue *)client_data; str_stripspc_copy(vptr->value, XawDialogGetValueString(dialog)); DestroyShell(dialog); (void)(*vptr->call_back) (vptr->value); RestartTerminal(); SeyonMessage("Parameter Change Performed");}voidsetVal_action_ok(widget) Widget widget;{ SetDoGetValue(widget, (XtPointer) curValObjPtr);}voidUpdateToggleSettings(widget, clientData) Widget widget; XtPointer clientData;{ int TerminalRefreshParameters(); /* We have to complicate things a bit to avoid the danger of the case SeGetTog.. = True = -1. One should not assume True = 1*/ ((void (*)())clientData)(SeGetToggleState(widget) ? 1 : 0); TerminalRefreshParameters(); SeyonMessage("Parameter Change Performed");}intSetIStrip(state) int state;{ qres.stripHighBit = (Boolean)state; return MdmSetGetIStrip(state);}intToggleDelMode(){ toggle_flag(&(qres.backspaceTranslation)); return 0;}intToggleMetaKeyTr(){ toggle_flag(&(qres.metaKeyTranslation)); return 0;}intToggleXOffMode(){ toggle_flag(&(qres.xonxoffFlowControl)); xc_setflow(); return 0;}intToggleRtsctsMode(){ toggle_flag(&(qres.rtsctsFlowControl)); set_rtscts(); return 0;}intToggleZmodemAutoDownload(){ toggle_flag(&(qres.autoZmodem)); return 0;}intToggleIdleGuard(){ toggle_flag(&(qres.idleGuard)); IdleGuard(); return 0;}intDetNewlineTrMode(keyword) String keyword;{ char kw[SM_BUF]; if ((keyword == NULL) || (*keyword == '\0')) { SeError("missing newlineTranslation keyword"); return -1; } str_stripspc_copy(kw, keyword); lc_word(kw); if (strcmp(kw, "nl") == 0) return 1; else if (strcmp(kw, "cr") == 0) return 2; else if (strcmp(kw, "cr/lf") == 0) return 3; else { SeErrorF("illigal newlineTranslation keyword: %s", keyword, "", ""); return -1; }}voidSetNewlineTrMode(keyword) String keyword;{ if ((newlineTrMode = DetNewlineTrMode(keyword)) < 0) newlineTrMode = 2;}intMenuSetGetNewlineTrMode(trMode) int trMode;{ if (trMode != -1) newlineTrMode = trMode; return newlineTrMode;}voidSetScrNewlineTrMode(){ getword(); if (word[0] == '\0') { SeError("'set newlineTranslation' must specify translation mode"); eof_flag++; return; } SetNewlineTrMode(word);}intMenuSetGetBaud(baudIndex) int baudIndex;{ return MdmSetGetBaud(baudIndex);}intMenuSetGetCSize(bitsIndex) int bitsIndex;{ return MdmSetGetCSize(bitsIndex == -1 ? bitsIndex : bitsIndex + 4) - 4;}intMenuSetGetParity(parityIndex) int parityIndex;{ return MdmSetGetParity(parityIndex == -1 ? parityIndex : parityIndex - 1) + 1;}intMenuSetGetStopBits(bitsIndex) int bitsIndex;{ return MdmSetGetStopBits(bitsIndex);}intMenuSetGetParamSCut(paramIndex) int paramIndex;{ int bits, parity, stopBits; if (paramIndex == -1) { bits = MdmSetGetCSize(-1); parity = MdmSetGetParity(-1); stopBits = MdmSetGetStopBits(-1); if (bits == 8 && parity == 0 && stopBits == 1) return 1; else if (bits == 7 && parity == 2 && stopBits == 1) return 2; else return 3; } if (paramIndex == 1) { MdmSetGetCSize(8); MdmSetGetParity(0); MdmSetGetStopBits(1); } else if (paramIndex == 2) { MdmSetGetCSize(7); MdmSetGetParity(2); MdmSetGetStopBits(1); } return paramIndex;}intSetBaud(baud) String baud;{ if (mbaud(baud) < 0) { SeErrorF("unsupported baud rate %s", baud, "", ""); return False; } return True;}intSetPort(port) String port;{ int retStatus, reopRetStatus; String oldPort = XtNewString(mport(NULL)); unlock_tty(); CloseModem(); if ((retStatus = OpenModem(port)) < 0) { ShowOpenModemErrMsg(port, retStatus); if ((reopRetStatus = OpenModem(oldPort)) < 0) {ShowOpenModemErrMsg(oldPort, reopRetStatus); SeError(FmtString("Could not re-open old modem device %s", oldPort, "", ""));} } XtFree(oldPort); return retStatus;}void s_set_xoff(), s_set_baud(), set_port(), s_set_cr(), ScrSetIStrip(), s_set_del(), set_meta_tr(), s_set_rtscts(), s_set_autozm(), SetScrIdleGuardMode(), ScrSetCSize(), ScrSetParity(), ScrSetStopBits();struct kw setlist[] ={ {"stripHighBit", ScrSetIStrip}, {"bits", ScrSetCSize}, {"parity", ScrSetParity}, {"stopBits", ScrSetStopBits}, {"newlineTranslation", SetScrNewlineTrMode}, {"del", s_set_del}, {"meta_tr", set_meta_tr}, {"xoff", s_set_xoff}, {"rtscts", s_set_rtscts}, {"autozm", s_set_autozm}, {"idleGuard", SetScrIdleGuardMode}, {"baud", s_set_baud}, {"port", set_port}, {NULL, NULL}};voids_set(){ struct kw *ptr; GETTEST_ARG("set");/* lc_word(word);*/ for (ptr = setlist; ptr->keyword != NULL; ptr++) if (strcmp(ptr->keyword, word) == 0) {(*ptr->rtn)(); return;} SeErrorF("Invalid set keyword `%s'", word, "", ""); eof_flag++;}voids_set_cr(){ set_onoff(&(qres.newlineTranslation));}voidScrSetIStrip(){ Boolean tmpSetFlag; set_onoff(&tmpSetFlag); SetIStrip(tmpSetFlag ? 1 : 0);}voids_set_del(){ set_onoff(&(qres.backspaceTranslation));}voidset_meta_tr(){ set_onoff(&(qres.metaKeyTranslation));}voids_set_xoff(){ set_onoff(&(qres.xonxoffFlowControl)); xc_setflow();}voids_set_rtscts(){ set_onoff(&(qres.rtsctsFlowControl)); set_rtscts();}voids_set_autozm(){ set_onoff(&(qres.autoZmodem));}voidSetScrIdleGuardMode(){ set_onoff(&(qres.idleGuard)); IdleGuard();}voidset_onoff(flag) Boolean *flag;{ String keyWord = XtNewString(word); getword(); lc_word(word); if (strcmp(word, "on") == 0) *flag = True; else if (strcmp(word, "off") == 0) *flag = False; else { SeErrorF("Argument `%s' to keyword `%s' is neither on nor off", word, keyWord, ""); eof_flag++; } if (keyWord) XtFree(keyWord);}#define ScrGetArg(msg) \{ \ getword(); \ if (word[0] == '\0') { \ SeError(msg); \ eof_flag++; \ return; \ } \}voidScrSetCSize(){ ScrGetArg("set bits: missing argument"); MdmSetGetCSize(atoi(word));}voidScrSetParity(){ ScrGetArg("set parity: missing argument"); MdmSetGetParity(atoi(word));}voidScrSetStopBits(){ ScrGetArg("set stopBits: missing argument"); MdmSetGetStopBits(atoi(word));}voids_set_baud(){ getword(); if (word[0] == '\0') { SeError("'set baud' must specify baud rate"); eof_flag++; return; } if (SetBaud(word) == False) eof_flag++;}voidset_port(){ SeNotice("/sp/ Sorry, \"set port\" is not supported in this release"); return; getword(); if (word[0] == '\0') { SeError("'set port' must specify modem device"); eof_flag++; return; } if (SetPort(word) == False) eof_flag++;}struct param { Boolean autoZmodem; Boolean idleGuard; Boolean stripHighBit; Boolean backspaceTranslation; Boolean metaKeyTranslation; Boolean xonxoffFlowControl; Boolean rtsctsFlowControl; int newlineTrMode;};intPutParameters(destination) int *destination;{ struct param param; int writeRetStatus; param.idleGuard = qres.idleGuard; param.stripHighBit = qres.stripHighBit; param.backspaceTranslation = qres.backspaceTranslation; param.metaKeyTranslation = qres.metaKeyTranslation; param.xonxoffFlowControl = qres.xonxoffFlowControl; param.rtsctsFlowControl = qres.rtsctsFlowControl; param.autoZmodem = qres.autoZmodem; param.newlineTrMode = newlineTrMode; if ((writeRetStatus = write(destination[1], (char*)¶m, sizeof(param))) == -1) SePError("Could not write to pipe"); return writeRetStatus;}voidGetParameters(clientData, source) XtPointer clientData; int *source;{ struct param param; if (read(source[0], (char*)¶m, sizeof(param)) == -1) SePError("Could not read from pipe"); qres.idleGuard = param.idleGuard; qres.stripHighBit = param.stripHighBit; qres.backspaceTranslation = param.backspaceTranslation; qres.metaKeyTranslation = param.metaKeyTranslation; qres.xonxoffFlowControl = param.xonxoffFlowControl; qres.rtsctsFlowControl = param.rtsctsFlowControl; qres.autoZmodem = param.autoZmodem; newlineTrMode = param.newlineTrMode; get_modem_attr();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -