summaryrefslogtreecommitdiff
path: root/actions.c
diff options
context:
space:
mode:
Diffstat (limited to 'actions.c')
-rw-r--r--actions.c358
1 files changed, 358 insertions, 0 deletions
diff --git a/actions.c b/actions.c
new file mode 100644
index 0000000..80e8940
--- /dev/null
+++ b/actions.c
@@ -0,0 +1,358 @@
+/*
+ * $Xorg: actions.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 <stdio.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xutil.h>
+
+#include <X11/Xaw/Cardinals.h>
+
+#include "editresP.h"
+
+/*
+ * External Functions.
+ */
+
+extern void SetMessage(), _TreeSelect(), _TreeSelectNode(), _FindWidget();
+extern void _TreeActivateNode(), _TreeRelabel(), _TreeRelabelNode();
+extern void PrepareToLayoutTree(), LayoutTree(), _PopdownFileDialog();
+
+/*
+ * Private data.
+ */
+
+struct ActionValues {
+ String name;
+ int type;
+};
+
+static struct ActionValues select_values[] = {
+ { "widget", (int) SelectWidget },
+ { "all", (int) SelectAll },
+ { "nothing", (int) SelectNone },
+ { "invert", (int) SelectInvert },
+ { "children", (int) SelectChildren },
+ { "descendants", (int) SelectDescendants },
+ { "parent", (int) SelectParent },
+ { "ancestors", (int) SelectAncestors }
+};
+
+static struct ActionValues label_values[] = {
+ { "name", (int) NameLabel },
+ { "class", (int) ClassLabel },
+ { "id", (int) IDLabel },
+ { "window", (int) WindowLabel },
+ { "toggle", (int) ToggleLabel }
+};
+
+static WNode * FindTreeNodeFromWidget();
+static Boolean CheckAndFindEntry();
+
+/* Function Name: EnableGetVal
+ * Description: sets a global variable to notify the Notify action
+ * for the resource list widet to do GetValues.
+ * Arguments: w - any widget in the widget tree.
+ * event - NOT USED.
+ * params, num_params - the parameters paseed to the action
+ * routine.
+ *
+ */
+
+Boolean do_get_values = False;
+
+/* ARGSUSED */
+static void
+EnableGetVal(w, event, params, num_params)
+Widget w;
+XEvent * event;
+String * params;
+Cardinal * num_params;
+{
+ do_get_values = True;
+}
+
+/* Function Name: SelectAction
+ * Description:
+ * Arguments: w - any widget in the widget tree.
+ * event - NOT USED.
+ * params, num_params - the parameters paseed to the action
+ * routine.
+ *
+ * params[0] - One of "nothing", "parent", "children", "ancestors",
+ * "descendants", "invert", "all"
+ * num_params - must be one.
+ */
+
+/* ARGSUSED */
+static void
+SelectAction(w, event, params, num_params)
+Widget w;
+XEvent * event;
+String * params;
+Cardinal * num_params;
+{
+ WNode * node;
+ int type;
+
+ if (!CheckAndFindEntry("Select", params, *num_params,
+ select_values, XtNumber(select_values), &type))
+ return;
+
+ switch(type) {
+ case SelectAll:
+ case SelectNone:
+ case SelectInvert:
+ _TreeSelect(global_tree_info, type);
+ break;
+ case SelectWidget:
+ _FindWidget(XtParent(w));
+ break;
+ default:
+ node = FindTreeNodeFromWidget(w);
+ if (node)
+ _TreeActivateNode(node, type);
+ else
+ _TreeSelect(global_tree_info, type);
+ break;
+ }
+}
+
+/* Function Name: RelabelAction
+ * Description:
+ * Arguments: w - any widget in the widget tree.
+ * event - NOT USED.
+ * params, num_params - the parameters paseed to the action
+ * routine.
+ *
+ * params[0] - One of "name", "class", "id"
+ * num_params - must be one.
+ */
+
+/* ARGSUSED */
+static void
+RelabelAction(w, event, params, num_params)
+Widget w;
+XEvent * event;
+String * params;
+Cardinal * num_params;
+{
+ WNode * node;
+ int type;
+
+ if (!CheckAndFindEntry("Relabel", params, *num_params,
+ label_values, XtNumber(label_values), &type))
+ return;
+
+ if ((node = FindTreeNodeFromWidget(w)) == NULL)
+ _TreeRelabel(global_tree_info, type);
+ else {
+ PrepareToLayoutTree(global_tree_info->tree_widget);
+ _TreeRelabelNode(node, type, FALSE);
+ LayoutTree(global_tree_info->tree_widget);
+ }
+}
+
+/* Function Name: PopdownFileDialogAction
+ * Description: Pops down the file dialog widget.
+ * and calls the approipriate handler.
+ * Arguments: w - any child of the dialog widget.
+ * event - the event that caused this action.
+ * params, num_params - params passed to the action routine.
+ * RETURNED none.
+ */
+
+/* ARGSUSED */
+
+static void
+PopdownFileDialogAction(w, event, params, num_params)
+Widget w;
+XEvent * event;
+String * params;
+Cardinal * num_params;
+{
+ char buf[BUFSIZ];
+ Boolean val;
+
+ if (*num_params != 1) {
+ sprintf(buf, res_labels[2],
+ "PopdownFileDialog");
+
+ SetMessage(global_screen_data.info_label, buf);
+ return;
+ }
+
+ XmuCopyISOLatin1Lowered(buf, params[0]);
+
+ if (streq(buf, "cancel"))
+ val = FALSE;
+ else if (streq(buf, "okay"))
+ val = TRUE;
+ else {
+ sprintf(buf, res_labels[1],
+ "PopdownFileDialog");
+
+ SetMessage(global_screen_data.info_label, buf);
+ return;
+ }
+
+ _PopdownFileDialog(w, (XtPointer)(long) val, NULL);
+}
+
+/* Function Name: ActionQuit
+ * Description: This function prints a message to stdout.
+ * Arguments: w - ** UNUSED **
+ * call_data - ** UNUSED **
+ * client_data - ** UNUSED **
+ * Returns: none
+ */
+
+/* ARGSUSED */
+static void
+ActionQuit(w, event, params, num_params)
+Widget w;
+XEvent * event;
+String * params;
+Cardinal * num_params;
+{
+ if (w==global_toplevel) {
+ XtDestroyApplicationContext(XtWidgetToApplicationContext(w));
+ exit(0);
+ }
+ else {
+ if (streq(XtName(w), RESOURCE_BOX))
+ global_resource_box_up = FALSE;
+ XtPopdown(w);
+ XtDestroyWidget(w);
+ }
+}
+
+/* Function Name: SetApplicationActions
+ * Description: Sets my application actions.
+ * Arguments: app_con - the application context.
+ * Returns: none.
+ */
+
+extern void ModifySVEntry();
+
+static XtActionsRec actions[] = {
+ {"EnableGetVal", EnableGetVal},
+ {"Select", SelectAction},
+ {"SVActiveEntry", ModifySVEntry},
+ {"Relabel", RelabelAction},
+ {"PopdownFileDialog", PopdownFileDialogAction},
+ {"quit", ActionQuit}
+};
+
+void
+SetApplicationActions(app_con)
+XtAppContext app_con;
+{
+ XtAppAddActions(app_con, actions, XtNumber(actions));
+
+}
+
+
+/************************************************************
+ *
+ * Private functions
+ *
+ ************************************************************/
+
+/* Function Name: CheckAndFindEntry
+ * Description: Checks the args to make sure they are valid,
+ * then parses the arg list to find the correct action
+ * to take.
+ * Arguments: action_name - name of the action (for error messages).
+ * params, num_params - params passed to the action routine.
+ * table, num_table - table to check the parameters against.
+ * RETURNED type - info about the action to take.
+ * Returns: TRUE if the arguments are okay.
+ */
+
+static Boolean
+CheckAndFindEntry(action_name, params, num_params, table, num_table, type)
+String * params, action_name;
+Cardinal num_params, num_table;
+struct ActionValues * table;
+int * type;
+{
+ char buf[BUFSIZ];
+ int i;
+
+ if (num_params != 1) {
+ sprintf(buf, res_labels[2],
+ action_name);
+ SetMessage(global_screen_data.info_label, buf);
+ return(FALSE);
+ }
+
+ XmuCopyISOLatin1Lowered(buf, params[0]);
+ for ( i = 0 ; i < num_table; i++ )
+ if (streq(buf, table[i].name)) {
+ *type = table[i].type;
+ return(TRUE);
+ }
+
+ sprintf(buf,res_labels[3],
+ action_name);
+
+ for (i = 0; i < num_table; ) {
+ strcat(buf, table[i++].name);
+
+ if (i == (num_table - 1))
+ strcat(buf, ", or ");
+ else if (i < num_table)
+ strcat(buf, ", ");
+ }
+
+ SetMessage(global_screen_data.info_label, buf);
+ return(FALSE);
+}
+
+/* Function Name: FindTreeNodeFromWidget
+ * Description: finds the tree node associated with a widget.
+ * Arguments: w - widget to check.
+ * Returns: the node associated with this widget, or NULL.
+ */
+
+static WNode *
+FindTreeNodeFromWidget(w)
+Widget w;
+{
+ int ret_val;
+ XPointer data_return;
+
+ /*
+ * Yes, I really am casting a widget to a window ** TRUST ME ***
+ */
+
+ ret_val = XFindContext(XtDisplay(w), (Window) w, NODE_INFO, &data_return);
+
+ if (ret_val == 0)
+ return((WNode *) data_return);
+ return(NULL);
+}
+