int main(int argc, char *argv[]) { int i, n; Arg args[10]; XtAppContext app; Widget toplevel, arrow; setlocale(LC_ALL, ""); //建立顶级窗口 toplevel = XtVaAppInitialize(&app, "ArrowButton", NULL, 0, &argc, argv, NULL, NULL); //建立多选按钮的布局组件 n = 0; XtSetArg(args[n], XmNarrowDirection, XmARROW_RIGHT); n++; XtSetArg(args[n], XmNwidth, 100); n++; XtSetArg(args[n], XmNheight, 100); n++; arrow = XmCreateArrowButton(toplevel, "arrow", args, n); XtManageChild(arrow); //设置回调 XtAddCallback(arrow, XmNactivateCallback, (XtCallbackProc)callback, NULL); //显示窗口 XtRealizeWidget(toplevel); //进入事件循环 XtAppMainLoop(app); }
static Widget createContents(Widget parent, SpaceWindow *window, int hasEventBar, char *eventBarText) { Arg args[50]; int ac; XmString s1, s2; char ctmp[10]; Widget form, displayMode, stability, particleType, rotation, stats; Widget formt1, allSliders; Widget controls, trackInfoFrame, trackInfo; Widget scaleFrame, scaleRC, scaleLabel, scaleArea; Widget stabilityLabel, particleTypeLabel; Widget eventCtrlFrame, eventCtrlForm, eventNumLabel, upArrow; Widget eventNumText, downArrow, eventCtrlText; Widget widget, spin; Pixel foreground, background; Pixmap pm; /* Create the form onto which everything goes */ ac = 0; XtSetArg(args[ac], XmNmarginHeight, 0); ac++; form = XmCreateForm(parent, "form", args, ac); XtManageChild(form); if (hasEventBar) { ac = 0; XtSetArg(args[ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNrightAttachment, XmATTACH_FORM); ac++; eventCtrlFrame = XmCreateFrame(form, "eventCtrlFrame", args, ac); XtManageChild(eventCtrlFrame); ac = 0; eventCtrlForm = XmCreateForm(eventCtrlFrame, "eventCtrlForm", args, ac); XtManageChild(eventCtrlForm); ac = 0; XtSetArg(args[ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNlabelString, (s1=MKSTRING("Event #"))); ac++; eventNumLabel = (Widget) XmCreateLabelGadget( eventCtrlForm, "eventNumLabel", args, ac); XmStringFree(s1); XtManageChild(eventNumLabel); ac = 0; XtSetArg(args[ac], XmNarrowDirection, XmARROW_UP); ac++; XtSetArg(args[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNleftWidget, eventNumLabel); ac++; upArrow = XmCreateArrowButton(eventCtrlForm, "upArrow", args, ac); XtAddCallback(upArrow, XmNactivateCallback, (XtCallbackProc) nextEvtCB, window); XtManageChild(upArrow); ac = 0; sprintf(ctmp," %d ", ac); XtSetArg(args[ac], XmNlabelString, (s1=MKSTRING(ctmp))); ac++; XtSetArg(args[ac], XmNcolumns, 7); ac++; XtSetArg(args[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNleftWidget, upArrow); ac++; eventNumText = (Widget) XmCreateLabelGadget( eventCtrlForm, "eventNumText", args, ac); /* eventNumText = XmCreateText(eventCtrlForm, "eventNumText", args, ac); */ XtManageChild(eventNumText); ac = 0; XtSetArg(args[ac], XmNarrowDirection, XmARROW_DOWN); ac++; XtSetArg(args[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNleftWidget, eventNumText); ac++; downArrow = XmCreateArrowButton(eventCtrlForm, "downArrow", args, ac); XtAddCallback(downArrow, XmNactivateCallback, (XtCallbackProc) previousEvtCB, window); XtManageChild(downArrow); ac = 0; XtSetArg(args[ac], XmNlabelString, (s1=MKSTRING(eventBarText))); ac++; XtSetArg(args[ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; eventCtrlText = (Widget) XmCreateLabelGadget( eventCtrlForm, "eventCtrlText", args, ac); XmStringFree(s1); XtManageChild(eventCtrlText); } /* Create a Form for the controls along the left edge of window */ ac = 0; if (hasEventBar) { XtSetArg(args[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNtopWidget, eventCtrlFrame); ac++; } else { XtSetArg(args[ac], XmNtopAttachment, XmATTACH_FORM); ac++; } controls = XmCreateForm(form, "controls", args, ac); XtManageChild(controls); ac = 0; XtSetArg(args[ac], XmNborderWidth, (Dimension)0); ac++; XtSetArg(args[ac], XmNpacking, XmPACK_COLUMN); ac++; XtSetArg(args[ac], XmNspacing, 0); ac++; XtSetArg(args[ac], XmNnumColumns, (short)2); ac++; stability = XmCreateRowColumn(controls, "stability", args, ac); XtManageChild(stability); ac = 0; XtSetArg(args[ac], XmNlabelString, (s1=MKSTRING("Particle Types"))); ac++; XtSetArg(args[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNtopWidget, stability); ac++; particleTypeLabel = (Widget) XmCreateLabelGadget( controls, "particleTypeLabel", args, ac); XmStringFree(s1); XtManageChild(particleTypeLabel); ac = 0; XtSetArg(args[ac], XmNborderWidth, (Dimension)0); ac++; XtSetArg(args[ac], XmNpacking, XmPACK_COLUMN); ac++; XtSetArg(args[ac], XmNspacing, 0); ac++; XtSetArg(args[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNnumColumns, (short)2); ac++; XtSetArg(args[ac], XmNtopWidget, particleTypeLabel); ac++; particleType = XmCreateRowColumn(controls, "particleType", args, ac); XtManageChild(particleType); ac = 0; XtSetArg(args[ac], XmNhighlightThickness, 0); ac++; XtSetArg(args[ac], XmNpacking, XmPACK_COLUMN); ac++; XtSetArg(args[ac], XmNspacing, 0); ac++; XtSetArg(args[ac], XmNorientation, XmHORIZONTAL); ac++; if (hasEventBar) { XtSetArg(args[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNtopWidget, eventCtrlFrame); ac++; } else { XtSetArg(args[ac], XmNtopAttachment, XmATTACH_FORM); ac++; } XtSetArg(args[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNleftWidget, controls); ac++; XtSetArg(args[ac], XmNtopOffset, (int)2); ac++; XtSetArg(args[ac], XmNleftOffset, (int)0); ac++; stats = XmCreateRowColumn(form, "stats", args, ac); XtManageChild(stats); #define TOGGLE_BTN(parent, label, name, cb, set) \ ac = 0; \ XtSetArg(args[ac], XmNlabelString, (s1=MKSTRING(label))); ac++; \ XtSetArg(args[ac], XmNset, set); ac++; \ XtSetArg(args[ac], XmNmarginHeight, 0); ac++; \ widget = XmCreateToggleButtonGadget(parent, name, args, ac); \ XmStringFree(s1); \ XtAddCallback(widget, XmNvalueChangedCallback, \ (XtCallbackProc) cb, window); \ XtManageChild(widget); \ TOGGLE_BTN(stability, "Stable", "stable", stableCB, True); TOGGLE_BTN(stability, "Unstable", "unstable", unstableCB, True); TOGGLE_BTN(particleType, "Charged", "charged", chargedCB, True); TOGGLE_BTN(particleType, "Neutral", "neutral", neutralCB, True); TOGGLE_BTN(particleType, "Electrons", "electrons", electronsCB, True); TOGGLE_BTN(particleType, "Muons", "muons", muonsCB, True); TOGGLE_BTN(particleType, "Neutrinos", "neutrinos", neutrinosCB, True); TOGGLE_BTN(particleType, "Gammas", "gammas", gammasCB, True); TOGGLE_BTN(particleType, "Quarks/Gluons", "quarks", quarksCB, True); TOGGLE_BTN(particleType,"Hadrons", "hadrons", hadronsCB, True); TOGGLE_BTN(particleType,"W/Z", "wz", wzCB, True); /* Do now the slider.. X, Y ,Z translation first. */ ac = 0; XtSetArg(args[ac], XmNborderWidth, (Dimension)0); ac++; XtSetArg(args[ac], XmNpacking, XmPACK_COLUMN); ac++; XtSetArg(args[ac], XmNspacing, 0); ac++; XtSetArg(args[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; /* XtSetArg(args[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; */ XtSetArg(args[ac], XmNnumColumns, (short)1); ac++; XtSetArg(args[ac], XmNtopWidget, particleType); ac++; /* XtSetArg(args[ac], XmNrightWidget, particleType); ac++; */ allSliders = XmCreateRowColumn(controls, "allSliders", args, ac); XtManageChild(allSliders); ac = 0; XtSetArg(args[ac], XmNpacking, XmPACK_COLUMN); ac++; XtSetArg(args[ac], XmNadjustLast, False); ac++; XtSetArg(args[ac], XmNspacing, 0); ac++; XtSetArg(args[ac], XmNnumColumns, (short)5); ac++; XtSetArg(args[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNtopWidget, allSliders); ac++; rotation = XmCreateRowColumn(controls, "rotation", args, ac); XtManageChild(rotation); /* Get foreground an background colors for pixmap buttons */ ac = 0; XtSetArg(args[ac], XmNforeground, &foreground); ac++; XtSetArg(args[ac], XmNbackground, &background); ac++; XtGetValues(controls, args, ac); #define ROTATE_BTN(pmName, widgetName, cb) \ pm = XmGetPixmap(XtScreen(parent), pmName, foreground, background); \ ac = 0; \ XtSetArg(args[ac], XmNlabelType, XmPIXMAP); ac++; \ XtSetArg(args[ac], XmNlabelPixmap, pm); ac++; \ widget = XmCreatePushButtonGadget(rotation, widgetName, args, ac); \ XtAddCallback(widget, XmNactivateCallback, \ (XtCallbackProc) cb, window); \ XtManageChild(widget); ROTATE_BTN("viewRotXPos", "viewRotXPos", viewRotXPosCB) ROTATE_BTN("viewRotYPos", "viewRotYPos", viewRotYPosCB) ROTATE_BTN("viewRotZPos", "viewRotZPos", viewRotZPosCB) ROTATE_BTN("viewRotXNeg", "viewRotXNeg", viewRotXNegCB) ROTATE_BTN("viewRotYNeg", "viewRotYNeg", viewRotYNegCB) ROTATE_BTN("viewRotZNeg", "viewRotZNeg", viewRotZNegCB) ROTATE_BTN("coordRotXPos", "coordRotXPos", coordRotXPosCB) ROTATE_BTN("coordRotYPos", "coordRotYPos", coordRotYPosCB) ROTATE_BTN("coordRotZPos", "coordRotZPos", coordRotZPosCB) ROTATE_BTN("coordRotXNeg", "coordRotXNeg", coordRotXNegCB) ROTATE_BTN("coordRotYNeg", "coordRotYNeg", coordRotYNegCB) ROTATE_BTN("coordRotZNeg", "coordRotZNeg", coordRotZNegCB) ROTATE_BTN("scaleUp", "scaleUp", scaleUpCB) ROTATE_BTN("scaleDown", "scaleDown", scaleDownCB) ROTATE_BTN("resetRotation", "resetRotation", resetRotationCB) ac = 0; XtSetArg(args[ac], XmNshadowType, XmSHADOW_IN); ac++; XtSetArg(args[ac], XmNshadowThickness, 1); ac++; scaleFrame = XmCreateFrame(stats, "scaleFrame", args, ac); XtManageChild(scaleFrame); trackInfoFrame = XmCreateFrame(stats, "trackInfoFrame", args, ac); XtManageChild(trackInfoFrame); ac = 0; XtSetArg(args[ac], XmNpacking, XmPACK_COLUMN); ac++; XtSetArg(args[ac], XmNentryAlignment, XmALIGNMENT_CENTER); ac++; XtSetArg(args[ac], XmNspacing, 0); ac++; scaleRC = XmCreateRowColumn(scaleFrame, "scaleRC", args, ac); XtManageChild(scaleRC); ac = 0; scaleArea = XmCreateDrawingArea(scaleRC, "scaleArea", args, ac); XtAddCallback(scaleArea, XmNexposeCallback, (XtCallbackProc) scaleExposeCB, window); XtManageChild(scaleArea); ac = 0; XtSetArg(args[ac], XmNlabelString, (s1=MKSTRING("x"))); ac++; XtSetArg(args[ac], XmNmarginHeight, 0); ac++; scaleLabel = (Widget) XmCreateLabelGadget( scaleRC, "scaleLabel", args, ac); XmStringFree(s1); XtManageChild(scaleLabel); ac = 0; XtSetArg(args[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; XtSetArg(args[ac], XmNrecomputeSize, False); ac++; XtSetArg(args[ac], XmNlabelString, (s1=MKSTRING( "00000 tracks, 00000 are stable\nx\nTrack of max. xxxxx is a(n) xxxx"))); ac++; trackInfo = (Widget) XmCreateLabelGadget( trackInfoFrame, "trackInfo", args, ac); XmStringFree(s1); XtManageChild(trackInfo); ac = 0; XtSetArg(args[ac], XmNshowAxes, True); ac++; XtSetArg(args[ac], XmNperspectiveOn, True); ac++; XtSetArg(args[ac], XmNdoubleBuffer, False); ac++; XtSetArg(args[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; XtSetArg(args[ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg(args[ac], XmNleftWidget, controls); ac++; XtSetArg(args[ac], XmNtopWidget, stats); ac++; XtSetArg(args[ac], XmNtopOffset, (int)0); ac++; XtSetArg(args[ac], XmNbottomOffset, (int)0); ac++; XtSetArg(args[ac], XmNleftOffset, (int)0); ac++; XtSetArg(args[ac], XmNrightOffset, (int)0); ac++; spin = XtCreateManagedWidget("spin", spinWidgetClass, form, args, ac); XtAddCallback(spin, XmNresizeCallback, (XtCallbackProc) resizeCB, window); XtAddCallback(spin, XmNredisplayCallback, (XtCallbackProc) redisplayCB, window); XtAddCallback(spin, XmNbtn2Callback, (XtCallbackProc) spinSelectCB, window); /* Place now the Sliders, right attached to the spin widget */ formt1 = createSpaceSlider(&window->scaleSliderScale, &window->scaleSliderValue, allSliders, spin, "scaleScale", "Overall Scale", SLIDER_MAX, window, scaleCB); formt1 = createSpaceSlider(&window->xTranslSliderScale, &window->xTranslSliderValue, allSliders, spin, "scaleX", "X transl.", (SLIDER_MAX/2), window, xTransCB); formt1 = createSpaceSlider(&window->yTranslSliderScale, &window->yTranslSliderValue, allSliders, spin, "scaleY", "Y transl.", (SLIDER_MAX/2), window, yTransCB); formt1 = createSpaceSlider(&window->zTranslSliderScale, &window->zTranslSliderValue, allSliders, spin, "scaleZ", "Z transl.", (SLIDER_MAX/2), window, zTransCB); formt1 = createSpaceSlider(&window->momToSpaceSliderScale, &window->momToSpaceSliderValue, allSliders, spin, "momtospace", "P to Dist", (SLIDER_MAX/10), window, momToSpaceCB); formt1 = createSpaceSlider(&window->longToTrSliderScale, &window->longToTrSliderValue, allSliders, spin, "LongToTr", "Aspect ratio Long/Tr. ", (SLIDER_MAX/10), window, longToTrCB); /* This last string is in fact constraining the appearance of the widget */ window->spin = spin; window->eventNumText = eventNumText; window->eventSelectorLabel = eventCtrlText; window->statsLabel = trackInfo; window->scaleArea = scaleArea; window->scaleLabel = scaleLabel; window->stable = True; window->unstable = True; window->charged = True; window->neutral = True; window->electrons = True; window->muons = True; window->gammas = True; window->neutrinos = True; window->quarks = True; window->hadrons = True; window->wz = True; return(form); }
Widget XmCreateArrowButton_TNK(Widget parent, String name, ArgList arglist,Cardinal argcount) { return XmCreateArrowButton(parent, name, arglist, argcount);}
static void initialize(Widget request, Widget new_w, ArgList args, Cardinal *num_args) { Dimension h; #ifdef DEBUG printf("NumEntry - initialize(%s) - %i args\n", XtName(new_w), *num_args); #endif XtHeight(new_w) = 0; XtWidth(new_w) = 0; NumEntry_Value(new_w) = XtNewString(NumEntry_Value(new_w)); NumEntry_Label(new_w) = XmCreateLabel(new_w, "Label", NULL, 0); if (NumEntry_LabelString(new_w) == NULL) { NumEntry_LabelString(new_w) = XmStringCreateSimple(XtName(new_w)); } XtVaSetValues(NumEntry_Label(new_w), XmNlabelString, NumEntry_LabelString(new_w), NULL); XtOverrideTranslations(NumEntry_Label(new_w), XtParseTranslationTable(tm_table)); XtManageChild(NumEntry_Label(new_w)); XtHeight(new_w) = XtHeight(new_w) > XtHeight(NumEntry_Label(new_w)) ? XtHeight(new_w) : XtHeight(NumEntry_Label(new_w)); XtWidth(new_w) += XtWidth(NumEntry_Label(new_w)); NumEntry_TextField(new_w) = XmCreateTextField(new_w, "Text", NULL, 0); XtAddCallback(NumEntry_TextField(new_w), XmNvalueChangedCallback, (XtCallbackProc)ValueChange, (XtPointer)NULL); XtAddCallback(NumEntry_TextField(new_w), XmNactivateCallback, (XtCallbackProc)Activate, (XtPointer)NULL); XtAddCallback(NumEntry_TextField(new_w), XmNlosingFocusCallback, (XtCallbackProc)LosingFocus, (XtPointer)NULL); XtVaSetValues(NumEntry_TextField(new_w), XmNvalue, NumEntry_Value(new_w), XmNcolumns, NumEntry_Columns(new_w), NULL); XtOverrideTranslations(NumEntry_TextField(new_w), XtParseTranslationTable(tm_table)); XtOverrideTranslations(NumEntry_TextField(new_w), XtParseTranslationTable(text_tm_table)); XtManageChild(NumEntry_TextField(new_w)); XtHeight(new_w) = XtHeight(new_w) > XtHeight(NumEntry_TextField(new_w)) ? XtHeight(new_w) : XtHeight(NumEntry_TextField(new_w)); XtWidth(new_w) += XtWidth(NumEntry_TextField(new_w)); h = XtHeight(new_w); h = (h * 2) / 3; NumEntry_RowColumn(new_w) = XmCreateRowColumn(new_w, "RowCol", NULL, 0); XtVaSetValues(NumEntry_RowColumn(new_w), XmNtraversalOn, False, XmNpacking, XmPACK_COLUMN, XmNorientation, XmHORIZONTAL, XmNnumColumns, 1, NULL); XtOverrideTranslations(NumEntry_RowColumn(new_w), XtParseTranslationTable(tm_table)); NumEntry_UpArrow(new_w) = XmCreateArrowButton(NumEntry_RowColumn(new_w), "UpArrow", NULL, 0); XtAddCallback(NumEntry_UpArrow(new_w), XmNactivateCallback, (XtCallbackProc)StepValue, (XtPointer)1); XtAddCallback(NumEntry_UpArrow(new_w), XmNarmCallback, (XtCallbackProc)AutoRepeat, (XtPointer)True); XtAddCallback(NumEntry_UpArrow(new_w), XmNdisarmCallback, (XtCallbackProc)AutoRepeat, (XtPointer)False); XtVaSetValues(NumEntry_UpArrow(new_w), XmNwidth, h, XmNarrowDirection, XmARROW_UP, NULL); XtOverrideTranslations(NumEntry_UpArrow(new_w), XtParseTranslationTable(tm_table)); XtManageChild(NumEntry_UpArrow(new_w)); NumEntry_DnArrow(new_w) = XmCreateArrowButton(NumEntry_RowColumn(new_w), "DnArrow", NULL, 0); XtAddCallback(NumEntry_DnArrow(new_w), XmNactivateCallback, (XtCallbackProc)StepValue, (XtPointer)-1); XtAddCallback(NumEntry_DnArrow(new_w), XmNarmCallback, (XtCallbackProc)AutoRepeat, (XtPointer)True); XtAddCallback(NumEntry_DnArrow(new_w), XmNdisarmCallback, (XtCallbackProc)AutoRepeat, (XtPointer)False); XtVaSetValues(NumEntry_DnArrow(new_w), XmNwidth, h, XmNarrowDirection, XmARROW_DOWN, NULL); XtOverrideTranslations(NumEntry_DnArrow(new_w), XtParseTranslationTable(tm_table)); XtManageChild(NumEntry_DnArrow(new_w)); XtVaSetValues(NumEntry_RowColumn(new_w), XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_NONE, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues(NumEntry_TextField(new_w), XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_NONE, XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, NumEntry_RowColumn(new_w), NULL); XtVaSetValues(NumEntry_Label(new_w), XmNalignment, XmALIGNMENT_BEGINNING, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, NumEntry_TextField(new_w), NULL); { XtWidgetGeometry pref; XtQueryGeometry(NumEntry_RowColumn(new_w), NULL, &pref); XtWidth(new_w) += pref.width; } XtManageChild(NumEntry_RowColumn(new_w)); XtAddCallback(new_w, XmNhelpCallback, (XtCallbackProc)Help, NULL); NumEntry_TimerId(new_w) = (XtIntervalId)NULL; NumEntry_Result(new_w) = XltCalc(NumEntry_Value(new_w)); }