|
|
1.1 ! root 1: /* $Header: Dialog.c,v 1.1 87/09/11 07:57:23 toddb Exp $ */ ! 2: #ifndef lint ! 3: static char *sccsid = "@(#)Dialog.c 1.26 5/18/87"; ! 4: #endif lint ! 5: /* ! 6: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. ! 7: * ! 8: * All Rights Reserved ! 9: * ! 10: * Permission to use, copy, modify, and distribute this software and its ! 11: * documentation for any purpose and without fee is hereby granted, ! 12: * provided that the above copyright notice appear in all copies and that ! 13: * both that copyright notice and this permission notice appear in ! 14: * supporting documentation, and that the name of Digital Equipment ! 15: * Corporation not be used in advertising or publicity pertaining to ! 16: * distribution of the software without specific, written prior permission. ! 17: * ! 18: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 19: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 20: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 21: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 22: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 23: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 24: * SOFTWARE. ! 25: */ ! 26: ! 27: ! 28: /* NOTE: THIS IS NOT A WIDGET! Rather, this is an interface to a widget. ! 29: It implements policy, and gives a (hopefully) easier-to-use interface ! 30: than just directly making your own form. */ ! 31: ! 32: ! 33: #include <strings.h> ! 34: #include "Xlib.h" ! 35: #include "Intrinsic.h" ! 36: #include "Form.h" ! 37: #include "Dialog.h" ! 38: #include "Text.h" ! 39: #include "Command.h" ! 40: #include "Label.h" ! 41: #include "Atoms.h" ! 42: ! 43: ! 44: /* Private Definitions. */ ! 45: ! 46: typedef struct { ! 47: Display *dpy; /* Form window display connection */ ! 48: Window mywin; /* Form window. */ ! 49: int width, height; /* Size of form window. */ ! 50: Window label; /* Window containing description of dialog. */ ! 51: Window value; /* Window for entering user response. */ ! 52: int numbuttons; /* How many buttons currently in window. */ ! 53: Window *button; /* Array of buttons. */ ! 54: char *labelstring; /* String containing data in label. */ ! 55: char *valuestring; /* String containing data in value. */ ! 56: } WidgetDataRec, *WidgetData; ! 57: ! 58: static XContext dialogContext = NULL; ! 59: ! 60: ! 61: ! 62: static WidgetData DataFromWindow(dpy, window) ! 63: Display *dpy; ! 64: Window window; ! 65: { ! 66: WidgetData result; ! 67: if (XFindContext(dpy, window, dialogContext, (caddr_t *)&result)) ! 68: return NULL; ! 69: return result; ! 70: } ! 71: ! 72: ! 73: static XtGeometryReturnCode DialogGeometryHandler(dpy, window, request, ! 74: reqBox, replBox) ! 75: Display *dpy; ! 76: Window window; ! 77: XtGeometryRequest request; ! 78: WindowBox *reqBox, *replBox; ! 79: { ! 80: WidgetData data; ! 81: data = DataFromWindow(dpy, window); ! 82: if (data && request == XtgeometryResize) { ! 83: data->width = reqBox->width; ! 84: data->height = reqBox->height; ! 85: XResizeWindow(data->dpy, window, reqBox->width, reqBox->height); ! 86: *replBox = *reqBox; ! 87: return XtgeometryYes; ! 88: } ! 89: return XtgeometryNo; ! 90: } ! 91: ! 92: ! 93: static XtEventReturnCode DialogEventHandler(event, data) ! 94: XEvent *event; ! 95: WidgetData data; ! 96: { ! 97: if (event->type == DestroyNotify) { ! 98: XtFree(data->labelstring); ! 99: if (data->valuestring) XtFree(data->valuestring); ! 100: XtFree((char *)data->button); ! 101: XtFree((char *)data); ! 102: return XteventHandled; ! 103: } ! 104: return XteventNotHandled; ! 105: } ! 106: ! 107: ! 108: /* Public definitions. */ ! 109: ! 110: Window XtDialogCreate(dpy, parent, description, valueinit, args, argCount) ! 111: Display *dpy; /* Display connection for the form */ ! 112: Window parent; /* Window to put the form in. */ ! 113: char *description; /* Title for this dialog box. */ ! 114: char *valueinit; /* Initial string for value field (use NULL ! 115: if you don't want a value field) */ ! 116: ArgList args; /* Args to pass on to form (if any). */ ! 117: int argCount; ! 118: { ! 119: WidgetData data; ! 120: static Arg arglist1[] = { ! 121: {XtNlabel, (XtArgVal)NULL}, ! 122: {XtNborderWidth, (XtArgVal) 0} ! 123: }; ! 124: static Arg arglist2[] = { ! 125: {XtNwidth, (XtArgVal)NULL}, ! 126: {XtNstring, (XtArgVal)NULL}, ! 127: {XtNlength, (XtArgVal)1000}, ! 128: {XtNtextOptions, (XtArgVal) (resizeWidth | resizeHeight)}, ! 129: {XtNeditType, (XtArgVal) XttextEdit} ! 130: }; ! 131: static Arg arglist3[] = { ! 132: {XtNfromVert, (XtArgVal)NULL}, ! 133: {XtNresizable, (XtArgVal)TRUE} ! 134: }; ! 135: if (dialogContext == NULL) dialogContext = XUniqueContext(); ! 136: data = (WidgetData) XtMalloc(sizeof(WidgetDataRec)); ! 137: data->dpy = dpy; ! 138: data->numbuttons = 0; ! 139: data->button = (Window *) XtMalloc(sizeof(Window)); ! 140: data->mywin = XtFormCreate(dpy, parent, args, argCount); ! 141: (void)XSaveContext(data->dpy, data->mywin, dialogContext, (caddr_t) data); ! 142: (void)XtSetGeometryHandler( ! 143: data->dpy, data->mywin, (XtGeometryHandler) DialogGeometryHandler); ! 144: data->labelstring = XtMalloc((unsigned) strlen(description) + 1); ! 145: (void) strcpy(data->labelstring, description); ! 146: arglist1[0].value = (XtArgVal) data->labelstring; ! 147: data->label = XtLabelCreate( ! 148: data->dpy, data->mywin, arglist1, XtNumber(arglist1)); ! 149: XtFormAddWidget(data->dpy, data->mywin, data->label, (ArgList) NULL, 0); ! 150: if (valueinit) { ! 151: static int grabfocus; ! 152: static Resource resources[] = { ! 153: {XtNgrabFocus, XtCGrabFocus, XrmRBoolean, sizeof(int), ! 154: (caddr_t)&grabfocus, (caddr_t)NULL} ! 155: }; ! 156: XrmNameList names; ! 157: XrmClassList classes; ! 158: grabfocus = FALSE; ! 159: XtGetResources(dpy, resources, XtNumber(resources), args, argCount, ! 160: parent, "dialog", "Dialog", &names, &classes); ! 161: XrmFreeNameList(names); ! 162: XrmFreeClassList(classes); ! 163: data->valuestring = XtMalloc(1010); ! 164: (void) strcpy(data->valuestring, valueinit); ! 165: arglist2[0].value = (XtArgVal) data->width; ! 166: arglist2[1].value = (XtArgVal) data->valuestring; ! 167: data->value = XtTextStringCreate( ! 168: data->dpy, data->mywin, arglist2, XtNumber(arglist2)); ! 169: arglist3[0].value = (XtArgVal) data->label; ! 170: if (grabfocus) XSetInputFocus(dpy, data->value, RevertToParent, ! 171: CurrentTime); /* !!! Hackish. |||*/ ! 172: XtFormAddWidget( ! 173: data->dpy, data->mywin, data->value, ! 174: arglist3, XtNumber(arglist3)); ! 175: } else { ! 176: data->valuestring = NULL; ! 177: data->value = NULL; ! 178: } ! 179: XtSetEventHandler(data->dpy, data->mywin, (XtEventHandler) DialogEventHandler, ! 180: StructureNotifyMask, (caddr_t)data); ! 181: return data->mywin; ! 182: } ! 183: ! 184: ! 185: void XtDialogAddButton(dpy, window, name, function, param) ! 186: Display *dpy; ! 187: Window window; ! 188: char *name; ! 189: void (*function)(); ! 190: caddr_t param; ! 191: { ! 192: WidgetData data; ! 193: static Arg arglist1[] = { ! 194: {XtNname, (XtArgVal) NULL}, ! 195: {XtNfunction, (XtArgVal) NULL}, ! 196: {XtNparameter, (XtArgVal) NULL} ! 197: }; ! 198: static Arg arglist2[] = { ! 199: {XtNfromHoriz, (XtArgVal) NULL}, ! 200: {XtNfromVert, (XtArgVal) NULL}, ! 201: {XtNleft, (XtArgVal) XtChainLeft}, ! 202: {XtNright, (XtArgVal) XtChainLeft} ! 203: }; ! 204: data = DataFromWindow(dpy, window); ! 205: if (data == NULL) return; ! 206: arglist1[0].value = (XtArgVal) name; ! 207: arglist1[1].value = (XtArgVal) function; ! 208: arglist1[2].value = (XtArgVal) param; ! 209: data->button = (Window *) ! 210: XtRealloc((char *)data->button, ! 211: (unsigned) ++data->numbuttons * sizeof(Window)); ! 212: data->button[data->numbuttons - 1] = ! 213: XtCommandCreate(data->dpy, window, arglist1, XtNumber(arglist1)); ! 214: if (data->numbuttons > 1) ! 215: arglist2[0].value = (XtArgVal) data->button[data->numbuttons - 2]; ! 216: else ! 217: arglist2[0].value = (XtArgVal) NULL; ! 218: if (data->value) arglist2[1].value = (XtArgVal) data->value; ! 219: else arglist2[1].value = (XtArgVal) data->label; ! 220: XtFormAddWidget(data->dpy, data->mywin, data->button[data->numbuttons - 1], ! 221: arglist2, XtNumber(arglist2)); ! 222: } ! 223: ! 224: ! 225: char *XtDialogGetValueString(dpy, window) ! 226: Display *dpy; ! 227: Window window; ! 228: { ! 229: WidgetData data; ! 230: data = DataFromWindow(dpy, window); ! 231: if (data) return data->valuestring; ! 232: else return NULL; ! 233: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.