2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $TOG: dtkcmds.c /main/13 1997/07/14 18:16:01 samborn $ */
24 /* Copyright (c) 1991, 1992 UNIX System Laboratories, Inc. */
25 /* All Rights Reserved */
27 /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
28 /* UNIX System Laboratories, Inc. */
29 /* The copyright notice above does not evidence any */
30 /* actual or intended publication of such source code. */
39 #include <X11/Intrinsic.h>
40 #include <X11/IntrinsicP.h>
41 #include <X11/CoreP.h>
42 #include <X11/StringDefs.h>
43 #include <Xm/XmStrDefs.h>
48 #include <Xm/Protocols.h>
49 #include <Dt/Service.h>
51 #include <Dt/HourGlass.h>
53 #include <Dt/Action.h>
68 #include "xmwidgets.h"
72 extern Namval_t *sh_assignok(register Namval_t *np,int add);
75 static void PendingDestroy(
79 static Boolean WtabDestroy(
81 static int _CreateWidget(
85 static int _DTKSH_XtDestroyWidget(
87 static int do_single_widget_arg_func(
91 static void mainloopsighandler(
93 static int XtCallCallbacks_usage(
95 static void RegisterCmdStr(
99 static void RemoveCmdStr(
102 static int do_RootWindowCmd(
106 static int cvtfontstruct(
109 static int CatchNonFatalFontError(
111 XErrorEvent *event) ;
119 static int invokeXDrawFunction(
123 static int XtAddInputUsage(
125 static void DestroyInputRecord(
127 static int FindInputRecord(
129 static Boolean ProcessInput(
134 static int VerifyString_usage(
136 static int XtSetSensitive_usage(
138 static int GetDisplayHandle(
142 static int RegisterTranslations(
146 static int LocateEHRecord(
149 static int GetWorkspaceList(
154 static int DtTurnOnOrOffHourGlass(
158 static int WsmCommonProc(
162 static int ttdt_SaveOrRevert(
166 static int message_DestroyOrReply(
170 static int message_FailOrReject(
174 static Tt_message TtFileCB(
181 static int tt_netfile_handler(
187 static Namval_t * CreateEmptyNameValuePair(
191 static Namval_t * ProcessIntValue(
198 static Namval_t * ProcessStringValue(
203 static Namval_t * ProcessBooleanIntValue(
209 static Namval_t * ProcessTraversalDirection(
210 XmTraversalDirection dir,
214 static Namval_t * ProcessSelectionType(
219 static Namval_t * ProcessIntTable(
225 static Namval_t * ProcessXmStringTable(
231 static Namval_t * ProcessWidgetHandle(
236 static Namval_t * ProcessXmStringValue(
241 static Namval_t * ProcessHyperType(
246 static void InitEventTables( void ) ;
247 static Namval_t * ProcessCallbackEvent(
252 static Namval_t * _IntProcessCallbackReason(
253 struct named_integer *table,
254 XmAnyCallbackStruct *cbData,
258 static Namval_t * ProcessCallbackReason(
259 XmAnyCallbackStruct *cbData,
263 static Namval_t * ProcessHelpCallbackReason(
264 XmAnyCallbackStruct *cbData,
268 static void _DtActionInvokeUsage( void ) ;
269 static void DtkReloadHandler(
270 XtPointer clientData ) ;
271 static Namfun_t * CloneDiscipline(
272 Namdisc_t * discipline );
273 static void FreeDiscipline(
274 Namfun_t * discipline );
275 static Namdisc_t * CheckClassDisciplines(
282 void SetTextStartPos(
314 #define CLEAR_WINDOW 1
316 #define DRAW_IMAGE_STRING 3
320 #define DRAW_POINTS 7
321 #define DRAW_RECTANGLE 8
322 #define DRAW_SEGMENTS 9
323 #define DRAW_STRING 10
325 #define FILL_POLYGON 12
326 #define FILL_RECTANGLE 13
329 #define WORKPROC_CMDS 0
330 #define TIMEOUT_CMDS 1
334 #define SLISTITEMSIZE 16
339 /* List of all name/value pairs created during handling of a callback */
340 Namval_t *** npTable = NULL;
342 int * npListSizes = NULL;
343 int nestingLevel = -1;
345 static Namdisc_t transDiscipline ={0, NULL, NULL, NULL, NULL,
346 (Namval_t *(*)())transCreateDisc, NULL, NULL};
347 static Namdisc_t ehDiscipline = {0, NULL, NULL, NULL, NULL,
348 (Namval_t *(*)())ehCreateDisc, NULL, NULL};
349 static Namdisc_t dftDiscipline = {0, NULL, NULL, NULL, NULL,
350 (Namval_t *(*)())dftCreateDisc, NULL, NULL};
351 static Namdisc_t nopDiscipline = {0, NULL, NULL, NULL, NULL,
352 (Namval_t *(*)())nopCreateDisc, NULL, NULL};
354 static Namdisc_t text_doit_disc = {0, (void (*)())SetTextDoit, NULL, NULL, NULL,
356 static Namdisc_t text_startpos_disc = {0, (void (*)())SetTextStartPos, NULL,
357 NULL, NULL,NULL, NULL, NULL};
358 static Namdisc_t text_endpos_disc = {0, (void (*)())SetTextEndPos, NULL, NULL,
359 NULL, NULL, NULL, NULL};
360 static Namdisc_t text_ptr_disc = {0, (void (*)())SetTextPtr, NULL, NULL, NULL,
362 static Namdisc_t text_len_disc = {0, (void (*)())SetTextLen, NULL, NULL, NULL,
364 static Namdisc_t text_format_disc = {0, (void (*)())SetTextFormat, NULL, NULL,
365 NULL, NULL, NULL, NULL};
366 static Namdisc_t text_wcsptr_disc = {0, (void (*)())SetTextWCSptr, NULL, NULL,
367 NULL, NULL, NULL, NULL};
368 static Namdisc_t text_wcslen_disc = {0, (void (*)())SetTextWCSlen, NULL, NULL,
369 NULL, NULL, NULL, NULL};
371 static const XtActionsRec Ksh_actions[] = {
372 { "ksh_eval", Translation_ksh_eval }
375 static dtksh_client_data_t ** cbDataTable = NULL;
376 static int cbDataTableSize = 0;
377 static dtksh_event_handler_data_t ** ehDataTable = NULL;
378 static int ehDataTableSize = 0;
380 static char * str_XtRString = XtRString;
382 char str_s_eq_s[] = "%s=%s";
383 char str_s_eq[] = "%s=";
384 char str_nill[] = "";
398 CommandString * workProcCmds = NULL;
399 int workProcCmdsSize = 0;
400 CommandString * timeOutCmds = NULL;
401 int timeOutCmdsSize = 0;
406 Tt_pattern * patterns;
409 Ttdt_file_cb_data ** fileCBList = 0;
410 int sizeFileCBList = 0;
414 char * representation;
415 Cardinal valueOffset;
421 EventEntryTable * table;
425 /* Keeps track of file input generated by XtAddInput() */
432 InputRecord * activeInputs = NULL;
433 int numActiveInputs = 0;
438 * When we are notified that a widget is being destroyed (through the
439 * widget's destroy callback, it is not yet safe for us to remove all
440 * internal knowledge of that widget, because the shell script may have
441 * also added a destroy callback, which gets call AFTER ours. Therefore,
442 * all we can do is mark the widget as 'pending destroy', and add a
443 * workproc; the workproc will then take care of removing the widget.
446 static Boolean workProcAdded = False;
454 wtab->mask |= DT_PENDING_DESTROY;
457 workProcAdded = True;
458 XtAddWorkProc((XtWorkProc)WtabDestroy, NULL);
469 for (i = 0; i < NumW; i++)
471 if ((W[i]->type == TAB_WIDGET) && (W[i]->mask & DT_PENDING_DESTROY))
476 char *val = env_get(W[i]->envar);
479 * Blank out the environment variable holding the
480 * widget handle, but only if it still holds the
481 * handle! This guards against the possibility that
482 * the user has re-used the same variable for another
485 if (val && W[i]->widid && strcmp(val, W[i]->widid) == 0) {
486 env_blank(W[i]->envar);
490 W[i]->type = TAB_EMPTY;
495 workProcAdded = False;
510 get_new_wtab(&w, widid);
512 env_set_var(var, widid);
513 w->envar = strdup(var);
515 w->envar = strdup("none");
517 w->type = TAB_WIDGET;
518 w->wname = name ? strdup(name) : strdup(XtName(wid));
521 w->widid = strdup(widid);
524 XtAddCallback(wid, XtNdestroyCallback, (XtCallbackProc)PendingDestroy,
529 static short Needfree[MAXARGS];
543 Boolean postponePixmaps )
546 register char *colon, *resource, *val, *p;
550 int conversionResult;
555 for (i = 0; i < argc; i++) {
557 errmsg = strdup(GETMESSAGE(5,1,
558 "Too many resource parameters have been specified; skipping '%s'"));
559 printerrf(arg0, errmsg,
560 argv[*n], NULL, NULL, NULL, NULL, NULL,
565 if ((colon = strchr(argv[i], ':')) == NULL)
567 errmsg = strdup(GETMESSAGE(5,2,
568 "Bad resource specification; should be of the form 'name:value' : %s"));
569 printerrf(arg0, errmsg,
570 argv[i], NULL, NULL, NULL, NULL, NULL, NULL, NULL);
575 len = colon - argv[i];
576 resource = XtMalloc(len + 1);
577 strncpy(resource, argv[i], len);
578 resource[len] = '\0';
581 * The following special check fixes a bug in Xt, where the
582 * string defined for the XmNwaitForWm resource does not
583 * follow the naming conventions, and is set to "waitforwm".
584 * In dtksh, users expect the naming conventions to be
585 * followed, and this breaks for this one resource.
587 if (strcmp(resource, "waitForWm") == 0)
588 strcpy(resource, XmNwaitForWm);
590 if ((conversionResult = ConvertStringToType(arg0, w, parent,
591 class, resource, val, &argval, &freeflag,
592 postponePixmaps)) == CONVERT_SUCCEEDED)
594 XtSetArg(args[*n], resource, argval);
597 * The following is a memory leak, but it allows us to
598 * comply with what Xt has spec'ed as the required
599 * behavior of the geometry string (It is a bogus
600 * requirement!). The Xt Shell widget does not make
601 * a copy of the incoming 'geometry' string, but
602 * instead, simply keeps a pointer to the string
603 * passed-in by the application. For dtksh, this is
604 * a problem, because we would typically free up the
605 * string right away. This hack causes us to not free
608 if (strcmp(resource, XmNgeometry) == 0)
609 Needfree[*n] = False;
611 Needfree[*n] = freeflag;
615 else if (conversionResult == CONVERT_POSTPONED)
618 * Postpone processing this resource until after the
619 * the widget has been created, or, in the case of a
620 * pixmap resource, until any new colors have been set.
624 pargv[*pargc] = argv[i];
644 * Free up argument pointers
646 for (i = 0; i < n; i++) {
647 XtFree(args[i].name);
649 XtFree((String)args[i].value);
665 if (Toplevel != NULL)
667 errmsg = strdup(GETMESSAGE(5,4,
668 "The toolkit has already been initialized"));
669 printerr(argv[0], errmsg, NULL);
675 errmsg =strdup(GETMESSAGE(5,5,
676 "Usage: XtInitialize variable applicationName applicationClass [args ...]"));
677 printerr(str_nill, errmsg, NULL);
681 lockedFds = LockKshFileDescriptors();
682 ret = toolkit_initialize(argc, argv);
683 UnlockKshFileDescriptors(lockedFds);
684 XtAddActions((XtActionList)Ksh_actions, XtNumber(Ksh_actions));
685 if ((dtkdb_hook = env_get("DTKDB_HOOK")) != NULL) {
686 ksh_eval(dtkdb_hook);
699 char *arg0 = argv[0];
700 wtab_t *w, *pw, *wtab;
701 char *wname, *wclass, *parentid, *var;
710 errmsg = strdup(GETMESSAGE(5,6,
711 "Usage: %s variable name class parent [arg:val ...]"));
712 printerrf(str_nill, errmsg,
713 argv[0], NULL, NULL, NULL, NULL, NULL, NULL, NULL);
721 pw = str_to_wtab(argv[0], parentid);
723 errmsg = strdup(GetSharedMsg(DT_NO_PARENT));
724 printerr(argv[0], errmsg, NULL);
730 if ((class = str_to_class(arg0, wclass)) == NULL) {
735 pargv = (char **)XtMalloc(sizeof(char *) * argc);
741 parse_args(arg0, argc, argv, NULL, pw, class, &n, args, &pargc, pargv,
743 widget = func(wname, class->class, pw->w, args, n);
744 if (widget != NULL) {
745 wtab = set_up_w(widget, pw, var, wname, class);
747 /* Process any postponed resources */
752 parse_args(arg0, pargc, pargv, wtab, pw, class, &n,
753 args, NULL, NULL, False);
754 XtSetValues(widget, args, n);
757 errmsg = strdup(GetSharedMsg(DT_WIDGET_CREATE_FAILED));
758 printerrf(argv[0], errmsg, wname,
759 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
764 XtFree((char *)pargv);
770 do_XtCreateApplicationShell(
776 char *arg0 = argv[0];
778 char *wname, *wclass, *var;
787 errmsg=strdup(GETMESSAGE(5,7,
788 "Usage: XtCreateApplicationShell variable name class [arg:val ...]"));
789 printerr(str_nill, errmsg, NULL);
798 if ((class = str_to_class(arg0, wclass)) == NULL) {
803 pargv = (char **)XtMalloc(sizeof(char *) * argc);
809 parse_args(arg0, argc, argv, NULL, NULL, class, &n, args, &pargc,
811 widget = XtCreateApplicationShell(wname, class->class, args, n);
812 if (widget != NULL) {
813 wtab = set_up_w(widget, NULL, var, wname, class);
815 /* Process any postponed resources */
820 parse_args(arg0, pargc, pargv, wtab, NULL, class,
821 &n, args, NULL, NULL, False);
822 XtSetValues(widget, args, n);
825 errmsg = strdup(GetSharedMsg(DT_WIDGET_CREATE_FAILED));
826 printerrf(argv[0], errmsg, wname,
827 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
832 XtFree((char *)pargv);
838 do_XtCreatePopupShell(
842 return(_CreateWidget(XtCreatePopupShell, argc, argv));
846 do_XtCreateManagedWidget(
850 return(_CreateWidget(XtCreateManagedWidget, argc, argv));
858 return(_CreateWidget(XtCreateWidget, argc, argv));
872 errmsg=strdup(GETMESSAGE(5,8,
873 "Usage: XtPopup widget GrabNone|GrabNonexclusive|GrabExclusive"));
874 printerr(str_nill, errmsg, NULL);
878 w = str_to_wtab(argv[0], argv[1]);
884 if (argc < 3 || strcmp(argv[2], "GrabNone") == 0)
886 else if (strcmp(argv[2], "GrabNonexclusive") == 0)
887 grab = XtGrabNonexclusive;
888 else if (strcmp(argv[2], "GrabExclusive") == 0)
889 grab = XtGrabExclusive;
892 errmsg=strdup(GETMESSAGE(5,9,
893 "The grab type '%s' is not recognized; using 'GrabNone'"));
894 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
905 _DTKSH_XtDestroyWidget(
913 do_single_widget_arg_func(
923 errmsg = strdup(GetSharedMsg(DT_USAGE_WIDGET));
924 printerrf(str_nill, errmsg, argv[0], NULL, NULL,
925 NULL, NULL, NULL, NULL, NULL);
929 for (i = 1; i < argc; i++) {
930 w = str_to_wtab(argv[0], argv[i]);
943 return(do_single_widget_arg_func(_DTKSH_XtDestroyWidget, argc, argv));
947 do_single_widget_test_func(
957 errmsg=strdup(GetSharedMsg(DT_USAGE_WIDGET));
958 printerrf(str_nill, errmsg, argv[0], NULL, NULL,
959 NULL, NULL, NULL, NULL, NULL);
963 w = str_to_wtab(argv[0], argv[1]);
975 return(do_single_widget_test_func((int(*)())XtIsSensitive, argc, argv));
980 * XtIsShell() is a macro, so we can't use do_single_widget_test_func().
993 errmsg = strdup(GETMESSAGE(5,10, "Usage: XtIsShell widget"));
994 printerr(str_nill, errmsg, NULL);
999 w = str_to_wtab(argv[0], argv[1]);
1001 return(!XtIsShell(w->w));
1010 return(do_single_widget_test_func((int(*)())XtIsManaged, argc, argv));
1018 return(do_single_widget_test_func((int(*)())XtIsRealized, argc, argv));
1026 return(do_single_widget_arg_func((int(*)())XtRealizeWidget, argc, argv));
1030 do_XtUnrealizeWidget(
1034 return(do_single_widget_arg_func((int(*)())XtUnrealizeWidget, argc, argv));
1038 * XtMapWidget() is a macro, so can't use do_single_widget_arg_func()
1051 errmsg = strdup(GETMESSAGE(5,11, "Usage: XtMapWidget widget"));
1052 printerr(str_nill, errmsg, NULL);
1056 for (i = 1; i < argc; i++) {
1057 w = str_to_wtab(argv[0], argv[i]);
1075 errmsg = strdup(GETMESSAGE(5,12, "Usage: XtUnmapWidget widget"));
1076 printerr(str_nill, errmsg, NULL);
1080 for (i = 1; i < argc; i++) {
1081 w = str_to_wtab(argv[0], argv[i]);
1083 XtUnmapWidget(w->w);
1094 return(do_single_widget_arg_func((int(*)())XtPopdown, argc, argv));
1103 * Required to guarantee that all of the shell script's "echo"
1104 * requests have been taken care of, before we drop into the
1105 * the black hole called XtMainLoop.
1119 return(GetDisplayHandle(argc, argv, (Widget (*)())XtDisplay));
1124 do_XtDisplayOfObject(
1128 return(GetDisplayHandle(argc, argv, (Widget (*)())XtDisplayOfObject));
1139 char *arg0 = argv[0];
1140 char * variable = argv[1];
1146 errmsg = strdup(GETMESSAGE(5,13, "Usage: %s variable widget"));
1147 printerrf(str_nill, errmsg, arg0, NULL, NULL, NULL, NULL, NULL,
1153 w = str_to_wtab(arg0, argv[2]);
1157 sprintf(buf, "0x%lx", (long)(*func)(w->w));
1158 alt_env_set_var(variable, buf);
1168 char *arg0 = argv[0];
1170 char * variable = argv[1];
1177 errmsg = strdup(GETMESSAGE(5,82,
1178 "Usage: XtNameToWidget variable referenceWidget names"));
1179 printerr(str_nill, errmsg, NULL);
1184 w = str_to_wtab(arg0, argv[2]);
1186 alt_env_set_var(variable, str_nill);
1190 child = XtNameToWidget(w->w, argv[3]);
1194 alt_env_set_var(variable, str_nill);
1198 w = widget_to_wtab(child);
1200 alt_env_set_var(variable, str_nill);
1204 * If the widget class has no resources registered, then this is
1205 * the first known instance of this widget class, so we need to
1206 * force the resource list to be loaded. This can frequently
1207 * occur if a Motif convenience function is used, which creates
1208 * a 'hidden' parent.
1211 if (ctab->res == NULL)
1212 (void)str_to_class(arg0, ctab->cname);
1214 alt_env_set_var(variable, w->widid);
1225 char *arg0 = argv[0];
1226 char * variable = argv[1];
1232 errmsg = strdup(GETMESSAGE(5,14, "Usage: XtScreen variable widget"));
1233 printerr(str_nill, errmsg, NULL);
1238 w = str_to_wtab(arg0, argv[2]);
1242 sprintf(buf, "0x%lx", (long)XtScreen(w->w));
1243 alt_env_set_var(variable, buf);
1254 char *arg0 = argv[0];
1255 char * variable = argv[1];
1261 errmsg = strdup(GETMESSAGE(5,15, "Usage: XtWindow variable widget"));
1262 printerr(str_nill, errmsg, NULL);
1267 w = str_to_wtab(arg0, argv[2]);
1271 sprintf(buf, "0x%lx", (long)XtWindow(w->w));
1272 alt_env_set_var(variable, buf);
1278 XtCallCallbacks_usage(
1283 errmsg = strdup(GETMESSAGE(5,16,
1284 "Usage: XtCallCallbacks widget callbackName"));
1285 printerr(str_nill, errmsg, NULL);
1297 char *arg0 = argv[0];
1300 return(XtCallCallbacks_usage(arg0));
1302 w = str_to_wtab(argv[0], argv[1]);
1306 XtCallCallbacks(w->w, argv[2], NULL);
1317 char *arg0 = argv[0];
1319 char * variable = argv[1];
1320 XtCallbackStatus callbackStatus;
1321 XrmValue fval, tval;
1326 errmsg = strdup(GETMESSAGE(5,17,
1327 "Usage: XtHasCallbacks variable widget callbackName"));
1328 printerr(str_nill, errmsg, NULL);
1333 w = str_to_wtab(argv[0], argv[2]);
1337 callbackStatus = XtHasCallbacks(w->w, argv[3]);
1339 switch (callbackStatus)
1341 case XtCallbackNoList:
1343 msg = "CallbackNoList";
1346 case XtCallbackHasNone:
1348 msg = "CallbackHasNone";
1351 case XtCallbackHasSome:
1353 msg = "CallbackHasSome";
1357 alt_env_set_var(variable, msg);
1370 errmsg = strdup(GETMESSAGE(5,18,
1371 "Usage: XtAddCallback widget callbackName ksh-command"));
1372 printerr(str_nill, errmsg, NULL);
1377 return(AddOneCallback(argv[0], argv[1], argv[2], argv[3], NULL));
1382 * This function is used to add both regular Xt Callbacks, and
1383 * Motif WMProtocol callback.
1394 dtksh_client_data_t *cdata;
1399 w = str_to_wtab(cmd, widget);
1405 propAtom = (Atom)strtoul(propAtomStr, &p, 0);
1406 if (p == propAtomStr)
1408 errmsg = strdup(GetSharedMsg(DT_BAD_ATOM));
1409 printerrf(cmd, errmsg, propAtomStr, NULL, NULL, NULL, NULL, NULL,
1418 cdata = GetNewCBData(kshcmd, w, cbName, propAtom);
1420 if (strcmp(cmd, "XtAddCallback") == 0)
1421 XtAddCallback(w->w, cbName, (XtCallbackProc)stdCB, (XtPointer)cdata);
1424 XmAddWMProtocolCallback(w->w, propAtom, (XtCallbackProc)stdCB,
1432 do_XtRemoveCallback(
1440 errmsg = strdup(GETMESSAGE(5,19,
1441 "Usage: XtRemoveCallback widget callbackName ksh-command"));
1442 printerr(str_nill, errmsg, NULL);
1447 return(RemoveOneCallback (argv[0], argv[1], argv[2], argv[3], NULL, NULL));
1451 * This function is used to delete both regular Xt Callbacks, and
1452 * Motif WMProtocol callback.
1464 dtksh_client_data_t *cdata;
1468 DtWsmCBContext handle;
1471 w = str_to_wtab(cmd, widget);
1477 propAtom = (Atom)strtoul(propAtomStr, &p, 0);
1478 if (p == propAtomStr)
1480 errmsg = strdup(GetSharedMsg(DT_BAD_ATOM));
1481 printerrf(cmd, errmsg, propAtomStr, NULL, NULL, NULL, NULL, NULL,
1492 handle = (DtWsmCBContext)strtoul(handleStr, &p, 0);
1495 errmsg = strdup(GETMESSAGE(5,20,
1496 "The following is an invalid callback handle: %s"));
1497 printerrf(cmd, errmsg, handleStr, NULL, NULL, NULL, NULL, NULL,
1506 /* Locate the matching table entry */
1507 if ((i = LocateCBRecord (w, cbName, kshcmd, propAtom, handle)) >= 0)
1509 cdata = cbDataTable[i];
1510 if (strcmp(cmd, "XtRemoveCallback") == 0)
1511 XtRemoveCallback(w->w, cbName, (XtCallbackProc)stdCB,(XtPointer)cdata);
1512 else if (strcmp(cmd, "XmRemoveWMProtocolCallback") == 0)
1514 XmRemoveWMProtocolCallback(w->w, propAtom, (XtCallbackProc)stdCB,
1519 DtWsmRemoveWorkspaceCallback(handle);
1522 if (--(cdata->refCount) <= 0)
1524 XtFree(cdata->ksh_cmd);
1525 XtFree(cdata->cbname);
1526 XtFree((XtPointer)cdata);
1527 cbDataTable[i] = NULL;
1534 errmsg = strdup(GETMESSAGE(5,21,
1535 "The specified callback is not registered"));
1536 printerr(cmd, errmsg, NULL);
1542 do_XtAddEventHandler(
1547 char *arg0 = argv[0];
1548 dtksh_event_handler_data_t *ehdata;
1549 Boolean nonMaskable;
1550 EventMask eventMask;
1551 XrmValue fval, tval;
1556 errmsg=strdup(GETMESSAGE(5,22,
1557 "Usage: XtAddEventHandler widget mask nonMaskable ksh-command"));
1558 printerr(str_nill, errmsg, NULL);
1563 w = str_to_wtab(arg0, argv[1]);
1567 fval.addr = argv[3];
1568 fval.size = strlen(argv[3]);
1569 XtConvert(Toplevel, XtRString, &fval, XtRBoolean, &tval);
1572 nonMaskable = *((Boolean *)(tval.addr));
1576 fval.addr = argv[2];
1577 fval.size = strlen(argv[2]);
1578 XtConvert(Toplevel, XtRString, &fval, "EventMask", &tval);
1581 eventMask = *((EventMask *)(tval.addr));
1585 if ((eventMask == 0) && (nonMaskable == False))
1588 ehdata = GetNewEHData(argv[4], w, eventMask, nonMaskable);
1590 XtAddEventHandler(w->w, eventMask, nonMaskable, (XtEventHandler)stdEH,
1597 do_XtRemoveEventHandler(
1602 char *arg0 = argv[0];
1603 dtksh_event_handler_data_t *ehdata;
1605 Boolean nonMaskable;
1606 EventMask eventMask;
1607 XrmValue fval, tval;
1612 errmsg =strdup(GETMESSAGE(5,23,
1613 "Usage: XtRemoveEventHandler widget mask nonMaskable ksh-command"));
1614 printerr(str_nill, errmsg, NULL);
1619 w = str_to_wtab(arg0, argv[1]);
1623 /* Locate the matching table entry */
1624 if ((i = LocateEHRecord (w, argv[4])) >= 0)
1626 ehdata = ehDataTable[i];
1628 fval.addr = argv[3];
1629 fval.size = strlen(argv[3]);
1630 XtConvert(Toplevel, XtRString, &fval, XtRBoolean, &tval);
1634 nonMaskable = *((Boolean *)(tval.addr));
1636 /* See if non-maskable event processing has been turned off */
1638 ehdata->nonMaskable = False;
1643 fval.addr = argv[2];
1644 fval.size = strlen(argv[2]);
1645 XtConvert(Toplevel, XtRString, &fval, "EventMask", &tval);
1649 eventMask = *((EventMask *)(tval.addr));
1651 /* Disable the specified set of events */
1652 ehdata->eventMask &= ~eventMask;
1657 XtRemoveEventHandler (w->w, eventMask, nonMaskable, (XtEventHandler)stdEH,
1660 if ((ehdata->eventMask == 0) && (ehdata->nonMaskable == False))
1662 /* It is now safe to remove this entry */
1663 XtFree(ehdata->ksh_cmd);
1664 XtFree((XtPointer)ehdata);
1665 ehDataTable[i] = NULL;
1672 errmsg = strdup(GETMESSAGE(5,24,
1673 "The specified event handler is not registered"));
1674 printerr(arg0, errmsg, NULL);
1686 char *arg0 = argv[0];
1687 char *val, *p, *str;
1689 char *envar[MAXARGS];
1694 errmsg = strdup(GETMESSAGE(5,25,
1695 "Usage: XtGetValues widget resource:variable ..."));
1696 printerr(str_nill, errmsg, NULL);
1700 w = str_to_wtab(argv[0], argv[1]);
1707 * Arguments are of the form:
1712 for (i = 0, n = 0; i < argc; i++) {
1713 if ((p = strchr(argv[i], ':')) == NULL) {
1714 errmsg=strdup(GETMESSAGE(5,26,
1715 "The following resource parameter is incorrectly formed: %s"));
1716 printerrf(arg0, errmsg, argv[i],
1717 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
1724 * The following special check fixes a bug in Xt, where the
1725 * string defined for the XmNwaitForWm resource does not
1726 * follow the naming conventions, and is set to "waitforwm".
1727 * In dtksh, users expect the naming conventions to be
1728 * followed, and this breaks for this one resource.
1730 if (strcmp(argv[n], "waitForWm") == 0)
1731 args[n].name = strdup(XmNwaitForWm);
1733 args[n].name = strdup(argv[n]);
1737 args[n].value = (XtArgVal)stakalloc(256);
1740 XtGetValues(w->w, args, n);
1741 for (i = 0; i < n; i++) {
1742 if (ConvertTypeToString(arg0, w->wclass, w, w->parent, args[i].name, args[i].value, &str) != FAIL) {
1743 env_set_var(envar[i], str);
1746 env_blank(envar[i]);
1747 XtFree(args[i].name);
1758 char *arg0 = argv[0];
1766 errmsg = strdup(GETMESSAGE(5,27,
1767 "Usage: XtSetValues widget arg:val ..."));
1768 printerr(str_nill, errmsg, NULL);
1772 w = str_to_wtab(argv[0], argv[1]);
1779 pargv = (char **)XtMalloc(sizeof(char *) * argc);
1781 parse_args(arg0, argc, argv, w, w->parent, w->wclass, &n, args,
1782 &pargc, pargv, True);
1784 XtSetValues(w->w, args, n);
1786 /* Process any postponed resources */
1791 parse_args(arg0, pargc, pargv, w, w->parent,
1792 w->wclass, &n, args, NULL, NULL, False);
1793 XtSetValues(w->w, args, n);
1796 XtFree((char *)pargv);
1803 * When a timeout or work proc is added, the memory allocated for the
1804 * clientData (i.e. the command string) will be lost, unless we provide
1805 * a means of associating the string with the workproc/timeout id, and
1806 * then free up the memory when the workproc/timeout is removed. The
1807 * following two functions implement such a mechanism. This prevents
1808 * a memory leak from occurring.
1817 CommandString **table;
1820 if (type == WORKPROC_CMDS)
1822 table = &workProcCmds;
1823 tableSize = &workProcCmdsSize;
1827 table = &timeOutCmds;
1828 tableSize = &timeOutCmdsSize;
1832 *table = (CommandString *)XtRealloc((char *)*table,
1833 sizeof(CommandString) * (*tableSize));
1834 (*table)[(*tableSize)-1].id = id;
1835 (*table)[(*tableSize)-1].cmd = cmd;
1843 CommandString **table;
1847 if (type == WORKPROC_CMDS)
1849 table = &workProcCmds;
1850 tableSize = &workProcCmdsSize;
1854 table = &timeOutCmds;
1855 tableSize = &timeOutCmdsSize;
1858 for (i = 0; i < (*tableSize); i++)
1860 if (id == (*table)[i].id)
1862 XtFree((*table)[i].cmd);
1865 for (j = i; j < (*tableSize); j++)
1866 (*table)[j] = (*table)[j+1];
1868 *table = (CommandString *)XtRealloc((char *) (*table),
1869 sizeof(CommandString) * (*tableSize));
1889 errmsg = strdup(GETMESSAGE(5,28,
1890 "Usage: XtAddWorkProc variable command"));
1891 printerr(str_nill, errmsg, NULL);
1897 cmd = strdup((char *)argv[2]);
1898 id = XtAddWorkProc((XtWorkProc)stdWorkProcCB, (XtPointer)cmd);
1899 RegisterCmdStr(WORKPROC_CMDS, (long)id, cmd);
1900 sprintf(buf, "0x%lx", (long)id);
1901 alt_env_set_var(variable, buf);
1906 do_XtRemoveWorkProc(
1916 errmsg = strdup(GETMESSAGE(5,29, "Usage: XtRemoveWorkProc workProcId"));
1917 printerr(str_nill, errmsg, NULL);
1922 id = strtoul(argv[1], &p, 16);
1925 errmsg=strdup(GETMESSAGE(5,30,
1926 "The workProcId parameter must be a hex number: %s"));
1927 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
1932 XtRemoveWorkProc(id);
1933 RemoveCmdStr(WORKPROC_CMDS, (long)id);
1942 unsigned long milliseconds = 0;
1952 errmsg = strdup(GETMESSAGE(5,31,
1953 "Usage: XtAddTimeOut variable milliseconds command"));
1954 printerr(str_nill, errmsg, NULL);
1960 if ((milliseconds = atol(argv[2])) <= 0)
1962 errmsg = strdup(GETMESSAGE(5,32,
1963 "The milliseconds parameter must be greater than zero"));
1964 printerr(argv[0], errmsg, NULL);
1966 alt_env_set_var(variable, str_nill);
1970 cmd = strdup((char *)argv[3]);
1971 id = XtAddTimeOut(milliseconds, (XtTimerCallbackProc)stdTimerCB,
1973 RegisterCmdStr(TIMEOUT_CMDS, (long)id, cmd);
1974 sprintf(buf, "0x%lx", (long)id);
1975 alt_env_set_var(variable, buf);
1990 errmsg = strdup(GETMESSAGE(5,33, "Usage: XtRemoveTimeOut intervalId"));
1991 printerr(str_nill, errmsg, NULL);
1996 id = strtoul(argv[1], &p, 16);
1998 errmsg = strdup(GETMESSAGE(5,34,
1999 "The intervalId parameter must be a hex number: %s"));
2000 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
2005 XtRemoveTimeOut(id);
2006 RemoveCmdStr(TIMEOUT_CMDS, (long)id);
2011 do_XtUnmanageChildren(
2015 return(do_managelist_func(argc, argv, (int (*)())XtUnmanageChildren));
2019 do_XtManageChildren(
2023 return(do_managelist_func(argc, argv, (int (*)())XtManageChildren));
2034 Widget widgets[MAXARGS];
2039 errmsg = strdup(GETMESSAGE(5,35, "Usage: %s widget ..."));
2040 printerrf(str_nill, errmsg, argv[0], NULL, NULL,
2041 NULL, NULL, NULL, NULL, NULL);
2045 for (nwidgets = 0, i = 1; i < argc && nwidgets < MAXARGS; i++) {
2046 w = str_to_wtab(argv[0], argv[i]);
2048 widgets[nwidgets++] = w->w;
2051 func(widgets, nwidgets);
2067 errmsg = strdup(GETMESSAGE(5,120,
2068 "Usage: XtIsSubclass widget class"));
2069 printerr(str_nill, errmsg, NULL);
2074 w = str_to_wtab(argv[0], argv[1]);
2077 for (i = 0; C[i].cname; i++)
2079 if (strcmp(argv[2], C[i].cname) == 0)
2080 return(!XtIsSubclass(w->w, C[i].class));
2083 errmsg = strdup(GETMESSAGE(5,121,
2084 "%s is not a valid widget class name"));
2085 printerrf(str_nill, errmsg, argv[2], NULL, NULL,
2086 NULL, NULL, NULL, NULL, NULL);
2104 errmsg = strdup(GETMESSAGE(5,122,
2105 "Usage: XtClass variable widget"));
2106 printerr(str_nill, errmsg, NULL);
2111 w = str_to_wtab(argv[0], argv[2]);
2115 class = XtClass(w->w);
2116 for (i = 0; C[i].cname; i++)
2118 if (C[i].class == class)
2120 alt_env_set_var(argv[1], C[i].cname);
2126 alt_env_set_var(argv[1], str_nill);
2132 #define PARSE_POINTLIST (-1)
2133 #define PARSE_SEGMENTLIST (-2)
2134 #define PARSE_AREA (-3)
2143 Standard_GC = XCreateGC(display, drawable, 0, NULL);
2159 errmsg=strdup(GETMESSAGE(5,36, "Usage: XBell display volume"));
2160 printerr(str_nill, errmsg, NULL);
2165 volume = atoi(argv[2]);
2167 display = (Display *)strtoul(argv[1], &p, 0);
2170 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
2171 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
2179 else if (volume > 100)
2182 XBell(display, volume);
2199 errmsg = strdup(GETMESSAGE(5,37, "Usage: %s variable screen"));
2200 printerrf(str_nill, errmsg, argv[0], NULL, NULL, NULL, NULL, NULL,
2206 screen = (Screen *)strtoul(argv[2], &p, 0);
2209 errmsg = strdup(GETMESSAGE(5,38, "The screen parameter is invalid: %s"));
2210 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
2216 sprintf(buf, "%ld", (long)(*func)(screen));
2217 alt_env_set_var(argv[1], buf);
2222 do_XRootWindowOfScreen(
2226 return(do_RootWindowCmd((int (*)())XRootWindowOfScreen, argc, argv));
2234 return(do_RootWindowCmd(XWidthOfScreen, argc, argv));
2242 return(do_RootWindowCmd(XHeightOfScreen, argc, argv));
2258 errmsg = strdup(GETMESSAGE(5,39,
2259 "Usage: XDefineCursor display window cursorId"));
2260 printerr(str_nill, errmsg, NULL);
2265 display = (Display *)strtoul(argv[1], &p, 0);
2268 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
2269 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
2275 window = (Window)strtoul(argv[2], &p, 0);
2278 errmsg = strdup(GetSharedMsg(DT_BAD_WINDOW));
2279 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
2285 cursor = (Cursor)strtoul(argv[3], &p, 0);
2288 errmsg = strdup(GETMESSAGE(5,40,
2289 "The cursorId parameter is invalid: %s"));
2290 printerrf(argv[0], errmsg, argv[3], NULL, NULL, NULL, NULL, NULL,
2296 XDefineCursor(display, window, cursor);
2312 errmsg = strdup(GETMESSAGE(5,41,
2313 "Usage: XUndefineCursor display window"));
2314 printerr(str_nill, errmsg, NULL);
2319 display = (Display *)strtoul(argv[1], &p, 0);
2322 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
2323 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
2329 window = (Window)strtoul(argv[2], &p, 0);
2332 errmsg = strdup(GetSharedMsg(DT_BAD_WINDOW));
2333 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
2339 XUndefineCursor(display, window);
2344 do_XtRemoveAllCallbacks(
2353 errmsg = strdup(GETMESSAGE(5,42,
2354 "Usage: XtRemoveAllCallbacks widget callbackName"));
2355 printerr(str_nill, errmsg, NULL);
2359 w = str_to_wtab(argv[0], argv[1]);
2361 XtRemoveAllCallbacks(w->w, argv[2]);
2372 XrmValue fval, tval;
2375 fval.size = strlen(name);
2376 XtConvert(Toplevel, XtRString, &fval, XtRFontStruct, &tval);
2378 if (tval.size != 0) {
2379 *fn = ((XFontStruct **)(tval.addr))[0];
2386 CatchNonFatalFontError(
2388 XErrorEvent *event )
2400 int (*oldHandler)();
2402 invalidFont = False;
2403 oldHandler = XSetErrorHandler(CatchNonFatalFontError);
2404 *fn = XLoadFont(display, name);
2405 XSync(display, False);
2406 XSetErrorHandler(oldHandler);
2419 XrmValue fval, tval;
2422 fval.size = strlen(name);
2423 XtConvert(Toplevel, XtRString, &fval, XtRPixel, &tval);
2425 if (tval.size != 0) {
2426 *pix = ((Pixel *)(tval.addr))[0];
2444 errmsg = strdup(GETMESSAGE(5,43,
2445 "Usage: XTextWidth variable fontName string"));
2446 printerr(str_nill, errmsg, NULL);
2450 if (cvtfontstruct(argv[2], &fn) != SUCCESS)
2452 errmsg = strdup(GetSharedMsg(DT_BAD_FONT));
2453 printerrf(argv[0], errmsg, argv[2], NULL,
2454 NULL, NULL, NULL, NULL, NULL, NULL);
2459 sprintf(buf, "%ld", (long)XTextWidth(fn, s, strlen(s)));
2460 alt_env_set_var(argv[1], buf);
2464 #define MAXDRAWARGS 6
2466 #define POLYGON_ARGS 2
2469 invokeXDrawFunction(
2474 char * functionName = argv[0];
2480 unsigned int width, height;
2493 Boolean unknownOption;
2494 Boolean userSpecifiedGC = False;
2499 errmsg = strdup(GETMESSAGE(5,44,
2500 "Usage: %s display drawable [args ...]"));
2501 printerrf(str_nill, errmsg, functionName, NULL, NULL, NULL, NULL, NULL,
2507 display = (Display *)strtoul(argv[1], &sp, 0);
2510 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
2511 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
2516 drawable = (Window)strtoul(argv[2], &sp, 0);
2519 errmsg = strdup(GETMESSAGE(5,45,
2520 "The drawable parameter is invalid: %s"));
2521 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
2527 if (function == COPY_AREA)
2532 destination = (Window)strtoul(argv[3], &sp, 0);
2535 errmsg = strdup(GETMESSAGE(5,46,
2536 "The destination parameter is invalid: %s"));
2537 printerrf(argv[0], errmsg, argv[3], NULL, NULL, NULL, NULL, NULL,
2542 srcX = atoi(argv[4]);
2543 srcY = atoi(argv[5]);
2544 width = atoi(argv[6]);
2545 height = atoi(argv[7]);
2546 destX = atoi(argv[8]);
2547 destY = atoi(argv[9]);
2551 else if (function == DRAW_RECTANGLE)
2554 func = XDrawRectangle;
2556 else if (function == FILL_RECTANGLE)
2559 func = XFillRectangle;
2561 else if (function == FILL_POLYGON)
2563 parse = PARSE_POINTLIST;
2564 func = XFillPolygon;
2565 argtype = POLYGON_ARGS;
2567 coordmode = CoordModeOrigin;
2570 while (argv[3][0] == '-')
2572 if (strcmp(argv[3], "-Complex") == 0)
2574 else if (strcmp(argv[3], "-Convex") == 0)
2576 else if (strcmp(argv[3], "-Nonconvex") == 0)
2577 polymode = Nonconvex;
2578 else if (strcmp(argv[3], "-CoordModeOrigin") == 0)
2579 coordmode = CoordModeOrigin;
2580 else if (strcmp(argv[3], "-CoordModePrevious") == 0)
2581 coordmode = CoordModePrevious;
2590 else if (function == DRAW_LINE)
2595 else if (function == DRAW_SEGMENTS)
2597 parse = PARSE_SEGMENTLIST;
2598 func = XDrawSegments;
2600 else if (function == DRAW_LINES)
2602 parse = PARSE_POINTLIST;
2604 argtype = LINE_ARGS;
2605 coordmode = CoordModeOrigin;
2608 while (argv[3][0] == '-')
2610 if (strcmp(argv[3], "-CoordModeOrigin") == 0)
2611 coordmode = CoordModeOrigin;
2612 else if (strcmp(argv[3], "-CoordModePrevious") == 0)
2613 coordmode = CoordModePrevious;
2622 else if (function == DRAW_STRING)
2628 else if (function == DRAW_IMAGE_STRING)
2632 func = XDrawImageString;
2634 else if (function == DRAW_ARC)
2639 else if (function == FILL_ARC)
2644 else if (function == DRAW_POINT)
2649 else if (function == DRAW_POINTS)
2651 parse = PARSE_POINTLIST;
2653 argtype = LINE_ARGS;
2654 coordmode = CoordModeOrigin;
2657 while (argv[3][0] == '-')
2659 if (strcmp(argv[3], "-CoordModeOrigin") == 0)
2660 coordmode = CoordModeOrigin;
2661 else if (strcmp(argv[3], "-CoordModePrevious") == 0)
2662 coordmode = CoordModePrevious;
2671 else if (function == CLEAR_WINDOW)
2674 func = XClearWindow;
2676 else if (function == CLEAR_AREA)
2682 if (Standard_GC == NULL)
2683 create_standard_gc(display, drawable);
2685 while (argc > 4 && argv[3][0] == '-')
2688 gc = XCreateGC(display, drawable, 0, NULL);
2690 if (strcmp(argv[3], "-gc") == 0)
2692 XFreeGC(display, gc);
2693 gc = (GC) atol(argv[4]);
2694 userSpecifiedGC = True;
2696 else if (strcmp(argv[3], "-foreground") == 0)
2700 if (cvtcolor(argv[4], &pix) == SUCCESS)
2701 XSetForeground(display, gc, pix);
2703 else if (strcmp(argv[3], "-background") == 0)
2707 if (cvtcolor(argv[4], &pix) == SUCCESS)
2708 XSetBackground(display, gc, pix);
2710 else if (strcmp(argv[3], "-font") == 0)
2714 if (cvtfont(display, argv[4], &fn) == SUCCESS)
2715 XSetFont(display, gc, fn);
2718 errmsg = strdup(GetSharedMsg(DT_BAD_FONT));
2719 printerrf(functionName, errmsg, argv[4], NULL, NULL, NULL,
2720 NULL, NULL, NULL, NULL);
2725 else if (strcmp(argv[3], "-line_width") == 0)
2729 v.line_width = atoi(argv[4]);
2730 XChangeGC(display, gc, GCLineWidth, &v);
2732 else if (strcmp(argv[3], "-function") == 0)
2737 unknownOption = False;
2739 if (strcmp(argv[4], "xor") == 0)
2741 else if (strcmp(argv[4], "or") == 0)
2743 else if (strcmp(argv[4], "clear") == 0)
2745 else if (strcmp(argv[4], "and") == 0)
2747 else if (strcmp(argv[4], "copy") == 0)
2749 else if (strcmp(argv[4], "noop") == 0)
2751 else if (strcmp(argv[4], "nor") == 0)
2753 else if (strcmp(argv[4], "nand") == 0)
2755 else if (strcmp(argv[4], "set") == 0)
2757 else if (strcmp(argv[4], "invert") == 0)
2759 else if (strcmp(argv[4], "equiv") == 0)
2761 else if (strcmp(argv[4], "andReverse") == 0)
2763 else if (strcmp(argv[4], "orReverse") == 0)
2765 else if (strcmp(argv[4], "copyInverted") == 0)
2769 errmsg = strdup(GETMESSAGE(5,47,
2770 "Unrecognized graphics function name: %s"));
2771 printerrf(functionName, errmsg, argv[4],
2772 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
2775 unknownOption = True;
2781 XChangeGC(display, gc, GCFunction, &v);
2784 else if (strcmp(argv[3], "-line_style") == 0)
2789 unknownOption = False;
2791 if (strcmp(argv[4], "LineSolid") == 0)
2793 else if (strcmp(argv[4], "LineDoubleDash") == 0)
2795 else if (strcmp(argv[4], "LineOnOffDash") == 0)
2798 errmsg = strdup(GETMESSAGE(5,48, "Unrecognized line style: %s"));
2799 printerrf(functionName, errmsg,
2800 argv[4], NULL, NULL, NULL, NULL, NULL, NULL, NULL);
2803 unknownOption = True;
2809 XChangeGC(display, gc, GCLineStyle, &v);
2814 errmsg = strdup(GETMESSAGE(5,49, "Unrecognized drawing option: %s"));
2815 printerrf(functionName, errmsg, argv[3], NULL, NULL,
2816 NULL, NULL, NULL, NULL, NULL);
2830 if (parse == PARSE_POINTLIST)
2832 XPoint *points = (XPoint *)malloc(sizeof(XPoint )*(argc/2+1));
2835 for (i = 0; i < argc-1; i += 2, npoints++)
2837 points[npoints].x = atoi(argv[i]);
2838 points[npoints].y = atoi(argv[i+1]);
2845 (*func)(display, drawable, gc, points, argc/2, polymode, coordmode);
2851 (*func)(display, drawable, gc, points, argc/2, coordmode);
2860 else if (parse == PARSE_SEGMENTLIST)
2865 segments = (XSegment *)malloc(sizeof(XSegment )*(argc/4+1));
2867 for (i = 0; i < argc-1; i += 4, nsegments++)
2869 segments[nsegments].x1 = atoi(argv[i]);
2870 segments[nsegments].y1 = atoi(argv[i+1]);
2871 segments[nsegments].x2 = atoi(argv[i+2]);
2872 segments[nsegments].y2 = atoi(argv[i+3]);
2875 (*func)(display, drawable, gc, segments, argc/4);
2877 argc -= 4*nsegments;
2878 argv += 4*nsegments;
2880 else if (parse == PARSE_AREA)
2882 Boolean exposures = False;
2883 XrmValue fval, tval;
2885 for (i = 0; i < 4 && argc > 0; i++)
2887 p[i] = atoi(argv[0]);
2894 fval.addr = argv[0];
2895 fval.size = strlen(argv[0]);
2896 XtConvert(Toplevel, XtRString, &fval, XtRBoolean, &tval);
2899 exposures = *((Boolean *)(tval.addr));
2905 (*func)(display, drawable, p[0], p[1], p[2], p[3], exposures);
2909 while (argc >= parse)
2911 for (i = 0; i < parse && i < argc; i++)
2912 p[i] = atoi(argv[i]);
2916 (*func)(display, drawable, gc,
2917 p[0], p[1], argv[i], strlen(argv[i]));
2921 else if (func == XClearWindow)
2922 (*func)(display, drawable);
2923 else if (func == XCopyArea)
2925 (*func)(display, drawable, destination, gc,
2926 srcX, srcY, width, height, destX, destY);
2930 (*func)(display, drawable, gc,
2931 p[0], p[1], p[2], p[3], p[4], p[5]);
2941 if ((gc != Standard_GC) && !userSpecifiedGC)
2942 XFreeGC(display, gc);
2946 errmsg = strdup(GETMESSAGE(5,50,
2947 "There were left over points which were ignored"));
2948 printerr(functionName, errmsg, NULL);
2964 invokeXDrawFunction(DRAW_ARC, argc, argv);
2968 do_XDrawImageString(
2972 invokeXDrawFunction(DRAW_IMAGE_STRING, argc, argv);
2980 invokeXDrawFunction(DRAW_LINE, argc, argv);
2988 invokeXDrawFunction(DRAW_LINES, argc, argv);
2996 invokeXDrawFunction(DRAW_POINT, argc, argv);
3004 invokeXDrawFunction(DRAW_POINTS, argc, argv);
3012 invokeXDrawFunction(DRAW_RECTANGLE, argc, argv);
3024 errmsg = strdup(GETMESSAGE(5,51,
3025 "Usage: XCopyArea display source dest sourceX sourceY width height destX destY [args ...]"));
3026 printerr(str_nill, errmsg, NULL);
3031 invokeXDrawFunction(COPY_AREA, argc, argv);
3039 invokeXDrawFunction(DRAW_SEGMENTS, argc, argv);
3047 invokeXDrawFunction(DRAW_STRING, argc, argv);
3055 invokeXDrawFunction(FILL_ARC, argc, argv);
3063 invokeXDrawFunction(FILL_POLYGON, argc, argv);
3071 invokeXDrawFunction(FILL_RECTANGLE, argc, argv);
3079 invokeXDrawFunction(CLEAR_AREA, argc, argv);
3087 invokeXDrawFunction(CLEAR_WINDOW, argc, argv);
3091 ConvertTypeToString(
3102 XrmValue fr_val, to_val;
3106 if ((nam = hashget((Hash_table_t*)class->res, resource)) == NULL) {
3107 /* If we didn't find it in this widget's class record,
3108 * see if the parent is a constraint widget class, and
3109 * if so then see if we can find the class there.
3111 if (parent == NULL || parent->wclass == NULL ||
3112 parent->wclass->con == NULL ||
3113 (nam = hashget((Hash_table_t*)parent->wclass->con, resource))
3116 errmsg = strdup(GetSharedMsg(DT_UNDEF_RESOURCE));
3117 printerrf(arg0, errmsg,
3118 (char *)(class->cname), resource, NULL, NULL,
3119 NULL, NULL, NULL, NULL);
3124 res = (XtResourceList)nam;
3127 * unfortunately, we have to have a special case for String
3128 * type resources, since their size may vary.
3130 if (strcmp(res->resource_type, str_XtRString) == 0) {
3131 *ret = ((String *)val)[0];
3134 fr_val.size = res->resource_size;
3135 fr_val.addr = (caddr_t)val;
3140 w ? w->w : Toplevel,
3141 res->resource_type, /* from type */
3142 &fr_val, /* from value */
3143 str_XtRString, /* to type */
3144 &to_val /* the converted value */
3146 if ((to_val.addr) || (strcmp(res->resource_type, XmRXmString) == 0)) {
3149 errmsg=strdup(GETMESSAGE(5,52,
3150 "Unable to convert resource type '%s' to 'String'"));
3151 printerrf(arg0, errmsg,
3152 res->resource_type, NULL, NULL, NULL, NULL, NULL,
3160 wtab_t *DTKSHConversionWidget;
3161 classtab_t *DTKSHConversionClass;
3162 char *DTKSHConversionResource;
3165 ConvertStringToType(
3174 Boolean postponePixmaps )
3178 XrmValue fr_val, to_val;
3182 DTKSHConversionClass = class; /* needed by callback converter */
3183 DTKSHConversionResource = resource; /* needed by callback converter */
3184 DTKSHConversionWidget = w; /* needed by callback converter */
3186 if ((nam = hashget((Hash_table_t*)class->res, resource)) == NULL) {
3187 /* If we didn't find it in this widget's class record,
3188 * see if the parent is a constraint widget class, and
3189 * if so then see if we can find the class there.
3191 if (parent == NULL || parent->wclass == NULL ||
3192 parent->wclass->con == NULL ||
3193 (nam = hashget((Hash_table_t*)parent->wclass->con,
3196 errmsg = strdup(GetSharedMsg(DT_UNDEF_RESOURCE));
3197 printerrf(arg0, errmsg,
3198 (char *)(class->cname), resource, NULL,
3199 NULL, NULL, NULL, NULL, NULL);
3201 return(CONVERT_FAILED);
3204 res = (XtResourceList)nam;
3207 * Unfortunately, because String types can be variable in size,
3208 * we have to handle this as a special case.
3210 if (strcmp(res->resource_type, str_XtRString) == 0) {
3211 *ret = (XtArgVal)strdup(val);
3213 return(CONVERT_SUCCEEDED);
3216 fr_val.size = strlen(val) + 1;
3217 fr_val.addr = (caddr_t)val;
3222 * Hook to allow us to postpone processing of certain classes of
3223 * resources. In particular, Dimension based resources can't be
3224 * converted until the widget exists, nor can gadget pixmap resources.
3225 * Any other pixmap resource needs to be postponed until after any
3226 * color changes have taken effect, otherwise the string to pixmap
3227 * converter uses the existing colors, instead of the new colors.
3229 if (toolkit_special_resource(arg0, res, w, parent,
3230 class, resource, val, ret,
3231 freeit, postponePixmaps)) {
3232 return(CONVERT_POSTPONED);
3235 w ? w->w : Toplevel,
3236 str_XtRString, /* from type */
3237 &fr_val, /* from value */
3238 res->resource_type, /* to type */
3239 &to_val /* the converted value */
3241 if (to_val.size && to_val.addr) {
3242 switch(to_val.size) {
3244 *ret = ((char *)to_val.addr)[0];
3248 *ret = (XtArgVal)((short *)to_val.addr)[0];
3252 *ret = (XtArgVal)((int *)to_val.addr)[0];
3257 * Deal with sizeof(long) != sizeof(int) here.
3258 * Bit of a cheat but it's a simple change.
3260 if (to_val.size == sizeof(long)) {
3261 *ret = (XtArgVal)((long *)to_val.addr)[0];
3267 * There is a possibility that some
3268 * coverters will return malloc'ed space and this
3269 * is really unnecessary and will leak memory. About
3270 * the only way to handle this is to handle such types as
3271 * special cases. Maybe we need a hash table that
3272 * contains the names of types that need the malloc?
3273 * The X specs should really have some mechanism for
3274 * knowing when to free the results of a conversion.
3276 *ret = (XtArgVal)XtMalloc(to_val.size);
3277 memcpy((char *)ret, to_val.addr, to_val.size);
3281 errmsg=strdup(GETMESSAGE(5,53,
3282 "Unable to convert resource type 'String' to type '%s'"));
3283 printerrf(arg0, errmsg,
3284 res->resource_type, NULL, NULL, NULL, NULL, NULL,
3287 return(CONVERT_FAILED);
3289 return(CONVERT_SUCCEEDED);
3298 errmsg=strdup(GETMESSAGE(5,54,
3299 "Usage: XtAddInput variable [-r] fileDescriptor kshCommand"));
3300 printerr(str_nill, errmsg, NULL);
3312 char *arg0 = argv[0];
3319 unsigned char modeFlags = LINE_INPUT_MODE;
3323 return(XtAddInputUsage(arg0));
3329 if (strcmp(argv[0], "-r") == 0)
3331 /* Raw mode; the registered handler will take care of reading input */
3332 modeFlags = RAW_INPUT_MODE;
3338 return(XtAddInputUsage(arg0));
3344 inp = (inputrec_t *)XtMalloc(sizeof(inputrec_t));
3345 if (modeFlags & RAW_INPUT_MODE)
3347 /* Raw mode; the registered handler will do all buffering */
3353 inp->lnbufsize = LINESIZE;
3354 inp->lnbuf = XtMalloc(inp->lnbufsize);
3357 inp->flags = modeFlags;
3359 inp->cmd = strdup(argv[0]);
3360 inp->lastCharIsBackslash = False;
3361 inp->lineWasTouched = False;
3363 id = XtAddInput(fd, (XtPointer)XtInputReadMask,
3364 (XtInputCallbackProc)stdInputCB, (caddr_t)inp);
3367 * Save a record of this input, so that we can destroy the buffer
3368 * information when the input handler is unregistered.
3370 for (i = 0; i < numActiveInputs; i++)
3372 if (activeInputs[i].inUse == False)
3376 if ( i >= numActiveInputs)
3378 /* Grow the array */
3379 numActiveInputs += 5;
3380 activeInputs = (InputRecord *)XtRealloc((char *)activeInputs,
3381 sizeof(InputRecord) * numActiveInputs);
3382 for (j = i; j < numActiveInputs; j++)
3384 activeInputs[j].inUse = False;
3385 activeInputs[j].inp = NULL;
3386 activeInputs[j].id = 0;
3389 activeInputs[i].inUse = True;
3390 activeInputs[i].id = id;
3391 activeInputs[i].inp = inp;
3393 sprintf(buf, "0x%lx", (long)id);
3394 alt_env_set_var(variable, buf);
3409 errmsg = strdup(GETMESSAGE(5,56, "Usage: XtRemoveInput inputId"));
3410 printerr(str_nill, errmsg, NULL);
3415 id = strtoul(argv[1], &p, 16);
3418 errmsg = strdup(GETMESSAGE(5,57,
3419 "The inputId parameter must be a hex number: %s"));
3420 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL,
3426 DestroyInputRecord(id);
3432 * This function will attempt to remove the indicated input source. If,
3433 * however, the source is busy (i.e. the XtRemoveInput() request came
3434 * from within the input handler), then we will simply mark the input
3435 * source as 'pending destroy', and will allow stdInputCB to do the
3436 * actual removing when it is safe.
3445 if ((entryIndex = FindInputRecord(id)) >= 0)
3447 inp = activeInputs[entryIndex].inp;
3449 if (inp->flags & INPUT_SOURCE_BUSY)
3450 inp->flags |= INPUT_SOURCE_PENDING_DELETE;
3453 /* It's ok to delete the source now */
3455 activeInputs[entryIndex].inUse = False;
3456 activeInputs[entryIndex].id = 0;
3457 activeInputs[entryIndex].inp = NULL;
3459 XtFree((char *)inp);
3471 for (i = 0; i < numActiveInputs; i++)
3473 if ((activeInputs[i].inUse) && (activeInputs[i].id == id))
3482 * This function will initialize some environment variables, and then
3483 * invoke the handler registered for this input source. If will return
3484 * 'True' if the handler called XtRemoveInput on this source; if this
3485 * has happened, then the 'inp' structure MUST NOT be touched again,
3486 * since it will have been freed up.
3495 Namval_t * sourceVar = nv_search("INPUT_SOURCE", sh.var_tree, NV_ADD);
3496 Namval_t * idVar = nv_search("INPUT_ID", sh.var_tree, NV_ADD);
3497 Namval_t * eofVar = nv_search("INPUT_EOF", sh.var_tree, NV_ADD);
3498 Namval_t * lineVar = nv_search("INPUT_LINE", sh.var_tree, NV_ADD);
3501 /* Initialize the environment variables */
3502 sprintf(strBuf, "%d", source);
3503 nv_putval(sourceVar, strBuf, NV_RDONLY);
3504 sprintf(strBuf, "0x%lx", (long)id);
3505 nv_putval(idVar, strBuf, NV_RDONLY);
3506 sprintf(strBuf, "%s", (eofFound ? "true" : "false"));
3507 nv_putval(eofVar, strBuf, NV_RDONLY);
3508 if ((inp->flags & RAW_INPUT_MODE) || (inp->lnend == 0))
3511 nv_putval(lineVar, strBuf, NV_RDONLY);
3514 nv_putval(lineVar, inp->lnbuf, NV_RDONLY);
3516 /* Invoke the registered handler */
3517 inp->flags |= INPUT_SOURCE_BUSY;
3519 inp->flags &= ~INPUT_SOURCE_BUSY;
3521 /* Clean up the environment variables */
3522 nv_newattr(sourceVar, 0, 0);
3523 nv_close(sourceVar);
3524 nv_newattr(idVar, 0, 0);
3526 nv_newattr(eofVar, 0, 0);
3528 nv_newattr(lineVar, 0, 0);
3531 /* If the handler removed the input source, then process it now */
3532 if (inp->flags & INPUT_SOURCE_PENDING_DELETE)
3534 DestroyInputRecord(id);
3543 Translation_ksh_eval(
3547 Cardinal *num_params )
3553 wtab_t *wtab = NULL;
3554 Namfun_t * clonedDisc;
3557 wtab = widget_to_wtab(w);
3560 np2 = GetNameValuePair("TRANSLATION_WIDGET");
3561 nv_newattr(np2, 0, 0);
3562 nv_putval(np2, (wtab ? wtab->widid : "Unknown"), NV_RDONLY);
3563 nv_newattr(np2, NV_RDONLY, 0);
3565 np = GetNameValuePair("TRANSLATION_EVENT");
3566 nv_newattr(np, 0, 0);
3567 sprintf(buf, "0x%lx", (long)event);
3568 nv_putval(np, buf, NV_RDONLY);
3569 nv_newattr(np, NV_RDONLY, 0);
3570 clonedDisc = CloneDiscipline(&transDiscipline);
3571 nv_stack(np, clonedDisc);
3573 for (i = 0; i < *num_params; i++)
3574 ksh_eval(params[i]);
3576 /* Remove the discipline for the hierarchical variables */
3578 FreeDiscipline(clonedDisc);
3580 /* Free up all of the name/value pairs we created */
3581 FreeNestedVariables();
3587 RestorePriorEnvVarValues(
3595 nv_newattr(np1, 0, 0);
3596 nv_putval(np1, value1, NV_RDONLY);
3597 nv_newattr(np1, NV_RDONLY, 0);
3601 nv_newattr(np2, 0, 0);
3602 nv_putval(np2, value2, NV_RDONLY);
3603 nv_newattr(np2, NV_RDONLY, 0);
3608 * stdCB() is the central routine from which all callback
3609 * functions are dispatched (specified by clientData). The
3610 * variables "CB_WIDGET" and "CB_CALL_DATA" will be placed in
3611 * the environment to represent the CallBackWidget handle.
3621 dtksh_client_data_t *cdata = (dtksh_client_data_t *)clientData;
3625 Namdisc_t * discipline = NULL;
3627 char * oldCB_WIDGET_value = NULL;
3628 char * oldCB_CALL_DATA_value = NULL;
3630 Namfun_t * clonedDisc;
3633 * The wtab_t entry of the cdata need not be filled in since
3634 * it could have been set via direct resource setting at widget
3635 * creation time, and the converter for string to callback would
3636 * not have had access to this information (since the widget
3637 * was not created yet.
3638 * Thus, we set it here. Note that this will happen at most
3639 * one time, since we are modifying the cdata structure.
3641 if (cdata->w == NULL)
3642 cdata->w = widget_to_wtab(widget);
3645 np2 = GetNameValuePair("CB_WIDGET");
3646 nv_newattr(np2, 0, 0);
3647 if (ptr = nv_getval(np2))
3648 oldCB_WIDGET_value = strdup(ptr);
3649 nv_putval(np2, (cdata->w ? cdata->w->widid : "Unknown"), NV_RDONLY);
3650 nv_newattr(np2, NV_RDONLY, 0);
3652 /* Certain callbacks don't pass structures as the calldata */
3653 if ((cdata->cbname) &&
3654 ((strcmp(cdata->cbname, XmNpopupCallback) == 0) ||
3655 (strcmp(cdata->cbname, XmNpopdownCallback) == 0)))
3657 /* The calldata indicates the grab type */
3658 XtGrabKind * grabKind = (XtGrabKind *)callData;
3661 case XtGrabNonexclusive:
3663 strcpy(buf, "GrabNonexclusive");
3667 case XtGrabExclusive:
3669 strcpy(buf, "GrabExclusive");
3675 strcpy(buf, "GrabNone");
3681 sprintf(buf, "0x%lx", (long)callData);
3683 np = GetNameValuePair("CB_CALL_DATA");
3684 nv_newattr(np, 0, 0);
3685 if (ptr = nv_getval(np))
3686 oldCB_CALL_DATA_value = strdup(ptr);
3687 nv_putval(np, buf, NV_RDONLY);
3688 nv_newattr(np, NV_RDONLY, 0);
3691 * Add a discipline for hierarchical variables.
3692 * Need to add a different discipline, based on the callback type,
3693 * since the fields within the callback structure differ depending
3694 * upon the type of callback and the widget. NOTE: the WMProtocol
3695 * callback will use the default discipline.
3699 if ((strcmp(cdata->cbname, XmNpopupCallback) == 0) ||
3700 (strcmp(cdata->cbname, XmNpopdownCallback) == 0) ||
3701 (strcmp(cdata->cbname, XmNdestroyCallback) == 0))
3703 discipline = &nopDiscipline;
3705 else if (strcmp(cdata->cbname, XmNhelpCallback) == 0)
3706 discipline = &dftDiscipline;
3709 class = XtClass(cdata->w->w);
3712 if (discipline = CheckClassDisciplines(class, cdata->cbname))
3715 class = class->core_class.superclass;
3721 * If a discipline was found, then use it; otherwise, we MUST set up
3722 * a default discipline; otherwise, any hierarchical variables
3723 * referenced by the user are not under our control, thus never getting
3724 * freed up, and then also preventing future disciplines from getting
3725 * called when they should have.
3728 clonedDisc = CloneDiscipline(discipline);
3730 clonedDisc = CloneDiscipline(&dftDiscipline);
3731 nv_stack(np, clonedDisc);
3733 ksh_eval((char *)cdata->ksh_cmd);
3735 /* We may be nested, so restore old CB_WIDGET & CB_CALL_DATA values */
3736 RestorePriorEnvVarValues(np2, oldCB_WIDGET_value, np, oldCB_CALL_DATA_value);
3737 XtFree(oldCB_WIDGET_value);
3738 XtFree(oldCB_CALL_DATA_value);
3740 /* Remove the discipline for the hierarchical variables */
3742 FreeDiscipline(clonedDisc);
3744 /* Free up all of the name/value pairs we created */
3745 FreeNestedVariables();
3752 * This is the callback handler for the 'workspace changed' callback.
3758 caddr_t clientData )
3761 dtksh_client_data_t *cdata = (dtksh_client_data_t *)clientData;
3765 char * oldCB_WIDGET_value = NULL;
3766 char * oldCB_CALL_DATA_value = NULL;
3768 Namfun_t * clonedDisc;
3771 np2 = GetNameValuePair("CB_WIDGET");
3772 nv_newattr(np2, 0, 0);
3773 if (ptr = nv_getval(np2))
3774 oldCB_WIDGET_value = strdup(ptr);
3775 nv_putval(np2, cdata->w->widid, NV_RDONLY);
3776 nv_newattr(np2, NV_RDONLY, 0);
3778 np = GetNameValuePair("CB_CALL_DATA");
3779 nv_newattr(np, 0, 0);
3780 sprintf(buf, "0x%lx", (long)atom);
3781 if (ptr = nv_getval(np))
3782 oldCB_CALL_DATA_value = strdup(ptr);
3783 nv_putval(np, buf, NV_RDONLY);
3784 nv_newattr(np, NV_RDONLY, 0);
3785 clonedDisc = CloneDiscipline(&nopDiscipline);
3786 nv_stack(np, clonedDisc);
3788 ksh_eval((char *)cdata->ksh_cmd);
3790 /* We may be nested, so restore old CB_WIDGET & CB_CALL_DATA values */
3791 RestorePriorEnvVarValues(np2, oldCB_WIDGET_value, np, oldCB_CALL_DATA_value);
3792 XtFree(oldCB_WIDGET_value);
3793 XtFree(oldCB_CALL_DATA_value);
3795 /* Remove the discipline for the hierarchical variables */
3797 FreeDiscipline(clonedDisc);
3799 /* Free up all of the name/value pairs we created */
3800 FreeNestedVariables();
3811 char cmdbuf[LINESIZE];
3814 register int i, n, j;
3818 /* If in 'raw' mode, then simply let the handler do all the work */
3819 if (inp->flags & RAW_INPUT_MODE)
3821 ProcessInput(inp, *source, *id, False);
3825 /* try to read some input from the fd */
3826 if ((n = read(inp->fd, buf, sizeof(buf)-1)) <= 0)
3828 /* EOF; notify handler, passing in any remaining buffered data */
3829 if ((inp->lnend > 0) || (inp->lineWasTouched))
3831 /* Force one call with the data, and a 2nd with the EOF */
3832 inp->lnbuf[inp->lnend] = '\0';
3833 ProcessInput(inp, *source, *id, False);
3835 inp->lastCharIsBackslash = False;
3836 inp->lineWasTouched = False;
3837 inp->lnbuf[0] = '\0';
3839 ProcessInput(inp, *source, *id, True);
3844 * Go through appending to current line, execute line if you
3845 * get an unquoted newline. Strip off the newline, so that
3846 * we are consistent with the ksh 'read' command, remove
3847 * escaped newlines, and do backslash processing.
3849 for (i = 0; i < n; )
3852 len = mblen(buf+i, MB_CUR_MAX);
3856 inp->lineWasTouched = True;
3858 if ((inp->lnend + len) >= (inp->lnbufsize-1))
3860 /* Grow the input buffer */
3861 inp->lnbufsize += (n + LINESIZE + 5);
3862 inp->lnbuf = XtRealloc(inp->lnbuf, inp->lnbufsize);
3865 /* Perform backslash processing */
3866 if ((len == 1) && (buf[i] == '\\') && (!inp->lastCharIsBackslash))
3868 /* Skip this character; the next character will be treated specially */
3869 inp->lastCharIsBackslash = True;
3875 * If the previous character has been a backslash, then the current
3876 * character gets placed into the buffer without any special
3877 * processing; the exception is the newline character, which gets
3880 if ((len == 1) && (buf[i] == '\n'))
3883 * If the newline is escaped, then drop it, and continue.
3884 * Otherwise, process the line.
3887 if (inp->lastCharIsBackslash)
3889 inp->lastCharIsBackslash = False;
3893 inp->lnbuf[inp->lnend] = '\0';
3894 if (ProcessInput(inp, *source, *id, False))
3896 /* The handler called XtRemoveInput() on this source; abort */
3900 inp->lineWasTouched = False;
3904 /* Simply copy the next character into the buffer */
3905 inp->lastCharIsBackslash = False;
3906 for (j = 0; j < len; j++)
3907 inp->lnbuf[inp->lnend++] = buf[i++];
3919 retcode = ksh_eval((char *)clientData);
3922 /* This is tricky, because we do not have the workproc id */
3923 for (i = 0; i < workProcCmdsSize; i++)
3925 if (clientData == workProcCmds[i].cmd)
3927 RemoveCmdStr(WORKPROC_CMDS, (long)workProcCmds[i].id);
3940 ksh_eval((char *)clientData);
3941 RemoveCmdStr(TIMEOUT_CMDS, (long)*id);
3957 errmsg = strdup(GETMESSAGE(5,59, "Usage: XFlush display"));
3958 printerr(str_nill, errmsg, NULL);
3963 display = (Display *)strtoul(argv[1], &p, 0);
3966 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
3967 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
3983 XrmValue fval, tval;
3990 errmsg = strdup(GETMESSAGE(5,60, "Usage: XSync display discard"));
3991 printerr(str_nill, errmsg, NULL);
3996 display = (Display *)strtoul(argv[1], &p, 0);
3999 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
4000 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
4006 fval.addr = argv[2];
4007 fval.size = strlen(argv[2]);
4008 XtConvert(Toplevel, XtRString, &fval, XtRBoolean, &tval);
4011 discard = *((Boolean *)(tval.addr));
4015 XSync(display, discard);
4025 XrmValue fval, tval;
4034 errmsg = strdup(GETMESSAGE(5,61, "Usage: XRaiseWindow display window"));
4035 printerr(str_nill, errmsg, NULL);
4040 display = (Display *)strtoul(argv[1], &p, 0);
4043 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
4044 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
4049 window = (Window)strtoul(argv[2], &p, 0);
4052 errmsg = strdup(GetSharedMsg(DT_BAD_WINDOW));
4053 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
4059 XRaiseWindow(display, window);
4064 XtSetSensitive_usage(
4069 errmsg = strdup(GETMESSAGE(5,62, "Usage: %s widget [True|False]"));
4070 printerrf(str_nill, errmsg, arg0, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
4082 XrmValue fval, tval;
4085 return(XtSetSensitive_usage(argv[0]));
4087 fval.addr = argv[2];
4088 fval.size = strlen(argv[2]);
4089 XtConvert(Toplevel, XtRString, &fval, XtRBoolean, &tval);
4092 bool = *((Boolean *)(tval.addr));
4096 w = str_to_wtab(argv[0], argv[1]);
4098 XtSetSensitive(w->w, bool);
4105 RegisterTranslations(
4111 XtTranslations translationTable;
4112 XrmValue fval, tval;
4117 errmsg = strdup(GETMESSAGE(5,63, "Usage: %s widget translations"));
4118 printerrf(str_nill, errmsg, argv[0], NULL, NULL,
4119 NULL, NULL, NULL, NULL, NULL);
4124 w = str_to_wtab(argv[0], argv[1]);
4128 fval.addr = argv[2];
4129 fval.size = strlen(argv[2]);
4130 XtConvert(Toplevel, XtRString, &fval, XtRTranslationTable, &tval);
4133 translationTable = *((XtTranslations *)(tval.addr));
4137 (*func)(w->w, translationTable);
4142 do_XtOverrideTranslations(
4146 return(RegisterTranslations(XtOverrideTranslations, argc, argv));
4150 do_XtAugmentTranslations(
4154 return(RegisterTranslations(XtAugmentTranslations, argc, argv));
4158 do_XtUninstallTranslations(
4163 XtTranslations * translationTable;
4164 XrmValue fval, tval;
4169 errmsg = strdup(GETMESSAGE(5,64,
4170 "Usage: XtUninstallTranslations widget"));
4171 printerr(str_nill, errmsg, NULL);
4176 w = str_to_wtab(argv[0], argv[1]);
4180 XtUninstallTranslations(w->w);
4189 char *arg0 = argv[0];
4197 errmsg = strdup(GETMESSAGE(5,65, "Usage: XtParent variable widget"));
4198 printerr(str_nill, errmsg, NULL);
4203 wtab = str_to_wtab(arg0, wname);
4208 if (wtab->parent == NULL) {
4209 wtab = widget_to_wtab(XtParent(wtab->w));
4213 * If the widget class has no resources registered, then this is
4214 * the first known instance of this widget class, so we need to
4215 * force the resource list to be loaded. This can frequently
4216 * occur if a Motif convenience function is used, which creates
4217 * a 'hidden' parent.
4219 ctab = wtab->wclass;
4220 if (ctab->res == NULL)
4221 (void)str_to_class(arg0, ctab->cname);
4223 wtab = wtab->parent;
4225 sprintf(buf, "%s", wtab->widid);
4226 alt_env_set_var(argv[1], buf);
4231 do_XtLastTimestampProcessed(
4235 char *arg0 = argv[0];
4242 errmsg = strdup(GETMESSAGE(5,66,
4243 "Usage: XtLastTimestampProcessed variable display"));
4244 printerr(str_nill, errmsg, NULL);
4249 display = (Display *)strtoul(argv[2], &p, 0);
4252 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
4253 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
4259 sprintf(buf, "%ld", (long)XtLastTimestampProcessed(display));
4260 alt_env_set_var(argv[1], buf);
4264 /**********************************************/
4267 * The following two functions work for both standard Xt callbacks
4268 * (which are identified by a callback name) and WM protocol callbacks
4269 * (which are identified by a property atom). That is why both of
4270 * these parameters are passed in. It is usually the case that only
4271 * one of the 'cbname' and 'propAtom' parameters are used; the unused
4272 * one should be set to NULL (cbname) or None (propAtom).
4275 dtksh_client_data_t *
4282 dtksh_client_data_t * cdata;
4286 /* Can we reuse an existing entry? */
4287 if ((i = LocateCBRecord (w, cbname, ksh_cmd, propAtom, NULL)) >= 0)
4289 cdata = cbDataTable[i];
4294 /* Look for an open slot */
4295 for (i = 0; i < cbDataTableSize; i++)
4297 if (cbDataTable[i] == NULL)
4301 if (i >= cbDataTableSize)
4303 /* Need to enlarge the table */
4304 cbDataTableSize += 10;
4305 cbDataTable = (dtksh_client_data_t **)
4306 XtRealloc((XtPointer)cbDataTable,
4307 sizeof(dtksh_client_data_t *) * cbDataTableSize);
4308 for (j = i; j < cbDataTableSize; j++)
4309 cbDataTable[j] = NULL;
4312 cdata = (dtksh_client_data_t *)XtMalloc(sizeof(dtksh_client_data_t));
4314 cdata->ksh_cmd = strdup(ksh_cmd);
4316 cdata->ksh_cmd = NULL;
4319 cdata->cbname = strdup(cbname);
4321 cdata->cbname = NULL;
4322 cdata->propAtom = propAtom;
4323 cdata->handle = NULL;
4324 cdata->refCount = 1;
4326 cbDataTable[i] = cdata;
4336 DtWsmCBContext handle )
4340 /* Locate the matching table entry */
4341 for (i = 0; i < cbDataTableSize; i++)
4345 if ((((cbname == NULL) && (cbDataTable[i]->cbname == NULL)) ||
4346 (((cbname != NULL) && (cbDataTable[i]->cbname != NULL)) &&
4347 (strcmp(cbDataTable[i]->cbname, cbname) == 0))) &&
4348 (cbDataTable[i]->w == w) &&
4349 (strcmp(cbDataTable[i]->ksh_cmd, ksh_cmd) == 0) &&
4350 (cbDataTable[i]->propAtom == propAtom) &&
4351 (cbDataTable[i]->handle == (XtPointer)handle))
4361 /**********************************************/
4368 Boolean *continueToDispatch )
4371 dtksh_event_handler_data_t *ehdata;
4375 Namfun_t * clonedDisc;
4377 ehdata = (dtksh_event_handler_data_t *)clientData;
4380 np2 = GetNameValuePair("EH_WIDGET");
4381 nv_newattr(np2, 0, 0);
4382 nv_putval(np2, ehdata->w->widid, NV_RDONLY);
4383 nv_newattr(np2, NV_RDONLY, 0);
4385 np = GetNameValuePair("EH_EVENT");
4386 nv_newattr(np, 0, 0);
4387 sprintf(buf, "0x%lx", (long)event);
4388 nv_putval(np, buf, NV_RDONLY);
4389 clonedDisc = CloneDiscipline(&ehDiscipline);
4390 nv_stack(np, clonedDisc);
4392 ksh_eval((char *)ehdata->ksh_cmd);
4394 /* Remove the discipline for the hierarchical variables */
4396 FreeDiscipline(clonedDisc);
4398 /* Free up all of the name/value pairs we created */
4399 FreeNestedVariables();
4404 * For a given widget, if the ksh-cmd is the same as one already
4405 * registered for this widget, then we will merge them into a
4406 * single event handler (by merging the event masks), as is done
4410 dtksh_event_handler_data_t *
4414 EventMask eventMask,
4415 Boolean nonMaskable )
4417 dtksh_event_handler_data_t * ehdata;
4421 /* Can we merge with an existing entry? */
4422 if ((i = LocateEHRecord (w, ksh_cmd)) >= 0)
4424 ehdata = ehDataTable[i];
4426 ehdata->nonMaskable = True;
4427 ehdata->eventMask |= eventMask;
4431 /* Look for an open slot */
4432 for (i = 0; i < ehDataTableSize; i++)
4434 if (ehDataTable[i] == NULL)
4438 if (i >= ehDataTableSize)
4440 /* Need to enlarge the table */
4441 ehDataTableSize += 10;
4442 ehDataTable = (dtksh_event_handler_data_t **)
4443 XtRealloc((XtPointer)ehDataTable,
4444 sizeof(dtksh_event_handler_data_t *) * ehDataTableSize);
4445 for (j = i; j < ehDataTableSize; j++)
4446 ehDataTable[j] = NULL;
4449 ehdata = (dtksh_event_handler_data_t *)
4450 XtMalloc(sizeof(dtksh_event_handler_data_t));
4452 ehdata->ksh_cmd = strdup(ksh_cmd);
4454 ehdata->ksh_cmd = NULL;
4456 ehdata->eventMask = eventMask;
4457 ehdata->nonMaskable = nonMaskable;
4459 ehDataTable[i] = ehdata;
4471 /* Locate the matching event handler table entry */
4472 for (i = 0; i < ehDataTableSize; i++)
4476 if ((ehDataTable[i]->w == w) &&
4477 (strcmp(ehDataTable[i]->ksh_cmd, ksh_cmd) == 0))
4488 do_DtSessionRestorePath(
4499 errmsg = strdup(GETMESSAGE(5,67,
4500 "Usage: DtSessionRestorePath widget pathVariable saveFile"));
4501 printerr(str_nill, errmsg, NULL);
4506 w = str_to_wtab(argv[0], argv[1]);
4510 status = DtSessionRestorePath(w->w, &path, argv[3]);
4512 alt_env_set_var(argv[2], path);
4514 alt_env_set_var(argv[2], str_nill);
4520 do_DtSessionSavePath(
4532 errmsg = strdup(GETMESSAGE(5,68,
4533 "Usage: DtSessionSavePath widget pathVariable fileVariable"));
4534 printerr(str_nill, errmsg, NULL);
4539 w = str_to_wtab(argv[0], argv[1]);
4543 status = DtSessionSavePath(w->w, &path, &file);
4546 env_set_var(argv[2], path);
4547 env_set_var(argv[3], file);
4559 do_DtShellIsIconified(
4567 unsigned long nitems;
4568 unsigned long leftover;
4569 WmStateData * wm_state;
4575 errmsg = strdup(GETMESSAGE(5,69, "Usage: DtShellIsIconified widget"));
4576 printerr(str_nill, errmsg, NULL);
4581 w = str_to_wtab(argv[0], argv[1]);
4585 wmStateAtom = XmInternAtom (XtDisplay(w->w), "WM_STATE", False);
4587 /* Getting the WM_STATE property to see if iconified or not */
4588 XGetWindowProperty(XtDisplay(w->w), XtWindow (w->w),
4589 wmStateAtom, 0L, (long) LINESIZE, False,
4590 wmStateAtom, &actual_type, &actual_format,
4591 &nitems, &leftover, (unsigned char **) &wm_state);
4593 return (wm_state->state != IconicState);
4597 do_DtSetStartupCommand(
4607 errmsg = strdup(GETMESSAGE(5,70,
4608 "Usage: DtSetStartupCommand widget command"));
4609 printerr(str_nill, errmsg, NULL);
4614 w = str_to_wtab(argv[0], argv[1]);
4618 commandAtom = XA_WM_COMMAND;
4620 XChangeProperty(XtDisplay(w->w), XtWindow(w->w), commandAtom,
4621 XA_STRING, 8, PropModeReplace,
4622 (unsigned char *)argv[2], strlen(argv[2])+1);
4623 XSync(XtDisplay(w->w), False);
4628 /* This only works if the widget is not yet realized */
4630 do_DtSetIconifyHint(
4636 XrmValue fval, tval;
4643 errmsg = strdup(GETMESSAGE(5,71,
4644 "Usage: DtSetIconifyHint widget boolean"));
4645 printerr(str_nill, errmsg, NULL);
4650 w = str_to_wtab(argv[0], argv[1]);
4654 fval.addr = argv[2];
4655 fval.size = strlen(argv[2]);
4656 XtConvert(Toplevel, XtRString, &fval, XtRBoolean, &tval);
4659 state = *((Boolean *)(tval.addr));
4665 /* add the iconify hint to the current shell */
4666 XtSetArg(args[0], XmNinitialState, IconicState);
4667 XtSetValues(w->w, args, 1);
4671 /* Remove the iconify hint from the current shell */
4672 wmhints = XGetWMHints(XtDisplay(w->w), XtWindow(w->w));
4673 wmhints->flags |= IconWindowHint;
4674 wmhints->initial_state = NormalState;
4675 XSetWMHints(XtDisplay(w->w), XtWindow(w->w), wmhints);
4683 do_DtWsmAddWorkspaceFunctions(
4687 return(WsmCommonProc(argc, argv, (void (*)())DtWsmAddWorkspaceFunctions));
4692 do_DtWsmRemoveWorkspaceFunctions(
4696 return(WsmCommonProc(argc, argv, (void (*)())DtWsmRemoveWorkspaceFunctions));
4715 errmsg = strdup(GetSharedMsg(DT_USAGE_DISPLAY_WINDOW));
4716 printerrf(str_nill, errmsg, argv[0], NULL, NULL, NULL, NULL,
4722 display = (Display *)strtoul(argv[1], &p, 0);
4725 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
4726 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
4731 window = (Window)strtoul(argv[2], &p, 0);
4734 errmsg = strdup(GetSharedMsg(DT_BAD_WINDOW));
4735 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
4741 (*func)(display, window);
4747 do_DtWsmGetCurrentWorkspace(
4761 errmsg = strdup(GetSharedMsg(DT_USAGE_DISPLAY_ROOT_VAR));
4762 printerrf(str_nill, errmsg, argv[0], NULL, NULL, NULL, NULL, NULL,
4768 display = (Display *)strtoul(argv[1], &p, 0);
4771 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
4772 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
4778 rootWindow = (Window)strtoul(argv[2], &p, 0);
4781 errmsg = strdup(GETMESSAGE(5,73,
4782 "The rootWindow parameter is invalid: %s"));
4783 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
4790 DtWsmGetCurrentWorkspace(display, rootWindow, &atom);
4791 sprintf(buf, "%ld", (long)atom);
4792 env_set_var(argv[3], buf);
4798 do_DtWsmSetCurrentWorkspace(
4810 errmsg = strdup(GETMESSAGE(5,74,
4811 "Usage: DtWsmSetCurrentWorkspace widget atom"));
4812 printerr(str_nill, errmsg, NULL);
4817 w = str_to_wtab(argv[0], argv[1]);
4821 atom = (Atom)strtoul(argv[2], &p, 0);
4824 errmsg = strdup(GETMESSAGE(5,75, "The workspace atom is invalid: %s"));
4825 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
4831 result = DtWsmSetCurrentWorkspace(w->w, atom);
4832 if (result == DT_SVC_SUCCESS)
4842 Boolean getOccupied,
4850 unsigned long numWS;
4860 printerrf(str_nill, usageMsg, argv[0], NULL, NULL, NULL, NULL, NULL,
4865 display = (Display *)strtoul(argv[1], &p, 0);
4868 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
4869 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
4875 root = (Window)strtoul(argv[2], &p, 0);
4878 errmsg = strdup(GetSharedMsg(DT_BAD_WINDOW));
4879 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
4887 result = DtWsmGetWorkspacesOccupied(display, root, &wsList, &numWS);
4889 result = DtWsmGetWorkspaceList(display, root, &wsList, (int *)&numWS);
4891 if (result == Success)
4896 for (i = 0; i < numWS; i++)
4898 sprintf(atom, "%ld", (long)wsList[i]);
4899 buf = XtRealloc(buf, strlen(buf) + strlen(atom) + 2);
4905 env_set_var(argv[3], buf);
4919 do_DtWsmGetWorkspaceList(
4926 errmsg = strdup(GetSharedMsg(DT_USAGE_DISPLAY_ROOT_VAR));
4927 retVal = GetWorkspaceList(errmsg, False, argc, argv);
4934 do_DtWsmGetWorkspacesOccupied(
4941 errmsg = strdup(GetSharedMsg(DT_USAGE_DISPLAY_WINDOW_VAR));
4942 retVal = GetWorkspaceList(errmsg, True, argc, argv);
4949 do_DtWsmSetWorkspacesOccupied(
4956 unsigned long numWS;
4965 errmsg = strdup(GETMESSAGE(5,78,
4966 "Usage: DtWsmSetWorkspacesOccupied display window workspaceList"));
4967 printerr(str_nill, errmsg, NULL);
4972 display = (Display *)strtoul(argv[1], &p, 0);
4975 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
4976 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
4981 window = (Window)strtoul(argv[2], &p, 0);
4984 errmsg = strdup(GetSharedMsg(DT_BAD_WINDOW));
4985 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
4994 /* Strip leading spaces */
4998 nextAtom = strtok(p, ",");
5000 wsList = (Atom *)XtMalloc(1);
5004 if (strlen(nextAtom) > 0)
5006 wsList = (Atom *)XtRealloc((char *)wsList, sizeof(Atom) * (numWS + 1));
5007 wsList[numWS] = atol(nextAtom);
5009 nextAtom = strtok(NULL, ",");
5013 DtWsmSetWorkspacesOccupied(display, window, wsList, numWS);
5014 XtFree ((char *)wsList);
5021 do_DtWsmGetCurrentBackdropWindow(
5027 Window rootWindow, returnedWin;
5032 errmsg = strdup(GetSharedMsg(DT_USAGE_DISPLAY_ROOT_VAR));
5033 printerrf(str_nill, errmsg, argv[0], NULL, NULL, NULL, NULL, NULL,
5039 display = (Display *)strtoul(argv[1], &p, 0);
5042 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
5043 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
5049 rootWindow = (Window)strtoul(argv[2], &p, 0);
5052 errmsg = strdup(GetSharedMsg(DT_BAD_WINDOW));
5053 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
5060 returnedWin = DtWsmGetCurrentBackdropWindow(display, rootWindow);
5062 if (returnedWin != None)
5066 sprintf(buf, "%d", (int)returnedWin);
5068 env_set_var(argv[3], buf);
5080 do_DtWsmOccupyAllWorkspaces(
5084 return(WsmCommonProc(argc, argv, (void (*)())DtWsmOccupyAllWorkspaces));
5089 do__DtGetHourGlassCursor(
5101 errmsg = strdup(GETMESSAGE(5,79,
5102 "Usage: _DtGetHourGlassCursor variable display"));
5103 printerr(str_nill, errmsg, NULL);
5108 display = (Display *)strtoul(argv[2], &p, 0);
5111 errmsg = strdup(GetSharedMsg(DT_BAD_DISPLAY));
5112 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
5115 alt_env_set_var(argv[1], str_nill);
5119 cursor = _DtGetHourGlassCursor(display);
5120 sprintf(buf, "%d", cursor);
5121 alt_env_set_var(argv[1], buf);
5128 DtTurnOnOrOffHourGlass(
5141 errmsg = strdup(GetSharedMsg(DT_USAGE_WIDGET));
5142 printerrf(str_nill, errmsg, argv[0], NULL, NULL, NULL, NULL,
5148 w = str_to_wtab(argv[0], argv[1]);
5158 do__DtTurnOnHourGlass(
5162 return(DtTurnOnOrOffHourGlass(_DtTurnOnHourGlass, argc, argv));
5167 do__DtTurnOffHourGlass(
5171 return(DtTurnOnOrOffHourGlass(_DtTurnOffHourGlass, argc, argv));
5175 do_DtWsmAddCurrentWorkspaceCallback(
5180 dtksh_client_data_t *cdata;
5183 DtWsmCBContext handle;
5189 errmsg = strdup(GETMESSAGE(5,80,
5190 "Usage: DtWsmAddCurrentWorkspaceCallback variable widget ksh-command"));
5191 printerr(str_nill, errmsg, NULL);
5196 w = str_to_wtab(argv[0], argv[2]);
5199 alt_env_set_var(argv[1], str_nill);
5203 /* Always force a new entry */
5204 cdata = GetNewCBData(NULL, NULL, NULL, None);
5206 cdata->ksh_cmd = strdup(argv[3]);
5208 handle = DtWsmAddCurrentWorkspaceCallback(w->w,
5209 (DtWsmWsChangeProc)stdWSCB, (XtPointer)cdata);
5210 cdata->handle = (XtPointer)handle;
5212 sprintf(buf, "%ld", (long)handle);
5213 alt_env_set_var(argv[1], buf);
5219 do_DtWsmRemoveWorkspaceCallback(
5224 dtksh_client_data_t *cdata = (dtksh_client_data_t *)NULL;
5225 DtWsmCBContext handle;
5230 errmsg = strdup(GETMESSAGE(5,81,
5231 "Usage: DtWsmRemoveWorkspaceCallback handle"));
5232 printerr(str_nill, errmsg, NULL);
5237 handle = (DtWsmCBContext)strtoul(argv[1], &p, 0);
5240 for(i = 0; i < cbDataTableSize; i++)
5242 if(cbDataTable[i] != (dtksh_client_data_t *)NULL)
5244 if(cbDataTable[i]->handle == handle)
5246 cdata = cbDataTable[i];
5253 if(cdata == (dtksh_client_data_t *)NULL)
5255 errmsg = strdup(GETMESSAGE(5,20,
5256 "The following is an invalid callback handle: %s"));
5257 printerrf(argv[0], errmsg, argv[1], NULL, NULL, NULL, NULL, NULL,
5263 return(RemoveOneCallback (argv[0], cdata->w->widid, NULL, cdata->ksh_cmd,
5268 /*****************************************************************************/
5269 /*****************************************************************************/
5281 errmsg = strdup(GETMESSAGE(5,83, "Usage: DtDbLoad"));
5282 printerr(str_nill, errmsg, NULL);
5292 /* Only a single handler is allowed */
5293 static char * reloadNotifyCommand = NULL;
5297 * This is our internal 'ReloadNotify' callback; it simply interprets
5298 * the ksh command specified by the shell script.
5302 XtPointer clientData )
5304 ksh_eval((char *)reloadNotifyCommand);
5309 * This command registers a ksh-command string, which will be executed
5310 * whenever a 'ReloadNotify' message is received. Subsequent calls to
5311 * this command will simply replace the previous ksh-command witht the
5315 do_DtDbReloadNotify(
5320 static Boolean firstTime = True;
5324 errmsg = strdup(GETMESSAGE(5,84, "Usage: DtDbReloadNotify ksh-command"));
5325 printerr(str_nill, errmsg, NULL);
5333 DtDbReloadNotify((DtDbReloadCallbackProc)DtkReloadHandler, NULL);
5336 XtFree(reloadNotifyCommand);
5337 reloadNotifyCommand = strdup(argv[1]);
5343 * This command is a boolean command, which returns 'True' if the
5344 * specified name correlates to a defined action.
5355 errmsg = strdup(GETMESSAGE(5,85, "Usage: DtActionExists actionName"));
5356 printerr(str_nill, errmsg, NULL);
5361 if (DtActionExists(argv[1]))
5368 * This command returns the label associated with an action. If the
5369 * action is not defined, or if there is no label, then an empty string
5382 errmsg = strdup(GETMESSAGE(5,86,
5383 "Usage: DtActionLabel variable actionName"));
5384 printerr(str_nill, errmsg, NULL);
5389 if (label = DtActionLabel(argv[2]))
5391 alt_env_set_var(argv[1], label);
5395 alt_env_set_var(argv[1], str_nill);
5401 * This command returns the description associated with an action. If the
5402 * action is not defined, or if there is no description, then an empty string
5406 do_DtActionDescription(
5415 errmsg = strdup(GETMESSAGE(5,87,
5416 "Usage: DtActionDescription variable actionName"));
5417 printerr(str_nill, errmsg, NULL);
5422 if (description = DtActionDescription(argv[2]))
5424 alt_env_set_var(argv[1], description);
5425 XtFree(description);
5428 alt_env_set_var(argv[1], str_nill);
5434 _DtActionInvokeUsage( void )
5438 errmsg = strdup(GETMESSAGE(5,88,
5439 "Usage: DtActionInvoke widget actionName termParms execHost contextDir useIndicator ksh-command [\"FILE\" fileName] ..."));
5440 printerr(str_nill, errmsg, NULL);
5446 * This command provides the shell script with the mechanism for requesting
5447 * that an action be invoked. It accepts a variable list of arguments,
5448 * which can currently only be of type 'ARG_FILE'.
5456 char * termParms = (char *)NULL;
5457 char * execHost = (char *)NULL;
5458 char * contextDir = (char *)NULL;
5459 Boolean useIndicator;
5461 DtActionArg *aap = (DtActionArg *)NULL;
5462 XrmValue fval, tval;
5468 * Either there must be no file args (so argc == 8), or if there are
5469 * file args, then there must be 2 components for each argument.
5470 * This check must change when/if we support arguments other than files.
5472 if ((argc < 8) || (((argc - 8) % 2) != 0))
5474 _DtActionInvokeUsage();
5478 w = str_to_wtab(argv[0], argv[1]);
5479 if (w == (wtab_t *)NULL)
5482 /* Get true/false value for useIndicator */
5483 fval.addr = argv[6];
5484 fval.size = strlen(argv[6]);
5485 XtConvert(Toplevel, XtRString, &fval, XtRBoolean, &tval);
5488 useIndicator = *((Boolean *)(tval.addr));
5492 if (argv[3] && (strlen(argv[3]) > 0))
5493 termParms = argv[3];
5495 if (argv[4] && (strlen(argv[4]) > 0))
5498 if (argv[5] && (strlen(argv[5]) > 0))
5499 contextDir = argv[5];
5502 * Parse the optional file arguments
5503 * This will have to change when/if we support arguments other than files.
5505 if ((aac = (argc - 8) / 2) > 0)
5507 aap = (DtActionArg *)XtMalloc(sizeof(DtActionArg) * aac);
5508 for (i = 8; i < argc; i+=2 )
5510 if(strcmp(argv[i], "FILE") != 0)
5512 _DtActionInvokeUsage();
5513 XtFree((char *)aap);
5518 aap[idx].argClass = DtACTION_FILE;
5519 aap[idx].u.file.name = argv[i + 1];
5523 /* Force fd above the range reserved by ksh for the user (0 - 9) */
5524 lockedFds = LockKshFileDescriptors();
5526 * Force callback to NULL until we have code in place to support it.
5528 DtActionInvoke(w->w, argv[2], aap, aac, termParms, execHost,
5529 contextDir, useIndicator, NULL,
5531 UnlockKshFileDescriptors(lockedFds);
5533 XtFree((char *)aap);
5539 /*****************************************************************************/
5540 /*****************************************************************************/
5543 do_DtDtsLoadDataTypes(
5551 errmsg = strdup(GETMESSAGE(5,89, "Usage: DtDtsLoadDataTypes"));
5552 printerr(str_nill, errmsg, NULL);
5557 DtDtsLoadDataTypes();
5563 do_DtDtsFileToDataType(
5572 errmsg = strdup(GETMESSAGE(5,90,
5573 "Usage: DtDtsFileToDataType variable fileName"));
5574 printerr(str_nill, errmsg, NULL);
5579 if (datatype = DtDtsFileToDataType(argv[2]))
5581 alt_env_set_var(argv[1], datatype);
5582 DtDtsFreeDataType(datatype);
5585 alt_env_set_var(argv[1], str_nill);
5591 do_DtDtsFileToAttributeValue(
5600 errmsg = strdup(GETMESSAGE(5,91,
5601 "Usage: DtDtsFileToAttributeValue variable fileName attrName"));
5602 printerr(str_nill, errmsg, NULL);
5607 if (attribute = DtDtsFileToAttributeValue(argv[2], argv[3]))
5609 alt_env_set_var(argv[1], attribute);
5610 DtDtsFreeAttributeValue(attribute);
5613 alt_env_set_var(argv[1], str_nill);
5619 do_DtDtsFileToAttributeList(
5624 char * attributeList;
5625 DtDtsAttribute ** attributes;
5630 errmsg = strdup(GETMESSAGE(5,92,
5631 "Usage: DtDtsFileToAttributeList variable fileName"));
5632 printerr(str_nill, errmsg, NULL);
5637 if (attributes = DtDtsFileToAttributeList(argv[2]))
5639 attributeList = XtMalloc(1);
5640 attributeList[0] = '\0';
5641 for (i = 0; attributes[i]; i++)
5643 attributeList = XtRealloc(attributeList,
5644 strlen(attributeList) +
5645 strlen(attributes[i]->name) + 3);
5647 strcat(attributeList, " ");
5648 strcat(attributeList, attributes[i]->name);
5651 alt_env_set_var(argv[1], attributeList);
5652 DtDtsFreeAttributeList(attributes);
5653 XtFree(attributeList);
5656 alt_env_set_var(argv[1], str_nill);
5662 do_DtDtsDataTypeToAttributeValue(
5670 if ((argc != 4) && (argc != 5))
5672 errmsg = strdup(GETMESSAGE(5,93,
5673 "Usage: DtDtsDataTypeToAttributeValue variable dataType attrName optName"));
5674 printerr(str_nill, errmsg, NULL);
5679 if ((argc == 4) || (strlen(argv[4]) == 0))
5684 if (attribute = DtDtsDataTypeToAttributeValue(argv[2], argv[3], optName))
5686 alt_env_set_var(argv[1], attribute);
5687 DtDtsFreeAttributeValue(attribute);
5690 alt_env_set_var(argv[1], str_nill);
5696 do_DtDtsDataTypeToAttributeList(
5701 char * attributeList;
5702 DtDtsAttribute ** attributes;
5706 if ((argc != 3) && (argc != 4))
5708 errmsg = strdup(GETMESSAGE(5,94,
5709 "Usage: DtDtsDataTypeToAttributeList variable dataType optName"));
5710 printerr(str_nill, errmsg, NULL);
5715 if ((argc == 3) || (strlen(argv[3]) == 0))
5720 if (attributes = DtDtsDataTypeToAttributeList(argv[2], optName))
5722 attributeList = XtMalloc(1);
5723 attributeList[0] = '\0';
5724 for (i = 0; attributes[i]; i++)
5726 attributeList = XtRealloc(attributeList,
5727 strlen(attributeList) +
5728 strlen(attributes[i]->name) + 3);
5730 strcat(attributeList, " ");
5731 strcat(attributeList, attributes[i]->name);
5734 alt_env_set_var(argv[1], attributeList);
5735 DtDtsFreeAttributeList(attributes);
5736 XtFree(attributeList);
5739 alt_env_set_var(argv[1], str_nill);
5745 do_DtDtsFindAttribute(
5750 char * dataTypeList;
5756 errmsg = strdup(GETMESSAGE(5,95,
5757 "Usage: DtDtsFindAttribute variable name value"));
5758 printerr(str_nill, errmsg, NULL);
5763 if (dataTypes = DtDtsFindAttribute(argv[2], argv[3]))
5765 dataTypeList = XtMalloc(1);
5766 dataTypeList[0] = '\0';
5767 for (i = 0; dataTypes[i]; i++)
5769 dataTypeList = XtRealloc(dataTypeList,
5770 strlen(dataTypeList) +
5771 strlen(dataTypes[i]) + 3);
5773 strcat(dataTypeList, " ");
5774 strcat(dataTypeList, dataTypes[i]);
5777 alt_env_set_var(argv[1], dataTypeList);
5778 DtDtsFreeDataTypeNames(dataTypes);
5779 XtFree(dataTypeList);
5782 alt_env_set_var(argv[1], str_nill);
5788 do_DtDtsDataTypeNames(
5793 char * dataTypeList;
5799 errmsg = strdup(GETMESSAGE(5,96, "Usage: DtDtsDataTypeNames variable"));
5800 printerr(str_nill, errmsg, NULL);
5805 if (dataTypes = DtDtsDataTypeNames())
5807 dataTypeList = XtMalloc(1);
5808 dataTypeList[0] = '\0';
5809 for (i = 0; dataTypes[i]; i++)
5811 dataTypeList = XtRealloc(dataTypeList,
5812 strlen(dataTypeList) +
5813 strlen(dataTypes[i]) + 3);
5815 strcat(dataTypeList, " ");
5816 strcat(dataTypeList, dataTypes[i]);
5819 alt_env_set_var(argv[1], dataTypeList);
5820 DtDtsFreeDataTypeNames(dataTypes);
5821 XtFree(dataTypeList);
5824 alt_env_set_var(argv[1], str_nill);
5830 do_DtDtsSetDataType(
5835 char * savedDataType;
5840 errmsg = strdup(GETMESSAGE(5,97,
5841 "Usage: DtDtsSetDataType variable fileName dataType override"));
5842 printerr(str_nill, errmsg, NULL);
5847 /* Since XtInitialize may not have been called, can't use XtConvert */
5848 if (DtCompareISOLatin1(argv[4], "true"))
5850 else if (DtCompareISOLatin1(argv[4], "false"))
5855 if (savedDataType = DtDtsSetDataType(argv[2], argv[3], override))
5857 alt_env_set_var(argv[1], savedDataType);
5858 DtDtsFreeDataType(savedDataType);
5861 alt_env_set_var(argv[1], str_nill);
5867 do_DtDtsDataTypeIsAction(
5875 errmsg = strdup(GETMESSAGE(5,98,
5876 "Usage: DtDtsDataTypeIsAction dataType"));
5877 printerr(str_nill, errmsg, NULL);
5882 if (DtDtsDataTypeIsAction(argv[1]))
5888 /*****************************************************************************/
5889 /*****************************************************************************/
5892 * This command will attempt to open a ToolTalk communications channel.
5901 Boolean sendStarted;
5904 char * statusString;
5912 errmsg = strdup(GETMESSAGE(5,99,
5913 "Usage: ttdt_open variable status variable2 toolname vendor version sendStarted"));
5914 printerr(str_nill, errmsg, NULL);
5919 /* Convert "true" or "false" to 1 or 0 */
5920 DtkshCvtStringToBool(argv[7], &toVal);
5922 if (toVal.size != 0)
5923 sendStarted = *((Boolean *)(toVal.addr));
5927 /* Force fd above the range reserved by ksh for the user (0 - 9) */
5928 lockedFds = LockKshFileDescriptors();
5929 procId = ttdt_open(&ttfd, argv[4], argv[5], argv[6], (int)sendStarted);
5930 UnlockKshFileDescriptors(lockedFds);
5932 /* Get the ttStatus and the asssociated string */
5933 ttStatus = tt_ptr_error(procId);
5934 DtkshCvtTtStatusToString(ttStatus, &toVal);
5936 if (toVal.size && toVal.addr)
5937 statusString = toVal.addr;
5939 statusString = str_nill;
5940 env_set_var(argv[2], statusString);
5942 if (ttStatus == TT_OK)
5943 env_set_var(argv[1], procId);
5946 env_set_var(argv[1], str_nill);
5950 sprintf(buf, "%d", ttfd);
5951 env_set_var(argv[3], buf);
5959 * This command is used to close a ToolTalk connection.
5967 Boolean sendStopped;
5968 XrmValue fval, tval;
5970 char * statusString;
5976 errmsg = strdup(GETMESSAGE(5,103,
5977 "Usage: ttdt_close status procId newProcId sendStopped"));
5978 printerr(str_nill, errmsg, NULL);
5983 /* Need to treat "" equal to a NULL pointer here */
5984 if (strlen(argv[2]) == 0)
5989 /* Need to treat "" equal to a NULL pointer here */
5990 if (strlen(argv[3]) == 0)
5993 newProcId = argv[3];
5995 DtkshCvtStringToBool(argv[4], &tval);
5998 sendStopped = *((Boolean *)(tval.addr));
6002 ttStatus = ttdt_close(procId, newProcId, (int)sendStopped);
6004 /* Map the ttStatus into a string */
6005 DtkshCvtTtStatusToString(ttStatus, &tval);
6007 if (tval.size && tval.addr)
6008 statusString = tval.addr;
6010 statusString = str_nill;
6011 env_set_var(argv[1], statusString);
6018 * This is the alternate input handler command for ToolTalk. Shell scripts
6019 * will invoke it from their alternate input handlers, passing in all of
6020 * the required parameters. This input handler will cause ToolTalk events
6021 * to be received and dispatched.
6024 do_tttk_Xt_input_handler(
6035 errmsg = strdup(GETMESSAGE(5,100,
6036 "Usage: tttk_Xt_input_handler procId source id"));
6037 printerr(str_nill, errmsg, NULL);
6042 source = strtoul(argv[2], &p, 0);
6045 errmsg=strdup(GETMESSAGE(5,101,
6046 "The source parameter must be an integer: %s"));
6047 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
6053 fid = strtoul(argv[3], &p, 0);
6056 errmsg = strdup(GETMESSAGE(5,102,
6057 "The id parameter must be a hex number: %s"));
6058 printerrf(argv[0], errmsg, argv[3], NULL, NULL, NULL, NULL, NULL,
6064 tttk_Xt_input_handler(argv[1], &source, &fid);
6070 do_ttdt_session_join(
6077 XrmValue fval, tval;
6079 char * statusString;
6083 Tt_pattern * patterns;
6087 errmsg = strdup(GETMESSAGE(5,104,
6088 "Usage: ttdt_session_join variable status sessId shellWidgetHandle join"
6090 printerr(str_nill, errmsg, NULL);
6095 DtkshCvtStringToBool(argv[5], &tval);
6098 join = *((Boolean *)(tval.addr));
6102 /* Need to treat "" equal to a NULL pointer here */
6103 if (strlen(argv[3]) == 0)
6108 /* Need to treat "" equal to a NULL pointer here */
6109 if (strlen(argv[4]) == 0)
6113 w = str_to_wtab(argv[0], argv[4]);
6119 patterns = ttdt_session_join(sessId, NULL, widget, NULL, (int)join);
6121 ttStatus = tt_ptr_error(patterns);
6123 /* Map the ttStatus into a string */
6124 DtkshCvtTtStatusToString(ttStatus, &tval);
6126 if (tval.size && tval.addr)
6127 statusString = tval.addr;
6129 statusString = str_nill;
6130 env_set_var(argv[2], statusString);
6132 if (ttStatus == TT_OK)
6134 sprintf(buf, "%ld", (long)patterns);
6135 env_set_var(argv[1], buf);
6138 env_set_var(argv[1], str_nill);
6145 do_ttdt_session_quit(
6152 XrmValue fval, tval;
6154 char * statusString;
6155 Tt_pattern * patterns;
6160 errmsg = strdup(GETMESSAGE(5,105,
6161 "Usage: ttdt_session_quit status sessId sessPatterns quit"));
6162 printerr(str_nill, errmsg, NULL);
6167 DtkshCvtStringToBool(argv[4], &tval);
6170 quit = *((Boolean *)(tval.addr));
6174 /* Need to treat "" equal to a NULL pointer here */
6175 if (strlen(argv[2]) == 0)
6180 /* Need to treat "" equal to a NULL pointer here */
6181 if (strlen(argv[3]) == 0)
6185 patterns = (Tt_pattern *)strtoul(argv[3], &p, 0);
6188 errmsg=strdup(GETMESSAGE(5,106,
6189 "The sessPatterns parameter is invalid: %s"));
6190 printerrf(argv[0], errmsg, argv[3], NULL, NULL, NULL, NULL, NULL,
6197 ttStatus = ttdt_session_quit(sessId, patterns, (int)quit);
6199 /* Map the ttStatus into a string */
6200 DtkshCvtTtStatusToString(ttStatus, &tval);
6202 if (tval.size && tval.addr)
6203 statusString = tval.addr;
6205 statusString = str_nill;
6206 env_set_var(argv[1], statusString);
6218 XrmValue fval, tval;
6220 char * statusString;
6222 Tt_pattern * patterns;
6228 errmsg = strdup(GETMESSAGE(5,107,
6229 "Usage: ttdt_file_event status op patterns send"));
6230 printerr(str_nill, errmsg, NULL);
6235 fval.addr = argv[2];
6236 fval.size = strlen(argv[2]);
6237 XtConvert(Toplevel, XtRString, &fval, "TtOp", &tval); /* XXX */
6240 op = *((Tttk_op *)(tval.addr));
6244 /* Need to treat "" equal to a NULL pointer here */
6245 if (strlen(argv[3]) == 0)
6249 patterns = (Tt_pattern *)strtoul(argv[3], &p, 0);
6252 errmsg = strdup(GetSharedMsg(DT_BAD_PATTERN));
6253 printerrf(argv[0], errmsg, argv[3], NULL, NULL, NULL, NULL, NULL,
6260 DtkshCvtStringToBool(argv[4], &tval);
6263 send = *((Boolean *)(tval.addr));
6268 ttStatus = ttdt_file_event(NULL, op, patterns, (int)send);
6270 /* Map the ttStatus into a string */
6271 DtkshCvtTtStatusToString(ttStatus, &tval);
6273 if (tval.size && tval.addr)
6274 statusString = tval.addr;
6276 statusString = str_nill;
6277 env_set_var(argv[1], statusString);
6284 * This is the internal callback invoked by tooltalk, whenever a message
6285 * is received for a file the user joined (using ttdt_file_join). We
6286 * need to set up some environment variables, and then interpret the
6287 * ksh-cmd supplied by the shell script.
6299 Ttdt_file_cb_data *cdata = (Ttdt_file_cb_data *)clientData;
6305 Namval_t * sameProcVar;
6306 Namval_t * sameEuidVar;
6307 XrmValue fval, tval;
6308 int ttmark = tt_mark();;
6310 /* Initialize the environment variables */
6311 msgVar = nv_search("DT_TT_MSG", sh.var_tree, NV_ADD);
6312 sprintf(strBuf, "%ld", (long)msg);
6313 nv_putval(msgVar, strBuf, NV_RDONLY);
6315 opVar = nv_search("DT_TT_OP", sh.var_tree, NV_ADD);
6316 fval.addr = (caddr_t)&op;
6317 fval.size = sizeof(op);
6318 XtConvert(Toplevel, "TtOp", &fval, XtRString, &tval); /* XXX?? */
6319 if (tval.size && tval.addr)
6320 nv_putval(opVar, (char *)tval.addr, NV_RDONLY);
6322 nv_putval(opVar, str_nill, NV_RDONLY);
6324 pathVar = nv_search("DT_TT_PATHNAME", sh.var_tree, NV_ADD);
6325 nv_putval(pathVar, pathName, NV_RDONLY);
6327 sameProcVar = nv_search("DT_TT_SAME_PROCID", sh.var_tree, NV_ADD);
6329 nv_putval(sameProcVar, "True", NV_RDONLY);
6331 nv_putval(sameProcVar, "False", NV_RDONLY);
6332 sameEuidVar = nv_search("DT_TT_SAME_EUID_EGID", sh.var_tree, NV_ADD);
6334 nv_putval(sameEuidVar, "True", NV_RDONLY);
6336 nv_putval(sameEuidVar, "False", NV_RDONLY);
6338 /* Interpret the registered command */
6339 results = ksh_eval((char *)cdata->ksh_cmd);
6341 /* Clean up the environment variables */
6342 nv_newattr(msgVar, 0, 0);
6344 nv_newattr(opVar, 0, 0);
6346 nv_newattr(pathVar, 0, 0);
6348 nv_newattr(sameProcVar, 0, 0);
6349 nv_close(sameProcVar);
6350 nv_newattr(sameEuidVar, 0, 0);
6351 nv_close(sameEuidVar);
6354 return((Tt_message)results);
6364 XrmValue fval, tval;
6366 char * statusString;
6369 Tt_pattern * patterns;
6370 Ttdt_file_cb_data * cData;
6376 errmsg = strdup(GETMESSAGE(5,115,
6377 "Usage: ttdt_file_join variable status pathName scope join ksh-command"));
6378 printerr(str_nill, errmsg, NULL);
6383 DtkshCvtStringToBool(argv[5], &tval);
6386 join = *((Boolean *)(tval.addr));
6390 fval.addr = argv[4];
6391 fval.size = strlen(argv[4]);
6392 XtConvert(Toplevel, XtRString, &fval, "TtScope", &tval); /* XXX ??? */
6395 scope = *((Tt_scope *)(tval.addr));
6399 cData = (Ttdt_file_cb_data *)XtMalloc(sizeof(Ttdt_file_cb_data));
6401 patterns = ttdt_file_join(argv[3], scope, (int)join, TtFileCB, cData);
6402 ttStatus = tt_ptr_error(patterns);
6404 /* Map the ttStatus into a string */
6405 DtkshCvtTtStatusToString(ttStatus, &tval);
6407 if (tval.size && tval.addr)
6408 statusString = tval.addr;
6410 statusString = str_nill;
6411 env_set_var(argv[2], statusString);
6414 * If the request failed, then no callback was added, so we can free
6415 * up the client data; otherwise, we need to finish filling in the
6416 * client data, and then saving it in our storage array, so that we
6417 * can later free it when ttdt_file_quit() is called.
6419 if (ttStatus == TT_OK)
6421 sprintf(buf, "%ld", (long)patterns);
6422 env_set_var(argv[1], buf);
6423 cData->ksh_cmd = strdup(argv[6]);
6424 cData->patterns = patterns;
6426 /* Add clientData to our storage array */
6427 for (i = 0; i < sizeFileCBList; i++)
6429 if (fileCBList[i] == NULL)
6432 if (i >= sizeFileCBList)
6434 /* Grow the array */
6435 sizeFileCBList += 10;
6436 fileCBList = (Ttdt_file_cb_data **)XtRealloc((char *)fileCBList,
6437 sizeof(Ttdt_file_cb_data *) * sizeFileCBList);
6438 for (j = i; j < sizeFileCBList; j++)
6439 fileCBList[j] = NULL;
6441 fileCBList[i] = cData;
6445 XtFree((char *)cData);
6446 env_set_var(argv[1], str_nill);
6459 XrmValue fval, tval;
6461 char * statusString;
6463 Tt_pattern * patterns;
6469 errmsg = strdup(GETMESSAGE(5,108,
6470 "Usage: ttdt_file_quit status patterns quit"));
6471 printerr(str_nill, errmsg, NULL);
6476 /* Need to treat "" equal to a NULL pointer here */
6477 if (strlen(argv[2]) == 0)
6481 patterns = (Tt_pattern *)strtoul(argv[2], &p, 0);
6484 errmsg = strdup(GetSharedMsg(DT_BAD_PATTERN));
6485 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
6492 DtkshCvtStringToBool(argv[3], &tval);
6495 quit = *((Boolean *)(tval.addr));
6499 ttStatus = ttdt_file_quit(patterns, (int)quit);
6501 /* Remove this entry from our list of file callbacks */
6502 for (i = 0; i < sizeFileCBList; i++)
6504 if (fileCBList[i] && (fileCBList[i]->patterns == patterns))
6506 XtFree(fileCBList[i]->ksh_cmd);
6507 XtFree((char *)fileCBList[i]);
6508 fileCBList[i] = NULL;
6513 /* Map the ttStatus into a string */
6514 DtkshCvtTtStatusToString(ttStatus, &tval);
6516 if (tval.size && tval.addr)
6517 statusString = tval.addr;
6519 statusString = str_nill;
6520 env_set_var(argv[1], statusString);
6527 do_ttdt_Get_Modified(
6532 XrmValue fval, tval;
6539 errmsg = strdup(GETMESSAGE(5,109,
6540 "Usage: ttdt_Get_Modified pathName scope timeout"));
6541 printerr(str_nill, errmsg, NULL);
6546 fval.addr = argv[2];
6547 fval.size = strlen(argv[2]);
6548 XtConvert(Toplevel, XtRString, &fval, "TtScope", &tval); /* XXX ?? */
6551 scope = *((Tt_scope *)(tval.addr));
6555 timeout = strtoul(argv[3], &p, 0);
6558 errmsg = strdup(GetSharedMsg(DT_BAD_TIMEOUT));
6559 printerrf(argv[0], errmsg, argv[3], NULL, NULL, NULL, NULL, NULL,
6565 if (ttdt_Get_Modified(NULL, argv[1], scope,
6566 XtWidgetToApplicationContext(Toplevel), timeout))
6575 * Common function for ttdt_Save and ttdt_Revert commands.
6579 Tt_status (*func)(),
6584 XrmValue fval, tval;
6589 char * statusString;
6593 errmsg = strdup(GETMESSAGE(5,110,
6594 "Usage: %s status pathName scope timeout"));
6595 printerrf(str_nill, errmsg, argv[0], NULL, NULL, NULL, NULL, NULL,
6601 fval.addr = argv[3];
6602 fval.size = strlen(argv[3]);
6603 XtConvert(Toplevel, XtRString, &fval, "TtScope", &tval); /* XXX ?? */
6606 scope = *((Tt_scope *)(tval.addr));
6610 timeout = strtoul(argv[4], &p, 0);
6613 errmsg = strdup(GetSharedMsg(DT_BAD_TIMEOUT));
6614 printerrf(argv[0], errmsg, argv[4], NULL, NULL, NULL, NULL, NULL,
6620 ttStatus = (*func)(NULL, argv[2], scope,
6621 XtWidgetToApplicationContext(Toplevel), timeout);
6623 /* Map the ttStatus into a string */
6624 DtkshCvtTtStatusToString(ttStatus, &tval);
6626 if (tval.size && tval.addr)
6627 statusString = tval.addr;
6629 statusString = str_nill;
6630 env_set_var(argv[1], statusString);
6641 return(ttdt_SaveOrRevert(ttdt_Save, argc, argv ));
6650 return(ttdt_SaveOrRevert(ttdt_Revert, argc, argv ));
6655 do_tt_error_pointer(
6660 XrmValue fval, tval;
6667 errmsg = strdup(GETMESSAGE(5,112,
6668 "Usage: tt_error_pointer variable ttStatus"));
6669 printerr(str_nill, errmsg, NULL);
6674 /* Map the string into a ttStatus */
6675 DtkshCvtStringToTtStatus(argv[2], &tval);
6678 ttStatus = *((Tt_status *)(tval.addr));
6682 errPtr = tt_error_pointer(ttStatus);
6683 sprintf(buf, "%ld", (long)errPtr);
6684 alt_env_set_var(argv[1], buf);
6691 message_DestroyOrReply(
6692 Tt_status (*func)(),
6697 XrmValue fval, tval;
6699 char * statusString;
6705 errmsg = strdup(GETMESSAGE(5,113, "Usage: %s status msg"));
6706 printerrf(str_nill, errmsg, argv[0], NULL, NULL, NULL, NULL, NULL,
6712 message = (Tt_message)strtoul(argv[2], &p, 0);
6715 errmsg = strdup(GetSharedMsg(DT_BAD_MESSAGE));
6716 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
6722 ttStatus = (*func)(message);
6724 /* Map the ttStatus into a string */
6725 DtkshCvtTtStatusToString(ttStatus, &tval);
6727 if (tval.size && tval.addr)
6728 statusString = tval.addr;
6730 statusString = str_nill;
6731 env_set_var(argv[1], statusString);
6738 do_tttk_message_destroy(
6742 return(message_DestroyOrReply(tttk_message_destroy, argc, argv));
6747 do_tt_message_reply(
6751 return(message_DestroyOrReply(tt_message_reply, argc, argv));
6756 message_FailOrReject(
6757 Tt_status (*func)(),
6762 XrmValue fval, tval;
6764 char * statusString;
6766 char * msgStatusString;
6772 errmsg = strdup(GETMESSAGE(5,114,
6773 "Usage: %s status msg msgStatus msgStatusString destroy"));
6774 printerrf(str_nill, errmsg, argv[0], NULL, NULL, NULL, NULL, NULL,
6780 message = (Tt_message)strtoul(argv[2], &p, 0);
6783 errmsg = strdup(GetSharedMsg(DT_BAD_MESSAGE));
6784 printerrf(argv[0], errmsg, argv[2], NULL, NULL, NULL, NULL, NULL,
6790 /* Map the string into a ttStatus */
6791 DtkshCvtStringToTtStatus(argv[3], &tval);
6794 ttStatus = *((Tt_status *)(tval.addr));
6798 /* Need to treat "" equal to a NULL pointer here */
6799 if (strlen(argv[4]) == 0)
6800 msgStatusString = NULL;
6802 msgStatusString = argv[4];
6804 /* Convert the boolean value */
6805 DtkshCvtStringToBool(argv[5], &tval);
6808 destroy = *((Boolean *)(tval.addr));
6812 ttStatus = (*func)(message, ttStatus, msgStatusString, destroy);
6814 /* Map the ttStatus into a string */
6815 DtkshCvtTtStatusToString(ttStatus, &tval);
6817 if (tval.size && tval.addr)
6818 statusString = tval.addr;
6820 statusString = str_nill;
6821 env_set_var(argv[1], statusString);
6828 do_tttk_message_reject(
6832 return(message_FailOrReject(tttk_message_reject, argc, argv));
6837 do_tttk_message_fail(
6841 return(message_FailOrReject(tttk_message_fail, argc, argv));
6853 XrmValue fval, tval;
6855 char * statusString;
6856 char * convertedName;
6860 if (argc != paramCount)
6862 printerr(str_nill, usageMsg, NULL);
6866 if (paramCount == 4)
6867 convertedName = (char *)(*func)(argv[3]);
6869 convertedName = (char *)(*func)(argv[3], argv[4]);
6872 * Map the ttStatus into a string. Note that we can't call the XtConvert
6873 * function, since a shell script may not have called XtInitialize.
6875 ttStatus = tt_ptr_error(convertedName);
6876 DtkshCvtTtStatusToString(ttStatus, &tval);
6878 if (ttStatus == TT_OK)
6879 env_set_var(argv[1], convertedName);
6881 env_set_var(argv[1], str_nill);
6883 if (tval.size && tval.addr)
6884 statusString = tval.addr;
6886 statusString = str_nill;
6887 env_set_var(argv[2], statusString);
6889 tt_free(convertedName);
6902 usageMsg = strdup(GETMESSAGE(5,116,
6903 "Usage: tt_file_netfile variable status filename"));
6904 results = tt_netfile_handler(4, tt_file_netfile, usageMsg, argc, argv);
6918 usageMsg = strdup(GETMESSAGE(5,117,
6919 "Usage: tt_netfile_file variable status netfilename"));
6920 results = tt_netfile_handler(4, tt_netfile_file, usageMsg, argc, argv);
6927 do_tt_host_file_netfile(
6934 usageMsg = strdup(GETMESSAGE(5,118,
6935 "Usage: tt_host_file_netfile variable status host filename"));
6936 results = tt_netfile_handler(5, tt_host_file_netfile, usageMsg, argc, argv);
6943 do_tt_host_netfile_file(
6950 usageMsg = strdup(GETMESSAGE(5,119,
6951 "Usage: tt_host_netfile_file variable status host netfilename"));
6952 results = tt_netfile_handler(5, tt_host_netfile_file, usageMsg, argc, argv);
6959 /*****************************************************************************/
6960 /*****************************************************************************/
6964 * Starting with the class of the widget, check to see if it defines the
6965 * indicated callback; if not, then keep checking its superclasses.
6968 CheckClassDisciplines(
6977 if (C[i].class == class)
6979 if (C[i].disciplines)
6981 while(C[i].disciplines[j].callbackName)
6983 if (strcmp(cbname, C[i].disciplines[j].callbackName) == 0)
6984 return(C[i].disciplines[j].discipline);
6995 /*****************************************************************************/
6996 /*****************************************************************************/
6999 * The following collection of functions deal with handling the dynamic
7000 * setting of an environment variable, when referenced by the shell script.
7001 * All of the environment variables are based off of the CB_CALL_DATA
7002 * environment variable, which is set before the shell script's callback
7003 * is invoked. After the shell script's callback returns, any dynamically
7004 * created environment variable are removed; thus, the scope is only
7005 * within the context of the callback.
7007 * If the shell script attempts to reference a subfield of the CB_CALL_DATA,
7008 * and if the parent has not yet been reference, then the 'name' passed to
7009 * the discipline function will contain all of the previously unreferenced
7010 * portions of the environment variable name. As an example, if the shell
7011 * script referenced ${CB_CALL_DATA.EVENT.TYPE} , and the "EVENT" portion
7012 * has not yet been referenced, then the incoming name will be "EVENT.TYPE".
7013 * This is why all of the discipline functions below use "strtok()"; this
7014 * allows us to break up the name into each token, and to then initialize
7015 * the token. Any unrecognized tokens are set to the string "". In the
7016 * above example, a new name/value pair will be created for both the
7017 * "EVENT" and the "TYPE" portions, and the returned name/value pair will
7018 * be for the "TYPE" portion, since it was the terminal portion of the
7023 static struct named_integer CallbackReasons[] = {
7024 { "CR_NONE", XmCR_NONE },
7025 { "CR_HELP", XmCR_HELP },
7026 { "CR_VALUE_CHANGED", XmCR_VALUE_CHANGED },
7027 { "CR_INCREMENT", XmCR_INCREMENT },
7028 { "CR_DECREMENT", XmCR_DECREMENT },
7029 { "CR_PAGE_INCREMENT", XmCR_PAGE_INCREMENT },
7030 { "CR_PAGE_DECREMENT", XmCR_PAGE_DECREMENT },
7031 { "CR_TO_TOP", XmCR_TO_TOP },
7032 { "CR_TO_BOTTOM", XmCR_TO_BOTTOM },
7033 { "CR_DRAG", XmCR_DRAG },
7034 { "CR_ACTIVATE", XmCR_ACTIVATE },
7035 { "CR_ARM", XmCR_ARM },
7036 { "CR_DISARM", XmCR_DISARM },
7037 { "CR_MAP", XmCR_MAP },
7038 { "CR_UNMAP", XmCR_UNMAP },
7039 { "CR_FOCUS", XmCR_FOCUS },
7040 { "CR_LOSING_FOCUS", XmCR_LOSING_FOCUS },
7041 { "CR_MODIFYING_TEXT_VALUE", XmCR_MODIFYING_TEXT_VALUE },
7042 { "CR_MOVING_INSERT_CURSOR", XmCR_MOVING_INSERT_CURSOR },
7043 { "CR_EXECUTE", XmCR_EXECUTE },
7044 { "CR_SINGLE_SELECT", XmCR_SINGLE_SELECT },
7045 { "CR_MULTIPLE_SELECT", XmCR_MULTIPLE_SELECT },
7046 { "CR_EXTENDED_SELECT", XmCR_EXTENDED_SELECT },
7047 { "CR_BROWSE_SELECT", XmCR_BROWSE_SELECT },
7048 { "CR_DEFAULT_ACTION", XmCR_DEFAULT_ACTION },
7049 { "CR_CLIPBOARD_DATA_REQUEST", XmCR_CLIPBOARD_DATA_REQUEST },
7050 { "CR_CLIPBOARD_DATA_DELETE", XmCR_CLIPBOARD_DATA_DELETE },
7051 { "CR_CASCADING", XmCR_CASCADING },
7052 { "CR_OK", XmCR_OK },
7053 { "CR_CANCEL", XmCR_CANCEL },
7054 { "CR_APPLY", XmCR_APPLY },
7055 { "CR_NO_MATCH", XmCR_NO_MATCH },
7056 { "CR_COMMAND_ENTERED", XmCR_COMMAND_ENTERED },
7057 { "CR_COMMAND_CHANGED", XmCR_COMMAND_CHANGED },
7058 { "CR_EXPOSE", XmCR_EXPOSE },
7059 { "CR_RESIZE", XmCR_RESIZE },
7060 { "CR_INPUT", XmCR_INPUT },
7061 { "CR_GAIN_PRIMARY", XmCR_GAIN_PRIMARY },
7062 { "CR_LOSE_PRIMARY", XmCR_LOSE_PRIMARY },
7063 { "CR_CREATE", XmCR_CREATE },
7064 { "CR_TEAR_OFF_ACTIVATE", XmCR_TEAR_OFF_ACTIVATE },
7065 { "CR_TEAR_OFF_DEACTIVATE", XmCR_TEAR_OFF_DEACTIVATE },
7066 { "CR_OBSCURED_TRAVERSAL", XmCR_OBSCURED_TRAVERSAL },
7067 { "CR_PROTOCOLS", 6666 },
7072 static struct named_integer HelpCallbackReasons[] = {
7073 { "HELP_CR_CLOSE", DtCR_HELP_CLOSE },
7074 { "HELP_CR_LINK_ACTIVATE", DtCR_HELP_LINK_ACTIVATE },
7080 * Create a new name/value pair (if necessary), and add it to the list of
7081 * name/value pairs which must be cleaned up when we are done.
7091 if (((np2 = nv_search(name, sh.var_tree, 0)) == NULL) ||
7092 (nestingLevel == 0))
7094 /* Add to the list only the first time referenced */
7095 if (nestingLevel + 1 > npTableSize)
7097 npTable = (Namval_t ***)XtRealloc((char *)npTable,
7098 sizeof(Namval_t **) * (nestingLevel+1));
7099 npListSizes = (int *)XtRealloc((char *)npListSizes,
7100 sizeof(int) * (nestingLevel+1));
7101 for (i = npTableSize; i < (nestingLevel + 1); i++)
7106 npTableSize = nestingLevel + 1;
7109 np2 = nv_search(name, sh.var_tree, NV_ADD);
7110 (npListSizes[nestingLevel])++;
7111 list = npTable[nestingLevel] = (Namval_t **)XtRealloc(
7112 (char *)npTable[nestingLevel],
7113 sizeof(Namval_t *) * npListSizes[nestingLevel]);
7114 list[npListSizes[nestingLevel] - 1] = np2;
7116 * I _think_ this works OK, because I _think_ the subshell code will
7117 * automatically clean up the "extra" Namval_t it might create here.
7118 * As long as we clean up the original, I don't think we leak here.
7121 np2 = sh_assignok(np2, 1);
7128 * Free only those environment variables created at this nesting level.
7131 FreeNestedVariables( void )
7136 if ((nestingLevel < 0) || (nestingLevel >= npTableSize))
7139 list = npTable[nestingLevel];
7141 for (i = 0; i < npListSizes[nestingLevel]; i++)
7143 nv_newattr(list[i], 0, 0);
7144 nv_stack(list[i], NULL);
7148 XtFree((char *)list);
7149 npTable[nestingLevel] = NULL;
7150 npListSizes[nestingLevel] = 0;
7155 * Create an empty name/value pair.
7156 * THIS FUNCTION ASSUMES THAT THE CALLER HAS DONE THE INITIAL strtok()
7157 * CALL, SO THAT WE CAN DO THE REMAINING ONES, TO INITIALIZE ALL REMAINING
7161 CreateEmptyNameValuePair(
7169 np2 = GetNameValuePair(name);
7171 nv_putval(np2, buf, NV_RDONLY);
7173 if (name = strtok(NULL, "."))
7174 return(CreateEmptyNameValuePair(np, name, fp));
7192 np2 = GetNameValuePair(name);
7193 sprintf(buf, format, value);
7195 nv_stack(np2, NULL);
7196 nv_putval(np2, buf, NV_RDONLY);
7198 nv_stack(np2, fp_new);
7200 if (name = strtok(NULL, "."))
7201 np2 = CreateEmptyNameValuePair(np, name, fp);
7216 np2 = GetNameValuePair(name);
7218 nv_putval(np2, value, NV_RDONLY);
7220 nv_putval(np2, str_nill, NV_RDONLY);
7222 if (name = strtok(NULL, "."))
7223 np2 = CreateEmptyNameValuePair(np, name, fp);
7230 ProcessBooleanIntValue(
7240 np2 = GetNameValuePair(name);
7242 strcpy(buf, "true");
7244 strcpy(buf, "false");
7247 * Any old disciplies MUST be cleared, before setting value. If this
7248 * is not done, then excessive looping occurs, and the value will not
7249 * be correct, the next time you retrieve it.
7251 nv_stack(np2, NULL);
7252 nv_putval(np2, buf, NV_RDONLY);
7254 nv_stack(np2, fp_new);
7256 if (name = strtok(NULL, "."))
7257 np2 = CreateEmptyNameValuePair(np, name, fp);
7264 ProcessTraversalDirection(
7265 XmTraversalDirection dir,
7275 np2 = GetNameValuePair(name);
7277 f.addr = (caddr_t)&dir;
7278 f.size = sizeof(XmTraversalDirection);
7281 XtConvert(Toplevel, "TraversalDirection", &f, XtRString, &t);
7283 if (t.size && t.addr)
7289 nv_putval(np2, buf, NV_RDONLY);
7291 if (name = strtok(NULL, "."))
7292 np2 = CreateEmptyNameValuePair(np, name, fp);
7299 ProcessSelectionType(
7309 int tmpSelType = (int)selType;
7311 np2 = GetNameValuePair(name);
7313 f.addr = (caddr_t)&tmpSelType;
7314 f.size = sizeof(int);
7317 XtConvert(Toplevel, "ListSelectionType", &f, XtRString, &t);
7319 if (t.size && t.addr)
7325 nv_putval(np2, buf, NV_RDONLY);
7327 if (name = strtok(NULL, "."))
7328 np2 = CreateEmptyNameValuePair(np, name, fp);
7350 np2 = GetNameValuePair(name);
7353 for (i = 0; i < count; i++)
7355 sprintf(buf2, "%d", table[i]);
7356 buf = XtRealloc(buf, strlen(buf) + strlen(buf2) + (i == 0 ? 1 : 2));
7363 nv_putval(np2, buf, NV_RDONLY);
7366 if (name = strtok(NULL, "."))
7367 np2 = CreateEmptyNameValuePair(np, name, fp);
7374 ProcessXmStringTable(
7385 np2 = GetNameValuePair(name);
7386 buf = _CvtXmStringTableToString(table, count);
7387 nv_putval(np2, buf, NV_RDONLY);
7389 if (name = strtok(NULL, "."))
7390 np2 = CreateEmptyNameValuePair(np, name, fp);
7397 ProcessWidgetHandle(
7407 np2 = GetNameValuePair(name);
7408 w = widget_to_wtab(handle);
7409 strcpy(buf, w ? w->widid : "Unknown");
7410 nv_putval(np2, buf, NV_RDONLY);
7412 if (name = strtok(NULL, "."))
7413 np2 = CreateEmptyNameValuePair(np, name, fp);
7420 ProcessXmStringValue(
7431 np2 = GetNameValuePair(name);
7433 if ((value = XmStringToString(xmstring)) == NULL)
7436 nv_putval(np2, value, NV_RDONLY);
7438 if (name = strtok(NULL, "."))
7439 np2 = CreateEmptyNameValuePair(np, name, fp);
7458 np2 = GetNameValuePair(name);
7460 f.addr = (caddr_t)&hyperType;
7461 f.size = sizeof(long);
7464 XtConvert(Toplevel, "HelpHyperType", &f, XtRString, &t);
7472 nv_putval(np2, buf, NV_RDONLY);
7474 if (name = strtok(NULL, "."))
7475 np2 = CreateEmptyNameValuePair(np, name, fp);
7481 static XEventTable eventTable[] = {
7485 {"XNOEXPOSE", NULL},
7486 {"XGRAPHICSEXPOSE", NULL},
7492 static EventEntryTable xanyTable[] = {
7493 {"TYPE", "XE_EventType", XtOffsetOf(XEvent, xany.type), sizeof(int)},
7494 {"SERIAL", "XE_IntValue", XtOffsetOf(XEvent, xany.serial),
7495 sizeof(unsigned long)},
7496 {"SEND_EVENT", "X_Bool", XtOffsetOf(XEvent, xany.send_event),
7498 {"DISPLAY", "XE_HexValue", XtOffsetOf(XEvent, xany.display),
7500 {"WINDOW", "XE_Window", XtOffsetOf(XEvent, xany.window),
7505 static EventEntryTable xbuttonTable[] = {
7506 {"TYPE", "XE_EventType", XtOffsetOf(XEvent, xbutton.type), sizeof(int)},
7507 {"SERIAL", "XE_IntValue", XtOffsetOf(XEvent, xbutton.serial),
7508 sizeof(unsigned long)},
7509 {"SEND_EVENT", "X_Bool", XtOffsetOf(XEvent, xbutton.send_event),
7511 {"DISPLAY", "XE_HexValue", XtOffsetOf(XEvent, xbutton.display),
7513 {"WINDOW", "XE_Window", XtOffsetOf(XEvent, xbutton.window),
7515 {"ROOT", "XE_Window", XtOffsetOf(XEvent, xbutton.root),
7517 {"SUBWINDOW", "XE_Window", XtOffsetOf(XEvent, xbutton.subwindow),
7519 {"TIME", "XE_IntValue", XtOffsetOf(XEvent, xbutton.time),
7520 sizeof(unsigned int)},
7521 {"X", "XE_IntValue", XtOffsetOf(XEvent, xbutton.x),
7523 {"Y", "XE_IntValue", XtOffsetOf(XEvent, xbutton.y),
7525 {"X_ROOT", "XE_IntValue", XtOffsetOf(XEvent, xbutton.x_root),
7527 {"Y_ROOT", "XE_IntValue", XtOffsetOf(XEvent, xbutton.y_root),
7529 {"STATE", "XE_ModifierState", XtOffsetOf(XEvent, xbutton.state),
7530 sizeof(unsigned int)},
7531 {"BUTTON", "XE_Button", XtOffsetOf(XEvent, xbutton.button),
7532 sizeof(unsigned int)},
7533 {"SAME_SCREEN", "X_Bool", XtOffsetOf(XEvent, xbutton.same_screen),
7538 static EventEntryTable xexposeTable[] = {
7539 {"TYPE", "XE_EventType", XtOffsetOf(XEvent, xexpose.type), sizeof(int)},
7540 {"SERIAL", "XE_IntValue", XtOffsetOf(XEvent, xexpose.serial),
7541 sizeof(unsigned long)},
7542 {"SEND_EVENT", "X_Bool", XtOffsetOf(XEvent, xexpose.send_event),
7544 {"DISPLAY", "XE_HexValue", XtOffsetOf(XEvent, xexpose.display),
7546 {"WINDOW", "XE_Window", XtOffsetOf(XEvent, xexpose.window),
7548 {"X", "XE_IntValue", XtOffsetOf(XEvent, xexpose.x),
7550 {"Y", "XE_IntValue", XtOffsetOf(XEvent, xexpose.y),
7552 {"WIDTH", "XE_IntValue", XtOffsetOf(XEvent, xexpose.width),
7554 {"HEIGHT", "XE_IntValue", XtOffsetOf(XEvent, xexpose.height),
7556 {"COUNT", "XE_IntValue", XtOffsetOf(XEvent, xexpose.count),
7561 static EventEntryTable xnoExposeTable[] = {
7562 {"TYPE", "XE_EventType", XtOffsetOf(XEvent, xnoexpose.type), sizeof(int)},
7563 {"SERIAL", "XE_IntValue", XtOffsetOf(XEvent, xnoexpose.serial),
7564 sizeof(unsigned long)},
7565 {"SEND_EVENT", "X_Bool", XtOffsetOf(XEvent, xnoexpose.send_event),
7567 {"DISPLAY", "XE_HexValue", XtOffsetOf(XEvent, xnoexpose.display),
7569 {"DRAWABLE", "XE_Window", XtOffsetOf(XEvent, xnoexpose.drawable),
7571 {"MAJOR_CODE", "XE_IntValue", XtOffsetOf(XEvent, xnoexpose.major_code),
7573 {"MINOR_CODE", "XE_IntValue", XtOffsetOf(XEvent, xnoexpose.minor_code),
7578 static EventEntryTable xgraphicsExposeTable[] = {
7579 {"TYPE", "XE_EventType",
7580 XtOffsetOf(XEvent, xgraphicsexpose.type), sizeof(int)},
7581 {"SERIAL", "XE_IntValue", XtOffsetOf(XEvent, xgraphicsexpose.serial),
7582 sizeof(unsigned long)},
7583 {"SEND_EVENT", "X_Bool", XtOffsetOf(XEvent, xgraphicsexpose.send_event),
7585 {"DISPLAY", "XE_HexValue", XtOffsetOf(XEvent, xgraphicsexpose.display),
7587 {"DRAWABLE", "XE_Window", XtOffsetOf(XEvent, xgraphicsexpose.drawable),
7589 {"X", "XE_IntValue", XtOffsetOf(XEvent, xgraphicsexpose.x),
7591 {"Y", "XE_IntValue", XtOffsetOf(XEvent, xgraphicsexpose.y),
7593 {"WIDTH", "XE_IntValue", XtOffsetOf(XEvent, xgraphicsexpose.width),
7595 {"HEIGHT", "XE_IntValue", XtOffsetOf(XEvent, xgraphicsexpose.height),
7597 {"COUNT", "XE_IntValue", XtOffsetOf(XEvent, xgraphicsexpose.count),
7599 {"MAJOR_CODE", "XE_IntValue",
7600 XtOffsetOf(XEvent, xgraphicsexpose.major_code),
7602 {"MINOR_CODE", "XE_IntValue", XtOffsetOf(XEvent, xgraphicsexpose.minor_code),
7607 static EventEntryTable xkeyTable[] = {
7608 {"TYPE", "XE_EventType", XtOffsetOf(XEvent, xkey.type), sizeof(int)},
7609 {"SERIAL", "XE_IntValue", XtOffsetOf(XEvent, xkey.serial),
7610 sizeof(unsigned long)},
7611 {"SEND_EVENT", "X_Bool", XtOffsetOf(XEvent, xkey.send_event),
7613 {"DISPLAY", "XE_HexValue", XtOffsetOf(XEvent, xkey.display),
7615 {"WINDOW", "XE_Window", XtOffsetOf(XEvent, xkey.window),
7617 {"ROOT", "XE_Window", XtOffsetOf(XEvent, xkey.root),
7619 {"SUBWINDOW", "XE_Window", XtOffsetOf(XEvent, xkey.subwindow),
7621 {"TIME", "XE_IntValue", XtOffsetOf(XEvent, xkey.time),
7622 sizeof(unsigned int)},
7623 {"X", "XE_IntValue", XtOffsetOf(XEvent, xkey.x),
7625 {"Y", "XE_IntValue", XtOffsetOf(XEvent, xkey.y),
7627 {"X_ROOT", "XE_IntValue", XtOffsetOf(XEvent, xkey.x_root),
7629 {"Y_ROOT", "XE_IntValue", XtOffsetOf(XEvent, xkey.y_root),
7631 {"STATE", "XE_ModifierState", XtOffsetOf(XEvent, xkey.state),
7632 sizeof(unsigned int)},
7633 {"KEYCODE", "XE_IntValue", XtOffsetOf(XEvent, xkey.keycode),
7634 sizeof(unsigned int)},
7635 {"SAME_SCREEN", "X_Bool", XtOffsetOf(XEvent, xkey.same_screen),
7640 static EventEntryTable xmotionTable[] = {
7641 {"TYPE", "XE_EventType", XtOffsetOf(XEvent, xmotion.type), sizeof(int)},
7642 {"SERIAL", "XE_IntValue", XtOffsetOf(XEvent, xmotion.serial),
7643 sizeof(unsigned long)},
7644 {"SEND_EVENT", "X_Bool", XtOffsetOf(XEvent, xmotion.send_event),
7646 {"DISPLAY", "XE_HexValue", XtOffsetOf(XEvent, xmotion.display),
7648 {"WINDOW", "XE_Window", XtOffsetOf(XEvent, xmotion.window),
7650 {"ROOT", "XE_Window", XtOffsetOf(XEvent, xmotion.root),
7652 {"SUBWINDOW", "XE_Window", XtOffsetOf(XEvent, xmotion.subwindow),
7654 {"TIME", "XE_IntValue", XtOffsetOf(XEvent, xmotion.time),
7655 sizeof(unsigned int)},
7656 {"X", "XE_IntValue", XtOffsetOf(XEvent, xmotion.x),
7658 {"Y", "XE_IntValue", XtOffsetOf(XEvent, xmotion.y),
7660 {"X_ROOT", "XE_IntValue", XtOffsetOf(XEvent, xmotion.x_root),
7662 {"Y_ROOT", "XE_IntValue", XtOffsetOf(XEvent, xmotion.y_root),
7664 {"STATE", "XE_ModifierState", XtOffsetOf(XEvent, xmotion.state),
7665 sizeof(unsigned int)},
7666 {"IS_HINT", "XE_MotionHint", XtOffsetOf(XEvent, xmotion.is_hint),
7668 {"SAME_SCREEN", "X_Bool", XtOffsetOf(XEvent, xmotion.same_screen),
7674 * The order in which the structures are initialized IS important; they
7675 * must be done in the same order as they are defined in the eventTable
7679 InitEventTables( void )
7683 eventTable[i++].table = xanyTable;
7684 eventTable[i++].table = xbuttonTable;
7685 eventTable[i++].table = xexposeTable;
7686 eventTable[i++].table = xnoExposeTable;
7687 eventTable[i++].table = xgraphicsExposeTable;
7688 eventTable[i++].table = xkeyTable;
7689 eventTable[i++].table = xmotionTable;
7694 ProcessCallbackEvent(
7702 static Boolean initialized = False;
7705 EventEntryTable * table;
7706 XrmValue fval, tval;
7715 np2 = GetNameValuePair(name);
7716 sprintf(buf, "0x%lx", (long)event);
7717 nv_putval(np2, buf, NV_RDONLY);
7719 if (name = strtok(NULL, "."))
7722 np2 = CreateEmptyNameValuePair(np, name, fp);
7725 np2 = GetNameValuePair(name);
7726 if (strcmp(name, "TYPE") == 0)
7728 fval.addr = (caddr_t)&(event->type);
7729 fval.size = sizeof(long);
7730 XtConvert(Toplevel, "XE_EventType", &fval, XtRString, &tval);
7732 ptr = (char *)(tval.addr);
7735 nv_putval(np2, ptr, NV_RDONLY);
7739 while (eventTable[i].eventType)
7741 if (strcmp(eventTable[i].eventType, name) == 0)
7743 sprintf(buf, "0x%lx", (long)event);
7744 nv_putval(np2, buf, NV_RDONLY);
7746 if (name = strtok(NULL, "."))
7748 np2 = GetNameValuePair(name);
7749 table = eventTable[i].table;
7750 while (table[j].fieldName)
7752 if (strcmp(table[j].fieldName, name) == 0)
7754 if (table[j].valueSize == sizeof(char))
7756 fval.addr = (caddr_t) ((char *)
7757 ((char *)event+table[j].valueOffset));
7758 fval.size = sizeof(char);
7760 else if (table[j].valueSize == sizeof(short))
7762 fval.addr = (caddr_t) ((short *)
7763 ((char *)event+table[j].valueOffset));
7764 fval.size = sizeof(short);
7766 else if (table[j].valueSize == sizeof(int))
7768 fval.addr = (caddr_t) ((int *)
7769 ((char *)event+table[j].valueOffset));
7770 fval.size = sizeof(int);
7772 else if (table[j].valueSize == sizeof(long))
7774 fval.addr = (caddr_t) ((long *)
7775 ((char *)event+table[j].valueOffset));
7776 fval.size = sizeof(long);
7778 XtConvert(Toplevel, table[j].representation,
7779 &fval, XtRString, &tval);
7781 ptr = (char *)(tval.addr);
7784 nv_putval(np2, ptr, NV_RDONLY);
7789 if (table[j].fieldName == NULL)
7790 nv_putval(np2, str_nill, NV_RDONLY);
7797 if (eventTable[i].eventType == NULL)
7798 nv_putval(np2, str_nill, NV_RDONLY);
7801 if (name = strtok(NULL, "."))
7802 np2 = CreateEmptyNameValuePair(np, name, fp);
7810 _IntProcessCallbackReason(
7811 struct named_integer *table,
7812 XmAnyCallbackStruct *cbData,
7821 * We won't use an Xt converter here (even though we could), because
7822 * we want to be able to handle the case where the callback reason
7823 * is one we don't know about.
7825 np2 = GetNameValuePair(name);
7828 if (table->value == cbData->reason)
7830 nv_putval(np2, table->name, NV_RDONLY);
7831 if (name = strtok(NULL, "."))
7832 np2 = CreateEmptyNameValuePair(np, name, fp);
7839 * fdt: someday, allow for an expandable table, which can be
7840 * added to by the shell script; useful when loading new widgets.
7843 /* Unknown callback reason; simply return the integer value */
7844 sprintf(buf, "%d", cbData->reason);
7845 nv_putval(np2, buf, NV_RDONLY);
7846 if (name = strtok(NULL, "."))
7847 np2 = CreateEmptyNameValuePair(np, name, fp);
7853 ProcessCallbackReason(
7854 XmAnyCallbackStruct *cbData,
7859 return(_IntProcessCallbackReason(CallbackReasons, cbData, np, name, fp));
7864 * This requires a separate handler, due to the fact that the help
7865 * callback reasons overlap the standard Motif callback reasons!!
7868 ProcessHelpCallbackReason(
7869 XmAnyCallbackStruct *cbData,
7874 return(_IntProcessCallbackReason(HelpCallbackReasons, cbData, np, name, fp));
7879 * Certain classes of callbacks do not return a structure as the calldata.
7880 * Examples are the destroyCallback, popupCallback, popdownCallback and
7881 * the workspace changed callback. Since the calldata is a value, and not
7882 * a structure, any references to subfields are invalid.
7892 char * dupName = strdup(name);
7894 token = strtok(dupName, ".");
7896 np2 = CreateEmptyNameValuePair(np, token, fp);
7903 * This function creates a new name/value pair (representing an environment
7904 * variable) when it is referenced. If the name/value pair already exists,
7905 * then it is simply reused. We keep track of all the name/value pairs
7906 * we create, so that they can be destroyed when callback processing has
7907 * completed. This handles the XmAnyCallbackStruct.
7917 XmAnyCallbackStruct * cbData;
7918 char * cbDataAddrStr;
7921 char * dupName = strdup(name);
7923 cbDataAddrStr = nv_getv(np, fp);
7924 cbData = (XmAnyCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
7926 token = strtok(dupName, ".");
7928 /* cbData can be NULL if invoked from XtCallCallbacks */
7930 np2 = CreateEmptyNameValuePair(np, token, fp);
7931 else if (strcmp(token, "REASON") == 0)
7932 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
7933 else if (strcmp(token, "EVENT") == 0)
7934 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
7936 np2 = CreateEmptyNameValuePair(np, token, fp);
7944 * This is the discipline handler for an event handler.
7945 * It only knows how to reference the event structure.
7956 char * eventAddrStr;
7961 eventAddrStr = nv_getv(np, fp);
7962 event = (XEvent *)strtoul(eventAddrStr, &p, 0);
7963 tmpBuf = XtMalloc(strlen(name) + strlen("EH_EVENT") + 2);
7964 sprintf(tmpBuf, "%s.%s", "EH_EVENT", name);
7965 token = strtok(tmpBuf, ".");
7966 np2 = ProcessCallbackEvent(event, np, token, fp);
7973 * This is the discipline handler for the translation handler.
7974 * It only knows how to reference the event structure.
7985 char * eventAddrStr;
7990 eventAddrStr = nv_getv(np, fp);
7991 event = (XEvent *)strtoul(eventAddrStr, &p, 0);
7992 tmpBuf = XtMalloc(strlen(name) + strlen("TRANSLATION_EVENT") + 2);
7993 sprintf(tmpBuf, "%s.%s", "TRANSLATION_EVENT", name);
7994 token = strtok(tmpBuf, ".");
7995 np2 = ProcessCallbackEvent(event, np, token, fp);
8001 * This is the 'create' discipline function for the scale widget.
8002 * This handles the XmScaleCallbackStruct.
8010 char * cbDataAddrStr;
8011 XmScaleCallbackStruct * cbData;
8014 char * dupName = strdup(name);
8017 cbDataAddrStr = nv_getv(np, fp);
8018 cbData = (XmScaleCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8020 token = strtok(dupName, ".");
8022 /* cbData can be NULL if invoked from XtCallCallbacks */
8024 np2 = CreateEmptyNameValuePair(np, token, fp);
8025 else if (strcmp(token, "REASON") == 0)
8026 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8027 else if (strcmp(token, "EVENT") == 0)
8028 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8029 else if (strcmp(token, "VALUE") == 0)
8030 np2 = ProcessIntValue((int)cbData->value, np, token, fp, "%d", NULL);
8032 np2 = CreateEmptyNameValuePair(np, token, fp);
8039 * This is the 'create' discipline function for the arrow widget.
8040 * This handles the XmArrowButtonCallbackStruct.
8048 char * cbDataAddrStr;
8049 XmArrowButtonCallbackStruct * cbData;
8052 char * dupName = strdup(name);
8055 cbDataAddrStr = nv_getv(np, fp);
8056 cbData = (XmArrowButtonCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8058 token = strtok(dupName, ".");
8060 /* cbData can be NULL if invoked from XtCallCallbacks */
8062 np2 = CreateEmptyNameValuePair(np, token, fp);
8063 else if (strcmp(token, "REASON") == 0)
8064 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8065 else if (strcmp(token, "EVENT") == 0)
8066 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8067 else if (strcmp(token, "CLICK_COUNT") == 0)
8069 if (cbData->reason == XmCR_ACTIVATE)
8071 np2 = ProcessIntValue((int)cbData->click_count, np, token, fp, "%d",
8075 np2 = CreateEmptyNameValuePair(np, token, fp);
8078 np2 = CreateEmptyNameValuePair(np, token, fp);
8085 * This is the 'create' discipline function for the comboBox widget.
8086 * This handles the XmComboBoxCallbackStruct.
8094 char * cbDataAddrStr;
8095 XmComboBoxCallbackStruct * cbData;
8098 char * dupName = strdup(name);
8101 cbDataAddrStr = nv_getv(np, fp);
8102 cbData = (XmComboBoxCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8104 token = strtok(dupName, ".");
8106 /* cbData can be NULL if invoked from XtCallCallbacks */
8108 np2 = CreateEmptyNameValuePair(np, token, fp);
8109 else if (strcmp(token, "REASON") == 0)
8110 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData,
8112 else if (strcmp(token, "EVENT") == 0)
8113 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8114 else if (strcmp(token, "ITEM_OR_TEXT") == 0)
8115 np2 = ProcessXmStringValue(cbData->item_or_text, np, token, fp);
8116 else if (strcmp(token, "ITEM_POSITION") == 0)
8118 np2 = ProcessIntValue((int)cbData->item_position, np, token, fp, "%d",
8122 np2 = CreateEmptyNameValuePair(np, token, fp);
8129 * This is the 'create' discipline function for the command widget.
8130 * This handles the XmCommandCallbackStruct.
8138 char * cbDataAddrStr;
8139 XmCommandCallbackStruct * cbData;
8142 char * dupName = strdup(name);
8146 cbDataAddrStr = nv_getv(np, fp);
8147 cbData = (XmCommandCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8149 token = strtok(dupName, ".");
8151 /* cbData can be NULL if invoked from XtCallCallbacks */
8153 np2 = CreateEmptyNameValuePair(np, token, fp);
8154 else if (strcmp(token, "REASON") == 0)
8155 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8156 else if (strcmp(token, "EVENT") == 0)
8157 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8158 else if (strcmp(token, "VALUE") == 0)
8159 np2 = ProcessXmStringValue(cbData->value, np, token, fp);
8160 else if (strcmp(token, "LENGTH") == 0)
8162 if ((p = XmStringToString(cbData->value)) == NULL)
8166 np2 = ProcessIntValue((int)len, np, token, fp, "%d", NULL);
8169 np2 = CreateEmptyNameValuePair(np, token, fp);
8176 * This is the 'create' discipline function for the drawingArea widget.
8177 * This handles the XmDrawingAreaCallbackStruct.
8185 char * cbDataAddrStr;
8186 XmDrawingAreaCallbackStruct * cbData;
8189 char * dupName = strdup(name);
8192 cbDataAddrStr = nv_getv(np, fp);
8193 cbData = (XmDrawingAreaCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8195 token = strtok(dupName, ".");
8197 /* cbData can be NULL if invoked from XtCallCallbacks */
8199 np2 = CreateEmptyNameValuePair(np, token, fp);
8200 else if (strcmp(token, "REASON") == 0)
8201 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8202 else if (strcmp(token, "EVENT") == 0)
8203 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8204 else if (strcmp(token, "WINDOW") == 0)
8205 np2 = ProcessIntValue((int)cbData->window, np, token, fp, "0x%x", NULL);
8207 np2 = CreateEmptyNameValuePair(np, token, fp);
8214 * This is the 'create' discipline function for the drawnButton widget.
8215 * This handles the XmDrawnButtonCallbackStruct.
8223 char * cbDataAddrStr;
8224 XmDrawnButtonCallbackStruct * cbData;
8227 char * dupName = strdup(name);
8230 cbDataAddrStr = nv_getv(np, fp);
8231 cbData = (XmDrawnButtonCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8233 token = strtok(dupName, ".");
8235 /* cbData can be NULL if invoked from XtCallCallbacks */
8237 np2 = CreateEmptyNameValuePair(np, token, fp);
8238 else if (strcmp(token, "REASON") == 0)
8239 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8240 else if (strcmp(token, "EVENT") == 0)
8241 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8242 else if (strcmp(token, "WINDOW") == 0)
8243 np2 = ProcessIntValue((int)cbData->window, np, token, fp, "0x%x", NULL);
8244 else if (strcmp(token, "CLICK_COUNT") == 0)
8246 if (cbData->reason == XmCR_ACTIVATE)
8248 np2 = ProcessIntValue((int)cbData->click_count, np, token, fp, "%d",
8252 np2 = CreateEmptyNameValuePair(np, token, fp);
8255 np2 = CreateEmptyNameValuePair(np, token, fp);
8262 * This is the 'create' discipline function for the file selection widget.
8263 * This handles the XmFileSelectionBoxCallbackStruct.
8271 char * cbDataAddrStr;
8272 XmFileSelectionBoxCallbackStruct * cbData;
8275 char * dupName = strdup(name);
8279 cbDataAddrStr = nv_getv(np, fp);
8280 cbData = (XmFileSelectionBoxCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8282 token = strtok(dupName, ".");
8284 /* cbData can be NULL if invoked from XtCallCallbacks */
8286 np2 = CreateEmptyNameValuePair(np, token, fp);
8287 else if (strcmp(token, "REASON") == 0)
8288 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8289 else if (strcmp(token, "EVENT") == 0)
8290 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8291 else if (strcmp(token, "VALUE") == 0)
8292 np2 = ProcessXmStringValue(cbData->value, np, token, fp);
8293 else if (strcmp(token, "LENGTH") == 0)
8295 if ((p = XmStringToString(cbData->value)) == NULL)
8299 np2 = ProcessIntValue(len, np, token, fp, "%d", NULL);
8301 else if (strcmp(token, "MASK") == 0)
8302 np2 = ProcessXmStringValue(cbData->mask, np, token, fp);
8303 else if (strcmp(token, "MASK_LENGTH") == 0)
8305 if ((p = XmStringToString(cbData->mask)) == NULL)
8309 np2 = ProcessIntValue(len, np, token, fp, "%d", NULL);
8311 else if (strcmp(token, "DIR") == 0)
8312 np2 = ProcessXmStringValue(cbData->dir, np, token, fp);
8313 else if (strcmp(token, "DIR_LENGTH") == 0)
8315 if ((p = XmStringToString(cbData->dir)) == NULL)
8319 np2 = ProcessIntValue(len, np, token, fp, "%d", NULL);
8321 else if (strcmp(token, "PATTERN") == 0)
8322 np2 = ProcessXmStringValue(cbData->pattern, np, token, fp);
8323 else if (strcmp(token, "PATTERN_LENGTH") == 0)
8325 if ((p = XmStringToString(cbData->pattern)) == NULL)
8329 np2 = ProcessIntValue(len, np, token, fp, "%d", NULL);
8332 np2 = CreateEmptyNameValuePair(np, token, fp);
8339 * This is the 'create' discipline function for the list widget.
8340 * This handles the XmListCallbackStruct.
8348 char * cbDataAddrStr;
8349 XmListCallbackStruct * cbData;
8352 char * dupName = strdup(name);
8356 cbDataAddrStr = nv_getv(np, fp);
8357 cbData = (XmListCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8359 token = strtok(dupName, ".");
8361 /* cbData can be NULL if invoked from XtCallCallbacks */
8363 np2 = CreateEmptyNameValuePair(np, token, fp);
8364 else if (strcmp(token, "REASON") == 0)
8365 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8366 else if (strcmp(token, "EVENT") == 0)
8367 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8368 else if (strcmp(token, "ITEM") == 0)
8369 np2 = ProcessXmStringValue(cbData->item, np, token, fp);
8370 else if (strcmp(token, "ITEM_LENGTH") == 0)
8372 if ((p = XmStringToString(cbData->item)) == NULL)
8376 np2 = ProcessIntValue(len, np, token, fp, "%d", NULL);
8378 else if (strcmp(token, "ITEM_POSITION") == 0)
8380 np2 = ProcessIntValue((int)cbData->item_position, np, token, fp, "%d",
8383 else if (strcmp(token, "SELECTED_ITEMS") == 0)
8385 if ((cbData->reason == XmCR_DEFAULT_ACTION) ||
8386 (cbData->reason == XmCR_MULTIPLE_SELECT) ||
8387 (cbData->reason == XmCR_EXTENDED_SELECT))
8389 np2 = ProcessXmStringTable(cbData->selected_items,
8390 cbData->selected_item_count,
8394 np2 = CreateEmptyNameValuePair(np, token, fp);
8396 else if (strcmp(token, "SELECTED_ITEM_COUNT") == 0)
8398 if ((cbData->reason == XmCR_DEFAULT_ACTION) ||
8399 (cbData->reason == XmCR_MULTIPLE_SELECT) ||
8400 (cbData->reason == XmCR_EXTENDED_SELECT))
8402 np2 = ProcessIntValue((int)cbData->selected_item_count, np, token,
8406 np2 = CreateEmptyNameValuePair(np, token, fp);
8408 else if (strcmp(token, "SELECTED_ITEM_POSITIONS") == 0)
8410 if ((cbData->reason == XmCR_DEFAULT_ACTION) ||
8411 (cbData->reason == XmCR_MULTIPLE_SELECT) ||
8412 (cbData->reason == XmCR_EXTENDED_SELECT))
8414 np2 = ProcessIntTable(cbData->selected_item_positions,
8415 cbData->selected_item_count,
8419 np2 = CreateEmptyNameValuePair(np, token, fp);
8421 else if (strcmp(token, "SELECTION_TYPE") == 0)
8423 if (cbData->reason == XmCR_EXTENDED_SELECT)
8424 np2 = ProcessSelectionType(cbData->selection_type, np, token, fp);
8426 np2 = CreateEmptyNameValuePair(np, token, fp);
8429 np2 = CreateEmptyNameValuePair(np, token, fp);
8436 * This is the 'create' discipline function for the pushbutton widget.
8437 * This handles the XmPushButtonCallbackStruct.
8445 char * cbDataAddrStr;
8446 XmPushButtonCallbackStruct * cbData;
8449 char * dupName = strdup(name);
8452 cbDataAddrStr = nv_getv(np, fp);
8453 cbData = (XmPushButtonCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8455 token = strtok(dupName, ".");
8457 /* cbData can be NULL if invoked from XtCallCallbacks */
8459 np2 = CreateEmptyNameValuePair(np, token, fp);
8460 else if (strcmp(token, "REASON") == 0)
8461 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8462 else if (strcmp(token, "EVENT") == 0)
8463 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8464 else if (strcmp(token, "CLICK_COUNT") == 0)
8466 if (cbData->reason == XmCR_ACTIVATE)
8468 np2 = ProcessIntValue((int)cbData->click_count, np, token, fp, "%d",
8472 np2 = CreateEmptyNameValuePair(np, token, fp);
8475 np2 = CreateEmptyNameValuePair(np, token, fp);
8482 * This is the 'create' discipline function for the rowcolumn widget.
8483 * This handles the XmRowColumnCallbackStruct.
8491 char * cbDataAddrStr;
8492 XmRowColumnCallbackStruct * cbData;
8495 char * dupName = strdup(name);
8498 cbDataAddrStr = nv_getv(np, fp);
8499 cbData = (XmRowColumnCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8501 token = strtok(dupName, ".");
8503 /* cbData can be NULL if invoked from XtCallCallbacks */
8505 np2 = CreateEmptyNameValuePair(np, token, fp);
8506 else if (strcmp(token, "REASON") == 0)
8508 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token,
8511 else if (strcmp(token, "EVENT") == 0)
8512 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8513 else if ((strcmp(token, "WIDGET") == 0) &&
8514 (cbData->reason == XmCR_ACTIVATE))
8516 np2 = ProcessWidgetHandle(cbData->widget, np, token, fp);
8518 else if ((strcmp(token, "DATA") == 0) && (cbData->reason == XmCR_ACTIVATE))
8519 np2 = ProcessIntValue((int)cbData->data, np, token, fp, "0x%x", NULL);
8520 else if ((strcmp(token, "CALLBACKSTRUCT") == 0) &&
8521 (cbData->reason == XmCR_ACTIVATE))
8523 np2 = ProcessIntValue((int)cbData->callbackstruct, np, token,fp,"0x%x",
8527 np2 = CreateEmptyNameValuePair(np, token, fp);
8534 * This is the 'create' discipline function for the scrollbar widget.
8535 * This handles the XmScrollBarCallbackStruct.
8543 char * cbDataAddrStr;
8544 XmScrollBarCallbackStruct * cbData;
8547 char * dupName = strdup(name);
8550 cbDataAddrStr = nv_getv(np, fp);
8551 cbData = (XmScrollBarCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8553 token = strtok(dupName, ".");
8555 /* cbData can be NULL if invoked from XtCallCallbacks */
8557 np2 = CreateEmptyNameValuePair(np, token, fp);
8558 else if (strcmp(token, "REASON") == 0)
8559 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8560 else if (strcmp(token, "EVENT") == 0)
8561 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8562 else if (strcmp(token, "VALUE") == 0)
8563 np2 = ProcessIntValue((int)cbData->value, np, token, fp, "%d", NULL);
8564 else if (strcmp(token, "PIXEL") == 0)
8566 if ((cbData->reason == XmCR_TO_BOTTOM) || (cbData->reason == XmCR_TO_TOP))
8567 np2 = ProcessIntValue((int)cbData->pixel, np, token,fp,"%d", NULL);
8569 np2 = CreateEmptyNameValuePair(np, token, fp);
8572 np2 = CreateEmptyNameValuePair(np, token, fp);
8579 * This is the 'create' discipline function for the scrolledwindow widget.
8580 * This handles the XmTraverseObsuredCallbackStruct.
8588 char * cbDataAddrStr;
8589 XmTraverseObscuredCallbackStruct * cbData;
8592 char * dupName = strdup(name);
8595 cbDataAddrStr = nv_getv(np, fp);
8596 cbData = (XmTraverseObscuredCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8598 token = strtok(dupName, ".");
8600 /* cbData can be NULL if invoked from XtCallCallbacks */
8602 np2 = CreateEmptyNameValuePair(np, token, fp);
8603 else if (strcmp(token, "REASON") == 0)
8604 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8605 else if (strcmp(token, "EVENT") == 0)
8606 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8607 else if (strcmp(token, "TRAVERSAL_DESTINATION") == 0)
8608 np2 = ProcessWidgetHandle(cbData->traversal_destination, np, token, fp);
8609 else if (strcmp(token, "DIRECTION") == 0)
8610 np2 = ProcessTraversalDirection(cbData->direction, np, token, fp);
8612 np2 = CreateEmptyNameValuePair(np, token, fp);
8619 * This is the 'create' discipline function for the selection box widget.
8620 * This handles the XmSelectionBoxCallbackStruct.
8628 char * cbDataAddrStr;
8629 XmSelectionBoxCallbackStruct * cbData;
8632 char * dupName = strdup(name);
8636 cbDataAddrStr = nv_getv(np, fp);
8637 cbData = (XmSelectionBoxCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8639 token = strtok(dupName, ".");
8641 /* cbData can be NULL if invoked from XtCallCallbacks */
8643 np2 = CreateEmptyNameValuePair(np, token, fp);
8644 else if (strcmp(token, "REASON") == 0)
8645 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8646 else if (strcmp(token, "EVENT") == 0)
8647 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8648 else if (strcmp(token, "VALUE") == 0)
8649 np2 = ProcessXmStringValue(cbData->value, np, token, fp);
8650 else if (strcmp(token, "LENGTH") == 0)
8652 if ((p = XmStringToString(cbData->value)) == NULL)
8656 np2 = ProcessIntValue(len, np, token, fp, "%d", NULL);
8659 np2 = CreateEmptyNameValuePair(np, token, fp);
8666 * This is the 'create' discipline function for the toggle widget.
8667 * This handles the XmToggleButtonCallbackStruct.
8675 char * cbDataAddrStr;
8676 XmToggleButtonCallbackStruct * cbData;
8679 char * dupName = strdup(name);
8682 cbDataAddrStr = nv_getv(np, fp);
8683 cbData = (XmToggleButtonCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8685 token = strtok(dupName, ".");
8687 /* cbData can be NULL if invoked from XtCallCallbacks */
8689 np2 = CreateEmptyNameValuePair(np, token, fp);
8690 else if (strcmp(token, "REASON") == 0)
8691 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8692 else if (strcmp(token, "EVENT") == 0)
8693 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8694 else if (strcmp(token, "SET") == 0)
8695 np2 = ProcessBooleanIntValue((int)cbData->set, np, token, fp, NULL);
8697 np2 = CreateEmptyNameValuePair(np, token, fp);
8704 * This is one ofthe 'create' discipline function for the text widget.
8705 * This handles the XmTextVerifyCallbackStruct. If a subfield can
8706 * be altered by a shell script (i.e. CB_CALL_DATA.TEXT.PTR), then
8707 * we must assign a discipline to the 'PTR' environment variable,
8708 * so that we will be notified when the assignment occurs, and thus
8709 * can update the real callback structure.
8717 char * cbDataAddrStr;
8718 XmTextVerifyCallbackStruct * cbData;
8724 char * dupName = strdup(name);
8727 cbDataAddrStr = nv_getv(np, fp);
8728 cbData = (XmTextVerifyCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8730 token = strtok(dupName, ".");
8732 /* cbData can be NULL if invoked from XtCallCallbacks */
8734 np2 = CreateEmptyNameValuePair(np, token, fp);
8735 else if (strcmp(token, "REASON") == 0)
8736 np2 = ProcessCallbackReason((XmAnyCallbackStruct *)cbData, np, token, fp);
8737 else if (strcmp(token, "EVENT") == 0)
8738 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
8739 else if (strcmp(token, "DOIT") == 0)
8741 static Namfun_t * disc = NULL;
8744 disc = CloneDiscipline(&text_doit_disc);
8746 np2 = ProcessBooleanIntValue((int)cbData->doit, np, token, fp, disc);
8748 else if (strcmp(token, "CURRINSERT") == 0)
8749 np2 = ProcessIntValue((int)cbData->currInsert, np, token, fp, "%d", NULL);
8750 else if (strcmp(token, "NEWINSERT") == 0)
8751 np2 = ProcessIntValue((int)cbData->newInsert, np, token, fp, "%d", NULL);
8752 else if (strcmp(token, "STARTPOS") == 0)
8754 static Namfun_t * disc = NULL;
8757 disc = CloneDiscipline(&text_startpos_disc);
8759 if ((cbData->reason == XmCR_LOSING_FOCUS) ||
8760 (cbData->reason == XmCR_MODIFYING_TEXT_VALUE))
8762 np2 = ProcessIntValue((int)cbData->startPos, np, token, fp,"%d", disc);
8765 np2 = CreateEmptyNameValuePair(np, token, fp);
8767 else if (strcmp(token, "ENDPOS") == 0)
8769 static Namfun_t * disc = NULL;
8772 disc = CloneDiscipline(&text_endpos_disc);
8774 if ((cbData->reason == XmCR_LOSING_FOCUS) ||
8775 (cbData->reason == XmCR_MODIFYING_TEXT_VALUE))
8777 np2 = ProcessIntValue((int)cbData->endPos, np, token, fp, "%d", disc);
8780 np2 = CreateEmptyNameValuePair(np, token, fp);
8782 else if (strcmp(token, "TEXT") == 0)
8784 if (cbData->reason == XmCR_MODIFYING_TEXT_VALUE)
8786 np2 = GetNameValuePair(token);
8787 sprintf(buf, "0x%lx", (long)cbData->text);
8788 nv_putval(np2, buf, NV_RDONLY);
8790 /* Need to handle the substructure fields */
8791 if (token = strtok(NULL, "."))
8793 np2 = GetNameValuePair(token);
8794 if (strcmp(token, "PTR") == 0)
8796 static Namfun_t * disc = NULL;
8799 disc = CloneDiscipline(&text_ptr_disc);
8801 /* Any old disciplies MUST be cleared, before setting value */
8802 nv_stack(np2, NULL);
8803 if (cbData->text->ptr)
8804 nv_putval(np2, cbData->text->ptr, NV_RDONLY);
8806 nv_putval(np2, str_nill, NV_RDONLY);
8807 nv_stack(np2, disc);
8809 else if (strcmp(token, "LENGTH") == 0)
8811 static Namfun_t * disc = NULL;
8814 disc = CloneDiscipline(&text_len_disc);
8816 /* Any old disciplies MUST be cleared, before setting value */
8817 sprintf(buf, "%d", cbData->text->length);
8818 nv_stack(np2, NULL);
8819 nv_putval(np2, buf, NV_RDONLY);
8820 nv_stack(np2, disc);
8822 else if (strcmp(token, "FORMAT") == 0)
8824 static Namfun_t * disc = NULL;
8827 disc = CloneDiscipline(&text_format_disc);
8829 f.addr = (caddr_t)&(cbData->text->format);
8830 f.size = sizeof(XmTextFormat);
8833 XtConvert(Toplevel, "TextFormat", &f, XtRString, &t);
8835 /* Any old disciplies MUST be cleared, before setting value */
8836 if (t.size && t.addr)
8840 nv_stack(np2, NULL);
8841 nv_putval(np2, value, NV_RDONLY);
8842 nv_stack(np2, disc);
8845 nv_putval(np2, str_nill, NV_RDONLY);
8847 /* No deeper nesting is supported */
8848 if (token = strtok(NULL, "."))
8849 np2 = CreateEmptyNameValuePair(np, token, fp);
8853 np2 = CreateEmptyNameValuePair(np, token, fp);
8856 np2 = CreateEmptyNameValuePair(np, token, fp);
8863 * This is one ofthe 'create' discipline function for the text widget.
8864 * This handles the XmTextVerifyCallbackStructWcs.
8872 char * cbDataAddrStr;
8873 XmTextVerifyCallbackStructWcs * cbData;
8877 char * nameCopy = strdup(name);
8878 char * dupName = strdup(name);
8881 cbDataAddrStr = nv_getv(np, fp);
8882 cbData = (XmTextVerifyCallbackStructWcs *)strtoul(cbDataAddrStr, &p, 0);
8884 token = strtok(dupName, ".");
8886 /* cbData can be NULL if invoked from XtCallCallbacks */
8888 np2 = CreateEmptyNameValuePair(np, token, fp);
8889 else if (strcmp(token, "TEXT") == 0)
8891 np2 = GetNameValuePair(token);
8892 sprintf(buf, "0x%lx", (long)cbData->text);
8893 nv_putval(np2, buf, NV_RDONLY);
8895 /* Need to handle the substructure fields */
8896 if (token = strtok(NULL, "."))
8898 np2 = GetNameValuePair(token);
8899 if (strcmp(token, "WCSPTR") == 0)
8901 static Namfun_t * disc = NULL;
8904 disc = CloneDiscipline(&text_wcsptr_disc);
8906 /* Any old disciplies MUST be cleared, before setting value */
8907 nv_stack(np2, NULL);
8908 if (cbData->text->wcsptr)
8916 * It appears that the wchar string coming in is NOT NULL
8917 * terminated; we must make our own copy, before calling
8920 wcBuf = (wchar_t *)XtMalloc((cbData->text->length + 1) *
8922 for ( i = 0; i < cbData->text->length; i++)
8923 wcBuf[i] = cbData->text->wcsptr[i];
8926 mbBufSize = ((cbData->text->length + 1) * sizeof(wchar_t));
8927 mbBuf = XtMalloc(mbBufSize);
8928 count = wcstombs(mbBuf, wcBuf, mbBufSize - sizeof(wchar_t));
8931 mbBuf[count] = '\0';
8932 nv_putval(np2, mbBuf, NV_RDONLY);
8935 nv_putval(np2, str_nill, NV_RDONLY);
8937 XtFree((char *)wcBuf);
8940 nv_putval(np2, str_nill, NV_RDONLY);
8941 nv_stack(np2, disc);
8943 else if (strcmp(token, "LENGTH") == 0)
8945 static Namfun_t * disc = NULL;
8948 disc = CloneDiscipline(&text_wcslen_disc);
8950 /* Any old disciplies MUST be cleared, before setting value */
8951 sprintf(buf, "%d", cbData->text->length);
8952 nv_stack(np2, NULL);
8953 nv_putval(np2, buf, NV_RDONLY);
8954 nv_stack(np2, disc);
8957 nv_putval(np2, str_nill, NV_RDONLY);
8959 /* No deeper nesting is supported */
8960 if (token = strtok(NULL, "."))
8961 np2 = CreateEmptyNameValuePair(np, token, fp);
8965 np2 = textCreateDisc(np, nameCopy, fp);
8973 * This is the 'create' discipline function for the help widget.
8974 * This handles the DtHelpDialogCallbackStruct.
8982 char * cbDataAddrStr;
8983 DtHelpDialogCallbackStruct * cbData;
8986 char * dupName = strdup(name);
8989 cbDataAddrStr = nv_getv(np, fp);
8990 cbData = (DtHelpDialogCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
8992 token = strtok(dupName, ".");
8994 /* cbData can be NULL if invoked from XtCallCallbacks */
8996 np2 = CreateEmptyNameValuePair(np, token, fp);
8997 else if (strcmp(token, "REASON") == 0)
9000 * Can't use the normal callback reason function, since the help
9001 * callback reasons are not unique! They overlap with the normal
9004 np2 = ProcessHelpCallbackReason((XmAnyCallbackStruct *)cbData, np,
9007 else if (strcmp(token, "EVENT") == 0)
9010 np2 = ProcessCallbackEvent(cbData->event, np, token, fp);
9012 np2 = CreateEmptyNameValuePair(np, token, fp);
9014 else if (strcmp(token, "LOCATIONID") == 0)
9016 if (cbData->reason == DtCR_HELP_LINK_ACTIVATE)
9017 np2 = ProcessStringValue(cbData->locationId, np, token, fp);
9019 np2 = CreateEmptyNameValuePair(np, token, fp);
9021 else if (strcmp(token, "HELPVOLUME") == 0)
9023 if (cbData->reason == DtCR_HELP_LINK_ACTIVATE)
9024 np2 = ProcessStringValue(cbData->helpVolume, np, token, fp);
9026 np2 = CreateEmptyNameValuePair(np, token, fp);
9028 else if (strcmp(token, "SPECIFICATION") == 0)
9030 if (cbData->reason == DtCR_HELP_LINK_ACTIVATE)
9031 np2 = ProcessStringValue(cbData->specification, np, token, fp);
9033 np2 = CreateEmptyNameValuePair(np, token, fp);
9035 else if (strcmp(token, "HYPERTYPE") == 0)
9037 if (cbData->reason == DtCR_HELP_LINK_ACTIVATE)
9038 np2 = ProcessHyperType(cbData->hyperType, np, token, fp);
9040 np2 = CreateEmptyNameValuePair(np, token, fp);
9043 np2 = CreateEmptyNameValuePair(np, token, fp);
9050 * This is the 'DtPrintSetupProc' discipline function for the DtPrintSetupBox
9051 * widget. It handles the DtPrintSetupData struct with the exception of the
9052 * print_display and print_screen members.
9055 dtPrintSetupProcDisc(
9060 char * cbDataAddrStr;
9061 DtPrintSetupData * cbData;
9064 char * dupName = strdup(name);
9067 cbDataAddrStr = nv_getv(np, fp);
9068 cbData = (DtPrintSetupData *)strtoul(cbDataAddrStr, &p, 0);
9070 token = strtok(dupName, ".");
9073 np2 = CreateEmptyNameValuePair(np, token, fp);
9074 else if (strcmp(token, "PRINTER_NAME") == 0)
9075 np2 = ProcessStringValue(cbData->printer_name, np, token, fp);
9076 else if (strcmp(token, "DESTINATION") == 0)
9077 np2 = ProcessIntValue(cbData->destination, np, token, fp, "%d", NULL);
9078 else if (strcmp(token, "DEST_INFO") == 0)
9079 np2 = ProcessStringValue(cbData->dest_info, np, token, fp);
9081 np2 = CreateEmptyNameValuePair(np, token, fp);
9088 /****************************************************************************
9090 * The following functions are used to create and free a copy of a
9091 * discipline structure. We register a discipline when we want to
9092 * be notified that the shell script has referenced one of our special
9093 * environment variables. This gives us the ability to dynamically
9094 * assign the value they will receive. This is used during callback,
9095 * translation and event handling (i.e. CB_CALL_DATA, etc). We need
9096 * to duplicate the discipline structure due to how ksh handles these
9097 * structures; it stores each successive one in a linked list. Typically,
9098 * this is not a problem. However, because callbacks can become nested
9099 * (From within one callback, the script does something which causes another
9100 * callback to fire), if the same discipline structure gets passed in twice,
9101 * when it gets added to the linked list, the original 'next' pointer gets
9102 * trashed; the typical result is that the next time one of the special
9103 * environment variables is referenced, dtksh goes into an infinite loop.
9104 * The solution appears to be to 'clone' the discipline, thus creating
9105 * a unique structure each time, and preventing the 'next' pointer from
9108 **************************************************************************/
9112 Namdisc_t * discipline )
9114 Namfun_t * clonedDisc;
9116 clonedDisc = (Namfun_t *)XtMalloc(sizeof(Namfun_t));
9117 clonedDisc->disc = discipline;
9118 clonedDisc->next = NULL;
9125 Namfun_t * discipline )
9127 XtFree((char *)discipline);
9137 XrmValue fval, tval;
9138 Boolean doit = True;
9139 char * cbDataAddrStr;
9140 XmTextVerifyCallbackStruct * cbData;
9144 /* Convert from string to a boolean */
9146 fval.size = strlen(name);
9147 XtConvert(Toplevel, XtRString, &fval, XtRBoolean, &tval);
9150 doit = *((Boolean *)(tval.addr));
9152 if (cbDataNp = nv_open("CB_CALL_DATA", sh.var_tree, 0))
9154 cbDataAddrStr = nv_getv(cbDataNp, NULL);
9155 cbData=(XmTextVerifyCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
9156 cbData->doit = doit;
9166 char * cbDataAddrStr;
9167 XmTextVerifyCallbackStruct * cbData;
9171 if (cbDataNp = nv_open("CB_CALL_DATA", sh.var_tree, 0))
9173 cbDataAddrStr = nv_getv(cbDataNp, NULL);
9174 cbData=(XmTextVerifyCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
9175 cbData->startPos = strtoul(name, &p, 0);
9185 char * cbDataAddrStr;
9186 XmTextVerifyCallbackStruct * cbData;
9190 if (cbDataNp = nv_open("CB_CALL_DATA", sh.var_tree, 0))
9192 cbDataAddrStr = nv_getv(cbDataNp, NULL);
9193 cbData=(XmTextVerifyCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
9194 cbData->endPos = strtoul(name, &p, 0);
9204 char * cbDataAddrStr;
9205 XmTextVerifyCallbackStruct * cbData;
9208 static char * staticBuf = NULL;
9210 if (cbDataNp = nv_open("CB_CALL_DATA", sh.var_tree, 0))
9212 cbDataAddrStr = nv_getv(cbDataNp, NULL);
9213 cbData=(XmTextVerifyCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
9217 * Motif will not currently free the original buffer,
9218 * but will instead free our buffer.
9220 * XtFree(staticBuf);
9222 staticBuf = strdup(name);
9223 cbData->text->ptr = staticBuf;
9233 char * cbDataAddrStr;
9234 XmTextVerifyCallbackStruct * cbData;
9238 if (cbDataNp = nv_open("CB_CALL_DATA", sh.var_tree, 0))
9240 cbDataAddrStr = nv_getv(cbDataNp, NULL);
9241 cbData=(XmTextVerifyCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
9242 cbData->text->length = strtoul(name, &p, 0);
9252 XrmValue fval, tval;
9253 Boolean doit = True;
9254 char * cbDataAddrStr;
9255 XmTextVerifyCallbackStruct * cbData;
9259 /* Convert from string to format type */
9261 fval.size = strlen(name);
9262 XtConvert(Toplevel, XtRString, &fval, "TextFormat", &tval);
9264 if (tval.size && tval.addr &&
9265 (cbDataNp = nv_open("CB_CALL_DATA", sh.var_tree, 0)))
9267 cbDataAddrStr = nv_getv(cbDataNp, NULL);
9268 cbData=(XmTextVerifyCallbackStruct *)strtoul(cbDataAddrStr, &p, 0);
9269 cbData->text->format = *((int *)(tval.addr));
9279 char * cbDataAddrStr;
9280 XmTextVerifyCallbackStructWcs * cbData;
9283 static wchar_t * wcBuf = NULL;
9286 if (cbDataNp = nv_open("CB_CALL_DATA", sh.var_tree, 0))
9288 cbDataAddrStr = nv_getv(cbDataNp, NULL);
9289 cbData=(XmTextVerifyCallbackStructWcs *)strtoul(cbDataAddrStr, &p, 0);
9293 * Motif will not currently free the original buffer,
9294 * but will instead free our buffer.
9298 wcBuf = (wchar_t *)XtMalloc((strlen(name) + 1) * sizeof(wchar_t));
9299 count = mbstowcs(wcBuf, name, strlen(name)+1);
9300 cbData->text->wcsptr = wcBuf;
9310 char * cbDataAddrStr;
9311 XmTextVerifyCallbackStructWcs * cbData;
9315 if (cbDataNp = nv_open("CB_CALL_DATA", sh.var_tree, 0))
9317 cbDataAddrStr = nv_getv(cbDataNp, NULL);
9318 cbData=(XmTextVerifyCallbackStructWcs *)strtoul(cbDataAddrStr, &p, 0);
9319 cbData->text->length = strtoul(name, &p, 0);
9324 * stdPrintSetupProc() is the central routine from which the DtPrintSetupBox
9325 * widget's DtPrintSetupProc resources are dispatched.
9326 * The variable "CB_WIDGET" will be placed in the environment to represent
9327 * the CallBackWidget handle. Because DtPrintSetupProc doesn't work the
9328 * same way as a callback, we had to fudge this to work by storing the command
9329 * string inside the widget's wtab_t->info field. This is pretty nasty and
9330 * non-generic, but there does not appear to be a good solution.
9332 * The call_data is made available through the CD_CALL_DATA variable.
9334 * If a new DtPrintSetupProc resource needs to be supported, the list of
9335 * hardcoded procs and associated information have to be updated, as follows:
9336 * - add a #define of the resource in dtksh.h
9337 * - add a new member in the ProcInfo_t to store that command in dtksh.h.
9338 * - add a new function called std<resource_name> which calls
9339 * stdPrintSetupProc().
9340 * - add a new case to set the command to the above function for the new
9341 * resource in DtkshCvtStringToPrintSetupProc().
9342 * - add a new case in the switch statement this function to account for
9351 DtPrintSetupData *callData)
9359 Namdisc_t *discipline = NULL;
9360 char *oldCB_WIDGET_value = NULL;
9361 char *oldCB_CALL_DATA_value = NULL;
9363 Namfun_t *clonedDisc;
9365 w = widget_to_wtab((Widget)widget);
9368 pinfo = (ProcInfo_t *) w->info;
9373 np2 = GetNameValuePair("CB_WIDGET");
9374 nv_newattr(np2, 0, 0);
9375 if (ptr = nv_getval(np2))
9376 oldCB_WIDGET_value = strdup(ptr);
9377 nv_putval(np2, w->widid, NV_RDONLY);
9378 nv_newattr(np2, NV_RDONLY, 0);
9380 sprintf(buf, "0x%lx", (long)callData);
9382 np = GetNameValuePair("CB_CALL_DATA");
9383 nv_newattr(np, 0, 0);
9384 if (ptr = nv_getval(np))
9385 oldCB_CALL_DATA_value = strdup(ptr);
9386 nv_putval(np, buf, NV_RDONLY);
9387 nv_newattr(np, NV_RDONLY, 0);
9389 /* look up the discipline for DtPrintSetupProc */
9390 class = XtClass(w->w);
9392 if (discipline = CheckClassDisciplines(class, DtRPrintSetupProc))
9394 class = class->core_class.superclass;
9398 * If a discipline was found, then use it; otherwise, we MUST set up
9399 * a default discipline; otherwise, any hierarchical variables
9400 * referenced by the user are not under our control, thus never getting
9401 * freed up, and then also preventing future disciplines from getting
9402 * called when they should have.
9405 clonedDisc = CloneDiscipline(discipline);
9407 clonedDisc = CloneDiscipline(&dftDiscipline);
9408 nv_stack(np, clonedDisc);
9411 case PRINTER_INFO_PROC:
9412 ksh_eval(pinfo->printerInfoProcCommand);
9414 case SELECT_FILE_PROC:
9415 ksh_eval(pinfo->selectFileProcCommand);
9417 case SELECT_PRINTER_PROC:
9418 ksh_eval(pinfo->selectPrinterProcCommand);
9421 ksh_eval(pinfo->setupProcCommand);
9423 case VERIFY_PRINTER_PROC:
9424 ksh_eval(pinfo->verifyPrinterProcCommand);
9428 /* We may be nested, so restore old CB_WIDGET & CB_CALL_DATA values */
9429 RestorePriorEnvVarValues(np2, oldCB_WIDGET_value, np, oldCB_CALL_DATA_value);
9430 XtFree(oldCB_WIDGET_value);
9431 XtFree(oldCB_CALL_DATA_value);
9433 /* Remove the discipline for the hierarchical variables */
9435 FreeDiscipline(clonedDisc);
9437 /* Free up all of the name/value pairs we created */
9438 FreeNestedVariables();
9447 DtPrintSetupData *callData)
9449 stdPrintSetupProc(PRINTER_INFO_PROC, widget, callData);
9456 DtPrintSetupData *callData)
9458 stdPrintSetupProc(SELECT_FILE_PROC, widget, callData);
9463 stdSelectPrinterProc(
9465 DtPrintSetupData *psd)
9467 stdPrintSetupProc(SELECT_PRINTER_PROC, widget, psd);
9474 DtPrintSetupData *callData)
9476 stdPrintSetupProc(SETUP_PROC, widget, callData);
9481 stdVerifyPrinterProc(
9483 DtPrintSetupData *callData)
9485 stdPrintSetupProc(VERIFY_PRINTER_PROC, widget, callData);