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