diff options
Diffstat (limited to 'svpopup.c')
-rw-r--r-- | svpopup.c | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/svpopup.c b/svpopup.c new file mode 100644 index 0000000..cd0e504 --- /dev/null +++ b/svpopup.c @@ -0,0 +1,336 @@ +/* + * $Xorg: svpopup.c,v 1.4 2001/02/09 02:05:30 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: Chris D. Peterson, MIT X Consortium + */ + +#include <X11/Intrinsic.h> +#include <X11/StringDefs.h> /* Get standard string definations. */ +#include <X11/Xatom.h> +#include <X11/cursorfont.h> +#include <X11/Shell.h> + +#include "editresP.h" + +#include <X11/Xaw/AsciiText.h> +#include <X11/Xaw/Cardinals.h> +#include <X11/Xaw/Command.h> +#include <X11/Xaw/Form.h> +#include <X11/Xaw/Label.h> + +#include <stdio.h> + +#ifdef XKB +#include <X11/extensions/XKBbells.h> +#endif + +extern void SetMessage(), SetCommand(), InsertWidgetFromNode(); +extern void GetAllStrings(), PopupCentered(); + +static void _SetField(), CreateSetValuesPopup(); +static void DoSetValues(), CancelSetValues(); + +/* Function Name: PopupSetValues + * Description: This function pops up the setvalues dialog + * Arguments: parent - the parent of the setvalues popup. + * event - the event that caused this popup, or NULL. + * Returns: none + */ + +/* ARGSUSED */ +void +PopupSetValues(parent, event) +Widget parent; +XEvent * event; +{ + Arg args[1]; + + if (global_tree_info == NULL) { + SetMessage(global_screen_data.info_label, + res_labels[17]); + return; + } + +/* + * Check and possibly create the popup. + */ + + if (global_screen_data.set_values_popup == NULL) + CreateSetValuesPopup(parent, &global_screen_data); + +/* + * Clear out the old strings, and set the active widget to the name widget. + */ + + XtSetArg(args[0], XtNstring, ""); + XtSetValues(global_screen_data.res_text, args, ONE); + XtSetValues(global_screen_data.val_text, args, ONE); + + _SetField(global_screen_data.res_text, global_screen_data.val_text); + +/* + * Pop it up. + */ + + PopupCentered(event, global_screen_data.set_values_popup, XtGrabNone); +} + +/* Function Name: ModifySVEntry + * Description: Action routine that can be bound to the set values + * dialog box's Text Widget that will send input to the + * field specified. + * Arguments: (Standard Action Routine args) + * Returns: none. + */ + +/* ARGSUSED */ +void +ModifySVEntry(w, event, params, num_params) +Widget w; +XEvent *event; +String * params; +Cardinal * num_params; +{ + Widget new, old; + char msg[BUFSIZ]; + + if (*num_params != 1) { + strcpy(msg, + res_labels[21]); + SetMessage(global_screen_data.info_label, msg); + return; + } + + switch (params[0][0]) { + case 'r': + case 'R': + new = global_screen_data.res_text; + old = global_screen_data.val_text; + break; + case 'v': + case 'V': + new = global_screen_data.val_text; + old = global_screen_data.res_text; + break; + default: + sprintf(msg, res_labels[22]); + SetMessage(global_screen_data.info_label, msg); + return; + } + + _SetField(new, old); +} + +/************************************************************ + * + * Private Functions + * + ************************************************************/ + +/* Function Name: _SetField + * Description: Sets the current text entry field. + * Arguments: new, old - new and old text fields. + * Returns: none + */ + +static void +_SetField(new, old) +Widget new, old; +{ + Arg args[2]; + Pixel new_border, old_border, old_bg; + + if (!XtIsSensitive(new)) { +#if XKB + /* Don't set field to an inactive Widget. */ + XkbStdBell(XtDisplay(old), XtWindow(new), 0, XkbBI_InvalidLocation); +#else + XBell(XtDisplay(old), 0); /* Don't set field to an inactive Widget. */ +#endif + return; + } + + XtSetKeyboardFocus(XtParent(new), new); + + XtSetArg(args[0], XtNborderColor, &old_border); + XtSetArg(args[1], XtNbackground, &old_bg); + XtGetValues(new, args, TWO); + + XtSetArg(args[0], XtNborderColor, &new_border); + XtGetValues(old, args, ONE); + + if (old_border != old_bg) /* Colors are already correct, return. */ + return; + + XtSetArg(args[0], XtNborderColor, old_border); + XtSetValues(old, args, ONE); + + XtSetArg(args[0], XtNborderColor, new_border); + XtSetValues(new, args, ONE); +} + +/* Function Name: CreateSetValuesPopup + * Description: Creates the setvalues popup. + * Arguments: parent - the parent of the popup. + * scr_data - the data about this screen. + * Returns: the set values popup. + */ + +static void +CreateSetValuesPopup(parent, scr_data) +Widget parent; +ScreenData * scr_data; +{ + Widget form, cancel, do_it, label; + Widget res_label; + Arg args[10]; + Cardinal num_args; + + scr_data->set_values_popup = XtCreatePopupShell("setValuesPopup", + transientShellWidgetClass, + parent, NULL, ZERO); + + form = XtCreateManagedWidget("form", formWidgetClass, + scr_data->set_values_popup, NULL, ZERO); + + num_args = 0; + label = XtCreateManagedWidget("label", labelWidgetClass, + form, args, num_args); + + + num_args = 0; + XtSetArg(args[num_args], XtNfromVert, label); num_args++; + res_label = XtCreateManagedWidget("resourceLabel", labelWidgetClass, + form, args, num_args); + + num_args = 0; + XtSetArg(args[num_args], XtNfromVert, label); num_args++; + XtSetArg(args[num_args], XtNfromHoriz, res_label); num_args++; + scr_data->res_text = XtCreateManagedWidget("resourceText", + asciiTextWidgetClass, + form, args, num_args); + + num_args = 0; + XtSetArg(args[num_args], XtNfromVert, scr_data->res_text); num_args++; + (void) XtCreateManagedWidget("valueLabel", labelWidgetClass, + form, args, num_args); + + num_args = 0; + XtSetArg(args[num_args], XtNfromHoriz, res_label); num_args++; + XtSetArg(args[num_args], XtNfromVert, scr_data->res_text); num_args++; + scr_data->val_text = XtCreateManagedWidget("valueText", + asciiTextWidgetClass, + form, args, num_args); + + num_args = 0; + XtSetArg(args[num_args], XtNfromVert, scr_data->val_text); num_args++; + do_it = XtCreateManagedWidget("setValues", commandWidgetClass, + form, args, num_args); + + num_args = 0; + XtSetArg(args[num_args], XtNfromVert, scr_data->val_text); num_args++; + XtSetArg(args[num_args], XtNfromHoriz, do_it); num_args++; + cancel = XtCreateManagedWidget("cancel", commandWidgetClass, + form, args, num_args); + + XtAddCallback(do_it, XtNcallback, DoSetValues, NULL); + XtAddCallback(cancel, XtNcallback, CancelSetValues, NULL); + +/* + * Initialize the text entry fields. + */ + + { + Pixel color; + + num_args = 0; + XtSetArg(args[num_args], XtNbackground, &color); num_args++; + XtGetValues(scr_data->val_text, args, num_args); + + num_args = 0; + XtSetArg(args[num_args], XtNborderColor, color); num_args++; + XtSetValues(scr_data->val_text, args, num_args); + + XtSetKeyboardFocus(form, scr_data->res_text); + } +} + +/* Function Name: DoSetValues + * Description: Performs a SetValues. + * Arguments: w - the widget that called this. + * junk, garbage - ** UNUSED **. + * Returns: none. + */ + +/* ARGSUSED */ +static void +DoSetValues(w, junk, garbage) +Widget w; +XtPointer junk, garbage; +{ + ProtocolStream * stream = &(global_client.stream); + char *res_name, *res_value; + Arg args[1]; + Cardinal i; + + if (global_tree_info->num_nodes == 0) { + SetMessage(global_screen_data.info_label, + res_labels[23]); + return; + } + + XtSetArg(args[0], XtNstring, &res_name); + XtGetValues(global_screen_data.res_text, args, ONE); + + XtSetArg(args[0], XtNstring, &res_value); + XtGetValues(global_screen_data.val_text, args, ONE); + + _XEditResResetStream(stream); + _XEditResPutString8(stream, res_name); + _XEditResPutString8(stream, XtRString); + _XEditResPutString8(stream, res_value); + _XEditResPut16(stream, global_tree_info->num_nodes); + + for (i = 0; i < global_tree_info->num_nodes; i++) + InsertWidgetFromNode(stream, global_tree_info->active_nodes[i]); + + SetCommand(w, LocalSetValues, NULL); +} + +/* Function Name: CancelSetValues + * Description: Pops down the setvalues popup. + * Arguments: w - any grandchild of the popup. + * junk, garbage - ** UNUSED **. + * Returns: none. + */ + +/* ARGSUSED */ +static void +CancelSetValues(w, junk, garbage) +Widget w; +XtPointer junk, garbage; +{ + XtPopdown(XtParent(XtParent(w))); +} |