1fd7d9bd3Smrg/* 2fd7d9bd3Smrg** getfilename.c 3fd7d9bd3Smrg** 4fd7d9bd3Smrg*/ 5fd7d9bd3Smrg 6fd7d9bd3Smrg#include <X11/Intrinsic.h> 7fd7d9bd3Smrg#include <X11/StringDefs.h> 8fd7d9bd3Smrg#include <X11/Xaw/Label.h> 9fd7d9bd3Smrg#include <X11/Xaw/Command.h> 10fd7d9bd3Smrg#include <X11/Xaw/Form.h> 11fd7d9bd3Smrg#include <X11/Shell.h> 12fd7d9bd3Smrg#include <X11/Xaw/AsciiText.h> 13fd7d9bd3Smrg#include <stdio.h> 14fd7d9bd3Smrg 15fd7d9bd3Smrg#include "xgc.h" 16fd7d9bd3Smrg 17fd7d9bd3Smrg 18fd7d9bd3Smrgstatic Widget popupshell = NULL; /* popup dialog box */ 19fd7d9bd3SmrgWidget filename_text_widget; /* Widget containing the name of 20fd7d9bd3Smrg the file the user has selected */ 21fd7d9bd3Smrg 22fd7d9bd3Smrgstatic void kill_popup_shell(void); 23fd7d9bd3Smrg 24fd7d9bd3Smrgvoid 25fd7d9bd3Smrgget_filename( 26fd7d9bd3Smrg void (*success)(void), /* what function to call when a filename is 27fd7d9bd3Smrg chosen */ 28fd7d9bd3Smrg void (*failure)(void)) /* what function to call when the user 29fd7d9bd3Smrg cancels */ 30fd7d9bd3Smrg{ 31fd7d9bd3Smrg static Widget popupform; /* form inside shell */ 32fd7d9bd3Smrg static Widget label; /* "Filename :" */ 33fd7d9bd3Smrg 34fd7d9bd3Smrg Window dummy1, dummy2; 35fd7d9bd3Smrg int x1,y1,x2,y2; 36fd7d9bd3Smrg unsigned int mask; 37fd7d9bd3Smrg 38fd7d9bd3Smrg /* The translation table for the text widget. Things such as <RETURN> 39fd7d9bd3Smrg ** confirm the user's choice. Other keys which would move out of 40fd7d9bd3Smrg ** the range of a one-line window are disabled. */ 41fd7d9bd3Smrg 42e53c48bfSmrg static const char *translationtable = 43fd7d9bd3Smrg "Ctrl<Key>J: KillPopup() Done()\n\ 44fd7d9bd3Smrg Ctrl<Key>M: KillPopup() Done()\n\ 45fd7d9bd3Smrg <Key>Linefeed: KillPopup() Done()\n\ 46fd7d9bd3Smrg <Key>Return: KillPopup() Done()\n\ 47fd7d9bd3Smrg Ctrl<Key>O: Nothing()\n\ 48fd7d9bd3Smrg Meta<Key>I: Nothing()\n\ 49fd7d9bd3Smrg Ctrl<Key>N: Nothing()\n\ 50fd7d9bd3Smrg Ctrl<Key>P: Nothing()\n\ 51fd7d9bd3Smrg Ctrl<Key>Z: Nothing()\n\ 52fd7d9bd3Smrg Meta<Key>Z: Nothing()\n\ 53fd7d9bd3Smrg Ctrl<Key>V: Nothing()\n\ 54fd7d9bd3Smrg Meta<Key>V: Nothing()"; 55fd7d9bd3Smrg 56fd7d9bd3Smrg /* What the actions in the translation table correspond to. */ 57fd7d9bd3Smrg 58fd7d9bd3Smrg static XtActionsRec actiontable[] = { 59fd7d9bd3Smrg {"KillPopup", (XtActionProc) kill_popup_shell}, 60fd7d9bd3Smrg {"Done", NULL}, 61fd7d9bd3Smrg {"Nothing", NULL} 62fd7d9bd3Smrg }; 63fd7d9bd3Smrg 64fd7d9bd3Smrg static Arg popupshellargs[] = { /* Where to put the popup shell. */ 65fd7d9bd3Smrg {XtNx, (XtArgVal) NULL}, 66fd7d9bd3Smrg {XtNy, (XtArgVal) NULL} 67fd7d9bd3Smrg }; 68fd7d9bd3Smrg 69fd7d9bd3Smrg static Arg labelargs[] = { /* ArgList for the label */ 70fd7d9bd3Smrg {XtNborderWidth, (XtArgVal) 0}, 71fd7d9bd3Smrg {XtNjustify, (XtArgVal) XtJustifyRight} 72fd7d9bd3Smrg }; 73fd7d9bd3Smrg 74fd7d9bd3Smrg static Arg textargs[] = { /* ArgList for the text widget */ 75fd7d9bd3Smrg {XtNeditType, (XtArgVal) XawtextEdit}, 76fd7d9bd3Smrg {XtNwidth, (XtArgVal) 200}, 77fd7d9bd3Smrg {XtNhorizDistance, (XtArgVal) 10}, 78fd7d9bd3Smrg {XtNfromHoriz, (XtArgVal) NULL}, 79fd7d9bd3Smrg }; 80fd7d9bd3Smrg 81fd7d9bd3Smrg static Arg cancelargs[] = { /* ArgList for the cancel button */ 82fd7d9bd3Smrg {XtNfromHoriz, (XtArgVal) NULL}, 83fd7d9bd3Smrg {XtNcallback, (XtArgVal) NULL} 84fd7d9bd3Smrg }; 85fd7d9bd3Smrg 86fd7d9bd3Smrg /* Procedures to call when the user selects 'cancel' */ 87fd7d9bd3Smrg static XtCallbackRec cancelcallbacklist[] = { 88fd7d9bd3Smrg {(XtCallbackProc) kill_popup_shell, NULL}, 89fd7d9bd3Smrg {NULL, NULL}, 90fd7d9bd3Smrg {NULL, NULL} 91fd7d9bd3Smrg }; 92fd7d9bd3Smrg 93fd7d9bd3Smrg if (popupshell != NULL) { 94fd7d9bd3Smrg XtPopup(popupshell,XtGrabExclusive); 95fd7d9bd3Smrg return; 96fd7d9bd3Smrg } 97fd7d9bd3Smrg 98fd7d9bd3Smrg /* Find out where the pointer is, so we can put the popup window there */ 99fd7d9bd3Smrg 100fd7d9bd3Smrg (void) XQueryPointer(X.dpy,XtWindow(topform),&dummy1,&dummy2,&x1,&y1, 101fd7d9bd3Smrg &x2,&y2,&mask); 102e53c48bfSmrg 103fd7d9bd3Smrg popupshellargs[0].value = (XtArgVal) x2; 104fd7d9bd3Smrg popupshellargs[1].value = (XtArgVal) y2; 105e53c48bfSmrg 106fd7d9bd3Smrg popupshell = XtCreatePopupShell("popup",overrideShellWidgetClass, 107fd7d9bd3Smrg topform,popupshellargs,XtNumber(popupshellargs)); 108fd7d9bd3Smrg 109fd7d9bd3Smrg popupform = XtCreateManagedWidget("form",formWidgetClass,popupshell, 110fd7d9bd3Smrg NULL, 0); 111fd7d9bd3Smrg 112fd7d9bd3Smrg label = XtCreateManagedWidget("Filename: ",labelWidgetClass,popupform, 113fd7d9bd3Smrg labelargs,XtNumber(labelargs)); 114fd7d9bd3Smrg 115fd7d9bd3Smrg textargs[3].value = (XtArgVal) label; 116fd7d9bd3Smrg 117fd7d9bd3Smrg filename_text_widget = XtCreateManagedWidget("text",asciiTextWidgetClass, 118fd7d9bd3Smrg popupform, 119fd7d9bd3Smrg textargs,XtNumber(textargs)); 120fd7d9bd3Smrg 121fd7d9bd3Smrg /* Complete the action table. We have to do it here because success 122fd7d9bd3Smrg ** isn't known at compile time. */ 123fd7d9bd3Smrg 124fd7d9bd3Smrg actiontable[1].proc = (XtActionProc) success; 125fd7d9bd3Smrg 126fd7d9bd3Smrg /* Register actions, translations, callbacks */ 127fd7d9bd3Smrg 128fd7d9bd3Smrg XtAppAddActions(appcontext,actiontable,XtNumber(actiontable)); 129fd7d9bd3Smrg XtOverrideTranslations(filename_text_widget, 130fd7d9bd3Smrg XtParseTranslationTable(translationtable)); 131fd7d9bd3Smrg cancelcallbacklist[1].callback = (XtCallbackProc) failure; 132fd7d9bd3Smrg 133fd7d9bd3Smrg cancelargs[0].value = (XtArgVal) filename_text_widget; 134fd7d9bd3Smrg cancelargs[1].value = (XtArgVal) cancelcallbacklist; 135fd7d9bd3Smrg 136fd7d9bd3Smrg (void) XtCreateManagedWidget("Cancel",commandWidgetClass,popupform, 137fd7d9bd3Smrg cancelargs,XtNumber(cancelargs)); 138fd7d9bd3Smrg 139fd7d9bd3Smrg /* Bring up the popup. When the user presses cancel or the return key, 140fd7d9bd3Smrg ** the function kill_popup_shell (below) will be called to remove it. */ 141fd7d9bd3Smrg 142fd7d9bd3Smrg XtPopup(popupshell,XtGrabExclusive); 143fd7d9bd3Smrg} 144fd7d9bd3Smrg 145fd7d9bd3Smrg/* kill_popup_shell() 146fd7d9bd3Smrg** ------------------ 147fd7d9bd3Smrg** Remove the popup window that get_filename popped up. 148fd7d9bd3Smrg*/ 149fd7d9bd3Smrg 150fd7d9bd3Smrgstatic void 151fd7d9bd3Smrgkill_popup_shell(void) 152fd7d9bd3Smrg{ 153fd7d9bd3Smrg XtPopdown(popupshell); 154fd7d9bd3Smrg} 155