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: dtkcvt.c /main/7 1998/04/20 12:54:59 mgreess $ */
25 /* Copyright (c) 1991, 1992 UNIX System Laboratories, Inc. */
26 /* All Rights Reserved */
28 /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
29 /* UNIX System Laboratories, Inc. */
30 /* The copyright notice above does not evidence any */
31 /* 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 <Xm/MwmUtil.h>
50 #include <Dt/Service.h>
52 #include <Dt/HourGlass.h>
54 #include <Dt/EnvControlP.h>
67 #include "xmwidgets.h"
70 #if defined(SYSV) || defined(SVR4_0) || defined(SVR4) || defined(DEC)
71 #define lsprintf sprintf
74 extern Hashtab_t * Wclasses;
78 static void CvtStringToMWMValue(
86 static void CvtMWMValueToString(
96 * Converters for dtksh
100 DtkshCvtWindowToString(
106 static char result[16];
110 if (fval->size != sizeof(Window))
112 errmsg = strdup(GETMESSAGE(6,1,
113 "DtkshCvtWindowToString: The 'from' value is an invalid size"));
120 window = ((Window *)(fval->addr))[0];
122 sprintf(result, "None");
124 sprintf(result, "0x%x", window);
125 toval->addr = result;
126 toval->size = strlen(result)+1;
130 DtkshCvtScreenToString(
136 static char result[16];
140 if (fval->size != sizeof(Screen *))
142 errmsg = strdup(GETMESSAGE(6,14,
143 "DtkshCvtScreenToString: The 'from' value is an invalid size"));
150 screen = ((Screen **)(fval->addr))[0];
151 sprintf(result, "0x%lx", (unsigned long)screen);
152 toval->addr = result;
153 toval->size = strlen(result)+1;
157 DtkshCvtStringToScreen(
163 static Screen * screen;
167 if (fval->size <= 0 || fval->addr == NULL)
174 screen = (Screen *)strtoul(fval->addr, &p, 0);
177 toval->addr = (XtPointer)&screen;
178 toval->size = sizeof(Screen *);
189 DtkshCvtStringToTopItemPosition(
195 static int topItemPosition;
198 if (fval->size <= 0 || fval->addr == NULL)
205 topItemPosition = (int)strtoul(fval->addr, &p, 0);
208 toval->addr = (XtPointer)&topItemPosition;
209 toval->size = sizeof(int);
220 DtkshCvtHexIntToString(
226 static char result[16];
229 if (fval->size != sizeof(long) && fval->size != sizeof(int) &&
230 fval->size != sizeof(short) && fval->size != sizeof(char))
232 errmsg = strdup(GETMESSAGE(6,2,
233 "DtkshCvtHexIntToString: The 'from' value is an invalid size"));
240 if (fval->size == sizeof(long))
241 sprintf(result, "0x%lx", ((long *)(fval->addr))[0]);
242 else if (fval->size == sizeof(int))
243 sprintf(result, "0x%x", ((int *)(fval->addr))[0]);
244 else if (fval->size == sizeof(short))
245 sprintf(result, "0x%x", (int)(((short *)(fval->addr))[0]));
246 else if (fval->size == sizeof(char))
247 sprintf(result, "0x%x", (int)(((char *)(fval->addr))[0]));
248 toval->addr = result;
249 toval->size = strlen(result)+1;
259 static char result[16];
262 if (fval->size != sizeof(int) && fval->size != sizeof(short))
264 errmsg = strdup(GETMESSAGE(6,3,
265 "DtkshCvtIntToString: The 'from' value is an invalid size"));
272 if (fval->size == sizeof(int))
273 sprintf(result, "%d", ((int *)(fval->addr))[0]);
275 sprintf(result, "%d", (int)(((short *)(fval->addr))[0]));
276 toval->addr = result;
277 toval->size = strlen(result)+1;
281 DtkshCvtBooleanToString(
288 Boolean booleanState;
290 if (fval->size != sizeof(int) && fval->size != sizeof(short) &&
291 fval->size != sizeof(char))
293 errmsg = strdup(GETMESSAGE(6,4,
294 "DtkshCvtBooleanToString: The 'from' value is an invalid size"));
302 if (fval->size == sizeof(int))
303 booleanState = (Boolean) (((int *)(fval->addr))[0]);
304 else if (fval->size == sizeof(short))
305 booleanState = (Boolean) (((short *)(fval->addr))[0]);
306 else if (fval->size == sizeof(char))
307 booleanState = (Boolean) (((char *)(fval->addr))[0]);
310 toval->addr = (caddr_t)("true");
312 toval->addr = (caddr_t)("false");
314 toval->size = strlen(toval->addr)+1;
318 DtkshCvtStringToPointer(
324 static XtPointer ret;
326 if (fval->size <= 0 || fval->addr == NULL)
332 ret = (XtPointer)strdup(fval->addr);
333 toval->addr = (XtPointer)&ret;
334 toval->size = sizeof(XtPointer);
339 DtkshCvtStringToWidget(
354 errmsg = strdup(GETMESSAGE(6,5,
355 "DtkshCvtStringToWidget: The 'from' value is an invalid size"));
362 wname = (char *)fval->addr;
363 if (wname == NULL || wname[0] == '\0' || strcmp(wname, "NULL") == 0)
365 static Widget NullWidget = NULL;
367 toval->addr = (XtPointer)&NullWidget;
368 toval->size = sizeof(Widget);
371 if ((w = str_to_wtab("DtkshCvtStringToWidget", wname)) != NULL)
374 toval->addr = (XtPointer)&wid;
375 toval->size = sizeof(Widget);
379 * If we couldn't find it in our table, try looking up the
380 * name in standard resource format.
382 if ((wid = DtkshNameToWidget(wname)) != NULL)
384 toval->addr = (XtPointer)&wid;
385 toval->size = sizeof(Widget);
389 * We failed completely
394 errmsg = strdup(GETMESSAGE(6,6,
395 "DtkshCvtStringToWidget: Unable to find a widget named '%s'"));
396 sprintf(errbuf, errmsg, wname);
405 DtkshCvtStringToCallback(
413 static XtCallbackList cb;
414 dtksh_client_data_t *cdata;
415 classtab_t *c = DTKSHConversionClass;
416 wtab_t *w = DTKSHConversionWidget;
421 errmsg = strdup(GETMESSAGE(6,7,
422 "DtkshCvtStringToCallback: The 'from' value is an invalid size"));
430 cb = (XtCallbackList)XtMalloc(sizeof(XtCallbackRec)*2);
431 cb[0].callback = (XtCallbackProc)stdCB;
433 cdata = GetNewCBData((String)fval->addr, w, DTKSHConversionResource, NULL);
435 cb[0].closure = (caddr_t)cdata;
436 cb[1].callback = NULL;
437 toval->addr = (XtPointer)&cb;
438 toval->size = sizeof(XtCallbackList);
442 DtkshCvtCallbackToString(
448 XtPointer converterData )
456 if (fval->size != sizeof(XtCallbackList))
458 errmsg = strdup(GETMESSAGE(6,8,
459 "DtkshCvtCallbackToString: The 'from' value is an invalid size"));
466 if (fval->addr == NULL)
474 for (cb = ((XtCallbackList *)(fval->addr))[0]; cb->callback != NULL; cb++)
476 if (cb->callback == (XtCallbackProc)stdCB)
478 dtksh_client_data_t *cdata = (dtksh_client_data_t *)cb->closure;
480 if (p + strlen((String)cdata->ksh_cmd) + 1 - buf > sizeof(buf))
482 errmsg = strdup(GetSharedMsg(DT_CONV_BUF_OVFL));
488 p += lsprintf(p, "|%s", (String)cdata->ksh_cmd);
490 p += lsprintf(p, "%s", (String)cdata->ksh_cmd);
494 toval->addr = (XtPointer)strdup(buf);
495 toval->size = strlen(buf) + 1;
500 DtkshCvtWidgetToString(
513 if (fval->size != sizeof(Widget) || fval->addr == NULL)
515 errmsg = strdup(GETMESSAGE(6,9,
516 "DtkshCvtWidgetToString: The 'from' value is an invalid size"));
523 widget = ((Widget *)fval->addr)[0];
526 toval->addr = (XtPointer)("NULL");
530 if ((w = widget_to_wtab(widget)) == NULL)
532 errmsg = strdup(GETMESSAGE(6,10,
533 "DtkshCvtWidgetToString: Unable to find a name for the widget"));
540 toval->addr = (XtPointer)w->widid;
541 toval->size = strlen(w->widid) + 1;
545 /***********************************************/
547 static EventMaskTable eventMasks[] = {
548 {"XtAllEvents", XtAllEvents},
549 {"NoEventMask", NoEventMask},
550 {"KeyPressMask", KeyPressMask},
551 {"KeyReleaseMask", KeyReleaseMask},
552 {"ButtonPressMask", ButtonPressMask},
553 {"ButtonReleaseMask", ButtonReleaseMask},
554 {"EnterWindowMask", EnterWindowMask},
555 {"LeaveWindowMask", LeaveWindowMask},
556 {"PointerMotionMask", PointerMotionMask},
557 {"PointerMotionHintMask", PointerMotionHintMask},
558 {"Button1MotionMask", Button1MotionMask},
559 {"Button2MotionMask", Button2MotionMask},
560 {"Button3MotionMask", Button3MotionMask},
561 {"Button4MotionMask", Button4MotionMask},
562 {"Button5MotionMask", Button5MotionMask},
563 {"ButtonMotionMask", ButtonMotionMask},
564 {"KeymapStateMask", KeymapStateMask},
565 {"ExposureMask", ExposureMask},
566 {"VisibilityChangeMask", VisibilityChangeMask},
567 {"StructureNotifyMask", StructureNotifyMask},
568 {"ResizeRedirectMask", ResizeRedirectMask},
569 {"SubstructureNotifyMask", SubstructureNotifyMask},
570 {"SubstructureRedirectMask", SubstructureRedirectMask},
571 {"FocusChangeMask", FocusChangeMask},
572 {"PropertyChangeMask", PropertyChangeMask},
573 {"ColormapChangeMask", ColormapChangeMask},
574 {"OwnerGrabButtonMask", OwnerGrabButtonMask},
580 DtkshCvtStringToEventMask(
588 static EventMask eventMask = 0;
591 char * eventMaskString;
593 toval->addr = (XtPointer)&eventMask;
594 toval->size = sizeof(EventMask);
596 if (fval->size <= 0 || fval->addr == NULL)
599 ptr = eventMaskString = strdup(fval->addr);
601 /* Skip any leading whitespace. */
602 while (isspace(*ptr) && (*ptr != '\0'))
606 ptr = strtok(ptr, "|");
609 for (i = 0; eventMasks[i].name; i++)
611 if (DtCompareISOLatin1(ptr, eventMasks[i].name))
613 eventMask |= eventMasks[i].mask;
617 ptr = strtok(NULL, "|");
620 XtFree(eventMaskString);
625 DtkshCvtStringToListItems(
633 XtConvert(Toplevel, XtRString, fval, XmRXmStringTable, toval);
638 DtkshCvtWidgetClassToString(
646 static char result[16];
651 if (fval->size != sizeof(WidgetClass))
653 errmsg = strdup(GETMESSAGE(6,11,
654 "DtkshCvtWidgetClassToString: The 'from' value is an invalid size"));
662 if ((wc = ((WidgetClass *)(fval->addr))[0]) == NULL)
669 for (i = 0; C[i].cname != NULL; i++)
671 if (C[i].class == wc)
673 toval->addr = C[i].cname;
674 toval->size = strlen(C[i].cname)+1;
680 errmsg = strdup(GETMESSAGE(6,12,
681 "DtkshCvtWidgetClassToString: Unknown widget class"));
690 DtkshCvtStringToWidgetClass(
698 static char result[16];
700 static WidgetClass wc;
704 classtab_t * classtab;
706 if (fval->size <= 0 || fval->addr == NULL)
713 wcName = (char *)(fval->addr);
714 if ((hashInfo = hashget(Wclasses, wcName)) != NULL)
716 classtab = (classtab_t *)hashInfo;
717 wc = classtab->class;
718 toval->addr = (caddr_t)&wc;
719 toval->size = sizeof(WidgetClass);
724 errmsg = strdup(GETMESSAGE(6,13,
725 "DtkshCvtStringToWidgetClass: Unknown widget class name"));
734 static MWMTable mwmDecorations[] = {
735 {"MWM_DECOR_ALL", MWM_DECOR_ALL},
736 {"MWM_DECOR_BORDER", MWM_DECOR_BORDER},
737 {"MWM_DECOR_RESIZEH", MWM_DECOR_RESIZEH},
738 {"MWM_DECOR_TITLE", MWM_DECOR_TITLE},
739 {"MWM_DECOR_MENU", MWM_DECOR_MENU},
740 {"MWM_DECOR_MINIMIZE", MWM_DECOR_MINIMIZE},
741 {"MWM_DECOR_MAXIMIZE", MWM_DECOR_MAXIMIZE},
745 static MWMTable mwmFunctions[] = {
746 {"MWM_FUNC_ALL", MWM_FUNC_ALL},
747 {"MWM_FUNC_RESIZE", MWM_FUNC_RESIZE},
748 {"MWM_FUNC_MOVE", MWM_FUNC_MOVE},
749 {"MWM_FUNC_MINIMIZE", MWM_FUNC_MINIMIZE},
750 {"MWM_FUNC_MAXIMIZE", MWM_FUNC_MAXIMIZE},
751 {"MWM_FUNC_CLOSE", MWM_FUNC_CLOSE},
773 toval->addr = (XtPointer)&value;
774 toval->size = sizeof(int);
776 if (fval->size <= 0 || fval->addr == NULL)
779 ptr = valueString = strdup(fval->addr);
781 /* Skip any leading whitespace. */
782 while (isspace(*ptr) && (*ptr != '\0'))
785 /* Integer values, especially -1, are also supported */
786 intVal = strtol(ptr, &p, 0);
794 ptr = strtok(ptr, "|");
797 for (i = 0; table[i].name; i++)
799 if (DtCompareISOLatin1(ptr, table[i].name))
801 value |= table[i].value;
805 ptr = strtok(NULL, "|");
822 static char *string = NULL;
825 Boolean firstOne = True;
827 value = ((int *)(fval->addr))[0];
831 string = XtRealloc(string, 5);
832 strcpy(string, "-1");
836 string = XtRealloc(string, 1);
839 while (table[i].name)
841 if (value & table[i].value)
845 string = XtRealloc(string,
846 strlen(string) + strlen(table[i].name) + 2);
848 strcat(string, table[i].name);
853 string = XtRealloc(string,
854 strlen(string) + strlen(table[i].name) + 1);
855 strcat(string, table[i].name);
862 toval->addr = (caddr_t)string;
863 toval->size = strlen(string) + 1;
867 DtkshCvtStringToMWMDecoration(
875 CvtStringToMWMValue(mwmDecorations, dpy, args, nargs, fval, toval, data);
880 DtkshCvtMWMDecorationToString(
888 CvtMWMValueToString(mwmDecorations, dpy, args, nargs, fval, toval, data);
892 DtkshCvtStringToMWMFunctions(
900 CvtStringToMWMValue(mwmFunctions, dpy, args, nargs, fval, toval, data);
905 DtkshCvtMWMFunctionsToString(
913 CvtMWMValueToString(mwmFunctions, dpy, args, nargs, fval, toval, data);
917 DtkshCvtStringToPanedWinPosIndex(
929 if (fval->size <= 0 || fval->addr == NULL)
936 pos = (char *)fval->addr;
937 if (DtCompareISOLatin1(pos, "LAST_POSITION"))
938 value = XmLAST_POSITION;
940 value = strtol(pos, &p, 0);
942 toval->addr = (XtPointer)&value;
943 toval->size = sizeof(short);
947 DtkshCvtPanedWinPosIndexToString(
955 static char result[50];
958 if (fval->size != sizeof(short))
964 value = ((short *)(fval->addr))[0];
965 if (value == XmLAST_POSITION)
966 sprintf(result, "LAST_POSITION");
968 sprintf(result, "%d", value);
969 toval->addr = result;
970 toval->size = strlen(result)+1;
975 DtkshCvtStringToPrintSetupProc(
983 static void (*proc)();
984 extern wtab_t *DTKSHConversionWidget;
985 wtab_t *w = DTKSHConversionWidget;
986 extern char *DTKSHConversionResource;
990 if (w->info == NULL) {
991 w->info = (XtPointer)XtMalloc(sizeof(ProcInfo_t));
992 memset(w->info, '\0', sizeof(ProcInfo_t));
994 pinfo = (ProcInfo_t *)w->info;
995 if (strcmp(DTKSHConversionResource, CONSTCHAR "printerInfoProc") == 0) {
996 if (pinfo->printerInfoProcCommand != NULL)
997 XtFree(pinfo->printerInfoProcCommand);
998 pinfo->printerInfoProcCommand = strdup((String)fval->addr);
999 proc = stdPrinterInfoProc;
1000 } else if (strcmp(DTKSHConversionResource, CONSTCHAR "selectFileProc") == 0) {
1001 if (pinfo->selectFileProcCommand != NULL)
1002 XtFree(pinfo->selectFileProcCommand);
1003 pinfo->selectFileProcCommand = strdup((String)fval->addr);
1004 proc = stdSelectFileProc;
1006 else if (strcmp(DTKSHConversionResource, CONSTCHAR "selectPrinterProc") == 0) {
1007 if (pinfo->selectPrinterProcCommand != NULL)
1008 XtFree(pinfo->selectPrinterProcCommand);
1009 pinfo->selectPrinterProcCommand = strdup((String)fval->addr);
1010 proc = stdSelectPrinterProc;
1012 else if (strcmp(DTKSHConversionResource, CONSTCHAR "setupProc") == 0) {
1013 if (pinfo->setupProcCommand != NULL)
1014 XtFree(pinfo->setupProcCommand);
1015 pinfo->setupProcCommand = strdup((String)fval->addr);
1016 proc = stdSetupProc;
1018 else if (strcmp(DTKSHConversionResource, CONSTCHAR "verifyPrinterProc") == 0) {
1019 if (pinfo->verifyPrinterProcCommand != NULL)
1020 XtFree(pinfo->verifyPrinterProcCommand);
1021 pinfo->verifyPrinterProcCommand = strdup((String)fval->addr);
1022 proc = stdVerifyPrinterProc;
1025 XtWarningMsg(CONSTCHAR "CvtStringToPrintSetupProc", CONSTCHAR "unsupported DtPrintSetupBox resource.", CONSTCHAR "XtToolkitError", "This resource is not currently supported by dtksh.", NULL, 0);
1028 XtWarningMsg(CONSTCHAR "CvtStringToPrintSetupProc", CONSTCHAR "widget must exist.", CONSTCHAR "XtToolkitError", "This resource cannot be set at creation time by dtksh, use XtSetValues after creation instead.", NULL, 0);
1034 toval->size = sizeof(DtPrintSetupProc);
1035 toval->addr = (XtPointer)&proc;