static int doYesNoDialog(const char *filename) { char string[255]; XmString mString; YesNoResult = ynNone; sprintf(string, "File %s already exists,\nOk to overwrite?", filename); mString = XmStringCreateLtoR(string, XmSTRING_DEFAULT_CHARSET); SET_ONE_RSRC(YesNoDialog, XmNmessageString, mString); XmStringFree(mString); ManageDialogCenteredOnPointer(YesNoDialog); while (YesNoResult == ynNone) XtAppProcessEvent(XtWidgetToApplicationContext(YesNoDialog), XtIMAll); XtUnmanageChild(YesNoDialog); /* Nasty motif bug here, patched around by waiting for a ReparentNotify event (with timeout) before allowing file selection dialog to pop down. If this routine returns too quickly, and the file selection dialog (and thereby, this dialog as well) are destroyed while X is still sorting through the events generated by the pop-down, something bad happens and we get a crash */ if (YesNoResult == ynYes) PopDownBugPatch(YesNoDialog); return YesNoResult == ynYes; }
void CreateMapInterpolateDialog(Widget parent, Arg *args, int nArgs) { Widget rc, fr, rc2, maps, intpB; StdForm *sf; void wprintf(); sf = PostStdFormDialog(parent, "Map interpolation", BUTT_APPLY, (XtCallbackProc)DoInterpolateMap, NULL, BUTT_CANCEL, NULL, NULL, NULL, NULL, NULL, 1, NULL); sf->any = NULL; rc = XtVaCreateManagedWidget("rowcol", xmRowColumnWidgetClass, sf->form, XmNorientation, XmVERTICAL, NULL); maps = XmCreateScrolledList(rc, "list", args, nArgs); fr = XtVaCreateManagedWidget("frame", xmFrameWidgetClass, rc, XmNshadowType, XmSHADOW_OUT, NULL); rc2 = XtVaCreateManagedWidget("rowcol", xmRowColumnWidgetClass, fr, XmNorientation, XmVERTICAL, NULL); XtCreateManagedWidget("Name of new map:", xmLabelWidgetClass, rc2, NULL, 0); sf->edit[0] = XtCreateManagedWidget("edit", xmTextWidgetClass, rc2, NULL, 0); intpB = XtCreateManagedWidget("Interpolation...", xmPushButtonWidgetClass, rc, NULL, 0); XtAddCallback(intpB, XmNactivateCallback, (XtCallbackProc)PostInterpolationDialog, "interpolate"); XtAddCallback(maps, XmNsingleSelectionCallback, (XtCallbackProc)MapInterpolateGet, sf); ArrangeStdFormDialog(sf, rc); XtManageChild(maps); wprintf(sf->edit[0], "<none>"); ManageDialogCenteredOnPointer(sf->form); }
static void doErrorDialog(const char *errorString, const char *filename) { char string[255]; XmString mString; ErrorDone = False; sprintf(string, errorString, filename); mString = XmStringCreateLtoR(string, XmSTRING_DEFAULT_CHARSET); SET_ONE_RSRC(ErrorDialog, XmNmessageString, mString); XmStringFree(mString); ManageDialogCenteredOnPointer(ErrorDialog); while (!ErrorDone) XtAppProcessEvent (XtWidgetToApplicationContext(ErrorDialog), XtIMAll); XtUnmanageChild(ErrorDialog); }
/* ** Create a dialog for the output of a shell command. The dialog lives until ** the user presses the Dismiss button, and is then destroyed */ static void createOutputDialog(Widget parent, char *text) { Arg al[50]; int ac, rows, cols, hasScrollBar, wrapped; Widget form, textW, button; XmString st1; /* measure the width and height of the text to determine size for dialog */ measureText(text, MAX_OUT_DIALOG_COLS, &rows, &cols, &wrapped); if (rows > MAX_OUT_DIALOG_ROWS) { rows = MAX_OUT_DIALOG_ROWS; hasScrollBar = True; } else hasScrollBar = False; if (cols > MAX_OUT_DIALOG_COLS) cols = MAX_OUT_DIALOG_COLS; if (cols == 0) cols = 1; /* Without completely emulating Motif's wrapping algorithm, we can't be sure that we haven't underestimated the number of lines in case a line has wrapped, so let's assume that some lines could be obscured */ if (wrapped) hasScrollBar = True; ac = 0; form = CreateFormDialog(parent, "shellOutForm", al, ac); ac = 0; XtSetArg(al[ac], XmNlabelString, st1=MKSTRING("OK")); ac++; XtSetArg(al[ac], XmNmarginWidth, BUTTON_WIDTH_MARGIN); ac++; XtSetArg(al[ac], XmNhighlightThickness, 0); ac++; XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; button = XmCreatePushButtonGadget(form, "ok", al, ac); XtManageChild(button); XtVaSetValues(form, XmNdefaultButton, button, NULL); XtVaSetValues(form, XmNcancelButton, button, NULL); XmStringFree(st1); XtAddCallback(button, XmNactivateCallback, destroyOutDialogCB, XtParent(form)); ac = 0; XtSetArg(al[ac], XmNrows, rows); ac++; XtSetArg(al[ac], XmNcolumns, cols); ac++; XtSetArg(al[ac], XmNresizeHeight, False); ac++; XtSetArg(al[ac], XmNtraversalOn, False); ac++; XtSetArg(al[ac], XmNwordWrap, True); ac++; XtSetArg(al[ac], XmNscrollHorizontal, False); ac++; XtSetArg(al[ac], XmNscrollVertical, hasScrollBar); ac++; XtSetArg(al[ac], XmNhighlightThickness, 0); ac++; XtSetArg(al[ac], XmNspacing, 0); ac++; XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++; XtSetArg(al[ac], XmNeditable, False); ac++; XtSetArg(al[ac], XmNvalue, text); ac++; XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg(al[ac], XmNbottomWidget, button); ac++; textW = XmCreateScrolledText(form, "outText", al, ac); AddMouseWheelSupport(textW); XtManageChild(textW); XtVaSetValues(XtParent(form), XmNtitle, "Output from Command", NULL); ManageDialogCenteredOnPointer(form); }
static Widget create_list_dialog(Widget parent, char *fname, ANTS *a, Arg *args, int nargs) { int n; Arg wargs[10]; Widget form, label, listDialog, sep, cancel, all, reset; static KLUDGE shit; n = 0; XtSetArg(wargs[n], XmNautoUnmanage, FALSE); n++; XtSetArg(wargs[n], XmNtitle, "Read POPS files"); n++; form = XmCreateFormDialog(parent, "form", wargs, n); a->form = form; label = XtCreateManagedWidget(fname, xmLabelWidgetClass, form, NULL, 0); listDialog = XmCreateScrolledList(form, "list", args, nargs); XtManageChild(listDialog); sep = XtVaCreateManagedWidget("separator", xmSeparatorWidgetClass, form, XmNseparatorType, XmSHADOW_ETCHED_IN, NULL); cancel = XtCreateManagedWidget(BUTT_CANCEL, xmPushButtonWidgetClass, form, NULL, 0); XtVaSetValues(form, XmNdefaultButton, cancel, NULL); all = XtCreateManagedWidget("Select all", xmPushButtonWidgetClass, form, NULL, 0); shit.w = listDialog; shit.n = a->nscans; reset = XtCreateManagedWidget("Unselect all", xmPushButtonWidgetClass, form, NULL, 0); XtAddCallback(cancel, XmNactivateCallback, (XtCallbackProc)cancel_pops_dialog, a); XtAddCallback(reset, XmNactivateCallback, (XtCallbackProc)reset_pops_dialog, &shit); XtAddCallback(all, XmNactivateCallback, (XtCallbackProc)all_pops_dialog, &shit); n = 0; XtSetArg(wargs[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNtopOffset, 10); n++; XtSetArg(wargs[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNleftOffset, 10); n++; XtSetArg(wargs[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNrightOffset, 10); n++; XtSetValues(XtParent(listDialog), wargs, n); n = 0; XtSetArg(wargs[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(wargs[n], XmNtopWidget, XtParent(listDialog)); n++; XtSetArg(wargs[n], XmNtopOffset, 10); n++; XtSetArg(wargs[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNleftOffset, 10); n++; XtSetArg(wargs[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNrightOffset, 10); n++; XtSetValues(label, wargs, n); n = 0; XtSetArg(wargs[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(wargs[n], XmNtopWidget, label); n++; XtSetArg(wargs[n], XmNtopOffset, 10); n++; XtSetArg(wargs[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNleftOffset, 1); n++; XtSetArg(wargs[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNrightOffset, 1); n++; XtSetValues(sep, wargs, n); n = 0; XtSetArg(wargs[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(wargs[n], XmNtopWidget, sep); n++; XtSetArg(wargs[n], XmNtopOffset, 20); n++; XtSetArg(wargs[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNleftOffset, 30); n++; XtSetArg(wargs[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNbottomOffset, 10); n++; XtSetValues(cancel, wargs, n); n = 0; XtSetArg(wargs[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(wargs[n], XmNtopWidget, sep); n++; XtSetArg(wargs[n], XmNtopOffset, 20); n++; XtSetArg(wargs[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(wargs[n], XmNleftWidget, cancel); n++; XtSetArg(wargs[n], XmNleftOffset, 20); n++; XtSetArg(wargs[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNbottomOffset, 10); n++; XtSetValues(reset, wargs, n); n = 0; XtSetArg(wargs[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(wargs[n], XmNtopWidget, sep); n++; XtSetArg(wargs[n], XmNtopOffset, 20); n++; XtSetArg(wargs[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(wargs[n], XmNleftWidget, reset); n++; XtSetArg(wargs[n], XmNleftOffset, 10); n++; XtSetArg(wargs[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(wargs[n], XmNbottomOffset, 10); n++; XtSetValues(all, wargs, n); ManageDialogCenteredOnPointer(form); return listDialog; }
char *FontSel(Widget parent, int showPropFonts, const char *currFont, Pixel sampleFG, Pixel sampleBG) { Widget dialog, form, okButton, cancelButton; Widget styleList, sizeList, fontName, fontList; Widget sizeToggle, propFontToggle = NULL, dispField; Widget nameLabel, sampleLabel; Arg args[MAX_ARGS]; int n; XmString tempStr; char bigFont[MAX_FONT_NAME_LEN]; xfselControlBlkType ctrlBlk; Display *theDisplay; ctrlBlk.fontData = XListFonts(XtDisplay(parent), "-*-*-*-*-*-*-*-*-*-*-*-*-*-*", MAX_NUM_FONTS, &ctrlBlk.numFonts); FindBigFont(&ctrlBlk, bigFont); ctrlBlk.oldFont = XLoadQueryFont(XtDisplay(parent), bigFont); ctrlBlk.oldFontList = XmFontListCreate(ctrlBlk.oldFont, XmSTRING_DEFAULT_CHARSET); ctrlBlk.sampleFG = sampleFG; ctrlBlk.sampleBG = sampleBG; dialog = CreateDialogShell(parent, "Font Selector", args, 0); /* Set up window sizes for form widget */ n = 0; XtSetArg(args[n], XmNautoUnmanage, FALSE); n++; XtSetArg(args[n], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); n++; /* Create form popup dialog widget */ form = XtCreateWidget ("Font Selector", xmFormWidgetClass, dialog, args, n); /* Create pushbutton widgets */ n = 0; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNbottomOffset, 4); n++; XtSetArg(args[n], XmNtopOffset, 1); n++; XtSetArg(args[n], XmNrightPosition, 45); n++; XtSetArg(args[n], XmNwidth, 110); n++; XtSetArg(args[n], XmNheight, 28); n++; XtSetArg(args[n], XmNshowAsDefault, TRUE); n++; okButton = XtCreateManagedWidget("OK", xmPushButtonWidgetClass, form, args, n); n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, okButton); n++; XtSetArg(args[n], XmNbottomWidget, okButton); n++; XtSetArg(args[n], XmNleftPosition, 55); n++; XtSetArg(args[n], XmNwidth, 110); n++; XtSetArg(args[n], XmNheight, 28); n++; cancelButton = XtCreateManagedWidget("Cancel", xmPushButtonWidgetClass, form, args, n); /* create font name text widget and the corresponding label */ n = 0; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNbottomWidget, okButton); n++; XtSetArg(args[n], XmNleftPosition, 1); n++; XtSetArg(args[n], XmNrightPosition, 99); n++; XtSetArg(args[n], XmNeditable, True); n++; XtSetArg(args[n], XmNeditMode, XmSINGLE_LINE_EDIT); n++; XtSetArg(args[n], XmNmaxLength, MAX_FONT_NAME_LEN); n++; fontName = XtCreateManagedWidget("fontname", xmTextWidgetClass, form, args, n); RemapDeleteKey(fontName); /* kludge to handle delete and BS */ n = 0; tempStr = XmStringCreate("Font Name:", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[n], XmNlabelString, tempStr); n++; XtSetArg(args[n], XmNmnemonic, 'N'); n++; XtSetArg(args[n], XmNuserData, fontName); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftWidget, fontName); n++; XtSetArg(args[n], XmNbottomWidget, fontName); n++; XtSetArg(args[n], XmNtopOffset, 1); n++; nameLabel = XtCreateManagedWidget("Font Name:", xmLabelWidgetClass, form, args, n); XmStringFree(tempStr); /* create sample display text field widget */ n = 0; XtSetArg(args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNrightPosition, 99); n++; XtSetArg(args[n], XmNbottomWidget, nameLabel); n++; XtSetArg(args[n], XmNleftPosition, 1); n++; XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++; XtSetArg(args[n], XmNvalue, "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789"); n++; XtSetArg(args[n], XmNforeground, sampleFG); n++; XtSetArg(args[n], XmNbackground, sampleBG); n++; dispField = XtCreateManagedWidget(" ", xmTextFieldWidgetClass, form, args, n); n = 0; tempStr = XmStringCreate("Sample:", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[n], XmNlabelString, tempStr); n++; XtSetArg(args[n], XmNmnemonic, 'S'); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftWidget, dispField); n++; XtSetArg(args[n], XmNbottomWidget, dispField); n++; XtSetArg(args[n], XmNtopOffset, 1); n++; sampleLabel = XtCreateManagedWidget("Font Name:", xmLabelWidgetClass, form, args, n); XmStringFree(tempStr); /* create toggle buttons */ n = 0; tempStr = XmStringCreate("Show Size in Points", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[n], XmNlabelString, tempStr); n++; XtSetArg(args[n], XmNmnemonic, 'P'); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftPosition, 2); n++; XtSetArg(args[n], XmNtopOffset, 1); n++; XtSetArg(args[n], XmNbottomWidget, sampleLabel); n++; sizeToggle = XtCreateManagedWidget("sizetoggle", xmToggleButtonWidgetClass, form, args, n); XmStringFree(tempStr); if (showPropFonts != ONLY_FIXED) { n = 0; tempStr = XmStringCreate("Show Proportional Width Fonts", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[n], XmNlabelString, tempStr); n++; XtSetArg(args[n], XmNmnemonic, 'W'); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNrightPosition, 98); n++; XtSetArg(args[n], XmNtopWidget, sizeToggle); n++; XtSetArg(args[n], XmNbottomWidget, sizeToggle); n++; XtSetArg(args[n], XmNtopOffset, 1); n++; propFontToggle = XtCreateManagedWidget("propfonttoggle", xmToggleButtonWidgetClass, form, args, n); XmStringFree(tempStr); } /* create scroll list widgets */ /* "Font" list */ n = 0; tempStr = XmStringCreate("Font:", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[n], XmNlabelString, tempStr); n++; XtSetArg(args[n], XmNmnemonic, 'F'); n++; XtSetArg(args[n], XmNtopOffset, 2); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNleftPosition, 1); n++; nameLabel = XtCreateManagedWidget("Font:", xmLabelWidgetClass, form, args, n); XmStringFree(tempStr); n = 0; XtSetArg(args[n], XmNvisibleItemCount, 15); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNbottomWidget, sizeToggle); n++; XtSetArg(args[n], XmNtopWidget, nameLabel); n++; XtSetArg(args[n], XmNleftWidget, nameLabel); n++; XtSetArg(args[n], XmNrightPosition, 52); n++; fontList = XmCreateScrolledList(form, "fontlist", args, n); AddMouseWheelSupport(fontList); XtManageChild(fontList); XtVaSetValues(nameLabel, XmNuserData, fontList, NULL); /* "Style" list */ n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNtopWidget, nameLabel); n++; XtSetArg(args[n], XmNleftOffset, 5); n++; XtSetArg(args[n], XmNleftWidget, XtParent(fontList)); n++; XtSetArg(args[n], XmNbottomWidget, XtParent(fontList)); n++; XtSetArg(args[n], XmNrightPosition, 85); n++; styleList = XmCreateScrolledList(form, "stylelist", args, n); AddMouseWheelSupport(styleList); XtManageChild(styleList); n = 0; tempStr = XmStringCreate("Style:", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[n], XmNmnemonic, 'y'); n++; XtSetArg(args[n], XmNuserData, styleList); n++; XtSetArg(args[n], XmNlabelString, tempStr); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNbottomWidget, XtParent(styleList)); n++; XtSetArg(args[n], XmNleftWidget, XtParent(styleList)); n++; XtCreateManagedWidget("Style:", xmLabelWidgetClass, form, args, n); XmStringFree(tempStr); /* "Size" list */ n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, nameLabel); n++; XtSetArg(args[n], XmNleftWidget, XtParent(styleList)); n++; XtSetArg(args[n], XmNbottomWidget, XtParent(fontList)); n++; XtSetArg(args[n], XmNleftOffset, 5); n++; XtSetArg(args[n], XmNrightPosition, 99); n++; sizeList = XmCreateScrolledList(form, "sizelist", args, n); AddMouseWheelSupport(sizeList); XtManageChild(sizeList); n = 0; tempStr = XmStringCreate("Size:", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[n], XmNlabelString, tempStr); n++; XtSetArg(args[n], XmNmnemonic, 'z'); n++; XtSetArg(args[n], XmNuserData, sizeList); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); n++; XtSetArg(args[n], XmNbottomWidget, XtParent(sizeList)); n++; XtSetArg(args[n], XmNleftWidget, XtParent(sizeList)); n++; XtCreateManagedWidget("Size:", xmLabelWidgetClass, form, args, n); XmStringFree(tempStr); /* update form widgets cancel button */ n = 0; XtSetArg(args[n], XmNcancelButton, cancelButton); n++; XtSetValues(form, args, n); /* update application's control block structure */ ctrlBlk.form = form; ctrlBlk.okButton = okButton; ctrlBlk.cancelButton = cancelButton; ctrlBlk.fontList = fontList; ctrlBlk.styleList = styleList; ctrlBlk.sizeList = sizeList; ctrlBlk.fontNameField = fontName; ctrlBlk.sizeToggle = sizeToggle; if (showPropFonts != ONLY_FIXED) ctrlBlk.propFontToggle = propFontToggle; ctrlBlk.dispField = dispField; ctrlBlk.exitFlag = FALSE; ctrlBlk.destroyedFlag = FALSE; ctrlBlk.showPropFonts = showPropFonts; ctrlBlk.showSizeInPixels = TRUE; ctrlBlk.sel1 = NULL; ctrlBlk.sel2 = NULL; ctrlBlk.sel3 = NULL; ctrlBlk.fontName = NULL; setupScrollLists(NONE, ctrlBlk); /* update scroll lists */ if (showPropFonts == PREF_PROP) XmToggleButtonSetState(propFontToggle, TRUE, FALSE); /* Register callback functions */ if (showPropFonts != ONLY_FIXED) XtAddCallback(propFontToggle, XmNvalueChangedCallback, (XtCallbackProc)propFontToggleAction, (char *)&ctrlBlk); XtAddCallback(sizeToggle, XmNvalueChangedCallback, (XtCallbackProc)sizeToggleAction, (char *)&ctrlBlk); XtAddCallback(fontList, XmNbrowseSelectionCallback, (XtCallbackProc)fontAction, (char *)&ctrlBlk); XtAddCallback(styleList, XmNbrowseSelectionCallback, (XtCallbackProc)styleAction, (char *)&ctrlBlk); XtAddCallback(sizeList, XmNbrowseSelectionCallback, (XtCallbackProc)sizeAction, (char *)&ctrlBlk); XtAddCallback(okButton, XmNactivateCallback, (XtCallbackProc)okAction, (char *)&ctrlBlk); XtAddCallback(cancelButton, XmNactivateCallback, (XtCallbackProc)cancelAction, (char *)&ctrlBlk); /* add event handler to setup input focus at start to scroll list */ XtAddEventHandler(fontList, FocusChangeMask, FALSE, (XtEventHandler)setFocus, (char *)&ctrlBlk); XmProcessTraversal(fontList, XmTRAVERSE_CURRENT); /* setup tabgroups */ XmAddTabGroup(fontList); XmAddTabGroup(styleList); XmAddTabGroup(sizeList); XmAddTabGroup(sizeToggle); if (showPropFonts != ONLY_FIXED) XmAddTabGroup(propFontToggle); XmAddTabGroup(fontName); XmAddTabGroup(okButton); XmAddTabGroup(cancelButton); /* Make sure that we don't try to access the dialog if the user destroyed it (possibly indirectly, by destroying the parent). */ XtAddCallback(dialog, XmNdestroyCallback, (XtCallbackProc)destroyCB, (char *)&ctrlBlk); /* Link Motif Close option to cancel action */ AddMotifCloseCallback(dialog, (XtCallbackProc)cancelAction, &ctrlBlk); /* Handle dialog mnemonics */ AddDialogMnemonicHandler(form, FALSE); /* Realize Widgets */ ManageDialogCenteredOnPointer(form); /* set up current font parameters */ if (currFont[0] != '\0') startupFont(&ctrlBlk, currFont); /* Make sure that we can still access the display in case the form gets destroyed */ theDisplay = XtDisplay(form); /* enter event loop */ while (! ctrlBlk.exitFlag && ! ctrlBlk.destroyedFlag) XtAppProcessEvent(XtWidgetToApplicationContext(form), XtIMAll); if (! ctrlBlk.destroyedFlag) { /* Don't let the callback destroy the font name */ XtRemoveCallback(dialog, XmNdestroyCallback, (XtCallbackProc)destroyCB, (char *)&ctrlBlk); XtDestroyWidget(dialog); } if (ctrlBlk.oldFont != NULL) { XFreeFont(theDisplay, ctrlBlk.oldFont); XmFontListFree(ctrlBlk.oldFontList); } return(ctrlBlk.fontName); }
void PostMacroEditDialog(Widget wid, char *cmd, XtPointer cd) { int n; Arg wargs[10]; Widget w = wid; Widget fr, rc, rc1, rc2, list, text; Widget clear; StdForm *sf; while (!XtIsWMShell(w)) w = XtParent(w); sf = PostStdFormDialog(w, "Macro Editor", BUTT_APPLY, (XtCallbackProc)RunMacro, NULL, BUTT_CANCEL, NULL, NULL, NULL, NULL, NULL, 0, NULL); fr = XtVaCreateWidget("frame", xmFrameWidgetClass, sf->form, XmNshadowType, XmSHADOW_OUT, NULL); rc = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, fr, XmNorientation, XmHORIZONTAL, NULL); rc1 = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, rc, XmNorientation, XmVERTICAL, NULL); rc2 = XtVaCreateWidget("rowcol", xmRowColumnWidgetClass, rc, XmNorientation, XmVERTICAL, NULL); XtCreateManagedWidget("Available macro commands:", xmLabelWidgetClass, rc1, NULL, 0); XtCreateManagedWidget("Macro:", xmLabelWidgetClass, rc2, NULL, 0); n = 0; XtSetArg(wargs[n], XmNitemCount, nMacroCmds); n++; XtSetArg(wargs[n], XmNitems, xMacroCmdStrs); n++; XtSetArg(wargs[n], XmNvisibleItemCount, 15); n++; XtSetArg(wargs[n], XmNfontList, gp->flist12); n++; XtSetArg(wargs[n], XmNselectionPolicy, XmSINGLE_SELECT); n++; list = XmCreateScrolledList(rc1, "list", wargs, n); text = XtVaCreateManagedWidget("text", xmTextWidgetClass, rc2, XmNeditMode, XmMULTI_LINE_EDIT, XmNcolumns, 25, XmNrows, 15, XmNfontList, gp->flist12, NULL); clear = XtCreateManagedWidget("Clear", xmPushButtonWidgetClass, rc2, NULL, 0); XtAddCallback(list, XmNsingleSelectionCallback, (XtCallbackProc)SelectMacroCmdCallback, text); XtAddCallback(clear, XmNactivateCallback, (XtCallbackProc)ClearMacro, text); ArrangeStdFormDialog(sf, rc); XtManageChild(list); XtManageChild(rc1); XtManageChild(rc2); XtManageChild(rc); XtManageChild(fr); UpdateMacroWindow(text); ManageDialogCenteredOnPointer(sf->form); }
static void existHelpCB(Widget w, Widget helpPanel, caddr_t call_data) { ManageDialogCenteredOnPointer(helpPanel); }
/* ** HandleCustomExistFileSB ** ** Manage a customized file selection box for opening existing files. ** Use this if you want to change the standard file selection dialog ** from the defaults provided in GetExistingFilename, but still ** want take advantage of the button processing, help messages, and ** file checking of GetExistingFilename. ** ** Arguments: ** ** Widget existFileSB - your custom file selection box widget id ** char * filename - a string to receive the selected filename ** (this string will not be altered if the ** user pressed the cancel button) ** ** Returns: GFN_OK - file was selected and OK button pressed ** GFN_CANCEL - Cancel button pressed and no returned file ** */ int HandleCustomExistFileSB(Widget existFileSB, char *filename) { Boolean done_with_dialog=False; /* ok to destroy dialog flag */ char *fileString; /* C string for file selected */ char *dirString; /* C string for dir of file selected */ XmString cFileString; /* compound string for file selected */ XmString cDir; /* compound directory selected */ XmString cPattern; /* compound filter pattern */ Widget help; /* help window form dialog */ #if XmVersion < 1002 int i; #endif XtAddCallback(existFileSB, XmNokCallback, (XtCallbackProc)existOkCB, &done_with_dialog); XtAddCallback(existFileSB, XmNcancelCallback, (XtCallbackProc)existCancelCB, &done_with_dialog); AddMotifCloseCallback(XtParent(existFileSB), (XtCallbackProc)existCancelCB, &done_with_dialog); help = createPanelHelp(existFileSB, HelpExist, "Selecting Files to Open"); createErrorDialog(existFileSB); XtAddCallback(existFileSB, XmNhelpCallback, (XtCallbackProc)existHelpCB, (char *)help); if (DefaultDirectory != NULL || DefaultPattern != NULL) XtVaSetValues(existFileSB, XmNdirectory, DefaultDirectory, XmNpattern, DefaultPattern, NULL); #ifndef SGI_CUSTOM makeListTypeable(XmFileSelectionBoxGetChild(existFileSB,XmDIALOG_LIST)); makeListTypeable(XmFileSelectionBoxGetChild(existFileSB,XmDIALOG_DIR_LIST)); #if XmVersion >= 1002 XtVaSetValues(existFileSB, XmNinitialFocus, XtParent( XmFileSelectionBoxGetChild(existFileSB, XmDIALOG_LIST)), NULL); #endif #endif ManageDialogCenteredOnPointer(existFileSB); #ifndef SGI_CUSTOM /* Typing in the directory list is dependent on the list being in the same form of alphabetical order expected by the character processing routines. As of about 1.2.3, some Motif libraries seem to have a different idea of ordering than is usual for Unix directories. To sort them properly, we have to patch the directory and file searching routines to re-sort the lists when they change */ XtVaGetValues(existFileSB, XmNdirSearchProc, &OrigDirSearchProc, XmNfileSearchProc, &OrigFileSearchProc, NULL); XtVaSetValues(existFileSB, XmNdirSearchProc, replacementDirSearchProc, XmNfileSearchProc, replacementFileSearchProc, NULL); sortWidgetList(XmFileSelectionBoxGetChild(existFileSB, XmDIALOG_DIR_LIST)); sortWidgetList(XmFileSelectionBoxGetChild(existFileSB, XmDIALOG_LIST)); #if XmVersion < 1002 /* To give file list initial focus, revoke default button status for the "OK" button. Dynamic defaulting will restore it as the default button after the keyboard focus is established. Note the voodoo below: calling XmProcess traversal extra times (a recommendation from OSF technical support) somehow succeedes in giving the file list focus */ XtVaSetValues(existFileSB, XmNdefaultButton, NULL, NULL); for (i=1; i<30; i++) XmProcessTraversal(XmFileSelectionBoxGetChild(existFileSB, XmDIALOG_LIST), XmTRAVERSE_CURRENT); #endif #endif /* SGI_CUSTOM */ while (!done_with_dialog) XtAppProcessEvent(XtWidgetToApplicationContext(existFileSB), XtIMAll); if (SelectResult == GFN_OK) { XtVaGetValues(existFileSB, XmNdirSpec, &cFileString, XmNdirectory, &cDir, XmNpattern, &cPattern, NULL); /* Undocumented: file selection box widget allocates copies of these strings on getValues calls. I have risked freeing them to avoid memory leaks, since I assume other developers have made this same realization, therefore OSF can't easily go back and change it */ if (DefaultDirectory != NULL) XmStringFree(DefaultDirectory); if (DefaultPattern != NULL) XmStringFree(DefaultPattern); DefaultDirectory = cDir; DefaultPattern = cPattern; XmStringGetLtoR(cFileString, XmSTRING_DEFAULT_CHARSET, &fileString); /* Motif 2.x seem to contain a bug that causes it to return only the relative name of the file in XmNdirSpec when XmNpathMode is set to XmPATH_MODE_RELATIVE (through X resources), although the man page states that it always returns the full path name. We can easily work around this by checking that the first character of the file name is a `/'. */ #ifdef VMS /* VMS won't return `/' as the 1st character of the full file spec. `:' terminates the device name and is not allowed elsewhere */ if (strchr(fileString, ':') != NULL) { #else if (fileString[0] == '/') { #endif /* VMS */ /* The directory name is already present in the file name or the user entered a full path name. */ strcpy(filename, fileString); } else { /* Concatenate the directory name and the file name */ XmStringGetLtoR(cDir, XmSTRING_DEFAULT_CHARSET, &dirString); strcpy(filename, dirString); strcat(filename, fileString); XtFree(dirString); } XmStringFree(cFileString); XtFree(fileString); } /* Destroy the dialog _shell_ iso. the dialog. Normally, this shouldn't be necessary as the shell is destroyed automatically when the dialog is. However, due to a bug in various Lesstif versions, the latter messes up the grab cascades and leaves new windows without grabs, such that they appear to be frozen. */ XtDestroyWidget(XtParent(existFileSB)); return SelectResult; } /* ** HandleCustomNewFileSB ** ** Manage a customized file selection box for opening new files. ** ** Arguments: ** ** Widget newFileSB - your custom file selection box widget id ** char * filename - a string to receive the selected filename ** (this string will not be altered if the ** user pressed the cancel button) ** char* defaultName - default name to be pre-entered in filename ** text field. ** ** Returns: GFN_OK - file was selected and OK button pressed ** GFN_CANCEL - Cancel button pressed and no returned file ** */ int HandleCustomNewFileSB(Widget newFileSB, char *filename, char *defaultName) { Boolean done_with_dialog=False; /* ok to destroy dialog flag */ Widget help; /* help window form dialog */ XmString cFileString; /* compound string for file selected */ XmString cDir; /* compound directory selected */ XmString cPattern; /* compound filter pattern */ char *fileString; /* C string for file selected */ char *dirString; /* C string for dir of file selected */ #if XmVersion < 1002 int i; #endif XtAddCallback(newFileSB, XmNokCallback, (XtCallbackProc)newFileOKCB, &done_with_dialog); XtAddCallback(newFileSB, XmNcancelCallback, (XtCallbackProc)newFileCancelCB, &done_with_dialog); #ifndef SGI_CUSTOM makeListTypeable(XmFileSelectionBoxGetChild(newFileSB,XmDIALOG_LIST)); makeListTypeable(XmFileSelectionBoxGetChild(newFileSB,XmDIALOG_DIR_LIST)); #endif if (DefaultDirectory != NULL || DefaultPattern != NULL) XtVaSetValues(newFileSB, XmNdirectory, DefaultDirectory, XmNpattern, DefaultPattern, NULL); help = createPanelHelp(newFileSB, HelpNew, "Saving a File"); createYesNoDialog(newFileSB); createErrorDialog(newFileSB); XtAddCallback(newFileSB, XmNhelpCallback, (XtCallbackProc)newHelpCB, (char *)help); if (defaultName != NULL) { Widget nameField = XmFileSelectionBoxGetChild(newFileSB, XmDIALOG_TEXT); XmTextInsert(nameField, XmTextGetLastPosition(nameField), defaultName); } #if XmVersion >= 1002 #ifndef SGI_CUSTOM XtVaSetValues(newFileSB, XmNinitialFocus, XmFileSelectionBoxGetChild(newFileSB, XmDIALOG_TEXT), NULL); #else /* SGI_CUSTOM */ { Widget finder = XmFileSelectionBoxGetChild(newFileSB, SgDIALOG_FINDER); if ( finder != NULL ) XtVaSetValues(newFileSB, XmNinitialFocus, finder, NULL); } #endif #endif ManageDialogCenteredOnPointer(newFileSB); #ifndef SGI_CUSTOM #if XmVersion < 1002 /* To give filename text initial focus, revoke default button status for the "OK" button. Dynamic defaulting will restore it as the default button after the keyboard focus is established. Note the voodoo below: calling XmProcess traversal FOUR times (a recommendation from OSF technical support) somehow succeedes in changing the focus */ XtVaSetValues(newFileSB, XmNdefaultButton, NULL, NULL); for (i=1; i<30; i++) XmProcessTraversal(XmFileSelectionBoxGetChild(newFileSB, XmDIALOG_TEXT), XmTRAVERSE_CURRENT); #endif /* Typing in the directory list is dependent on the list being in the same form of alphabetical order expected by the character processing routines. As of about 1.2.3, some Motif libraries seem to have a different idea of ordering than is usual for Unix directories. To sort them properly, we have to patch the directory and file searching routines to re-sort the lists when they change */ XtVaGetValues(newFileSB, XmNdirSearchProc, &OrigDirSearchProc, XmNfileSearchProc, &OrigFileSearchProc, NULL); XtVaSetValues(newFileSB, XmNdirSearchProc, replacementDirSearchProc, XmNfileSearchProc, replacementFileSearchProc, NULL); sortWidgetList(XmFileSelectionBoxGetChild(newFileSB, XmDIALOG_DIR_LIST)); sortWidgetList(XmFileSelectionBoxGetChild(newFileSB, XmDIALOG_LIST)); #endif /* SGI_CUSTOM */ while (!done_with_dialog) XtAppProcessEvent (XtWidgetToApplicationContext(newFileSB), XtIMAll); if (SelectResult == GFN_OK) { /* See note in existing file routines about freeing the values obtained in the following call */ XtVaGetValues(newFileSB, XmNdirSpec, &cFileString, XmNdirectory, &cDir, XmNpattern, &cPattern, NULL); if (DefaultDirectory != NULL) XmStringFree(DefaultDirectory); if (DefaultPattern != NULL) XmStringFree(DefaultPattern); DefaultDirectory = cDir; DefaultPattern = cPattern; XmStringGetLtoR(cFileString, XmSTRING_DEFAULT_CHARSET, &fileString); /* See note in existing file routines about Motif 2.x bug. */ #ifdef VMS /* VMS won't return `/' as the 1st character of the full file spec. `:' terminates the device name and is not allowed elsewhere */ if (strchr(fileString, ':') != NULL) { #else if (fileString[0] == '/') { #endif /* VMS */ /* The directory name is already present in the file name or the user entered a full path name. */ strcpy(filename, fileString); } else { /* Concatenate the directory name and the file name */ XmStringGetLtoR(cDir, XmSTRING_DEFAULT_CHARSET, &dirString); strcpy(filename, dirString); strcat(filename, fileString); XtFree(dirString); } XmStringFree(cFileString); XtFree(fileString); } XtDestroyWidget(newFileSB); return SelectResult; } /* ** Return current default directory used by GetExistingFilename. ** Can return NULL if no default directory has been set (meaning ** use the application's current working directory) String must ** be freed by the caller using XtFree. */ char *GetFileDialogDefaultDirectory(void) { char *string; if (DefaultDirectory == NULL) return NULL; XmStringGetLtoR(DefaultDirectory, XmSTRING_DEFAULT_CHARSET, &string); return string; }