📄 sedial.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 <signal.h>#include <setjmp.h>#include <sys/types.h>#include <sys/wait.h>#include <math.h>#include <X11/Intrinsic.h>#include <X11/StringDefs.h>#include <X11/Shell.h>#include <X11/Xaw/Command.h>#include <X11/Xaw/Dialog.h>#include <X11/Xaw/Viewport.h>#include "MultiList.h"#include "seyon.h"#include "SeDecl.h"#include "SeSig.h"extern char *get_word();extern int IconifyShell(), MdmReadLine(), MdmTimedWaitFor();extern int ConvertStringToIntArray();int ReadParsePhoneFile();void DoDial(), ExecDial(), DismissDirectory(), DialerEnd(), HighlightItems(), ClearAllItems(), ManualDial(), DoManualDial(), ReReadPhoneFile();struct _ddItem { char number[LIT_BUF]; char name[LIT_BUF]; char baud[10]; int bits; int parity; int stopBits; char prefix[LIT_BUF]; char suffix[LIT_BUF]; char script[SM_BUF];};struct _ddItem *ddItems[MAX_ENT];Boolean dialDirUp = False, manualDial = False;char *script_file, phone_number[SM_BUF] = "", dialMsg[SM_BUF];int dialTime, dialTry, current_item, ddCurItemIndex;jmp_buf dial_env;XfwfMultiListWidget mlw;#define BUGGY_MULTILIST_WIDGET 1/*---------------------------------------------------------------------------+| TopDial - the top routine for the dialing directory.+---------------------------------------------------------------------------*/voidTopDial(widget, clientData) Widget widget; XtPointer clientData;{ void EditFile(); static Widget popup, view, list; Widget form, mBox, uBox, lBox; static char phoneFile[REG_BUF]; static String disItems[MAX_ENT+1] = {NULL}; if (clientData == NULL && dialDirUp) {XMapRaised(XtDisplay(widget), XtWindow(popup)); return;} if (disItems[0] == NULL) { strcpy(phoneFile, qres.phoneFile); if (ReadParsePhoneFile(phoneFile, disItems) < 0) return; form = XtParent(widget); popup = SeAddPopupWG("directory", widget, form, form, 0, SeWidgetHeight(form), True, True); mBox = AddPaned("mBox", popup);/* uBox = AddBox("uBox", mBox);*/ uBox = SeAddForm("uBox", mBox); lBox = AddBox("lBox", mBox); view = XtCreateManagedWidget("view", viewportWidgetClass, uBox, NULL, 0); list = XtVaCreateManagedWidget("list", xfwfMultiListWidgetClass, view, XtNlist, disItems, NULL); mlw = (XfwfMultiListWidget)list; SeSetViewportDimFromMultiList(view, list, 10); XtAddCallback(list, XtNcallback, DoDial, NULL); AddButton("dismiss", lBox, DismissDirectory, NULL); AddButton("ok", lBox, DoDial, NULL); AddButton("manual", lBox, ManualDial, NULL); AddButton("clear", lBox, ClearAllItems, NULL); AddButton("default", lBox, HighlightItems, qres.defaultPhoneEntries); AddButton("edit", lBox, EditFile, (XtPointer)phoneFile); AddButton("reread", lBox, ReReadPhoneFile, (XtPointer)disItems); XtRealizeWidget(popup); }#if BUGGY_MULTILIST_WIDGET else { XtDestroyWidget(list); list = XtVaCreateManagedWidget("list", xfwfMultiListWidgetClass, view, XtNlist, disItems, NULL); mlw = (XfwfMultiListWidget)list;/* SeSetViewportDimFromMultiList(view, list, 10);*/ XtAddCallback(list, XtNcallback, DoDial, NULL); XtRealizeWidget(popup); }#endif if (clientData == NULL) { XtPopup(popup, XtGrabNone); dialDirUp = True; if (qres.dialAutoStart) { qres.dialAutoStart = False; HighlightItems(widget, qres.defaultPhoneEntries); DoDial(); } } else { HighlightItems(widget, clientData); DoDial(); }}/* * DoDial: gets the first selected item and dials it. */voidDoDial(){ static XfwfMultiListReturnStruct *item; ErrorIfBusy(); if ((item = XfwfMultiListGetHighlighted(mlw))->num_selected == 0) SimpleError("No Item Selected"); ddCurItemIndex = item->selected_items[(current_item = 0)]; inhibit_child = True; manualDial = False; dialTry = 1; PreProcessPrep(); ExecDial();}/* * executes the dialing as a forked process and communicates progress * to the main process */voidDialHandler(#if NeedFunctionPrototypes int signo, XtPointer client_data#endif){ void DispatchActions(), RunScript();#if defined(SUNOS_3) || defined(Mips) union wait status;#else int status;#endif Widget dirWidget; if (wait(&status) < 0) {SePError("Dial wait failed"); return;} XoAppIgnoreSignal(app_con, SIGCHLD);#if defined(SUNOS_3) || defined(Mips) switch (status.w_retcode) {#else switch (WEXITSTATUS(status)) {#endif case 0: if (manualDial) SeyonMessage("Connected"); else SeyonMessage(FmtString1("Connected to %s", ddItems[ddCurItemIndex]->name)); UpdateStatusBox(NULL); DispatchActions(ACTION_DISPATCH, qres.postConnectAction, genericWidget); if ((dirWidget = XtNameToWidget(dialWidget, "directory"))) { RemoveCurrentItem(); if (ddItems[ddCurItemIndex]->script[0] && !manualDial) { linkflag = 1; inhibit_child = False; RunScript(NULL, ddItems[ddCurItemIndex]->script); return; } } break; case 1: DialCirculate(); return; case 2: Beep(); SeyonMessage("Dial Aborted: Online"); break; case 10: SeyonMessage("Dialing Canceled by User"); break; } inhibit_child = False; PostProcessPrep();}/* * KillDialHandler: signal handler for canceling the dialing process. */voidKillDialHandler(#if NeedFunctionPrototypes int signo#endif){ void MdmOFlush(); signal(SIGTERM, SIG_IGN); MdmOFlush(); cancel_dial(0); exit(10);}voidExecDial(){ int DialNumber(); static int retStatus; XoAppAddSignal(app_con, SIGCHLD, DialHandler, NULL); if ((w_child_pid = SeFork())) return; /* Child process */ signal(SIGTERM, KillDialHandler); retStatus = DialNumber(); exit(retStatus);}/* * ReReadPhoneFile: updates the dialing directory from the phonebook file. */voidReReadPhoneFile(widget, disItems) Widget widget; XtPointer disItems[];{ Widget dirWidget = XtParent(GetShell(widget)); ErrorIfBusy(); FreeList(disItems); DestroyShell(widget); dialDirUp = False; TopDial(dirWidget, NULL);}/* * ManualDial: sets up the manual dialing popup. */voidManualDial(widget) Widget widget;{ Widget popup; ErrorIfBusy(); popup = GetShell(PopupDialogGetValue("manual_dial", widget, DoManualDial, NULL, phone_number)); PopupCentered(popup, widget);}/* * action proc for manual dialing */voidmanual_dial_action_ok(widget) Widget widget;{ DoManualDial(widget);}/* * does manual dialing */voidDoManualDial(widget) Widget widget;{ void ExecManualDial(); Widget dialog = XtParent(widget); char phoneNumber[SM_BUF]; strcpy(phoneNumber, XawDialogGetValueString(dialog)); DestroyShell(dialog); ExecManualDial(XtParent(GetShell(widget)), phoneNumber);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -