summaryrefslogtreecommitdiff
path: root/app/xgc/getfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/xgc/getfile.c')
-rw-r--r--app/xgc/getfile.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/app/xgc/getfile.c b/app/xgc/getfile.c
new file mode 100644
index 000000000..43bba8b34
--- /dev/null
+++ b/app/xgc/getfile.c
@@ -0,0 +1,155 @@
+/*
+** getfilename.c
+**
+*/
+/* $XFree86: xc/programs/xgc/getfile.c,v 1.4tsi Exp $ */
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xaw/Label.h>
+#include <X11/Xaw/Command.h>
+#include <X11/Xaw/Form.h>
+#include <X11/Shell.h>
+#include <X11/Xaw/AsciiText.h>
+#include <stdio.h>
+
+#include "xgc.h"
+
+
+static Widget popupshell = NULL; /* popup dialog box */
+Widget filename_text_widget; /* Widget containing the name of
+ the file the user has selected */
+
+static void kill_popup_shell(void);
+
+void
+get_filename(
+ void (*success)(void), /* what function to call when a filename is
+ chosen */
+ void (*failure)(void)) /* what function to call when the user
+ cancels */
+{
+ static Widget popupform; /* form inside shell */
+ static Widget label; /* "Filename :" */
+
+ Window dummy1, dummy2;
+ int x1,y1,x2,y2;
+ unsigned int mask;
+
+ /* The translation table for the text widget. Things such as <RETURN>
+ ** confirm the user's choice. Other keys which would move out of
+ ** the range of a one-line window are disabled. */
+
+ static const char *translationtable =
+ "Ctrl<Key>J: KillPopup() Done()\n\
+ Ctrl<Key>M: KillPopup() Done()\n\
+ <Key>Linefeed: KillPopup() Done()\n\
+ <Key>Return: KillPopup() Done()\n\
+ Ctrl<Key>O: Nothing()\n\
+ Meta<Key>I: Nothing()\n\
+ Ctrl<Key>N: Nothing()\n\
+ Ctrl<Key>P: Nothing()\n\
+ Ctrl<Key>Z: Nothing()\n\
+ Meta<Key>Z: Nothing()\n\
+ Ctrl<Key>V: Nothing()\n\
+ Meta<Key>V: Nothing()";
+
+ /* What the actions in the translation table correspond to. */
+
+ static XtActionsRec actiontable[] = {
+ {"KillPopup", (XtActionProc) kill_popup_shell},
+ {"Done", NULL},
+ {"Nothing", NULL}
+ };
+
+ static Arg popupshellargs[] = { /* Where to put the popup shell. */
+ {XtNx, (XtArgVal) NULL},
+ {XtNy, (XtArgVal) NULL}
+ };
+
+ static Arg labelargs[] = { /* ArgList for the label */
+ {XtNborderWidth, (XtArgVal) 0},
+ {XtNjustify, (XtArgVal) XtJustifyRight}
+ };
+
+ static Arg textargs[] = { /* ArgList for the text widget */
+ {XtNeditType, (XtArgVal) XawtextEdit},
+ {XtNwidth, (XtArgVal) 200},
+ {XtNhorizDistance, (XtArgVal) 10},
+ {XtNfromHoriz, (XtArgVal) NULL},
+ };
+
+ static Arg cancelargs[] = { /* ArgList for the cancel button */
+ {XtNfromHoriz, (XtArgVal) NULL},
+ {XtNcallback, (XtArgVal) NULL}
+ };
+
+ /* Procedures to call when the user selects 'cancel' */
+ static XtCallbackRec cancelcallbacklist[] = {
+ {(XtCallbackProc) kill_popup_shell, NULL},
+ {NULL, NULL},
+ {NULL, NULL}
+ };
+
+ if (popupshell != NULL) {
+ XtPopup(popupshell,XtGrabExclusive);
+ return;
+ }
+
+ /* Find out where the pointer is, so we can put the popup window there */
+
+ (void) XQueryPointer(X.dpy,XtWindow(topform),&dummy1,&dummy2,&x1,&y1,
+ &x2,&y2,&mask);
+
+ popupshellargs[0].value = (XtArgVal) x2;
+ popupshellargs[1].value = (XtArgVal) y2;
+
+ popupshell = XtCreatePopupShell("popup",overrideShellWidgetClass,
+ topform,popupshellargs,XtNumber(popupshellargs));
+
+ popupform = XtCreateManagedWidget("form",formWidgetClass,popupshell,
+ NULL, 0);
+
+ label = XtCreateManagedWidget("Filename: ",labelWidgetClass,popupform,
+ labelargs,XtNumber(labelargs));
+
+ textargs[3].value = (XtArgVal) label;
+
+ filename_text_widget = XtCreateManagedWidget("text",asciiTextWidgetClass,
+ popupform,
+ textargs,XtNumber(textargs));
+
+ /* Complete the action table. We have to do it here because success
+ ** isn't known at compile time. */
+
+ actiontable[1].proc = (XtActionProc) success;
+
+ /* Register actions, translations, callbacks */
+
+ XtAppAddActions(appcontext,actiontable,XtNumber(actiontable));
+ XtOverrideTranslations(filename_text_widget,
+ XtParseTranslationTable(translationtable));
+ cancelcallbacklist[1].callback = (XtCallbackProc) failure;
+
+ cancelargs[0].value = (XtArgVal) filename_text_widget;
+ cancelargs[1].value = (XtArgVal) cancelcallbacklist;
+
+ (void) XtCreateManagedWidget("Cancel",commandWidgetClass,popupform,
+ cancelargs,XtNumber(cancelargs));
+
+ /* Bring up the popup. When the user presses cancel or the return key,
+ ** the function kill_popup_shell (below) will be called to remove it. */
+
+ XtPopup(popupshell,XtGrabExclusive);
+}
+
+/* kill_popup_shell()
+** ------------------
+** Remove the popup window that get_filename popped up.
+*/
+
+static void
+kill_popup_shell(void)
+{
+ XtPopdown(popupshell);
+}