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