summaryrefslogtreecommitdiff
path: root/handler.c
diff options
context:
space:
mode:
authorKaleb Keithley <kaleb@freedesktop.org>2003-11-14 15:54:52 +0000
committerKaleb Keithley <kaleb@freedesktop.org>2003-11-14 15:54:52 +0000
commitefce7cb078dd34e9e9f7d6f5f5cdd0c8ef267691 (patch)
treef9652b85cbb9728b5999913ea2aadee0b3ad1a17 /handler.c
R6.6 is the Xorg base-lineXORG-MAINXORG-STABLE
Diffstat (limited to 'handler.c')
-rw-r--r--handler.c966
1 files changed, 966 insertions, 0 deletions
diff --git a/handler.c b/handler.c
new file mode 100644
index 0000000..2c3ebeb
--- /dev/null
+++ b/handler.c
@@ -0,0 +1,966 @@
+/*
+ * $Xorg: handler.c,v 1.4 2001/02/09 02:05:29 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.
+ */
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+
+#include <X11/Xaw/Cardinals.h>
+#include <X11/Xaw/List.h>
+#include <X11/Xaw/Panner.h>
+#include <X11/Xaw/Toggle.h>
+#include <X11/Xfuncs.h>
+#include <X11/Xos.h> /* for W_OK def */
+
+#include <stdio.h>
+
+#include "editresP.h"
+
+/*
+ * Function Definitions.
+ */
+
+extern void SetCommand(), PopupSetValues(), SetAndCenterTreeNode();
+extern void _TreeSelect(), _TreeRelabel(), _TreeActivate(), SetMessage();
+extern void _FlashActiveWidgets(), _DumpTreeToFile(), _PopupFileDialog();
+extern void AddString(), CreateResourceBox(), ExecuteOverAllNodes();
+extern void GetNamesAndClasses(), TreeToggle(), InsertWidgetFromNode();
+extern Boolean CheckDatabase();
+extern XrmQuarkList Quarkify();
+extern char *GetResourceValueForSetValues();
+
+void SetResourceString(), ActivateResourceWidgets();
+void ActivateWidgetsAndSetResourceString();
+static void SetOnlyMatchingWidgets();
+static void CreateSetValuesCommand();
+static void ObtainResource();
+
+/* Function Name: Quit
+ * Description: This function prints a message to stdout.
+ * Arguments: w - ** UNUSED **
+ * call_data - ** UNUSED **
+ * client_data - ** UNUSED **
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+Quit(w, client_data, call_data)
+Widget w;
+XtPointer call_data, client_data;
+{
+ XtDestroyApplicationContext(XtWidgetToApplicationContext(w));
+ exit(0);
+}
+
+/* Function Name: SendTree
+ * Description: This function initiates the client communication.
+ * by getting the resource tree.
+ * Arguments: w - the widget that made the selection.
+ * value - a boolean value stored as a pointer.
+ * if True then get a new client, otherwise
+ * refresh the current client.
+ * call_data - ** UNUSED **
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+SendTree(w, value, call_data)
+Widget w;
+XtPointer value, call_data;
+{
+ if ((Boolean)(long) value)
+ global_client.window = None;
+
+ if (!XtIsWidget(w)) /* Make sure that we use a "Real" widget here. */
+ w = XtParent(w);
+
+ _XEditResResetStream(&(global_client.stream)); /* an empty message. */
+
+ SetCommand(w, LocalSendWidgetTree, NULL);
+}
+
+/* Function Name: FindWidget
+ * Description: Maps a widget in the client to one in the currently
+ * displayed widget tree.
+ * Arguments: w - the widget that invoked this action.
+ * call_data, client_data ** UNUSED **
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+FindWidget(w, client_data, call_data)
+Widget w;
+XtPointer client_data, call_data;
+{
+ void _FindWidget();
+
+ _FindWidget(XtParent(w)); /* Use parent since it is a "real"
+ widget not a rect_obj. */
+}
+
+/* Function Name: InitSetValues
+ * Description: This function pops up the setvalues dialog
+ * Arguments: w - the widget caused this action.
+ * call_data - ** UNUSED **
+ * client_data - ** UNUSED **
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+InitSetValues(w, client_data, call_data)
+Widget w;
+XtPointer call_data, client_data;
+{
+ if (!XtIsWidget(w)) /* Make sure that we use a "Real" widget here. */
+ w = XtParent(w);
+
+ PopupSetValues(w, NULL);
+}
+
+/* Function Name: TreeSelect
+ * Description: Selects all widgets.
+ * Arguments: w - the widget caused this action.
+ * call_data - ** UNUSED **
+ * client_data - The type of thing to select.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+TreeSelect(w, client_data, call_data)
+Widget w;
+XtPointer call_data, client_data;
+{
+ SelectTypes type = (SelectTypes) client_data;
+
+ _TreeSelect(global_tree_info, type);
+}
+
+/* Function Name: TreeRelabel
+ * Description: Relabels a tree to the type specified.
+ * Arguments: w - the widget caused this action.
+ * call_data - ** UNUSED **
+ * client_data - the type of label to assign to each node.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+TreeRelabel(w, client_data, call_data)
+Widget w;
+XtPointer call_data, client_data;
+{
+ LabelTypes type = (LabelTypes) client_data;
+
+ _TreeRelabel(global_tree_info, type);
+}
+
+/* Function Name: PannerCallback
+ * Description: called when the panner has moved.
+ * Arguments: panner - the panner widget.
+ * closure - *** NOT USED ***.
+ * report_ptr - the panner record.
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+void
+PannerCallback(w, closure, report_ptr)
+Widget w;
+XtPointer closure, report_ptr;
+{
+ Arg args[2];
+ XawPannerReport *report = (XawPannerReport *) report_ptr;
+
+ if (global_tree_info == NULL)
+ return;
+
+ XtSetArg (args[0], XtNx, -report->slider_x);
+ XtSetArg (args[1], XtNy, -report->slider_y);
+
+ XtSetValues(global_tree_info->tree_widget, args, TWO);
+}
+
+/* Function Name: PortholeCallback
+ * Description: called when the porthole or its child has
+ * changed
+ * Arguments: porthole - the porthole widget.
+ * panner_ptr - the panner widget.
+ * report_ptr - the porthole record.
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+void
+PortholeCallback(w, panner_ptr, report_ptr)
+Widget w;
+XtPointer panner_ptr, report_ptr;
+{
+ Arg args[10];
+ Cardinal n = 0;
+ XawPannerReport *report = (XawPannerReport *) report_ptr;
+ Widget panner = (Widget) panner_ptr;
+
+ XtSetArg (args[n], XtNsliderX, report->slider_x); n++;
+ XtSetArg (args[n], XtNsliderY, report->slider_y); n++;
+ if (report->changed != (XawPRSliderX | XawPRSliderY)) {
+ XtSetArg (args[n], XtNsliderWidth, report->slider_width); n++;
+ XtSetArg (args[n], XtNsliderHeight, report->slider_height); n++;
+ XtSetArg (args[n], XtNcanvasWidth, report->canvas_width); n++;
+ XtSetArg (args[n], XtNcanvasHeight, report->canvas_height); n++;
+ }
+ XtSetValues (panner, args, n);
+}
+
+/* Function Name: FlashActiveWidgets
+ * Description: called to flass all active widgets in the display.
+ * Arguments: *** NOT USED ***
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+void
+FlashActiveWidgets(w, junk, garbage)
+Widget w;
+XtPointer junk, garbage;
+{
+ _FlashActiveWidgets(global_tree_info);
+}
+
+/* Function Name: GetResourceList
+ * Description: Gets the resources lists of all active widgets.
+ * Arguments: ** NOT USED **
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+GetResourceList(w, junk, garbage)
+Widget w;
+XtPointer junk, garbage;
+{
+ WNode * node;
+ ProtocolStream * stream = &(global_client.stream);
+
+ if (global_tree_info == NULL) {
+ SetMessage(global_screen_data.info_label,
+ res_labels[17]);
+ return;
+ }
+
+ if (global_tree_info->num_nodes != 1) {
+ SetMessage(global_screen_data.info_label,
+ res_labels[19]);
+ return;
+ }
+
+ node = global_tree_info->active_nodes[0];
+ if (node->resources != NULL) {
+ char * errors = NULL;
+ CreateResourceBox(node, &errors);
+ if (errors != NULL) {
+ SetMessage(global_screen_data.info_label, errors);
+ XtFree(errors);
+ }
+ return;
+ }
+
+ /*
+ * No resoruces, fetch them from the client.
+ */
+
+ _XEditResResetStream(stream);
+ _XEditResPut16(stream, (unsigned short) 1);
+ InsertWidgetFromNode(stream, node);
+ SetCommand(global_tree_info->tree_widget, LocalGetResources, NULL);
+}
+
+/* Function Name: DumpTreeToFile
+ * Description: Dumps all widgets in the tree to a file.
+ * Arguments: w - the widget that activated this callback.
+ * junk, garbage - ** NOT USED **.
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+void
+DumpTreeToFile(w, junk, garbage)
+Widget w;
+XtPointer junk, garbage;
+{
+ _PopupFileDialog(XtParent(w), "Enter the filename:", "",
+ _DumpTreeToFile, (XtPointer) global_tree_info);
+}
+
+/************************************************************
+ *
+ * Callbacks for the Resource Box.
+ *
+ ************************************************************/
+
+
+/* Function Name: AnyChosen
+ * Description: Callback that is called when the "any" widget
+ * is activated.
+ * Arguments: w - the "any" widget that activated this callback.
+ * any_info_ptr - pointer to struct containing
+ * dot and star widgets to lock.
+ * state_ptr - state of the any toggle.
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+void
+AnyChosen(w, any_info_ptr, state_ptr)
+Widget w;
+XtPointer any_info_ptr, state_ptr;
+{
+ AnyInfo * any_info = (AnyInfo *) any_info_ptr;
+ Boolean state = (Boolean)(long) state_ptr;
+ Arg args[1];
+
+ if (state) {
+
+ if (any_info->left_count == 0) {
+ XtSetSensitive(any_info->left_dot, FALSE);
+ XtSetSensitive(any_info->left_star, FALSE);
+
+ XtSetArg(args[0], XtNstate, TRUE);
+ XtSetValues(any_info->left_star, args, ONE);
+ }
+
+ if ((any_info->right_count == NULL)||(*any_info->right_count == 0)) {
+ XtSetSensitive(any_info->right_dot, FALSE);
+ XtSetSensitive(any_info->right_star, FALSE);
+
+ XtSetArg(args[0], XtNstate, TRUE);
+ XtSetValues(any_info->right_star, args, ONE);
+ }
+ any_info->left_count++;
+
+ if (any_info->right_count != NULL)
+ (*any_info->right_count)++;
+ }
+ else { /* state == 0 */
+ if (any_info->left_count > 0)
+ any_info->left_count--;
+ if ((any_info->right_count != NULL)&&(*any_info->right_count > 0))
+ (*any_info->right_count)--;
+
+ if (any_info->left_count == 0) {
+ XtSetSensitive(any_info->left_dot, TRUE);
+ XtSetSensitive(any_info->left_star, TRUE);
+
+ XtSetArg(args[0], XtNstate, TRUE);
+ XtSetValues(any_info->left_dot, args, ONE);
+ }
+
+ if ((any_info->right_count == NULL)||(*any_info->right_count == 0)) {
+ XtSetSensitive(any_info->right_dot, TRUE);
+ XtSetSensitive(any_info->right_star, TRUE);
+
+ XtSetArg(args[0], XtNstate, TRUE);
+ XtSetValues(any_info->right_dot, args, ONE);
+ }
+ }
+ SetResourceString(NULL, (XtPointer) any_info->node, NULL);
+ ActivateResourceWidgets(NULL, (XtPointer) any_info->node, NULL);
+}
+
+/* Function Name: GetResourceName
+ * Description: Gets the name of the current resource.
+ * Arguments: res_box - the resource box.
+ * Returns: the name of the currently selected resource.
+ */
+
+
+static char *
+GetResourceName(res_box)
+ResourceBoxInfo * res_box;
+{
+ XawListReturnStruct * list_info;
+ char * result;
+
+ list_info = XawListShowCurrent(res_box->norm_list);
+ if ((list_info->list_index == XAW_LIST_NONE) &&
+ (res_box->cons_list != NULL)) {
+ list_info = XawListShowCurrent(res_box->cons_list);
+ }
+
+ if (list_info->list_index == XAW_LIST_NONE)
+ result = "unknown";
+ else
+ result = list_info->string;
+
+ return(result);
+}
+
+
+/* Function Name: ActivateWidgetsAndSetResourceString
+ * Description: Sets the new resources string, then
+ * activates all widgets that match this resource,
+ * Arguments: w - the widget that activated this.
+ * node_ptr - the node that owns this resource box.
+ * call_data - passed on to other callbacks.
+ * Returns: none.
+ *
+ * NOTE: I cannot just have two callback routines, since I care which
+ * order that these are executed in, sigh...
+ */
+
+void
+ActivateWidgetsAndSetResourceString(w, node_ptr, call_data)
+Widget w;
+XtPointer node_ptr, call_data;
+{
+ SetResourceString(w, node_ptr, call_data);
+ ActivateResourceWidgets(w, node_ptr, call_data);
+}
+
+/* Function Name: SetResourceString
+ * Description: Sets the resource label to correspond to the currently
+ * chosen string.
+ * Arguments: w - The widget that invoked this callback, or NULL.
+ * node_ptr - pointer to widget node contating this res box.
+ * call_data - The call data for the action that invoked
+ * this callback.
+ * Returns: none.
+ */
+
+void
+SetResourceString(w, node_ptr, junk)
+Widget w;
+XtPointer node_ptr, junk;
+{
+ static char * malloc_string; /* These are both inited to zero. */
+ static Cardinal malloc_size;
+
+ WNode * node = (WNode *) node_ptr;
+ ResourceBoxInfo * res_box = node->resources->res_box;
+ char * temp, buf[BUFSIZ * 10]; /* here's hoping it's big enough. */
+ NameInfo * name_node = res_box->name_info;
+ Arg args[1];
+ int len;
+
+ if ((w != NULL) && XtIsSubclass(w, toggleWidgetClass)) {
+ /*
+ * Only set resources when toggles are activated, not when they are
+ * deactivated.
+ */
+ if (!((Boolean)(long) junk))
+ return;
+ }
+
+ buf[0] = '\0'; /* clear out string. */
+
+ /*
+ * Get the widget name/class info.
+ */
+
+ if ((temp = (char *) XawToggleGetCurrent(name_node->sep_leader)) != NULL)
+ strcat(buf, temp);
+
+ for ( ; name_node->next != NULL ; name_node = name_node->next) {
+ temp = (char *) XawToggleGetCurrent(name_node->name_leader);
+ if ( (temp != NULL) && !streq(temp, ANY_RADIO_DATA) ) {
+ strcat(buf, temp);
+ temp = (char *) XawToggleGetCurrent(name_node->next->sep_leader);
+ if (temp == NULL)
+ strcat(buf, "!");
+ else
+ strcat(buf, temp);
+ }
+ }
+
+ strcat(buf, GetResourceName(res_box));
+ len = strlen(buf) + 2; /* Leave space for ':' and '\0' */
+
+#ifdef notdef
+ XtSetArg(args[0], XtNstring, &temp);
+ XtGetValues(res_box->value_wid, args, ONE);
+ len += strlen(temp);
+#endif
+
+ if (len > malloc_size) {
+ malloc_string = XtRealloc(malloc_string, sizeof(char) * len);
+ malloc_size = len;
+ }
+
+ strcpy(malloc_string, buf);
+ strcat(malloc_string, ":");
+#ifdef notdef
+ strcat(malloc_string, temp);
+#endif
+
+ XtSetArg(args[0], XtNlabel, malloc_string);
+ XtSetValues(res_box->res_label, args, ONE);
+}
+
+/* Function Name: ResourceListCallback
+ * Description: Callback functions for the resource lists. This
+ * routine is essentialy called by the list widgets
+ * Notify action. If action EnableGetVal has been
+ * invoked, ResourceListCallback will perform a
+ * GetValues protocol request.
+ * Arguments: list - the list widget that we are dealing with.
+ * node_ptr - pointer to widget node contating this res box.
+ * junk - UNUSED.
+ * Returns: none
+ */
+
+extern Boolean do_get_values;
+
+void
+ResourceListCallback(list, node_ptr, junk)
+Widget list;
+XtPointer node_ptr, junk;
+{
+ Widget o_list;
+ WNode * node = (WNode *) node_ptr;
+ ResourceBoxInfo * res_box = node->resources->res_box;
+
+ if (list == res_box->norm_list)
+ o_list = res_box->cons_list;
+ else
+ o_list = res_box->norm_list;
+
+ if (o_list != NULL)
+ XawListUnhighlight(o_list);
+
+ SetResourceString(list, node_ptr, junk);
+
+ /* get the resource value from the application */
+ if (global_effective_protocol_version >=
+ PROTOCOL_VERSION_ONE_POINT_ONE && do_get_values) {
+ ObtainResource(node_ptr);
+ do_get_values = False;
+ }
+}
+
+/* Function Name: PopdownResBox
+ * Description: Pops down the resource box.
+ * Arguments: w - UNUSED
+ * shell_ptr - pointer to the shell to pop down.
+ * junk - UNUSED.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+PopdownResBox(w, shell_ptr, junk)
+Widget w;
+XtPointer shell_ptr, junk;
+{
+ Widget shell = (Widget) shell_ptr;
+
+ XtPopdown(shell);
+ XtDestroyWidget(shell);
+}
+
+/* ARGSUSED */
+static void
+_AppendResourceString(w, res_box_ptr, filename_ptr)
+Widget w;
+XtPointer res_box_ptr, filename_ptr;
+{
+ Arg args[1];
+ FILE * fp;
+ char buf[BUFSIZ], * resource_string, *filename = (char *) filename_ptr;
+ ResourceBoxInfo * res_box = (ResourceBoxInfo *) res_box_ptr;
+ char *value_ptr;
+
+ if (filename != NULL) {
+ if (global_resources.allocated_save_resources_file)
+ XtFree(global_resources.save_resources_file);
+ else
+ global_resources.allocated_save_resources_file = TRUE;
+
+ global_resources.save_resources_file = XtNewString(filename);
+ }
+
+ if ((fp = fopen(global_resources.save_resources_file, "a+")) == NULL) {
+ sprintf(buf, "Unable to open this file for writing, would %s",
+ "you like To try again?");
+ _PopupFileDialog(global_toplevel ,buf,
+ global_resources.save_resources_file,
+ _AppendResourceString, res_box_ptr);
+ return;
+ }
+
+ XtSetArg(args[0], XtNlabel, &resource_string);
+ XtGetValues(res_box->res_label, args, ONE);
+
+ XtSetArg(args[0], XtNstring, &value_ptr);
+ XtGetValues(res_box->value_wid, args, ONE);
+
+ fprintf(fp, "%s %s\n", resource_string, value_ptr);
+
+ fclose(fp);
+}
+
+/* Function Name: SaveResource
+ * Description: Save the current resource to your resource file
+ * Arguments: w - any widget in the application.
+ * res_box_ptr - the resource box info.
+ * junk - UNUSED.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+SaveResource(w, res_box_ptr, junk)
+Widget w;
+XtPointer res_box_ptr, junk;
+{
+ /*
+ * If there is no filename the ask for one, otherwise just save to
+ * current file.
+ */
+
+ if (streq(global_resources.save_resources_file, ""))
+ _PopupFileDialog(XtParent(w), "Enter file to dump resources into:",
+ global_resources.save_resources_file,
+ _AppendResourceString, res_box_ptr);
+ else
+ _AppendResourceString(w, res_box_ptr, NULL);
+}
+
+/* Function Name: _SetResourcesFile
+ * Description: Sets the filename of the file to save the resources to.
+ * Arguments: w - UNUSED
+ * junk - UNUSED
+ * filename_ptr - a pointer to the filename;
+ * Returns: none
+ */
+
+/* ARGSUSED */
+static void
+_SetResourcesFile(w, junk, filename_ptr)
+Widget w;
+XtPointer junk, filename_ptr;
+{
+ char *filename = (char *) filename_ptr;
+
+ if (global_resources.allocated_save_resources_file)
+ XtFree(global_resources.save_resources_file);
+ else
+ global_resources.allocated_save_resources_file = TRUE;
+
+ global_resources.save_resources_file = XtNewString(filename);
+}
+
+/* Function Name: SetFile
+ * Description: Changes the current save file
+ * Arguments: w - UNUSED.
+ * res_box_ptr - UNUSED.
+ * junk - UNUSED.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+SetFile(w, junk, garbage)
+Widget w;
+XtPointer junk, garbage;
+{
+ /*
+ * If there is no filename the ask for one, otherwise just save to
+ * current file.
+ */
+
+ _PopupFileDialog(XtParent(w), "Enter file to dump resources into:",
+ global_resources.save_resources_file,
+ _SetResourcesFile, NULL);
+}
+
+/* Function Name: ApplyResource
+ * Description: Apply the current resource to the running application.
+ * Arguments: w - any widget in the application.
+ * node_ptr - a pointer to the node containing
+ * the current resouce box.
+ * junk - UNUSED.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+void
+ApplyResource(w, node_ptr, junk)
+Widget w;
+XtPointer node_ptr, junk;
+{
+ ProtocolStream * stream = &(global_client.stream);
+ ApplyResourcesInfo info;
+ WNode * node = (WNode *) node_ptr;
+ char * value;
+ unsigned short size, i;
+ long len;
+ Arg args[1];
+
+ info.name = GetResourceName(node->resources->res_box);
+ info.class = "IGNORE_ME"; /* Not currently used. */
+ info.stream = stream;
+ info.count = 0;
+
+ XtSetArg(args[0], XtNlabel, &value);
+ XtGetValues(node->resources->res_box->res_label, args, ONE);
+
+ info.database = NULL;
+ XrmPutLineResource(&(info.database), value);
+
+
+ _XEditResResetStream(stream);
+ _XEditResPutString8(stream, info.name); /* Insert name */
+ _XEditResPutString8(stream, XtRString); /* insert type */
+
+ /*
+ * Insert value.
+ */
+
+ value = GetResourceValueForSetValues(node, &size);
+ _XEditResPut16(stream, size);
+ for (i = 0; i < size; i++)
+ _XEditResPut8(stream, value[i]);
+ XtFree(value);
+ len = stream->current - stream->top;
+
+ /*
+ * Insert the widget count, overriden later.
+ */
+
+ _XEditResPut16(stream, 0);
+
+ ExecuteOverAllNodes(node->tree_info->top_node,
+ CreateSetValuesCommand, (XtPointer) &info);
+
+ if (info.count > 0) {
+ *(stream->top + len++) = info.count >> XER_NBBY; /* Set the correct */
+ *(stream->top + len) = info.count; /* count. */
+
+ SetCommand(node->tree_info->tree_widget, LocalSetValues, NULL);
+ }
+ else
+ SetMessage(global_screen_data.info_label,
+ res_labels[20]);
+
+ XrmDestroyDatabase(info.database);
+}
+
+/* Function Name: ObtainResource
+ * Description: Obtain the current resource from the running application.
+ * Arguments: node_ptr - a pointer to the node containing
+ * the current resouce box.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+static void
+ObtainResource(node_ptr)
+XtPointer node_ptr;
+{
+ ProtocolStream * stream = &(global_client.stream);
+ ObtainResourcesInfo info;
+ WNode * node = (WNode *) node_ptr;
+ char * value;
+ Arg args[1];
+
+ info.name = GetResourceName(node->resources->res_box);
+ info.class = "IGNORE_ME"; /* Not currently used. */
+ info.stream = stream;
+ info.count = 1;
+
+ XtSetArg(args[0], XtNlabel, &value);
+ XtGetValues(node->resources->res_box->res_label, args, ONE);
+
+ info.database = NULL;
+ XrmPutLineResource(&(info.database), value);
+
+ _XEditResResetStream(stream);
+ _XEditResPutString8(stream, info.name); /* insert name */
+
+ /*
+ * Insert the widget count, always 1
+ */
+
+ _XEditResPut16(stream, 1);
+
+ /*CreateGetValuesCommand(node, (XtPointer)&info); Inserts widget */
+
+ /* Insert widget */
+ _XEditResPut16(stream, 1);
+ _XEditResPut32(stream, node->id);
+
+ SetCommand(node->tree_info->tree_widget, LocalGetValues, NULL);
+}
+
+/* Function Name: CreateSetValuesCommand
+ * Description: Creates the SetValues command if this widget
+ * matches the resource string in the database.
+ * Arguments: node - the current node.
+ * info_ptr - the pointer to the apply info.
+ * Returns: none
+ */
+
+static void
+CreateSetValuesCommand(node, info_ptr)
+WNode * node;
+XtPointer info_ptr;
+{
+ ApplyResourcesInfo * info = (ApplyResourcesInfo *) info_ptr;
+ XrmNameList name_quarks;
+ XrmClassList class_quarks;
+ char ** names, **classes;
+
+ GetNamesAndClasses(node, &names, &classes);
+ name_quarks = (XrmNameList) Quarkify(names, info->name);
+ class_quarks = (XrmNameList) Quarkify(classes, info->class);
+
+ if (CheckDatabase(info->database, name_quarks, class_quarks)) {
+ InsertWidgetFromNode(info->stream, node);
+ info->count++;
+ }
+
+ XtFree((char *)names);
+ XtFree((char *)classes);
+ XtFree((char *)name_quarks);
+ XtFree((char *)class_quarks);
+}
+
+/* Function Name: CreateGetValuesCommand
+ * Description: Creates the GetValues command.
+ * Arguments: node - the current node.
+ * info_ptr - the pointer to the apply info.
+ * Returns: none
+ */
+
+/*****
+
+static void
+CreateGetValuesCommand(node, info_ptr)
+WNode * node;
+XtPointer info_ptr;
+{
+ ApplyResourcesInfo * info = (ApplyResourcesInfo *) info_ptr;
+ XrmNameList name_quarks;
+ XrmClassList class_quarks;
+ char ** names, **classes;
+
+ GetNamesAndClasses(node, &names, &classes);
+ name_quarks = (XrmNameList) Quarkify(names, info->name);
+ class_quarks = (XrmNameList) Quarkify(classes, info->class);
+
+ if (CheckDatabase(info->database, name_quarks, class_quarks)) {
+ InsertWidgetFromNode(info->stream, node);
+ info->count++;
+ }
+
+ XtFree((char *)names);
+ XtFree((char *)classes);
+ XtFree((char *)name_quarks);
+ XtFree((char *)class_quarks);
+}
+
+*****/
+
+/* Function Name: ActivateResourceWidgets
+ * Description: Activates all widgets that match this resource.
+ * Arguments: w - UNUSED.
+ * node_ptr - the node that owns this resource box.
+ * junk - UNUSED.
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+void
+ActivateResourceWidgets(w, node_ptr, junk)
+Widget w;
+XtPointer node_ptr, junk;
+{
+ WNode * node = (WNode *) node_ptr;
+ ApplyResourcesInfo info;
+ char * line;
+ Arg args[1];
+
+ info.name = GetResourceName(node->resources->res_box);
+ info.class = "IGNORE_ME"; /* Not currently used. */
+
+ /*
+ * Unused fields.
+ */
+
+ info.count = 0;
+ info.stream = NULL;
+
+ XtSetArg(args[0], XtNlabel, &line);
+ XtGetValues(node->resources->res_box->res_label, args, ONE);
+
+ info.database = NULL;
+ XrmPutLineResource(&(info.database), line);
+
+
+ ExecuteOverAllNodes(node->tree_info->top_node,
+ SetOnlyMatchingWidgets, (XtPointer) &info);
+
+ XrmDestroyDatabase(info.database);
+}
+
+/* Function Name: SetOnlyMatchingWidgets
+ * Description: Activates all widgets in the tree that match this
+ * resource specifiction.
+ * Arguments: node - the current node.
+ * info_ptr - the pointer to the apply info.
+ * Returns: none
+ */
+
+static void
+SetOnlyMatchingWidgets(node, info_ptr)
+WNode * node;
+XtPointer info_ptr;
+{
+ ApplyResourcesInfo * info = (ApplyResourcesInfo *) info_ptr;
+ XrmNameList name_quarks;
+ XrmClassList class_quarks;
+ char ** names, **classes;
+ Boolean state;
+ Arg args[1];
+
+ GetNamesAndClasses(node, &names, &classes);
+ name_quarks = (XrmNameList) Quarkify(names, info->name);
+ class_quarks = (XrmNameList) Quarkify(classes, info->class);
+
+ state = CheckDatabase(info->database, name_quarks, class_quarks);
+
+ XtSetArg(args[0], XtNstate, state);
+ XtSetValues(node->widget, args, ONE);
+ TreeToggle(node->widget, (XtPointer) node, (XtPointer)(long) state);
+
+ XtFree((char *)names);
+ XtFree((char *)classes);
+ XtFree((char *)name_quarks);
+ XtFree((char *)class_quarks);
+}