chapman@lll-lcc.UUCP (Carol Chapman) (05/11/89)
Thanks to everyone who responded to my request for help in making a pop-up window. The person I owe the most thanks to is Duane Voth, and lately I can't reach him by email, so if you read this Duane, THANK YOU! I wanted a pop-up window to be called from within a function, and then to return to just after the XtPopup call once the pop-up window had gotten the necessary information (in this case a barcode) from the user. The following appears to work, for those of you who may soon face a similar situation: carol chapman P.S. I didn't include the source code here for my xprintf routine because that really applies to a different topic. If you need it, let me know. /**************************************************************************/ global stuff: #define WAITING 0 #define CANCELLED 1 #define DONE 2 #define BAD_BCODE 3 Widget popup_box, popup_label, input_text; Widget cancel_button, ok_button, popup_shell, toplevel; unsigned short popup_state = WAITING; ...etc. /**************************************************************************/ The following is from a routine I call open_display: toplevel = XtInitialize(APPLICATION_NAME, APPLICATION_CLASS, option_table, 1, &argc, argv); if (argc != 1) /* the program was incorrectly called */ syntax_prob(argv[0]); app_context = XtWidgetToApplicationContext(toplevel); /* get the display and screen for later use */ disp = XtDisplay(toplevel); scrn = XtScreen(toplevel); /***************************************************************************/ The following is from a routine I call make_text_windows. It is called before XtRealizeWidget: Arg args[ARG_SIZE]; Cardinal num_args; /* set up a popup window to collect text input from the user */ num_args = 0; /* reinitialize */ XtSetArg(args[num_args], XtNallowShellResize, TRUE); num_args++; popup_shell = XtCreatePopupShell("Popup Shell", transientShellWidgetClass, toplevel, args, num_args); num_args = 0; /* reinitialize */ barcode = (char *) calloc(cnum, sizeof(char)); XtSetArg(args[num_args], XtNborderWidth, 4); num_args++; popup_box = XtCreateManagedWidget("Input Box", boxWidgetClass, popup_shell, args, num_args); num_args = 0; /* reinitialize */ XtSetArg(args[num_args], XtNfont, fontb_info); num_args++; popup_label = XtCreateManagedWidget("Enter a barcode: ", labelWidgetClass, popup_box, args, num_args); num_args = 0; /* reinitialize */ XtSetArg(args[num_args], XtNfont, fontn_info); num_args++; XtSetArg(args[num_args], XtNstring, barcode); num_args++; XtSetArg(args[num_args], XtNlength, STR_LEN); num_args++; XtSetArg(args[num_args], XtNeditType, XttextEdit); num_args++; input_text = XtCreateManagedWidget("Input Text", asciiStringWidgetClass, popup_box, args, num_args); /* create an OK button for the popup window */ num_args = 0; /* reinitialize */ XtSetArg(args[num_args], XtNborderWidth, 4); num_args++; XtSetArg(args[num_args], XtNfont, fontb_info); num_args++; ok_button = XtCreateManagedWidget("OK", commandWidgetClass, popup_box, args, num_args); XtAddCallback(ok_button, XtNcallback, check_barcode, popup_box); /* create a cancel_button for the popup window */ cancel_button = XtCreateManagedWidget("Cancel", commandWidgetClass, popup_box, args, num_args); XtAddCallback(cancel_button, XtNcallback, cancel_action, NULL); /****************************************************************************/ void cancel_action() /* Called by: Cancel button selected by the user * * (see make_text_windows) * * * * Makes calls to: nothing * * * * Purpose: To cancel an action already in progress without * * exiting the program. */ { popup_state = CANCELLED; } /* of cancel_action */ /*****************************************************************************/ void check_barcode(widget, input_text, call_data) Widget widget, input_text; caddr_t call_data; /* Called by: OK button selected by the user * * (see make_text_windows) * * * * Makes calls to: lower_string * * xprintf * * * * Purpose: To validate, as much as possible, a barcode entered * * by the user. */ { unsigned short len = 0; /* barcode length */ len = strlen(barcode); if (len > MAX_BCODE) /* barcode is too long */ xprintf("check_barcode: Invalid barcode %s (too long)\n", barcode); else if (len < MIN_BCODE) /* barcode is too short */ xprintf("check_barcode: Invalid barcode %s (too short)\n", barcode); else if (! isalpha(barcode[0])) /* barcode doesn't start with a letter */ { xprintf("check_barcode: Invalid barcode %s ", barcode); xprintf("(must begin with an alpha character)\n"); } /* of else if */ else /* process as if it is a valid barcode */ { popup_state = DONE; xprintf("Accepting barcode %s\n", barcode); /* echo barcode */ lower_string(barcode); /* make sure barcode is in lowercase */ } /* of else */ if (popup_state != DONE) /* try again for a valid barcode */ popup_state = BAD_BCODE; } /* of check_barcode */ /*****************************************************************************/ This is within my routine display(): unsigned char ok = FALSE; unsigned short p_state = WAITING; while (! ok) { p_state = popup_and_wait(popup_shell); if (p_state == CANCELLED) /* Cancel button was pushed */ return; /* go back to main window */ else if (p_state == DONE) /* barcode that appears valid was received */ ok = TRUE; } /* of while */ /***************************************************************************/ static unsigned short popup_and_wait(popup_shell) Widget popup_shell; /* Called by: display * * * * Makes calls to: XtAppNextEvent * * XtDispatchEvent * * XtPopdown * * XtPopup * * * * Written by: Duane Voth (duanev@mcc.com) * * * * Purpose: To keep the process from continuing until user * * input can be received from a pop-up window. */ { XEvent event; XtPopup(popup_shell, XtGrabExclusive); /* display pop-up window */ popup_state = WAITING; /* prepare to wait for user input */ while (popup_state == WAITING) /* wait for input */ { XtAppNextEvent(app_context, &event); XtDispatchEvent(&event); } /* of while */ XtPopdown(popup_shell); return(popup_state); } /* of popup_and_wait */ /*****************************************************************************/ -- ------------------------------------------------------------------------------- Livermore Lab (chapman@lll-crg.llnl.gov or chapman@lll-lcc.llnl.gov) P.O. Box 808, L-153 Tel. (415) 423-7876 Livermore, CA 94550 "Never own anything that you have to FEED or PAINT."