diff options
Diffstat (limited to 'Dialog.c')
-rw-r--r-- | Dialog.c | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/Dialog.c b/Dialog.c new file mode 100644 index 0000000..ebf0a3b --- /dev/null +++ b/Dialog.c @@ -0,0 +1,204 @@ +/* $Xorg: Dialog.c,v 1.4 2001/02/09 02:05:28 xorgcvs Exp $ */ +/* + +Copyright 1989, 1998 The Open Group + +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. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * Author: Davor Matic, MIT X Consortium + */ + +#include <X11/Intrinsic.h> +#include <X11/StringDefs.h> +#include <X11/Shell.h> +#include <X11/Xaw/Dialog.h> +#include <X11/Xaw/Command.h> +#include <X11/Xmu/CharSet.h> + +#include "Dialog.h" + +#define min(x, y) (((x) < (y)) ? (x) : (y)) +#define max(x, y) (((x) > (y)) ? (x) : (y)) + +static void SetDialogButton(); + +static XtActionsRec actions_table[] = { + {"set-dialog-button", SetDialogButton}, +}; + +static DialogButton dialog_buttons[] = { + {"yes", Yes}, + {"no", No}, + {"maybe", Maybe}, + {"okay", Okay}, + {"abort", Abort}, + {"cancel", Cancel}, + {"retry", Retry}, +}; + +static unsigned long selected; + +/* ARGSUSED */ +static void SetSelected(w, clientData, callData) /* ARGSUSED */ + Widget w; + XtPointer clientData, callData; +{ + String name = (String)clientData; + int i; + + for (i = 0; i < XtNumber(dialog_buttons); i++) + if (!strcmp(dialog_buttons[i].name, name)) + selected |= dialog_buttons[i].flag; +} + +/* ARGSUSED */ +static void SetDialogButton(w, event, argv, argc) + Widget w; /* not used */ + XEvent *event; /* not used */ + String *argv; + Cardinal *argc; +{ + char button_name[80]; + XtPointer dummy = NULL; + int i; + + for (i = 0; i < *argc; i++) { + XmuCopyISOLatin1Lowered (button_name, argv[i]); + SetSelected(w, button_name, dummy); + } +} + +static Boolean firstTime = True; + +Dialog CreateDialog(top_widget, name, options) + Widget top_widget; + String name; + unsigned long options; +{ + int i; + Dialog popup; + + popup = (Dialog) XtMalloc(sizeof(_Dialog)); + + if (popup) { + if (firstTime) { + XtAddActions(actions_table, XtNumber(actions_table)); + firstTime = False; + } + popup->top_widget = top_widget; + popup->shell_widget = XtCreatePopupShell(name, + transientShellWidgetClass, + top_widget, NULL, 0); + popup->dialog_widget = XtCreateManagedWidget("dialog", + dialogWidgetClass, + popup->shell_widget, + NULL, 0); + for (i = 0; i < XtNumber(dialog_buttons); i++) + if (options & dialog_buttons[i].flag) + XawDialogAddButton(popup->dialog_widget, + dialog_buttons[i].name, + SetSelected, dialog_buttons[i].name); + popup->options = options; + return popup; + } + else + return NULL; +} + +void PopdownDialog(popup, answer) + Dialog popup; + String *answer; +{ + if (answer) + *answer = XawDialogGetValueString(popup->dialog_widget); + + XtPopdown(popup->shell_widget); +} + +unsigned long PopupDialog(popup, message, suggestion, answer, grab) + Dialog popup; + String message, suggestion, *answer; + XtGrabKind grab; +{ + Position popup_x, popup_y, top_x, top_y; + Dimension popup_width, popup_height, top_width, top_height, border_width; + int n; + Arg wargs[4]; + + n = 0; + XtSetArg(wargs[n], XtNlabel, message); n++; + XtSetArg(wargs[n], XtNvalue, suggestion); n++; + XtSetValues(popup->dialog_widget, wargs, n); + + XtRealizeWidget(popup->shell_widget); + + n = 0; + XtSetArg(wargs[n], XtNx, &top_x); n++; + XtSetArg(wargs[n], XtNy, &top_y); n++; + XtSetArg(wargs[n], XtNwidth, &top_width); n++; + XtSetArg(wargs[n], XtNheight, &top_height); n++; + XtGetValues(popup->top_widget, wargs, n); + + n = 0; + XtSetArg(wargs[n], XtNwidth, &popup_width); n++; + XtSetArg(wargs[n], XtNheight, &popup_height); n++; + XtSetArg(wargs[n], XtNborderWidth, &border_width); n++; + XtGetValues(popup->shell_widget, wargs, n); + + popup_x = max(0, + min(top_x + ((Position)top_width - (Position)popup_width) / 2, + (Position)DisplayWidth(XtDisplay(popup->shell_widget), + DefaultScreen(XtDisplay(popup->shell_widget))) - + (Position)popup_width - 2 * (Position)border_width)); + popup_y = max(0, + min(top_y + ((Position)top_height - (Position)popup_height) / 2, + (Position)DisplayHeight(XtDisplay(popup->shell_widget), + DefaultScreen(XtDisplay(popup->shell_widget))) - + (Position)popup_height - 2 * (Position)border_width)); + n = 0; + XtSetArg(wargs[n], XtNx, popup_x); n++; + XtSetArg(wargs[n], XtNy, popup_y); n++; + XtSetValues(popup->shell_widget, wargs, n); + + selected = None; + + XtPopup(popup->shell_widget, grab); + XWarpPointer(XtDisplay(popup->shell_widget), + XtWindow(popup->top_widget), + XtWindow(popup->shell_widget), + 0, 0, top_width, top_height, + popup_width / 2, popup_height / 2); + + while ((selected & popup->options) == None) { + XEvent event; + XtNextEvent(&event); + XtDispatchEvent(&event); + } + + PopdownDialog(popup, answer); + + return (selected & popup->options); +} |