From: jwalz Date: Sat, 5 Jan 2002 21:06:02 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: MOVE2GIT~3556 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=89005a14e4d3a4cd846a3f18f9448a0e9dacf45a;p=nethack *** empty log message *** --- diff --git a/win/X11/dialogs.c b/win/X11/dialogs.c new file mode 100644 index 000000000..ba2f913c2 --- /dev/null +++ b/win/X11/dialogs.c @@ -0,0 +1,340 @@ +/* + * Copyright 1991 University of Wisconsin-Madison + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the University of Wisconsin-Madison not + * be used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. The University of + * Wisconsin-Madison makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * THE UNIVERSITY OF WISCONSIN-MADISON DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF WISCONSIN-MADISON BE LIABLE FOR + * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Tim Theisen Department of Computer Sciences + * tim@cs.wisc.edu University of Wisconsin-Madison + * uwvax!tim 1210 West Dayton Street + * (608)262-0438 Madison, WI 53706 + * + * + * Modified 12/91 by Dean Luick. Tim graciously donated this piece of code + * from his program ghostview, an X11 front end for ghostscript. + * + * + Make the cancel button optional. + * + Put an #ifdef SPECIAL_CMAP around code to fix a colormap bug. + * We don't need it here. + * + Add the function positionpopup() from another part of ghostview + * to this code. + * + * Modified 2/93, Various. + * + Added workaround for SYSV include problem. + * + Changed the default width response text widget to be as wide as the + * window itself. Suggestion from David E. Wexelblat, dwex@goblin.org. + */ + +#ifndef SYSV +#define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef PRESERVE_NO_SYSV +# ifdef SYSV +# undef SYSV +# endif +# undef PRESERVE_NO_SYSV +#endif + +#include "config.h" /* #define for const for non __STDC__ compilers */ + +/* ":" added to both translations below to allow limited redefining of + * keysyms before testing for keysym values -- dlc */ +static const char okay_accelerators[] = + "#override\n\ + :Return: set() notify() unset()\n"; + +static const char cancel_accelerators[] = + "#override\n\ + :Escape: set() notify() unset()\n\ + :[: set() notify() unset()\n"; /* for keyboards w/o an ESC */ + + +/* Create a dialog widget. It is just a form widget with + * a label prompt + * a text response + * an okay button + * an optional cancel button + */ +Widget +CreateDialog(parent, name, okay_callback, cancel_callback) + Widget parent; + String name; + XtCallbackProc okay_callback; + XtCallbackProc cancel_callback; +{ + Widget form, prompt, response, okay, cancel; + Arg args[20]; + Cardinal num_args; + + num_args = 0; +#ifdef SPECIAL_CMAP + if (special_cmap) { + XtSetArg(args[num_args], XtNbackground, white); num_args++; + } +#endif + form = XtCreateManagedWidget(name, formWidgetClass, parent, args, num_args); + + num_args = 0; +#ifdef SPECIAL_CMAP + if (special_cmap) { + XtSetArg(args[num_args], XtNforeground, black); num_args++; + XtSetArg(args[num_args], XtNbackground, white); num_args++; + } +#endif + XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; + XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; + XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; + XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; + XtSetArg(args[num_args], XtNresizable, True); num_args++; + XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; + prompt = XtCreateManagedWidget("prompt", labelWidgetClass, + form, args, num_args); + + num_args = 0; +#ifdef SPECIAL_CMAP + if (special_cmap) { + XtSetArg(args[num_args], XtNforeground, black); num_args++; + XtSetArg(args[num_args], XtNbackground, white); num_args++; + } +#endif + XtSetArg(args[num_args], XtNfromVert, prompt); num_args++; + XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; + XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; + XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; + XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; + XtSetArg(args[num_args], XtNresizable, True); num_args++; + XtSetArg(args[num_args], XtNeditType, XawtextEdit); num_args++; + XtSetArg(args[num_args], XtNresize, XawtextResizeWidth); num_args++; + XtSetArg(args[num_args], XtNstring, ""); num_args++; + response = XtCreateManagedWidget("response", asciiTextWidgetClass, + form, args, num_args); + + num_args = 0; +#ifdef SPECIAL_CMAP + if (special_cmap) { + XtSetArg(args[num_args], XtNforeground, black); num_args++; + XtSetArg(args[num_args], XtNbackground, white); num_args++; + } +#endif + XtSetArg(args[num_args], XtNfromVert, response); num_args++; + XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; + XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; + XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; + XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; + XtSetArg(args[num_args], XtNresizable, True); num_args++; + XtSetArg(args[num_args], XtNaccelerators, + XtParseAcceleratorTable(okay_accelerators)); num_args++; + okay = XtCreateManagedWidget("okay", commandWidgetClass, + form, args, num_args); + XtAddCallback(okay, XtNcallback, okay_callback, form); + + /* Only create cancel button if there is a callback for it. */ + if (cancel_callback) { + num_args = 0; +#ifdef SPECIAL_CMAP + if (special_cmap) { + XtSetArg(args[num_args], XtNforeground, black); num_args++; + XtSetArg(args[num_args], XtNbackground, white); num_args++; + } +#endif + XtSetArg(args[num_args], XtNfromVert, response); num_args++; + XtSetArg(args[num_args], XtNfromHoriz, okay); num_args++; + XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; + XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; + XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; + XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; + XtSetArg(args[num_args], XtNresizable, True); num_args++; + XtSetArg(args[num_args], XtNaccelerators, + XtParseAcceleratorTable(cancel_accelerators)); num_args++; + cancel = XtCreateManagedWidget("cancel", commandWidgetClass, + form, args, num_args); + XtAddCallback(cancel, XtNcallback, cancel_callback, form); + XtInstallAccelerators(response, cancel); + } + + XtInstallAccelerators(response, okay); + XtSetKeyboardFocus(form, response); + + return form; +} + +#if 0 +/* get the prompt from the dialog box. Used a startup time to + * save away the initial prompt */ +String +GetDialogPrompt(w) + Widget w; +{ + Arg args[1]; + Widget label; + String s; + + label = XtNameToWidget(w, "prompt"); + XtSetArg(args[0], XtNlabel, &s); + XtGetValues(label, args, ONE); + return XtNewString(s); +} +#endif + +/* set the prompt. This is used to put error information in the prompt */ +void +SetDialogPrompt(w, newprompt) + Widget w; + String newprompt; +{ + Arg args[1]; + Widget label; + + label = XtNameToWidget(w, "prompt"); + XtSetArg(args[0], XtNlabel, newprompt); + XtSetValues(label, args, ONE); +} + +/* get what the user typed; caller must free the response */ +String +GetDialogResponse(w) + Widget w; +{ + Arg args[1]; + Widget response; + String s; + + response = XtNameToWidget(w, "response"); + XtSetArg(args[0], XtNstring, &s); + XtGetValues(response, args, ONE); + return XtNewString(s); +} + +#define max(a,b) (((a) > (b)) ? (a) : (b)) +/* set the default reponse */ +void +SetDialogResponse(w, s) + Widget w; + String s; +{ + Arg args[4]; + Widget response; + XFontStruct *font; + Dimension width, nwidth, tmp, leftMargin, rightMargin; + + response = XtNameToWidget(w, "response"); + XtSetArg(args[0], XtNfont, &font); + XtSetArg(args[1], XtNleftMargin, &leftMargin); + XtSetArg(args[2], XtNrightMargin, &rightMargin); + XtSetArg(args[3], XtNwidth, &width); + XtGetValues(response, args, FOUR); + nwidth = (font->max_bounds.width * strlen(s))+leftMargin+rightMargin; + tmp = width-(leftMargin+rightMargin); + if (nwidth < tmp) + nwidth = tmp; + + XtSetArg(args[0], XtNstring, s); + XtSetArg(args[1], XtNwidth, nwidth); + XtSetValues(response, args, TWO); + XawTextSetInsertionPoint(response, strlen(s)); +} + +#if 0 +/* clear the response */ +void +ClearDialogResponse(w) + Widget w; +{ + Arg args[2]; + Widget response; + + response = XtNameToWidget(w, "response"); + XtSetArg(args[0], XtNstring, ""); + XtSetArg(args[1], XtNwidth, 100); + XtSetValues(response, args, TWO); +} +#endif + + +/* Not a part of the original dialogs.c from ghostview --------------------- */ + +/* position popup window under the cursor */ +void +positionpopup(w, bottom) + Widget w; + boolean bottom; /* position y on bottom? */ +{ + Arg args[3]; + Cardinal num_args; + Dimension width, height, b_width; + int x, y, max_x, max_y; + Window root, child; + XSizeHints *hints; + int dummyx, dummyy; + unsigned int dummymask; + extern Widget toplevel; + + /* following line deals with a race condition w/brain-damaged WM's -dlc */ + XtUnrealizeWidget(w); + + XQueryPointer(XtDisplay(toplevel), XtWindow(toplevel), &root, &child, + &x, &y, &dummyx, &dummyy, &dummymask); + num_args = 0; + XtSetArg(args[num_args], XtNwidth, &width); num_args++; + XtSetArg(args[num_args], XtNheight, &height); num_args++; + XtSetArg(args[num_args], XtNborderWidth, &b_width); num_args++; + XtGetValues(w, args, num_args); + + /* position so that the cursor is center,center or center,bottom */ + width += 2 * b_width; + x -= ( (Position) width/2 ); + if (x < 0) x = 0; + if ( x > (max_x = (Position) (XtScreen(w)->width - width)) ) x = max_x; + + if (bottom) { + y -= (height+b_width-1); + height += 2 * b_width; + } else { + height += 2 * b_width; + y -= ( (Position) height/2 ); + } + if (y < 0) y = 0; + if ( y > (max_y = (Position) (XtScreen(w)->height - height)) ) y = max_y; + + + num_args = 0; + XtSetArg(args[num_args], XtNx, x); num_args++; + XtSetArg(args[num_args], XtNy, y); num_args++; + XtSetValues(w, args, num_args); + + /* Some older window managers ignore XtN{x,y}; hint the same values */ + /* The {x,y} are not used by newer window managers; older ones need them */ + XtRealizeWidget(w); + hints = XAllocSizeHints(); + hints->flags = USPosition; + hints->x = x; + hints->y = y; + XSetWMNormalHints(XtDisplay(w), XtWindow(w), hints); + XFree(hints); +}