home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / tcl / tclmotif.1 / tclmotif / tm.1.2 / src / tmConverters.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-03  |  42.1 KB  |  1,953 lines

  1. /*
  2.  * tmConverters.c -
  3.  *    This module implements all the Xt Converters to and
  4.  *    from Strings needed by Tm
  5.  *
  6.  * Copyright 1993 Jan Newmarch, University of Canberra.
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The author
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. /* Copyright (C) 1992 by Gustaf Neumann, Stefan Nusser
  17.  
  18.  *      Wirtschaftsuniversitaet Wien, 
  19.  *      Abteilung fuer Wirtschaftsinformatik
  20.  *      Augasse 2-6, 
  21.  *      A-1090 Vienna, Austria
  22.  *      neumann@wu-wien.ac.at, nusser@wu-wien.ac.at
  23.  
  24.  * Permission to use, copy, modify, and distribute this software and its
  25.  * documentation for any purpose and without fee is hereby granted, provided
  26.  * that the above copyright notice appears in all copies and that both that
  27.  * copyright notice and this permission notice appear in all supporting
  28.  * documentation.  This software is provided "as is" without expressed or
  29.  * implied warranty.
  30.  */
  31.  
  32. #include "tmFuncs.h"
  33. #ifndef MOTIF11
  34. #include <Xm/RepType.h>
  35. #include <Xm/DragDrop.h>
  36. #endif
  37. #include <X11/IntrinsicP.h>
  38. #include <X11/CoreP.h>        /* for CoreRec */
  39. #include <string.h>
  40. #include <ctype.h>
  41.  
  42. /* escape char for XmString formatting */
  43. #define TM_FORMAT_CHAR '@'
  44.  
  45. #define done(address, type)                               \
  46.     {                                                   \
  47.         if(toVal->addr)                                 \
  48.         {                                               \
  49.             if(toVal->size < sizeof(type))              \
  50.             {                                           \
  51.                 toVal->size = sizeof(type);             \
  52.                 return( FALSE) ;                        \
  53.             }                                           \
  54.             else                                        \
  55.             {   *((type *) (toVal->addr)) = *address;   \
  56.             }                                           \
  57.         }                                               \
  58.         else                                            \
  59.         {                                               \
  60.             toVal->addr = (XPointer) address;           \
  61.         }                                               \
  62.         toVal->size = sizeof(type);                     \
  63.     }
  64.  
  65.  
  66. /*
  67.  * so that we can keep tabs on the size of an XmStringTable
  68.  * see function Tm_MaybeSetXmStringTableSize
  69.  */
  70. int Tm_XmStringTableSize;
  71.  
  72. /*
  73.  *--------------------------------------------------------------
  74.  *
  75.  * InstallReverseRepTypes --
  76.  *
  77.  *    Install the converters from internal representation
  78.  *    types to their string values.
  79.  *
  80.  * Results:
  81.  *
  82.  * Side effects:
  83.  *    Modifies the Motif RepType tables
  84.  *
  85.  *--------------------------------------------------------------
  86.  */
  87.  
  88. static void
  89. InstallReverseRepTypes()
  90. {
  91. #ifndef MOTIF11
  92.     XmRepTypeId id;
  93.     XmRepTypeList start, list;
  94.     int n;
  95.  
  96.     start = list = XmRepTypeGetRegistered();
  97.  
  98.     while (list->rep_type_name != NULL) {
  99.         if ((id = XmRepTypeGetId(list->rep_type_name)) != XmREP_TYPE_INVALID) {
  100.         XmRepTypeAddReverse(id);
  101.         } else {
  102.         fprintf(stderr, "Failed to install %s converter\n", 
  103.             list->rep_type_name);
  104.         }
  105.     list++;
  106.     }
  107.     XtFree((char *)start);
  108. #endif
  109. }
  110.  
  111.  
  112. /*
  113.  *--------------------------------------------------------------
  114.  *
  115.  * Tm_CvtStringToWidget --
  116.  *
  117.  *    Converter from String to Widget type
  118.  *
  119.  * Results:
  120.  *
  121.  *    changes the "toVal" arg to contain the new value.
  122.  *
  123.  * Side effects:
  124.  *
  125.  *    none
  126.  *--------------------------------------------------------------
  127.  */
  128.  
  129. Boolean
  130. Tm_CvtStringToWidget(display, args, num_args, fromVal, toVal, destructor_data)
  131.     Display *display;
  132.     XrmValuePtr args;
  133.     Cardinal *num_args;
  134.     XrmValuePtr fromVal;
  135.     XrmValuePtr toVal;
  136.     XtPointer *destructor_data;
  137. {
  138.     Tcl_Interp *interp = (Tcl_Interp *) args->addr;
  139.     Tm_Widget *info;
  140.     static Widget w;
  141.  
  142.     info = Tm_WidgetInfoFromPath(interp, (char *) fromVal->addr);
  143.     if (info == NULL) {
  144.     return False;
  145.     }
  146.     w = info->widget;
  147.  
  148.     done(&w, Widget);
  149.  
  150.     return True;
  151. }
  152.  
  153. /*
  154.  *--------------------------------------------------------------
  155.  *
  156.  * Tm_CvtWidgetToString --
  157.  *
  158.  *    Converter from Widget to String type
  159.  *
  160.  * Results:
  161.  *
  162.  *    changes the "toVal" arg to contain the new value.
  163.  *
  164.  * Side effects:
  165.  *
  166.  *    none
  167.  *--------------------------------------------------------------
  168.  */
  169.  
  170. Boolean
  171. Tm_CvtWidgetToString(display, args, num_args, fromVal, toVal, destructor_data)
  172.     Display *display;
  173.     XrmValuePtr args;
  174.     Cardinal *num_args;
  175.     XrmValuePtr fromVal;
  176.     XrmValuePtr toVal;
  177.     XtPointer *destructor_data;
  178. {
  179.     Tm_Widget *info;
  180.     Widget w = *(Widget *) fromVal->addr;
  181.     static char *buf;
  182.     extern char *Tm_Resource; 
  183.  
  184.     /* double hack going on here. because of Motif
  185.        bug, some Widget resources are of type Window.
  186.        When we *really* get a window to convert,
  187.        just fail :-((
  188.      */
  189.     if (strcmp(Tm_Resource, "windowGroup") == 0)
  190.     return False;
  191.  
  192.     /* it is valid to ask for a NULL widget e.g. topWidget in a Form
  193.        when the thing is attached to the Form (default is NULL)
  194.      */
  195.     if (w == NULL) {
  196.         buf = "";
  197.         done(&buf, String);
  198.     return True;
  199.     }
  200.     info = NULL;
  201.     XtVaGetValues(w, XmNuserData, &info, NULL);
  202.     if (info == NULL) {
  203.     return False;
  204.     }
  205.  
  206.     buf = info->pathName;
  207.     done(&buf, String);
  208.  
  209.     return True;
  210. }
  211.  
  212.  
  213. /*
  214.  *--------------------------------------------------------------
  215.  *
  216.  * Tm_CvtWidgetListToString --
  217.  *
  218.  *    Converter from WidgetList to String type
  219.  *
  220.  * Results:
  221.  *
  222.  *    changes the "toVal" arg to contain the new value.
  223.  *
  224.  * Side effects:
  225.  *
  226.  *    none
  227.  *--------------------------------------------------------------
  228.  */
  229.  
  230. Boolean
  231. Tm_CvtWidgetListToString(display, args, num_args, fromVal, toVal, destructor_data)
  232.     Display *display;
  233.     XrmValuePtr args;
  234.     Cardinal *num_args;
  235.     XrmValuePtr fromVal;
  236.     XrmValuePtr toVal;
  237.     XtPointer *destructor_data;
  238. {
  239.     Tm_Widget *info;
  240.     Widget w = *(Widget *) args[0].addr;
  241.     WidgetList children = *(WidgetList *) fromVal->addr;
  242.     Cardinal num_children, final_num_children;
  243.     String *widgetNames;
  244.     int n, len;
  245.     char *end, *p;
  246.     static char *buf = NULL;
  247.     int buf_size;
  248.  
  249.     buf_size = 32;
  250.     buf = XtRealloc(buf, buf_size);
  251.  
  252.     if ( !XtIsComposite(w)) {
  253.     buf[0] = '\0';
  254.         done(&buf, char *);
  255.         return True;
  256.     }
  257.  
  258.     XtVaGetValues(w, 
  259.     XmNnumChildren, &num_children,
  260.     XmNchildren, &children, NULL);
  261.     if (num_children == 0) {
  262.     buf[0] = '\0';
  263.         done(&buf, char *);
  264.         return True;
  265.     }
  266.  
  267.     widgetNames = (String *) XtMalloc(num_children * sizeof(String));
  268.     len = 0;
  269.     final_num_children = 0;
  270.     for (n = 0; n < num_children; n++) {
  271.     info = NULL;
  272.         XtVaGetValues(children[n], XmNuserData, &info, NULL);
  273.         if (info == NULL) {
  274.         continue;
  275.     }
  276.     widgetNames[final_num_children] = info->pathName;
  277.     len += strlen(info->pathName) + 2; /* for ", " */
  278.     final_num_children++;
  279.     }
  280.  
  281.     /* grow if needed */
  282.     if (buf_size < len + 1) {
  283.     do {
  284.         buf_size *= 2;
  285.     }   while (buf_size < len + 1);
  286.     buf = XtRealloc(buf, buf_size);
  287.     }
  288.  
  289.     if (len == 0) {
  290.         *buf = '\0';
  291.         done(&buf, char *);
  292.         return True;
  293.     }
  294.     end = buf;
  295.     for (n = 0; n < final_num_children; n++) {
  296.         p = widgetNames[n];
  297.         while (*end++ = *p++)
  298.         ;
  299.         *(end - 1) = ',';
  300.         *end++ = ' ';
  301.     }
  302.     *(end - 2) = '\0';
  303.  
  304.     done(&buf, char *);
  305.     XtFree((char *) widgetNames);
  306.  
  307.     return True;
  308. }
  309.  
  310. /*
  311.  *--------------------------------------------------------------
  312.  *
  313.  * Tm_CvtStringToTransferStatus --
  314.  *
  315.  *    Converter from String to TransferStatus type
  316.  *    (see transferProc widget0
  317.  *
  318.  * Results:
  319.  *
  320.  *    changes the "toVal" arg to contain the new value.
  321.  *
  322.  * Side effects:
  323.  *
  324.  *    none
  325.  *--------------------------------------------------------------
  326.  */
  327.  
  328. Boolean
  329. Tm_CvtStringToTransferStatus(display, args, num_args, fromVal, toVal, destructor_data)
  330.     Display *display;
  331.     XrmValuePtr args;
  332.     Cardinal *num_args;
  333.     XrmValuePtr fromVal;
  334.     XrmValuePtr toVal;
  335.     XtPointer *destructor_data;
  336. {
  337.     char *buf;
  338.     int n;
  339.     static unsigned char status;
  340.  
  341.     buf = (char *) (fromVal->addr);
  342.     for (n = 0; n < strlen(buf); n++) {
  343.     buf[n] = tolower(buf[n]);
  344.     }
  345. #   ifdef DEBUG
  346.     fprintf(stderr, "converted string to %s\n", buf);
  347. #   endif
  348.     if (strcmp(buf, "transfer_success") == 0) {
  349.     status = 1;
  350.     } else {
  351.     status = 0;
  352.     }
  353.  
  354.     done(&status, unsigned char);
  355.  
  356.     return True;
  357. }
  358.  
  359.  
  360. /*
  361.  *--------------------------------------------------------------
  362.  *
  363.  * Tm_CvtStringToDropTransfers--
  364.  *
  365.  *    Converter from String to DropTransfers type
  366.  *    (see transferProc widget0
  367.  *
  368.  * Results:
  369.  *
  370.  *    changes the "toVal" arg to contain the new value.
  371.  *
  372.  * Side effects:
  373.  *
  374.  *    none
  375.  *--------------------------------------------------------------
  376.  */
  377.  
  378. Boolean
  379. Tm_CvtStringToDropTransfers(display, args, num_args, fromVal, toVal, destructor_data)
  380.     Display *display;
  381.     XrmValuePtr args;
  382.     Cardinal *num_args;
  383.     XrmValuePtr fromVal;
  384.     XrmValuePtr toVal;
  385.     XtPointer *destructor_data;
  386. {
  387. #ifndef MOTIF11
  388.     char *buf;
  389.     char **argv, **argvv;
  390.     int argc, argcc;
  391.     int n;
  392.     static unsigned char status;
  393.     static XmDropTransferEntryRec transferEntries[32];
  394.     static XmDropTransferEntryRec *p;
  395.     Tm_Widget *wPtr;
  396.     Tcl_Interp *interp = (Tcl_Interp *) args->addr;
  397.  
  398.     buf = (char *) (fromVal->addr);
  399. #   ifdef DEBUG
  400.     fprintf(stderr, "converted string to %s\n", buf);
  401. #   endif
  402.     if (Tcl_SplitList(interp, buf, &argc, &argv) == TCL_ERROR) {
  403.     fprintf(stderr, "failed to convert list\n");
  404.     }
  405.     for (n = 0; n < argc; n++) {
  406.     if (Tcl_SplitList(interp, argv[n], &argcc, &argvv) == TCL_ERROR) {
  407.         fprintf(stderr, "failed to convert internal list\n");
  408.     }
  409.     if (argcc != 2) {
  410.         fprintf(stderr, "list should have two elements\n");
  411.     }
  412.     transferEntries[n].target = XInternAtom(display, argvv[0], False);
  413. /*
  414.     wPtr = Tm_WidgetInfoFromPath(interp, argvv[1]);
  415.     transferEntries[n].client_data = wPtr->widget;
  416. */
  417.     transferEntries[n].client_data = argvv[1];
  418.     }
  419.  
  420.     p = transferEntries;
  421.     done(&p, XtPointer);
  422.  
  423. #endif
  424.     return True;
  425. }
  426.  
  427. /*
  428.  *--------------------------------------------------------------
  429.  *
  430.  * Tm_CvtXmStringToString --
  431.  *
  432.  *    Converter from XmString to String type
  433.  *
  434.  * Results:
  435.  *
  436.  *    changes the "toVal" arg to contain the new value.
  437.  *
  438.  * Side effects:
  439.  *
  440.  *    destroys the XmString
  441.  *--------------------------------------------------------------
  442.  */
  443.  
  444. Boolean
  445. Tm_CvtXmStringToString(display, args, num_args, fromVal, toVal, destructor_data)
  446.     Display *display;
  447.     XrmValuePtr args;
  448.     Cardinal *num_args;
  449.     XrmValuePtr fromVal;
  450.     XrmValuePtr toVal;
  451.     XtPointer *destructor_data;
  452. {
  453.     XmStringContext context;
  454.     static char *buf = NULL;
  455.     char *p, *text;
  456.     XmStringCharSet charset;
  457.     XmStringDirection direction;
  458.     Boolean separator;
  459.     int size;
  460.     int current_len, segment_len;
  461.     XmString xmstr;
  462.  
  463.     /* whatever buf has grown to, or started from, 
  464.        make it a reasonable size
  465.      */
  466.     size = 128;
  467.     buf = XtRealloc(buf, size);
  468.     p = buf;
  469.  
  470.     xmstr = *(XmString *) fromVal->addr;
  471.     if (!XmStringInitContext(&context, xmstr)) {
  472.     return False;
  473.     }
  474.     while (XmStringGetNextSegment(context, &text, &charset,
  475.         &direction, &separator)) {
  476.     XtFree(charset);
  477.     segment_len = strlen(text);
  478.     if (p + segment_len >= buf + size) {
  479.         /* string too large, double space */
  480.         current_len = p - buf;
  481.         size *= 2;
  482.         buf = XtRealloc(buf, size);
  483.         p = buf + current_len;
  484.     }
  485.     strcpy(p, text);
  486.     p += segment_len;
  487.     if (separator == True) {
  488.         *p++ = '\n';
  489.         *p = 0;
  490.     }
  491.     XtFree(text);
  492.     }
  493.     XmStringFreeContext(context);
  494.  
  495.     /* destroy the XmString we started from */
  496.     XmStringFree(xmstr);
  497.  
  498.     done(&buf, char *);
  499.  
  500.     return True;
  501. }
  502.  
  503. /*
  504.  *--------------------------------------------------------------
  505.  *
  506.  * Tm_XmStringToString --
  507.  *
  508.  * Results:
  509.  *
  510.  *    returns the Ascii string rep of the XmString
  511.  *
  512.  * Side effects:
  513.  *
  514.  *    none
  515.  *--------------------------------------------------------------
  516.  */
  517. String
  518. Tm_XmStringToString(xmstr)
  519.     XmString xmstr;
  520. {
  521.     XmStringContext context;
  522.     static char *buf = NULL;
  523.     char *p, *text;
  524.     XmStringCharSet charset;
  525.     XmStringDirection direction;
  526.     Boolean separator;
  527.     int size;
  528.     int current_len, segment_len;
  529.  
  530.     /* whatever buf has grown to, or started from, 
  531.        make it a reasonable size
  532.      */
  533.     size = 128;
  534.     buf = XtRealloc(buf, size);
  535.     p = buf;
  536.  
  537.     if (!XmStringInitContext(&context, xmstr)) {
  538.     return False;
  539.     }
  540.     while (XmStringGetNextSegment(context, &text, &charset,
  541.         &direction, &separator)) {
  542.     XtFree(charset);
  543.     segment_len = strlen(text);
  544.     if (p + segment_len >= buf + size) {
  545.         /* string too large, double space */
  546.         current_len = p - buf;
  547.         size *= 2;
  548.         buf = XtRealloc(buf, size);
  549.         p = buf + current_len;
  550.     }
  551.     strcpy(p, text);
  552.     p += segment_len;
  553.     if (separator == True) {
  554.         *p++ = '\n';
  555.         *p = 0;
  556.     }
  557.     XtFree(text);
  558.     }
  559.     XmStringFreeContext(context);
  560.  
  561.     return buf;
  562. }
  563.  
  564. /*
  565.  *--------------------------------------------------------------
  566.  *
  567.  * Tm_CvtXmStringTableToString --
  568.  *
  569.  *    Converter from XmStringTable to String type
  570.  *
  571.  * Results:
  572.  *
  573.  *    changes the "toVal" arg to contain the new value.
  574.  *
  575.  * Side effects:
  576.  *
  577.  *    none
  578.  *--------------------------------------------------------------
  579.  */
  580.  
  581. Boolean
  582. Tm_CvtXmStringTableToString(display, args, num_args, fromVal, toVal, destructor_data)
  583.     Display *display;
  584.     XrmValuePtr args;
  585.     Cardinal *num_args;
  586.     XrmValuePtr fromVal;
  587.     XrmValuePtr toVal;
  588.     XtPointer *destructor_data;
  589. {
  590.     String *items;
  591.     static String buf = NULL;
  592.     int n, len, item_count;
  593.     char *p, *end;
  594.     char *dummy;
  595.     XmString *xmstrs = *(XmString **) fromVal->addr;
  596.     Arg arg;
  597.     Widget w = *((Widget *) args[0].addr);
  598.     char *size_resource;
  599.     /* this should come in via args, but Xt doesn't give it */
  600.     extern char *Tm_Resource;
  601.  
  602.     if (Tm_Resource== NULL)
  603.     return False;
  604.     if (strcmp (Tm_Resource, XmNitems) == 0) {
  605.         size_resource = XmNitemCount;
  606.     } else
  607.     if (strcmp (Tm_Resource, XmNselectedItems) == 0) {
  608.         size_resource = XmNselectedItemCount;
  609.     } else
  610.     return False;
  611.  
  612.     XtSetArg(arg, size_resource, &item_count);
  613.     XtGetValues(w, &arg, 1);
  614.     Tm_Resource = NULL; /* make sure under our control */
  615.  
  616.     len= 0;
  617.     items = NULL;
  618.  
  619.     if (item_count != 0) {
  620.         items = (String *) XtMalloc(item_count * sizeof(String));
  621.         for (n = 0; n < item_count; n++) {
  622.         items[n] = Tm_XmStringToString(xmstrs[n]);
  623.         items[n] = XtNewString(items[n]);
  624.             len += strlen(items[n]) + 2; /* for , */
  625.         }
  626.     }
  627. #ifdef TM_MOTIF_XMSTRINGTABLE
  628.     buf = XtRealloc(buf, len + 1); /* we overshoot by 1 */
  629.     if (len == 0) {
  630.         *buf = '\0';
  631.         done(&buf, char *);
  632.         return True;
  633.     }
  634.     end = buf;
  635.     for (n = 0; n < item_count; n++) {
  636.         p = items[n];
  637.         while (*end++ = *p++)
  638.         ;
  639.         *(end - 1) = ',';
  640.         *end++ = ' ';
  641.         XtFree(items[n]);
  642.     }
  643.     *(end - 2) = '\0';
  644. #else
  645.     if (buf != NULL)
  646.     free(buf);
  647.     buf = Tcl_Merge(item_count, items);
  648.     for (n = 0; n < item_count; n++) {
  649.         XtFree(items[n]);
  650.     }
  651. #endif
  652.  
  653.     done(&buf, char *);
  654.  
  655.     if (items != NULL) {
  656.     XtFree((char *) items);
  657.     }
  658.  
  659.     return True;
  660. }
  661.  
  662.  
  663. Boolean
  664. Tm_CvtStringToXmStringTable(display, args, num_args, 
  665.         fromVal, toVal, destructor_data)
  666.     Display *display;
  667.     XrmValuePtr args;
  668.     Cardinal *num_args;
  669.     XrmValuePtr fromVal;
  670.     XrmValuePtr toVal;
  671.     XtPointer *destructor_data;
  672. {
  673.     Tcl_Interp *interp = (Tcl_Interp *) args->addr;
  674.     Tm_Widget *info;
  675.     char **argv;
  676.     int argc;
  677.     static XmStringTable tbl = NULL;
  678.     int n;
  679.  
  680.     if (Tcl_SplitList(interp, (char *) fromVal->addr,
  681.         &argc, &argv) == TCL_ERROR) {
  682.     return False;
  683.     }
  684.  
  685.     if (argc == 0) {
  686.     tbl = NULL;
  687.     done(&tbl, XmStringTable);
  688.     free((char *) argv);
  689.     return True;
  690.     }
  691.  
  692.     tbl = (XmStringTable) XtMalloc(argc * sizeof(XmString));
  693.     Tm_AddToFreeResourceList((char *) tbl, (Tm_FreeProc) XtFree);
  694.  
  695.     for (n = 0; n < argc; n++) {
  696.     tbl[n] = XmStringCreateLocalized(argv[n]);
  697.         /* allow this to be garbage collected when possible */
  698.         Tm_AddToFreeResourceList((char *) tbl[n],
  699.                 (Tm_FreeProc) XmStringFree);
  700.     }
  701.     done(&tbl, XmStringTable);
  702.     free((char *) argv);
  703.  
  704.     return True;
  705. }
  706.  
  707. static XmString
  708. Tm_XmStringConcatAndFree(front, back)
  709.     XmString front;
  710.     XmString back;
  711. {
  712.     XmString result;
  713.  
  714.     result = XmStringConcat(front, back);
  715.     XmStringFree(front);
  716.     XmStringFree(back);
  717.  
  718.     return result;
  719. }
  720.  
  721. static XmString
  722. Tm_XmStringAppendString(oldCompStr, text, charSet, dir, sep)
  723. XmString           oldCompStr;
  724. char              *text;
  725. XmStringCharSet    charSet;
  726. XmStringDirection  dir;
  727. Boolean            sep;
  728.     {
  729.     XmString  addSeg, newString;
  730.     
  731.     if (*text == '\0' && sep)
  732.     return(oldCompStr);
  733.  
  734. /*
  735.     fprintf(stderr, "Generated segment with <%s>\n", text);
  736. */
  737.  
  738.     if (oldCompStr == NULL)
  739.     return(XmStringSegmentCreate(text, charSet, dir, sep));
  740.     else
  741.     {
  742.     addSeg = XmStringSegmentCreate(text, charSet, dir, sep);
  743.     newString = XmStringConcat(oldCompStr, addSeg);
  744.     XmStringFree(addSeg);
  745.     XmStringFree(oldCompStr);
  746.     return(newString);
  747.     }
  748.     }
  749.  
  750. static XmString    
  751. Tm_StringToXmString(interp, inString)
  752.     char  *inString;
  753.     Tcl_Interp *interp;
  754. {
  755.     char               *segBuf;
  756.     XmStringCharSet    charSet = XmFONTLIST_DEFAULT_TAG; 
  757.     XmStringDirection  dir = XmSTRING_DIRECTION_L_TO_R;
  758.     XmString           result = NULL;
  759.     XmString           xm_dir;
  760.     char              *segPtr;
  761.     char              *ptr;
  762.     char              *top;
  763.     int              len;
  764.     char          separator;
  765.     int           argc;
  766.     char          **argv;
  767.     int              n;
  768.     Boolean          segment_started = True;
  769.  
  770.     len = strlen(inString); 
  771.     segPtr = segBuf =  XtMalloc(len + 1);
  772.  
  773.     /* In Motif 2.0 the segment stuff will vanish, leaving
  774.        the component stuff only
  775.      */
  776.     *segPtr = '\0';
  777.  
  778.     Tcl_SplitList(interp, inString, &argc, &argv);
  779.     for (n = 0; n < argc; n++) {
  780.     ptr = argv[n];
  781.     switch (*ptr) {
  782.     case '\n':
  783.         /* NewLine: Finish current segment */
  784.  
  785.         *segPtr = '\0';
  786.             result = Tm_XmStringAppendString(result, segBuf, charSet, dir, True);
  787.         segPtr = segBuf;
  788.         segment_started = True;
  789.         break;
  790.         
  791.     case TM_FORMAT_CHAR:
  792.             /* Enter command mode */
  793.         ptr++;
  794.  
  795.         if (*ptr == '\0') {
  796.         fprintf(stderr, 
  797.             "XmString Conversion: Cannot handle trailing 'TM_FORMAT_CHAR'\n");
  798.         return NULL;
  799.         }
  800.  
  801.         if (*ptr == TM_FORMAT_CHAR) {
  802.         /* Two TM_FORMAT_CHAR => leave command mode, 
  803.            insert one TM_FORMAT_CHAR */
  804.         if (*segPtr != '\0')
  805.             *segPtr++ = ' ';
  806.         *segPtr++ = TM_FORMAT_CHAR;
  807.         } else
  808.  
  809.         switch (*ptr) {
  810.         case 'n':
  811.                 *segPtr = '\0';
  812.                     result = Tm_XmStringAppendString(result, segBuf, 
  813.                        charSet, dir, True);
  814.                 segPtr = segBuf;
  815.                 segment_started = True;
  816.             break;
  817.         case 'F':
  818.         case 'f':
  819.             /* save string collected so far */
  820.             *segPtr = '\0';
  821.                     result = Tm_XmStringAppendString(result, segBuf, 
  822.                        charSet, dir, False);
  823.  
  824.             /* now make new font */
  825.             segPtr = segBuf;
  826.             ptr++;
  827.             if (*ptr == '{') {
  828.             /* @f{font-name} */
  829.             ptr++;
  830.             while (*ptr != '}') {
  831.                 *segPtr++ = *ptr++;
  832.             }
  833.             ptr++;
  834.             } else
  835.             if (*ptr == '(') {
  836.             /* @fXY - 2 char font name XY */
  837.             ptr++;
  838.             *segPtr++ = *ptr++;
  839.             *segPtr++ = *ptr;
  840.             } else {
  841.             /* @fX - 1 char font name X */
  842.             *segPtr++ = *ptr;
  843.             }
  844.             *segPtr = '\0';
  845.             /* replace these 3 lines in 2.0 */
  846.             charSet = XtNewString(segBuf);
  847.             result = Tm_XmStringAppendString(result, "", 
  848.                                            charSet, dir, False);
  849.  
  850.             segPtr = segBuf;
  851.                 segment_started = True;
  852.             *segPtr = '\0';
  853.             break;
  854.         case 'L':
  855.         case 'l':
  856.                 *segPtr = '\0';
  857.             /* replace these 3 lines in 2.0 */
  858.                     result = Tm_XmStringAppendString(result, segBuf, 
  859.                        charSet, dir, False);
  860.             dir = XmSTRING_DIRECTION_L_TO_R;
  861.             xm_dir = XmStringDirectionCreate(dir);
  862.             result = Tm_XmStringConcatAndFree(result, xm_dir);
  863.  
  864.             segPtr = segBuf;
  865.                 segment_started = True;
  866.             break;
  867.         case 'R':
  868.         case 'r':
  869.                 *segPtr = '\0';
  870.             /* replace these 3 lines in 2.0 */
  871.                     result = Tm_XmStringAppendString(result, segBuf, 
  872.                        charSet, dir, False);
  873.             dir = XmSTRING_DIRECTION_R_TO_L;
  874.             xm_dir = XmStringDirectionCreate(dir);
  875.             result = Tm_XmStringConcatAndFree(result, xm_dir);
  876.  
  877.             segPtr = segBuf;
  878.                 segment_started = True;
  879.             break;
  880.         default:
  881.             break;
  882.         }
  883.         break;
  884.                 
  885.     default:
  886.         /* insert a space if not first */
  887.         if ( ! segment_started)
  888.         *segPtr++ = ' ';
  889.         /* and copy string across */
  890.         while (*ptr)
  891.             *segPtr++ = *ptr++;
  892.         segment_started = False;
  893.         break;
  894.  
  895.     } /* switch */        
  896.     } /* for */
  897.  
  898.     *segPtr = '\0';
  899.     result = Tm_XmStringAppendString(result, segBuf, charSet, dir, False);
  900.  
  901.     free((char *) argv);
  902.     XtFree(segBuf);
  903.     return result;
  904. }
  905.  
  906.  
  907.  
  908. static Boolean
  909. Tm_CvtStringToXmString(dpy, args, num_args, fromVal, toVal,
  910.                                 converter_data)
  911.     Display   *dpy;
  912.     XrmValue  *args;
  913.     Cardinal  *num_args;
  914.     XrmValue  *fromVal;
  915.     XrmValue  *toVal;
  916.     XtPointer *converter_data;
  917. {
  918.     XmString result;
  919.     Tcl_Interp *interp = (Tcl_Interp *) args->addr;
  920.  
  921.  
  922.     if ((result = Tm_StringToXmString(interp, (char *)fromVal->addr)) == NULL) {
  923.     XtDisplayStringConversionWarning(dpy, (char *)fromVal->addr, 
  924.                      "XmString");
  925.     return(False);
  926.     }
  927.     
  928.     /* allow this to be garbage collected when possible */
  929.     Tm_AddToFreeResourceList((char *) result,
  930.         (Tm_FreeProc) XmStringFree);
  931.  
  932.     done(&result, XmString);
  933.     return(True);
  934. }
  935.  
  936.  
  937. /*
  938.  *--------------------------------------------------------------
  939.  *
  940.  * Tm_CvtStringToString --
  941.  *
  942.  *    Converter from String to String type
  943.  *
  944.  * Results:
  945.  *
  946.  *    changes the "toVal" arg to contain the new value.
  947.  *
  948.  * Side effects:
  949.  *
  950.  *    none
  951.  *--------------------------------------------------------------
  952.  */
  953.  
  954. Boolean
  955. Tm_CvtStringToString(display, args, num_args, fromVal, toVal, destructor_data)
  956.     Display *display;
  957.     XrmValuePtr args;
  958.     Cardinal *num_args;
  959.     XrmValuePtr fromVal;
  960.     XrmValuePtr toVal;
  961.     XtPointer *destructor_data;
  962. {
  963.     static char *buf;
  964.  
  965.     buf = *(char **) (fromVal->addr);
  966. #   ifdef DEBUG
  967.     fprintf(stderr, "converted string to %s\n", buf);
  968. #   endif
  969.  
  970.     done(&buf, char *);
  971.  
  972.     return True;
  973. }
  974.  
  975. /*
  976.  *--------------------------------------------------------------
  977.  *
  978.  * Tm_CvtBooleanToString --
  979.  *
  980.  *    Converter from Boolean to String type
  981.  *
  982.  * Results:
  983.  *
  984.  *    changes the "toVal" arg to contain the new value.
  985.  *
  986.  * Side effects:
  987.  *
  988.  *    none
  989.  *--------------------------------------------------------------
  990.  */
  991.  
  992. Boolean
  993. Tm_CvtBooleanToString(display, args, num_args, fromVal, toVal, destructor_data)
  994.     Display *display;
  995.     XrmValuePtr args;
  996.     Cardinal *num_args;
  997.     XrmValuePtr fromVal;
  998.     XrmValuePtr toVal;
  999.     XtPointer *destructor_data;
  1000. {
  1001.     static char *buf;
  1002.     Boolean boolVal;
  1003.  
  1004.     boolVal = *(Boolean *) (fromVal->addr);
  1005.  
  1006.     if (boolVal) {
  1007.     buf = "true";
  1008.     } else {
  1009.     buf = "false";
  1010.     } 
  1011.  
  1012.     done(&buf, char *);
  1013.  
  1014.     return True;
  1015. }
  1016.  
  1017. /*
  1018.  *--------------------------------------------------------------
  1019.  *
  1020.  * Tm_CvtIntToString --
  1021.  *
  1022.  *    Converter from Int to String type
  1023.  *
  1024.  * Results:
  1025.  *
  1026.  *    changes the "toVal" arg to contain the new value.
  1027.  *
  1028.  * Side effects:
  1029.  *
  1030.  *    none
  1031.  *--------------------------------------------------------------
  1032.  */
  1033.  
  1034. Boolean
  1035. Tm_CvtIntToString(display, args, num_args, fromVal, toVal, destructor_data)
  1036.     Display *display;
  1037.     XrmValuePtr args;
  1038.     Cardinal *num_args;
  1039.     XrmValuePtr fromVal;
  1040.     XrmValuePtr toVal;
  1041.     XtPointer *destructor_data;
  1042. {
  1043.     static char *buf = NULL;
  1044.     int intVal;
  1045.  
  1046.     intVal = *(int *) (fromVal->addr);
  1047.  
  1048.     if (buf == NULL) {
  1049.         buf = XtMalloc(16);
  1050.     }
  1051.     sprintf(buf, "%d", intVal);
  1052.  
  1053.     done(&buf, char *);
  1054.  
  1055.     return True;
  1056. }
  1057.  
  1058.  
  1059. /*
  1060.  *--------------------------------------------------------------
  1061.  *
  1062.  * Tm_CvtUnsignedIntToString --
  1063.  *
  1064.  *    Converter from UnsignedInt to String type
  1065.  *
  1066.  * Results:
  1067.  *
  1068.  *    changes the "toVal" arg to contain the new value.
  1069.  *
  1070.  * Side effects:
  1071.  *
  1072.  *    none
  1073.  *--------------------------------------------------------------
  1074.  */
  1075.  
  1076. Boolean
  1077. Tm_CvtUnsignedIntToString(display, args, num_args, fromVal, toVal, destructor_data)
  1078.     Display *display;
  1079.     XrmValuePtr args;
  1080.     Cardinal *num_args;
  1081.     XrmValuePtr fromVal;
  1082.     XrmValuePtr toVal;
  1083.     XtPointer *destructor_data;
  1084. {
  1085.     static char *buf = NULL;
  1086.     unsigned int intVal;
  1087.  
  1088.     intVal = *(int *) (fromVal->addr);
  1089.  
  1090.     if (buf == NULL)
  1091.         buf = XtMalloc(16);
  1092.     sprintf(buf, "%u", intVal);
  1093.  
  1094.     done(&buf, char *);
  1095.  
  1096.     return True;
  1097. }
  1098.  
  1099. /*
  1100.  *--------------------------------------------------------------
  1101.  *
  1102.  * Tm_CvtDimensionToString --
  1103.  *
  1104.  *    Converter from Dimension to String type
  1105.  *
  1106.  * Results:
  1107.  *
  1108.  *    changes the "toVal" arg to contain the new value.
  1109.  *
  1110.  * Side effects:
  1111.  *
  1112.  *    none
  1113.  *--------------------------------------------------------------
  1114.  */
  1115.  
  1116. Boolean
  1117. Tm_CvtDimensionToString(display, args, num_args, fromVal, toVal, destructor_data)
  1118.     Display *display;
  1119.     XrmValuePtr args;
  1120.     Cardinal *num_args;
  1121.     XrmValuePtr fromVal;
  1122.     XrmValuePtr toVal;
  1123.     XtPointer *destructor_data;
  1124. {
  1125.     static char *buf = NULL;
  1126.     Dimension dimVal;
  1127.  
  1128.     dimVal = *(Dimension *) (fromVal->addr);
  1129.  
  1130.     if (buf == NULL)
  1131.         buf = XtMalloc(16);
  1132.     sprintf(buf, "%hu", dimVal);
  1133.  
  1134.     done(&buf, char *);
  1135.  
  1136.     return True;
  1137. }
  1138.  
  1139. /*
  1140.  *--------------------------------------------------------------
  1141.  *
  1142.  * Tm_CvtShortToString --
  1143.  *
  1144.  *    Converter from Short to String type
  1145.  *
  1146.  * Results:
  1147.  *
  1148.  *    changes the "toVal" arg to contain the new value.
  1149.  *
  1150.  * Side effects:
  1151.  *
  1152.  *    none
  1153.  *--------------------------------------------------------------
  1154.  */
  1155.  
  1156. Boolean
  1157. Tm_CvtShortToString(display, args, num_args, fromVal, toVal, destructor_data)
  1158.     Display *display;
  1159.     XrmValuePtr args;
  1160.     Cardinal *num_args;
  1161.     XrmValuePtr fromVal;
  1162.     XrmValuePtr toVal;
  1163.     XtPointer *destructor_data;
  1164. {
  1165.     static char *buf = NULL;
  1166.     Dimension shortVal;
  1167.  
  1168.     shortVal = *(short *) (fromVal->addr);
  1169.  
  1170.     if (buf == NULL)
  1171.         buf = XtMalloc(16);
  1172.     sprintf(buf, "%hd", shortVal);
  1173.  
  1174.     done(&buf, char *);
  1175.  
  1176.     return True;
  1177. }
  1178.  
  1179.  
  1180. /*
  1181.  *--------------------------------------------------------------
  1182.  *
  1183.  * Tm_CvtLongToString --
  1184.  *
  1185.  *    Converter from Long to String type
  1186.  *
  1187.  * Results:
  1188.  *
  1189.  *    changes the "toVal" arg to contain the new value.
  1190.  *
  1191.  * Side effects:
  1192.  *
  1193.  *    none
  1194.  *--------------------------------------------------------------
  1195.  */
  1196.  
  1197. Boolean
  1198. Tm_CvtLongToString(display, args, num_args, fromVal, toVal, destructor_data)
  1199.     Display *display;
  1200.     XrmValuePtr args;
  1201.     Cardinal *num_args;
  1202.     XrmValuePtr fromVal;
  1203.     XrmValuePtr toVal;
  1204.     XtPointer *destructor_data;
  1205. {
  1206.     static char *buf = NULL;
  1207.     Dimension shortVal;
  1208.  
  1209.     shortVal = *(short *) (fromVal->addr);
  1210.  
  1211.     if (buf == NULL)
  1212.         buf = XtMalloc(16);
  1213.     sprintf(buf, "%ld", shortVal);
  1214.  
  1215.     done(&buf, char *);
  1216.  
  1217.     return True;
  1218. }
  1219.  
  1220.  
  1221. /*
  1222.  *--------------------------------------------------------------
  1223.  *
  1224.  * Tm_CvtPixelToString --
  1225.  *
  1226.  *    Converter from Pixel to String type
  1227.  *    gives result in #RGB form
  1228.  *
  1229.  * Results:
  1230.  *
  1231.  *    changes the "toVal" arg to contain the new value.
  1232.  *
  1233.  * Side effects:
  1234.  *
  1235.  *    none
  1236.  *--------------------------------------------------------------
  1237.  */
  1238.  
  1239. Boolean
  1240. Tm_CvtPixelToString(display, args, num_args, fromVal, toVal, destructor_data)
  1241.     Display *display;
  1242.     XrmValuePtr args;
  1243.     Cardinal *num_args;
  1244.     XrmValuePtr fromVal;
  1245.     XrmValuePtr toVal;
  1246.     XtPointer *destructor_data;
  1247. {
  1248.     static char *buf = NULL;
  1249.     Pixel pixelVal;
  1250.     Screen *screen;
  1251.     Colormap colormap;
  1252.     XColor color;
  1253.  
  1254.     color.pixel = *(unsigned long *) fromVal->addr;
  1255.     screen = *((Screen **) args[0].addr);
  1256.     colormap = *((Colormap *) args[1].addr);
  1257.  
  1258.     XQueryColor(DisplayOfScreen(screen), colormap, &color);
  1259.  
  1260.     if (buf == NULL)
  1261.         buf = XtMalloc(32);
  1262.     sprintf(buf, "#%04x%04x%04x", color.red, color.green, color.blue);
  1263.  
  1264.     done(&buf, char *);
  1265.  
  1266.     return True;
  1267. }
  1268.  
  1269. /*
  1270.  *--------------------------------------------------------------
  1271.  *
  1272.  * Tm_CvtStringToPixmap --
  1273.  *
  1274.  *    Converter from String to Pixmap type
  1275.  *
  1276.  * Results:
  1277.  *
  1278.  *    changes the "toVal" arg to contain the new value.
  1279.  *
  1280.  * Side effects:
  1281.  *
  1282.  *    none
  1283.  *--------------------------------------------------------------
  1284.  */
  1285.  
  1286. Boolean
  1287. Tm_CvtStringToPixmap(display, args, num_args, fromVal, toVal, destructor_data)
  1288.     Display *display;
  1289.     XrmValuePtr args;
  1290.     Cardinal *num_args;
  1291.     XrmValuePtr fromVal;
  1292.     XrmValuePtr toVal;
  1293.     XtPointer *destructor_data;
  1294. {
  1295.     Widget w = *((Widget *) args[0].addr);
  1296.  
  1297.     /* use the Motif registered converter for this! (why reinvent?) */
  1298.     if (XtConvertAndStore(w, XmRString, fromVal, 
  1299.         XmRPrimForegroundPixmap, toVal)) {
  1300.         return True;
  1301.     }
  1302.     return False;
  1303. }
  1304.  
  1305. /*
  1306.  *--------------------------------------------------------------
  1307.  *
  1308.  * Tm_CvtStringToFunction --
  1309.  *
  1310.  *    Converter from String to XmRProc type
  1311.  *    (for dropProc in D&D)
  1312.  *
  1313.  * Results:
  1314.  *
  1315.  *    changes the "toVal" arg to contain the new value.
  1316.  *
  1317.  * Side effects:
  1318.  *
  1319.  *    none
  1320.  *--------------------------------------------------------------
  1321.  */
  1322.  
  1323. Boolean
  1324. Tm_CvtStringToFunction(display, args, num_args, fromVal, toVal, destructor_data)
  1325.     Display *display;
  1326.     XrmValuePtr args;
  1327.     Cardinal *num_args;
  1328.     XrmValuePtr fromVal;
  1329.     XrmValuePtr toVal;
  1330.     XtPointer *destructor_data;
  1331. {
  1332. #ifndef MOTIF11
  1333.     char *command;
  1334.     extern Tm_Widget *Tm_HackDragWidgetPtr;
  1335.     Tm_Widget *wPtr = Tm_HackDragWidgetPtr;
  1336.     Widget w = *((Widget *) args[1].addr);
  1337.     WidgetClass Class = *((WidgetClass *) args[2].addr);
  1338.     static XtConvertSelectionProc p = Tm_ConvertProcHandler;
  1339.  
  1340.     /* set our proc in widgets user data */
  1341.     command = (char *) (fromVal->addr);
  1342. /*
  1343.     XtVaGetValues(w, XmNuserData, &wPtr, NULL);
  1344. */
  1345.     wPtr->convertProc = XtNewString(command);
  1346.     XtVaSetValues(w, XmNuserData, wPtr, NULL);
  1347.     
  1348.     done(&p, XtConvertSelectionProc);
  1349.  
  1350.     return True;
  1351. #endif
  1352. }
  1353.  
  1354.  
  1355. /*
  1356.  *--------------------------------------------------------------
  1357.  *
  1358.  * Tm_CvtStringToProc --
  1359.  *
  1360.  *    Converter from String to XmRFunc type
  1361.  *    (for convertProc resource in D&D)
  1362.  *
  1363.  * Results:
  1364.  *
  1365.  *    changes the "toVal" arg to contain the new value.
  1366.  *
  1367.  * Side effects:
  1368.  *
  1369.  *    none
  1370.  *--------------------------------------------------------------
  1371.  */
  1372.  
  1373. Boolean
  1374. Tm_CvtStringToProc(display, args, num_args, fromVal, toVal, destructor_data)
  1375.     Display *display;
  1376.     XrmValuePtr args;
  1377.     Cardinal *num_args;
  1378.     XrmValuePtr fromVal;
  1379.     XrmValuePtr toVal;
  1380.     XtPointer *destructor_data;
  1381. {
  1382. #ifndef MOTIF11
  1383.     char *command;
  1384.     Tm_Widget *wPtr;
  1385.     Widget w = *((Widget *) args[1].addr);
  1386.     WidgetClass Class = *((WidgetClass *) args[2].addr);
  1387.     static XtCallbackProc p = Tm_DropProcHandler;
  1388.  
  1389.    /* note these two hacks because XmRProc
  1390.       is not a unique enough type */
  1391.     extern Boolean Tm_SettingDropResources;
  1392.     extern Boolean Tm_SettingDropProc;
  1393.  
  1394.     if (Tm_SettingDropResources) {
  1395.         /* set our proc in widgets user data */
  1396.         command = (char *) (fromVal->addr);
  1397.         XtVaGetValues(w, XmNuserData, &wPtr, NULL);
  1398.     if (Tm_SettingDropProc) {
  1399.             wPtr->dropProc = XtNewString(command);
  1400.     } else {
  1401.         return False;
  1402.     }
  1403.         XtVaSetValues(w, XmNuserData, wPtr, NULL);
  1404.     
  1405.         done(&p, XtCallbackProc);
  1406.  
  1407.         return True;
  1408.     }
  1409. #endif /* not MOTIF11 */
  1410.     return False;
  1411. }
  1412.  
  1413.  
  1414. /*
  1415.  *--------------------------------------------------------------
  1416.  *
  1417.  * Tm_CvtStringToCallbackProc --
  1418.  *
  1419.  *    Converter from String to XmRFunc type
  1420.  *
  1421.  * Results:
  1422.  *
  1423.  *    changes the "toVal" arg to contain the new value.
  1424.  *
  1425.  * Side effects:
  1426.  *
  1427.  *    none
  1428.  *--------------------------------------------------------------
  1429.  */
  1430.  
  1431. Boolean
  1432. Tm_CvtStringToCallbackProc(display, args, num_args, fromVal, toVal, destructor_data)
  1433.     Display *display;
  1434.     XrmValuePtr args;
  1435.     Cardinal *num_args;
  1436.     XrmValuePtr fromVal;
  1437.     XrmValuePtr toVal;
  1438.     XtPointer *destructor_data;
  1439. {
  1440. #ifndef MOTIF11
  1441.     char *command;
  1442.     extern Tm_Widget *Tm_HackWidgetPtr;
  1443.     Tm_Widget *wPtr = Tm_HackWidgetPtr;
  1444.     Widget w = *((Widget *) args[1].addr);
  1445.     WidgetClass Class = *((WidgetClass *) args[2].addr);
  1446.     static XtSelectionCallbackProc p = Tm_DropTransferHandler;
  1447.  
  1448. /*
  1449.     if (Tm_SettingDropTransferResources) {
  1450. */
  1451.         /* set our proc in widgets user data */
  1452.         command = (char *) (fromVal->addr);
  1453.         wPtr->transferProc = XtNewString(command);
  1454.     
  1455.         done(&p, XtCallbackProc);
  1456.  
  1457.         return True;
  1458. /*
  1459.     }
  1460.     return False;
  1461. */
  1462. #endif
  1463. }
  1464.  
  1465.  
  1466. /*
  1467.  *--------------------------------------------------------------
  1468.  *
  1469.  * Tm_RegisterConverters --
  1470.  *
  1471.  *    Register all extra converters with Xt.
  1472.  *
  1473.  * Results:
  1474.  *
  1475.  * Side effects:
  1476.  *
  1477.  *    Modifies the Xt converter lists.
  1478.  *--------------------------------------------------------------
  1479.  */
  1480.  
  1481. void
  1482. Tm_RegisterConverters(interp, appContext)
  1483.     Tcl_Interp *interp;
  1484.     XtAppContext appContext;
  1485. {
  1486.     XtConvertArgRec convert_arg;
  1487.     XtConvertArgRec convert_args[128];
  1488.  
  1489.     /*
  1490.      * Register the type converters we need
  1491.      * This implementation installs everything, 
  1492.      * even if it is never used. A smarter method
  1493.      * would be to install on demand. Maybe someday...
  1494.      */
  1495.  
  1496.     InstallReverseRepTypes();
  1497.  
  1498.     /* 
  1499.      * String to Widget
  1500.      */
  1501.     convert_arg.address_mode = XtAddress;
  1502.     convert_arg.address_id = (XtPointer) interp;
  1503.     convert_arg.size = sizeof(XtPointer);
  1504.  
  1505.     XtSetTypeConverter(
  1506.         XtRString, XtRWidget,
  1507.         Tm_CvtStringToWidget,
  1508.         &convert_arg,
  1509.         1,
  1510.         XtCacheNone,
  1511.         NULL);
  1512.  
  1513.     /*
  1514.      * Motif 1.2.1 MainW.c has bugs in it - resources like menuBar are declared
  1515.      * as type Window not Widget. So we have to have another converter just
  1516.      * to handle this bug
  1517.      */
  1518.     convert_arg.address_mode = XtAddress;
  1519.     convert_arg.address_id = (XtPointer) interp;
  1520.     convert_arg.size = sizeof(XtPointer);
  1521.  
  1522.     XtSetTypeConverter(
  1523.         XtRString, XtRWindow,
  1524.         Tm_CvtStringToWidget,
  1525.         &convert_arg,
  1526.         1,
  1527.         XtCacheNone,
  1528.         NULL);
  1529.  
  1530.     /* 
  1531.      * String to MenuWidget
  1532.      */
  1533.     convert_arg.address_mode = XtAddress;
  1534.     convert_arg.address_id = (XtPointer) interp;
  1535.     convert_arg.size = sizeof(XtPointer);
  1536.  
  1537.     XtSetTypeConverter(
  1538.         XtRString, XmRMenuWidget,
  1539.         Tm_CvtStringToWidget,
  1540.         &convert_arg,
  1541.         1,
  1542.         XtCacheNone,
  1543.         NULL);
  1544.  
  1545.     /* 
  1546.      * Widget to String
  1547.      */
  1548.  
  1549.     XtSetTypeConverter(
  1550.         XtRWidget, XmRString,
  1551.         Tm_CvtWidgetToString,
  1552.         NULL,
  1553.         0,
  1554.         XtCacheNone,
  1555.         NULL);
  1556.  
  1557.     /* 
  1558.      * Widget to String - this is registered as Window to String because
  1559.      * of the buggy resource decls mentioned before
  1560.      */
  1561.  
  1562.     XtSetTypeConverter(
  1563.         XtRWindow, XmRString,
  1564.         Tm_CvtWidgetToString,
  1565.         NULL,
  1566.         0,
  1567.         XtCacheNone,
  1568.         NULL);
  1569.  
  1570.     /* 
  1571.      * WidgetList to String
  1572.      */
  1573.     convert_args[0].address_mode = XtWidgetBaseOffset;
  1574.     convert_args[0].address_id = (XtPointer) XtOffsetOf(CoreRec, core.self);
  1575.     convert_args[0].size = sizeof(CoreWidget);
  1576.  
  1577.     XtSetTypeConverter(
  1578.         XtRWidgetList, XmRString,
  1579.         Tm_CvtWidgetListToString,
  1580.         convert_args,
  1581.         1,
  1582.         XtCacheNone,
  1583.         NULL);
  1584.  
  1585. #ifndef MOTIF11
  1586.     /* 
  1587.      * String to DropTransfers
  1588.      */
  1589.     convert_arg.address_mode = XtAddress;
  1590.     convert_arg.address_id = (XtPointer) interp;
  1591.     convert_arg.size = sizeof(XtPointer);
  1592.  
  1593.     XtSetTypeConverter(
  1594.         XtRString, XmRDropTransfers,
  1595.         Tm_CvtStringToDropTransfers,
  1596.         &convert_arg,
  1597.         1,
  1598.         XtCacheNone,
  1599.         NULL);
  1600.  
  1601.     /* 
  1602.      * String to TransferStatus (as in dropTransfer widget
  1603.      */
  1604.  
  1605.     XtSetTypeConverter(
  1606.         XtRString, XmRTransferStatus,
  1607.         Tm_CvtStringToTransferStatus,
  1608.         NULL,
  1609.         0,
  1610.         XtCacheNone,
  1611.         NULL);
  1612. #endif
  1613.  
  1614.     /* 
  1615.      * String to Pixmap
  1616.      */
  1617.     convert_args[0].address_mode = XtWidgetBaseOffset;
  1618.     convert_args[0].address_id = (XtPointer) XtOffsetOf(CoreRec, core.self);
  1619.     convert_args[0].size = sizeof(CoreWidget);
  1620.  
  1621.     XtSetTypeConverter(
  1622.         XmRString, XtRPixmap,
  1623.         Tm_CvtStringToPixmap,
  1624.         convert_args,
  1625.         1,
  1626.         XtCacheNone,
  1627.         NULL);
  1628.     /* 
  1629.      * XmString to String
  1630.      */
  1631.     XtSetTypeConverter(
  1632.         XmRXmString, XtRString,
  1633.         Tm_CvtXmStringToString,
  1634.         NULL,
  1635.         0,
  1636.         XtCacheNone,
  1637.         NULL);
  1638.  
  1639.     /* 
  1640.      * XmStringTable to String
  1641.      */
  1642.     convert_arg.address_mode = XtWidgetBaseOffset;
  1643.     convert_arg.address_id = (XtPointer) XtOffsetOf(CoreRec, core.self);
  1644.     convert_arg.size = sizeof(CoreWidget);
  1645.  
  1646.     XtSetTypeConverter(
  1647.         XmRXmStringTable, XtRString,
  1648.         Tm_CvtXmStringTableToString,
  1649.         &convert_arg,
  1650.         1,
  1651.         XtCacheNone,
  1652.         NULL);
  1653.  
  1654.     /* 
  1655.      * String to XmString
  1656.      */
  1657.     convert_arg.address_mode = XtAddress;
  1658.     convert_arg.address_id = (XtPointer) interp;
  1659.     convert_arg.size = sizeof(XtPointer);
  1660.  
  1661.     XtSetTypeConverter(
  1662.         XmRString, XmRXmString,
  1663.         Tm_CvtStringToXmString,
  1664.         &convert_arg,
  1665.         1,
  1666.         XtCacheNone,
  1667.         NULL);
  1668.  
  1669.     /*
  1670.      * String to XmStringTable
  1671.      */
  1672.     convert_arg.address_mode = XtAddress;
  1673.     convert_arg.address_id = (XtPointer) interp;
  1674.     convert_arg.size = sizeof(XtPointer);
  1675.  
  1676.     XtSetTypeConverter(
  1677.         XmRString, XmRXmStringTable,
  1678.         Tm_CvtStringToXmStringTable,
  1679.         &convert_arg,
  1680.         1,
  1681.         XtCacheNone,
  1682.         NULL);
  1683.  
  1684.     /* 
  1685.      * String to String
  1686.      * I don't know why there isn't already one of these,
  1687.      * but getting value out of Text seems to need it.
  1688.      *
  1689.      * it doesn't seem to work anyway - maybe something
  1690.      * special case away X to X convertions
  1691.      */
  1692. /*
  1693.     convert_arg.address_mode = XtAddress;
  1694.     convert_arg.address_id = (XtPointer) interp;
  1695.     convert_arg.size = sizeof(XtPointer);
  1696.  
  1697.     XtSetTypeConverter(
  1698.         XtRString, XtRString,
  1699.         Tm_CvtStringToString,
  1700.         &convert_arg,
  1701.         1,
  1702.         XtCacheNone,
  1703.         NULL);
  1704. */
  1705.  
  1706.     /* 
  1707.      * Int to String
  1708.      */
  1709.     XtSetTypeConverter(
  1710.         XmRInt, XtRString,
  1711.         Tm_CvtIntToString,
  1712.         NULL,
  1713.         0,
  1714.         XtCacheNone,
  1715.         NULL);
  1716.  
  1717.  
  1718.     /* 
  1719.      * Cardinal to String
  1720.      */
  1721.     XtSetTypeConverter(
  1722.         XmRCardinal, XtRString,
  1723.         Tm_CvtUnsignedIntToString,
  1724.         NULL,
  1725.         0,
  1726.         XtCacheNone,
  1727.         NULL);
  1728.  
  1729.     /* 
  1730.      * HorizontalInt to String
  1731.      */
  1732.     XtSetTypeConverter(
  1733.         XmRHorizontalInt, XtRString,
  1734.         Tm_CvtIntToString,
  1735.         NULL,
  1736.         0,
  1737.         XtCacheNone,
  1738.         NULL);
  1739.  
  1740.     /* 
  1741.      * VerticalInt to String
  1742.      */
  1743.     XtSetTypeConverter(
  1744.         XmRVerticalInt, XtRString,
  1745.         Tm_CvtIntToString,
  1746.         NULL,
  1747.         0,
  1748.         XtCacheNone,
  1749.         NULL);
  1750.  
  1751.  
  1752.     /* 
  1753.      * Boolean to String
  1754.      */
  1755.     XtSetTypeConverter(
  1756.         XmRBoolean, XtRString,
  1757.         Tm_CvtBooleanToString,
  1758.         NULL,
  1759.         0,
  1760.         XtCacheNone,
  1761.         NULL);
  1762.  
  1763.     /* 
  1764.      * Dimension to String
  1765.      */
  1766.     XtSetTypeConverter(
  1767.         XmRDimension, XtRString,
  1768.         Tm_CvtDimensionToString,
  1769.         NULL,
  1770.         0,
  1771.         XtCacheNone,
  1772.         NULL);
  1773.  
  1774.     /* 
  1775.      * BooleanDimension to String
  1776.      */
  1777.     XtSetTypeConverter(
  1778.         XmRBooleanDimension, XtRString,
  1779.         Tm_CvtDimensionToString,
  1780.         NULL,
  1781.         0,
  1782.         XtCacheNone,
  1783.         NULL);
  1784.  
  1785.     /* 
  1786.      * HorizontalDimension to String
  1787.      * Buggy? should use UnitType resource
  1788.      */
  1789.     XtSetTypeConverter(
  1790.         XmRHorizontalDimension, XtRString,
  1791.         Tm_CvtDimensionToString,
  1792.         NULL,
  1793.         0,
  1794.         XtCacheNone,
  1795.         NULL);
  1796.  
  1797.     /* 
  1798.      * VerticalDimension to String
  1799.      * Buggy? should use UnitType resource
  1800.      */
  1801.  
  1802.     XtSetTypeConverter(
  1803.         XmRVerticalDimension, XtRString,
  1804.         Tm_CvtDimensionToString,
  1805.         NULL,
  1806.         0,
  1807.         XtCacheNone,
  1808.         NULL);
  1809.  
  1810.     /* 
  1811.      * short to String
  1812.      */
  1813.     XtSetTypeConverter(
  1814.         XmRShort, XtRString,
  1815.         Tm_CvtShortToString,
  1816.         NULL,
  1817.         0,
  1818.         XtCacheNone,
  1819.         NULL);
  1820.  
  1821.     /* 
  1822.      * Position to String
  1823.      */
  1824.     XtSetTypeConverter(
  1825.         XmRPosition, XtRString,
  1826.         Tm_CvtShortToString,
  1827.         NULL,
  1828.         0,
  1829.         XtCacheNone,
  1830.         NULL);
  1831.  
  1832.     /* 
  1833.      * HorizontalPosition to String
  1834.      */
  1835.     XtSetTypeConverter(
  1836.         XmRHorizontalPosition, XtRString,
  1837.         Tm_CvtShortToString,
  1838.         NULL,
  1839.         0,
  1840.         XtCacheNone,
  1841.         NULL);
  1842.  
  1843.     /* 
  1844.      * VerticalPosition to String
  1845.      */
  1846.     XtSetTypeConverter(
  1847.         XmRVerticalPosition, XtRString,
  1848.         Tm_CvtShortToString,
  1849.         NULL,
  1850.         0,
  1851.         XtCacheNone,
  1852.         NULL);
  1853.  
  1854.     /* 
  1855.      * TextPosition to String
  1856.      */
  1857.     XtSetTypeConverter(
  1858.         XmRTextPosition, XtRString,
  1859.         Tm_CvtLongToString,
  1860.         NULL,
  1861.         0,
  1862.         XtCacheNone,
  1863.         NULL);
  1864.  
  1865.     /* 
  1866.      * String to XmProc
  1867.      */
  1868.     convert_args[0].address_mode = XtImmediate;
  1869.     convert_args[0].address_id = (XtPointer) interp;
  1870.     convert_args[0].size = sizeof(XtPointer);
  1871.  
  1872.     convert_args[1].address_mode = XtWidgetBaseOffset;
  1873.     convert_args[1].address_id = (XtPointer) XtOffsetOf(CoreRec, core.self);
  1874.     convert_args[1].size = sizeof(CoreWidget);
  1875.  
  1876.     convert_args[2].address_mode = XtWidgetBaseOffset;
  1877.     convert_args[2].address_id = (XtPointer) XtOffsetOf(CoreRec, core.widget_class);
  1878.     convert_args[2].size = sizeof(CoreWidget);
  1879.  
  1880.     XtSetTypeConverter(
  1881.         XmRString, XmRProc,
  1882.         Tm_CvtStringToProc,
  1883.         convert_args,
  1884.         3,
  1885.         XtCacheNone,
  1886.         NULL);
  1887.  
  1888.     /* 
  1889.      * String to XmCallbackProc
  1890.      */
  1891.     convert_args[0].address_mode = XtImmediate;
  1892.     convert_args[0].address_id = (XtPointer) interp;
  1893.     convert_args[0].size = sizeof(XtPointer);
  1894.  
  1895.     convert_args[1].address_mode = XtWidgetBaseOffset;
  1896.     convert_args[1].address_id = (XtPointer) XtOffsetOf(CoreRec, core.self);
  1897.     convert_args[1].size = sizeof(CoreWidget);
  1898.  
  1899.     convert_args[2].address_mode = XtWidgetBaseOffset;
  1900.     convert_args[2].address_id = (XtPointer) XtOffsetOf(CoreRec, core.widget_class);
  1901.     convert_args[2].size = sizeof(CoreWidget);
  1902.  
  1903.     XtSetTypeConverter(
  1904.         XmRString, XmRCallbackProc,
  1905.         Tm_CvtStringToCallbackProc,
  1906.         convert_args,
  1907.         3,
  1908.         XtCacheNone,
  1909.         NULL);
  1910.  
  1911.     /* 
  1912.      * String to XmFunc
  1913.      */
  1914.     convert_args[0].address_mode = XtImmediate;
  1915.     convert_args[0].address_id = (XtPointer) interp;
  1916.     convert_args[0].size = sizeof(XtPointer);
  1917.  
  1918.     convert_args[1].address_mode = XtWidgetBaseOffset;
  1919.     convert_args[1].address_id = (XtPointer) XtOffsetOf(CoreRec, core.self);
  1920.     convert_args[1].size = sizeof(CoreWidget);
  1921.  
  1922.     convert_args[2].address_mode = XtWidgetBaseOffset;
  1923.     convert_args[2].address_id = (XtPointer) XtOffsetOf(CoreRec, core.widget_class);
  1924.     convert_args[2].size = sizeof(CoreWidget);
  1925.  
  1926.     XtSetTypeConverter(
  1927.         XmRString, XmRFunction,
  1928.         Tm_CvtStringToFunction,
  1929.         convert_args,
  1930.         3,
  1931.         XtCacheNone,
  1932.         NULL);
  1933.  
  1934.     /* 
  1935.      * Pixel to String
  1936.      */
  1937.     convert_args[0].address_mode = XtWidgetBaseOffset;
  1938.     convert_args[0].address_id = (XtPointer) XtOffsetOf(WidgetRec, core.screen);
  1939.     convert_args[0].size = sizeof(Screen *);
  1940.  
  1941.     convert_args[1].address_mode = XtWidgetBaseOffset;
  1942.     convert_args[1].address_id = (XtPointer) XtOffsetOf(CoreRec, core.colormap);
  1943.     convert_args[1].size = sizeof(Colormap);
  1944.  
  1945.     XtSetTypeConverter(
  1946.         XmRPixel, XmRString,
  1947.         Tm_CvtPixelToString,
  1948.         convert_args,
  1949.         2,
  1950.         XtCacheNone,
  1951.         NULL);
  1952. }
  1953.