Blame lib/Xm/ColorS.c.rgbtxt

Packit a21d5c
/*
Packit a21d5c
 * Motif
Packit a21d5c
 *
Packit a21d5c
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit a21d5c
 *
Packit a21d5c
 * These libraries and programs are free software; you can
Packit a21d5c
 * redistribute them and/or modify them under the terms of the GNU
Packit a21d5c
 * Lesser General Public License as published by the Free Software
Packit a21d5c
 * Foundation; either version 2 of the License, or (at your option)
Packit a21d5c
 * any later version.
Packit a21d5c
 *
Packit a21d5c
 * These libraries and programs are distributed in the hope that
Packit a21d5c
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit a21d5c
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit a21d5c
 * PURPOSE. See the GNU Lesser General Public License for more
Packit a21d5c
 * details.
Packit a21d5c
 *
Packit a21d5c
 * You should have received a copy of the GNU Lesser General Public
Packit a21d5c
 * License along with these librararies and programs; if not, write
Packit a21d5c
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit a21d5c
 * Floor, Boston, MA 02110-1301 USA
Packit a21d5c
 * 
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/************************************************************
Packit a21d5c
 *       INCLUDE FILES
Packit a21d5c
 ************************************************************/
Packit a21d5c
#ifdef HAVE_CONFIG_H
Packit a21d5c
#include <config.h>
Packit a21d5c
#endif
Packit a21d5c
Packit a21d5c
#include <stdio.h>
Packit a21d5c
#include <stdlib.h>
Packit a21d5c
#include <ctype.h>
Packit a21d5c
Packit a21d5c
#include "ColorSP.h"
Packit a21d5c
Packit a21d5c
#include <Xm/Xm.h>
Packit a21d5c
#include <Xm/VaSimpleP.h>
Packit a21d5c
Packit a21d5c
#include <Xm/ButtonBox.h>
Packit a21d5c
#include <Xm/Scale.h>
Packit a21d5c
#include <Xm/ScrolledW.h>
Packit a21d5c
#include <Xm/List.h>
Packit a21d5c
#include <Xm/RowColumn.h>
Packit a21d5c
#include <Xm/ToggleB.h>
Packit a21d5c
#include <Xm/Frame.h>
Packit a21d5c
#include <Xm/Label.h>
Packit a21d5c
Packit a21d5c
#include <Xm/ExtP.h>
Packit a21d5c
#include "XmI.h"
Packit a21d5c
Packit a21d5c
/************************************************************
Packit a21d5c
 *       TYPEDEFS AND DEFINES
Packit a21d5c
 ************************************************************/
Packit a21d5c
Packit a21d5c
#define SUPERCLASS ((WidgetClass) &xmManagerClassRec)
Packit a21d5c
Packit a21d5c
/************************************************************
Packit a21d5c
 *       MACROS
Packit a21d5c
 ************************************************************/
Packit a21d5c
Packit a21d5c
/************************************************************
Packit a21d5c
 *       GLOBAL DECLARATIONS
Packit a21d5c
 ************************************************************/
Packit a21d5c
Packit a21d5c
extern void 		XmeNavigChangeManaged(Widget);
Packit a21d5c
Packit a21d5c
/************************************************************
Packit a21d5c
 *       STATIC FUNCTION DECLARATIONS
Packit a21d5c
 ************************************************************/
Packit a21d5c
Packit a21d5c
static void ChangeManaged(Widget w);
Packit a21d5c
static void ClassInitialize(void), Destroy(Widget), Resize(Widget);
Packit a21d5c
static void ClassPartInitialize(WidgetClass w_class);
Packit a21d5c
static void Initialize(Widget, Widget, ArgList, Cardinal *);
Packit a21d5c
static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *);
Packit a21d5c
static XtGeometryResult GeometryHandler(Widget, XtWidgetGeometry *, 
Packit a21d5c
					XtWidgetGeometry *);
Packit a21d5c
static XtGeometryResult QueryGeometry(Widget, XtWidgetGeometry *,
Packit a21d5c
				      XtWidgetGeometry *);
Packit a21d5c
Packit a21d5c
static Boolean UpdateColorWindow(XmColorSelectorWidget, Boolean);
Packit a21d5c
static Boolean color_name_changed(XmColorSelectorWidget, char *);
Packit a21d5c
static Boolean FindColor(XmColorSelectorWidget, int *);
Packit a21d5c
static Boolean CvtStringToColorMode(Display *, XrmValuePtr, Cardinal, 
Packit a21d5c
				    XrmValuePtr, XrmValuePtr, XtPointer *);
Packit a21d5c
static Boolean DefaultVisualDisplay(XmColorSelectorWidget, Pixel, XColor, char *);
Packit a21d5c
Packit a21d5c
static void CalcPreferredSize(XmColorSelectorWidget, Dimension *, Dimension *);
Packit a21d5c
static void SelectColor(XmColorSelectorWidget);
Packit a21d5c
static void slider_changed(Widget, XtPointer, XtPointer);
Packit a21d5c
static void list_selected(Widget, XtPointer, XtPointer);
Packit a21d5c
static void change_mode(Widget, XtPointer, XtPointer);
Packit a21d5c
static void new_mode(XmColorSelectorWidget, XmColorMode);
Packit a21d5c
static void compute_size(XmColorSelectorWidget);
Packit a21d5c
static void read_rgb_file(XmColorSelectorWidget, ArgList, Cardinal, Boolean);
Packit a21d5c
static void SetSliders(XmColorSelectorWidget);
Packit a21d5c
Packit a21d5c
static void CreateColorSliders(XmColorSelectorWidget, ArgList, Cardinal);
Packit a21d5c
static void CreateSelectorRadio(XmColorSelectorWidget, ArgList, Cardinal);
Packit a21d5c
static void CreateColorWindow(XmColorSelectorWidget, ArgList, Cardinal);
Packit a21d5c
static void NoPrivateColormaps(XmColorSelectorWidget, Pixel, XColor, char *);
Packit a21d5c
static void PrivateColormaps(XmColorSelectorWidget, Pixel, XColor, char *);
Packit a21d5c
Packit a21d5c
#ifdef notdef
Packit a21d5c
static void CreateTypes(XmColorSelectorWidget, Widget, ArgList, Cardinal);
Packit a21d5c
#endif
Packit a21d5c
Packit a21d5c
static int CmpColors(const void *, const void *);
Packit a21d5c
static char *find_name(char *);
Packit a21d5c
static int GetVisual(XmColorSelectorWidget);
Packit a21d5c
Packit a21d5c
static void GetValues_XmNredSliderLabel ( Widget w, int n, XtArgVal *value) ;
Packit a21d5c
static void GetValues_XmNgreenSliderLabel( Widget w, int n, XtArgVal *value) ;
Packit a21d5c
static void GetValues_XmNblueSliderLabel( Widget w, int n, XtArgVal *value) ;
Packit a21d5c
static void GetValues_XmNcolorListTogLabel( Widget w, int n, XtArgVal *value) ;
Packit a21d5c
static void GetValues_XmNsliderTogLabel( Widget w, int n, XtArgVal *value) ;
Packit a21d5c
static void GetValues_XmNnoCellError( Widget w, int n, XtArgVal *value) ;
Packit a21d5c
static void GetValues_XmNfileReadError( Widget w, int n, XtArgVal *value) ;
Packit a21d5c
Packit a21d5c
/************************************************************
Packit a21d5c
 *       STATIC DECLARATIONS
Packit a21d5c
 ************************************************************/
Packit a21d5c
Packit a21d5c
static XtResource resources[] =
Packit a21d5c
{
Packit a21d5c
  {
Packit a21d5c
    XmNcolorMode, XmCColorMode, XmRXmColorMode,
Packit a21d5c
    sizeof(XmColorMode), XtOffsetOf(XmColorSelectorRec, cs.color_mode),
Packit a21d5c
    XmRImmediate, (XtPointer) XmScaleMode
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNcolorName, XmCString, XmRString,
Packit a21d5c
    sizeof(String), XtOffsetOf(XmColorSelectorRec, cs.color_name),
Packit a21d5c
    XmRString, "White"
Packit a21d5c
  },
Packit a21d5c
#ifdef VMS    
Packit a21d5c
  {
Packit a21d5c
    XmNrgbFile, XmCString, XmRString,
Packit a21d5c
    sizeof(String), XtOffsetOf(XmColorSelectorRec, cs.rgb_file),
Packit a21d5c
    XmRString, (XtPointer) "sys$manager:decw$rgb.dat"
Packit a21d5c
  },
Packit a21d5c
#else
Packit a21d5c
  {
Packit a21d5c
    XmNrgbFile, XmCString, XmRString,
Packit a21d5c
    sizeof(String), XtOffsetOf(XmColorSelectorRec, cs.rgb_file),
Packit a21d5c
    XmRString, (XtPointer) "/usr/lib/X11/rgb.txt"
Packit a21d5c
  },
Packit a21d5c
#endif
Packit a21d5c
  {
Packit a21d5c
    XmNmarginWidth, XmCMargin, XmRHorizontalDimension,
Packit a21d5c
    sizeof(Dimension), XtOffsetOf(XmColorSelectorRec, cs.margin_width),
Packit a21d5c
    XmRImmediate, (XtPointer) 2
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNmarginHeight, XmCMargin, XmRVerticalDimension,
Packit a21d5c
    sizeof(Dimension), XtOffsetOf(XmColorSelectorRec, cs.margin_height),
Packit a21d5c
    XmRImmediate, (XtPointer) 2
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNredSliderLabel, XmCSliderLabel, XmRXmString,
Packit a21d5c
    sizeof(XmString), XtOffsetOf(XmColorSelectorRec, cs.strings.slider_labels[0]),
Packit a21d5c
    XmRString, (XtPointer) "Red"
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNgreenSliderLabel, XmCSliderLabel, XmRXmString,
Packit a21d5c
    sizeof(XmString), XtOffsetOf(XmColorSelectorRec, cs.strings.slider_labels[1]),
Packit a21d5c
    XmRString, (XtPointer) "Green"
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNblueSliderLabel, XmCSliderLabel, XmRXmString,
Packit a21d5c
    sizeof(XmString), XtOffsetOf(XmColorSelectorRec, cs.strings.slider_labels[2]),
Packit a21d5c
    XmRString, (XtPointer) "Blue"
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNcolorListTogLabel, XmCTogLabel, XmRXmString,
Packit a21d5c
    sizeof(XmString), XtOffsetOf(XmColorSelectorRec, cs.strings.tog_labels[0]),
Packit a21d5c
    XmRString, (XtPointer) "Color List"
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNsliderTogLabel, XmCTogLabel, XmRXmString,
Packit a21d5c
    sizeof(XmString), XtOffsetOf(XmColorSelectorRec, cs.strings.tog_labels[1]),
Packit a21d5c
    XmRString,(XtPointer)"Color Sliders"
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNnoCellError, XmCNoCellError, XmRXmString,
Packit a21d5c
    sizeof(XmString), XtOffsetOf(XmColorSelectorRec, cs.strings.no_cell_error),
Packit a21d5c
    XmRString, (XtPointer)"\n\nNo Color Cell Available!"
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNfileReadError, XmCFileReadError, XmRXmString,
Packit a21d5c
    sizeof(XmString), XtOffsetOf(XmColorSelectorRec, cs.strings.file_read_error),
Packit a21d5c
    XmRString, (XtPointer)"Could not read rgb.txt file:"
Packit a21d5c
  }
Packit a21d5c
};	
Packit a21d5c
Packit a21d5c
static XmSyntheticResource get_resources[] =
Packit a21d5c
{
Packit a21d5c
  {
Packit a21d5c
    XmNmarginWidth, sizeof(Dimension),
Packit a21d5c
    XtOffsetOf(XmColorSelectorRec, cs.margin_width),
Packit a21d5c
    XmeFromHorizontalPixels, (XmImportProc) XmeToHorizontalPixels
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNmarginHeight, sizeof(Dimension),
Packit a21d5c
    XtOffsetOf(XmColorSelectorRec, cs.margin_height),
Packit a21d5c
    XmeFromVerticalPixels, (XmImportProc) XmeToVerticalPixels
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNredSliderLabel, sizeof(XmString),
Packit a21d5c
    XtOffsetOf(XmColorSelectorRec, cs.strings.slider_labels[0]), 
Packit a21d5c
    GetValues_XmNredSliderLabel, NULL
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNgreenSliderLabel, sizeof(XmString),
Packit a21d5c
    XtOffsetOf(XmColorSelectorRec, cs.strings.slider_labels[1]),
Packit a21d5c
    GetValues_XmNgreenSliderLabel, NULL
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNblueSliderLabel, sizeof(XmString),
Packit a21d5c
    XtOffsetOf(XmColorSelectorRec, cs.strings.slider_labels[2]), 
Packit a21d5c
    GetValues_XmNblueSliderLabel, NULL
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNcolorListTogLabel, sizeof(XmString),
Packit a21d5c
    XtOffsetOf(XmColorSelectorRec, cs.strings.tog_labels[0]), 
Packit a21d5c
    GetValues_XmNcolorListTogLabel, NULL
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNsliderTogLabel, sizeof(XmString),
Packit a21d5c
    XtOffsetOf(XmColorSelectorRec, cs.strings.tog_labels[1]),
Packit a21d5c
    GetValues_XmNsliderTogLabel, NULL
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNnoCellError, sizeof(XmString),
Packit a21d5c
    XtOffsetOf(XmColorSelectorRec, cs.strings.no_cell_error),
Packit a21d5c
    GetValues_XmNnoCellError, NULL
Packit a21d5c
  },
Packit a21d5c
Packit a21d5c
  {
Packit a21d5c
    XmNfileReadError, sizeof(XmString),
Packit a21d5c
    XtOffsetOf(XmColorSelectorRec, cs.strings.file_read_error),
Packit a21d5c
    GetValues_XmNfileReadError, NULL
Packit a21d5c
  }
Packit a21d5c
};
Packit a21d5c
Packit a21d5c
XmColorSelectorClassRec xmColorSelectorClassRec = {
Packit a21d5c
  { /* core fields */
Packit a21d5c
    /* superclass               */      SUPERCLASS,
Packit a21d5c
    /* class_name               */      "XmColorSelector",
Packit a21d5c
    /* widget_size              */      sizeof(XmColorSelectorRec),
Packit a21d5c
    /* class_initialize         */      ClassInitialize,
Packit a21d5c
    /* class_part_initialize    */      ClassPartInitialize,
Packit a21d5c
    /* class_inited             */      False,
Packit a21d5c
    /* initialize               */      Initialize,
Packit a21d5c
    /* initialize_hook          */      NULL,
Packit a21d5c
    /* realize                  */      XtInheritRealize,
Packit a21d5c
    /* actions                  */      NULL,
Packit a21d5c
    /* num_actions              */      (Cardinal)0,
Packit a21d5c
    /* resources                */      (XtResource*)resources,
Packit a21d5c
    /* num_resources            */      XtNumber(resources),
Packit a21d5c
    /* xrm_class                */      NULLQUARK,
Packit a21d5c
    /* compress_motion          */      True,
Packit a21d5c
    /* compress_exposure        */      True,
Packit a21d5c
    /* compress_enterleave      */      True,
Packit a21d5c
    /* visible_interest         */      False,
Packit a21d5c
   /* destroy                  */      Destroy,
Packit a21d5c
    /* resize                   */      Resize,
Packit a21d5c
    /* expose                   */      NULL,
Packit a21d5c
    /* set_values               */      SetValues,
Packit a21d5c
    /* set_values_hook          */      NULL,
Packit a21d5c
    /* set_values_almost        */      XtInheritSetValuesAlmost,
Packit a21d5c
    /* get_values_hook          */      NULL,
Packit a21d5c
    /* accept_focus             */      NULL,
Packit a21d5c
    /* version                  */      XtVersion,
Packit a21d5c
    /* callback_private         */      NULL,
Packit a21d5c
    /* tm_table                 */      XtInheritTranslations,
Packit a21d5c
    /* query_geometry           */      (XtGeometryHandler) QueryGeometry,
Packit a21d5c
    /* display_accelerator      */      XtInheritDisplayAccelerator,
Packit a21d5c
    /* extension                */      NULL,
Packit a21d5c
  },
Packit a21d5c
  {            /* composite_class fields */
Packit a21d5c
    /* geometry_manager   	*/      GeometryHandler,
Packit a21d5c
    /* change_managed     	*/      ChangeManaged,
Packit a21d5c
    /* insert_child       	*/      XtInheritInsertChild,
Packit a21d5c
    /* delete_child       	*/      XtInheritDeleteChild,
Packit a21d5c
    /* extension          	*/      NULL,
Packit a21d5c
  },
Packit a21d5c
  {            /* constraint_class fields */
Packit a21d5c
   /* resource list        	*/ 	NULL,
Packit a21d5c
   /* num resources        	*/ 	0,
Packit a21d5c
   /* constraint size      	*/ 	sizeof(XmColorSelectorConstraintRec),
Packit a21d5c
   /* destroy proc         	*/ 	NULL,
Packit a21d5c
   /* init proc            	*/ 	NULL,
Packit a21d5c
   /* set values proc      	*/ 	NULL,
Packit a21d5c
   /* extension            	*/ 	NULL,
Packit a21d5c
  },
Packit a21d5c
  {            /* manager_class fields */
Packit a21d5c
   /* default translations   	*/      XtInheritTranslations,
Packit a21d5c
   /* syn_resources          	*/      get_resources,
Packit a21d5c
   /* num_syn_resources      	*/      XtNumber(get_resources),
Packit a21d5c
   /* syn_cont_resources     	*/      NULL,
Packit a21d5c
   /* num_syn_cont_resources 	*/      0,
Packit a21d5c
   /* parent_process         	*/      NULL,
Packit a21d5c
   /* extension              	*/      NULL,
Packit a21d5c
  },
Packit a21d5c
  {	      /* color_selector_class fields */
Packit a21d5c
    /* mumble 		  	*/	NULL,
Packit a21d5c
  }
Packit a21d5c
};
Packit a21d5c
Packit a21d5c
WidgetClass xmColorSelectorWidgetClass = (WidgetClass)&xmColorSelectorClassRec;
Packit a21d5c
Packit a21d5c
/************************************************************
Packit a21d5c
 *       STATIC CODE
Packit a21d5c
 ************************************************************/
Packit a21d5c
Packit a21d5c
/*      Function Name: ClassInitialize
Packit a21d5c
 *      Description:   Called to initialize class specific information.
Packit a21d5c
 *      Arguments:     widget_class - the widget class.
Packit a21d5c
 *      Returns:       none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
static void 
Packit a21d5c
ClassInitialize(void)
Packit a21d5c
{
Packit a21d5c
    XmColorSelectorClassRec *wc = &xmColorSelectorClassRec;
Packit a21d5c
Packit a21d5c
    XtSetTypeConverter(XmRString, XmRXmColorMode, 
Packit a21d5c
		       (XtTypeConverter) CvtStringToColorMode, 
Packit a21d5c
		       NULL, (Cardinal) 0, XtCacheAll, NULL);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*
Packit a21d5c
 * ClassPartInitialize sets up the fast subclassing for the widget.
Packit a21d5c
 */
Packit a21d5c
static void 
Packit a21d5c
#ifdef _NO_PROTO
Packit a21d5c
ClassPartInitialize(w_class)
Packit a21d5c
        WidgetClass w_class ;
Packit a21d5c
#else
Packit a21d5c
ClassPartInitialize(WidgetClass w_class)
Packit a21d5c
#endif /* _NO_PROTO */
Packit a21d5c
{
Packit a21d5c
    _XmFastSubclassInit (w_class, XmCOLORSELECTOR_BIT);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
Packit a21d5c
Packit a21d5c
/*      Function Name: Initialize
Packit a21d5c
 *      Description:   Called to initialize information specific
Packit a21d5c
 *                     to this widget.
Packit a21d5c
 *      Arguments:     request - what was originally requested.
Packit a21d5c
 *                     set - what will be created (our superclasses have
Packit a21d5c
 *                           already mucked with this)
Packit a21d5c
 *                     args, num_args - The arguments passed to
Packit a21d5c
 *                                      the creation call.
Packit a21d5c
 *      Returns:       none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void 
Packit a21d5c
Initialize(Widget request, Widget set, ArgList args, Cardinal *num_args)
Packit a21d5c
{
Packit a21d5c
    XmColorSelectorWidget	csw = (XmColorSelectorWidget)set;
Packit a21d5c
    Dimension			width, height;
Packit a21d5c
    String 			temp;
Packit a21d5c
    char			message_buffer[BUFSIZ];
Packit a21d5c
    ArgList 			f_args;
Packit a21d5c
    Cardinal 			f_num_args;
Packit a21d5c
    Widget			button;
Packit a21d5c
Packit a21d5c
    _XmFilterArgs(args, *num_args, xm_std_filter, &f_args, &f_num_args);
Packit a21d5c
Packit a21d5c
    /*
Packit a21d5c
     * Initialize important values.
Packit a21d5c
     */
Packit a21d5c
    
Packit a21d5c
    XmColorS_good_cell(csw) = False;
Packit a21d5c
Packit a21d5c
    temp = XmColorS_color_name(csw);
Packit a21d5c
    XmColorS_color_name(csw) = NULL;
Packit a21d5c
    XmColorS_list(csw) = NULL;
Packit a21d5c
Packit a21d5c
    CreateColorSliders(csw, f_args, f_num_args);
Packit a21d5c
    CreateSelectorRadio(csw, f_args, f_num_args);
Packit a21d5c
    CreateColorWindow(csw, f_args, f_num_args);
Packit a21d5c
Packit a21d5c
    XmColorS_rgb_file(csw) = XtNewString(XmColorS_rgb_file(csw));
Packit a21d5c
    XmColorS_colors(csw) = NULL;
Packit a21d5c
    read_rgb_file(csw, f_args, f_num_args, True);
Packit a21d5c
Packit a21d5c
    if (!color_name_changed(csw, temp)) {
Packit a21d5c
        snprintf(message_buffer, BUFSIZ, XmNunparsableColorMsg, temp);
Packit a21d5c
	XmeWarning((Widget)set, message_buffer);
Packit a21d5c
Packit a21d5c
	(void) color_name_changed(csw, "White");
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    slider_changed(NULL, (XtPointer) csw, NULL);
Packit a21d5c
Packit a21d5c
    CalcPreferredSize(csw, &width, &height);
Packit a21d5c
    
Packit a21d5c
    if ( csw->core.width < 1 )
Packit a21d5c
	csw->core.width = width;
Packit a21d5c
Packit a21d5c
    if ( csw->core.height < 1 )
Packit a21d5c
	csw->core.height = height;
Packit a21d5c
Packit a21d5c
    new_mode(csw, XmColorS_color_mode(csw));
Packit a21d5c
    button = XmColorS_chose_mode(csw)[XmColorS_color_mode(csw)];
Packit a21d5c
    XmToggleButtonSetState(button, True, False);
Packit a21d5c
Packit a21d5c
    XtFree((XtPointer) f_args);
Packit a21d5c
Packit a21d5c
    {
Packit a21d5c
    int i;
Packit a21d5c
    for( i = 0; i < 3; i++ )
Packit a21d5c
    	XmColorS_strings(csw).slider_labels[i] = XmStringCopy(XmColorS_strings(csw).slider_labels[i]);
Packit a21d5c
    for (i = 0; i< XmColorSelector_NUM_TOGGLES; i++) 
Packit a21d5c
	XmColorS_strings(csw).tog_labels[i] = XmStringCopy(XmColorS_strings(csw).tog_labels[i]);
Packit a21d5c
    XmColorS_strings(csw).file_read_error = XmStringCopy(XmColorS_strings(csw).file_read_error);
Packit a21d5c
    XmColorS_strings(csw).no_cell_error = XmStringCopy(XmColorS_strings(csw).no_cell_error); 
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: Destroy
Packit a21d5c
 *      Description:   Called to destroy this widget.
Packit a21d5c
 *      Arguments:     w - Color Selector Widget to destroy.
Packit a21d5c
 *      Returns:       none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void	
Packit a21d5c
Destroy(Widget w)
Packit a21d5c
{
Packit a21d5c
    XmColorSelectorWidget	csw = (XmColorSelectorWidget)w;
Packit a21d5c
Packit a21d5c
    if (XmColorS_good_cell(csw)) {
Packit a21d5c
    	XFreeColors(XtDisplay(csw), csw->core.colormap,
Packit a21d5c
		    &XmColorS_color_pixel(csw), 1, 0);
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    XtFree((char*) XmColorS_colors(csw));
Packit a21d5c
    XtFree((char*) XmColorS_color_name(csw));
Packit a21d5c
    XtFree((char*) XmColorS_rgb_file(csw));
Packit a21d5c
Packit a21d5c
    {
Packit a21d5c
    int i;
Packit a21d5c
    for( i = 0; i < 3; i++ ) 
Packit a21d5c
    	XmStringFree(XmColorS_strings(csw).slider_labels[i]);
Packit a21d5c
    for (i = 0; i< XmColorSelector_NUM_TOGGLES; i++) 
Packit a21d5c
	XmStringFree(XmColorS_strings(csw).tog_labels[i]);
Packit a21d5c
    XmStringFree(XmColorS_strings(csw).file_read_error);
Packit a21d5c
    XmStringFree(XmColorS_strings(csw).no_cell_error); 
Packit a21d5c
    }
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: Resize
Packit a21d5c
 *      Description:   Called when this widget has been resized.
Packit a21d5c
 *      Arguments:     w - Color Selector Widget to realize.
Packit a21d5c
 *      Returns:       none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void	
Packit a21d5c
Resize(Widget w)
Packit a21d5c
{
Packit a21d5c
    compute_size((XmColorSelectorWidget)w);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
static Boolean AreDiff(char *s1, char *s2)
Packit a21d5c
{
Packit a21d5c
	if (s1 && !s2)	return True;
Packit a21d5c
	if (s2 && !s1)	return True;
Packit a21d5c
	if (!s1 && !s2)	return False;
Packit a21d5c
	/* they exist; now safe to do strcmp */
Packit a21d5c
	return strcmp(s1, s2);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: SetValues
Packit a21d5c
 *      Description:   Called when some widget data needs to be modified on-
Packit a21d5c
 *                     the-fly.
Packit a21d5c
 *      Arguments:     current - the current (old) widget values.
Packit a21d5c
 *                     request - before superclassed have changed things.
Packit a21d5c
 *                     set - what will acutally be the new values.
Packit a21d5c
 *                     args, num_args - the arguments in the list.
Packit a21d5c
 *      Returns:       none
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static Boolean 
Packit a21d5c
SetValues(Widget current, Widget request, Widget set, 
Packit a21d5c
	  ArgList args, Cardinal *num_args)
Packit a21d5c
{
Packit a21d5c
    XmColorSelectorWidget	csw = (XmColorSelectorWidget)set;
Packit a21d5c
    XmColorSelectorWidget	curr = (XmColorSelectorWidget)current;
Packit a21d5c
Packit a21d5c
    /*
Packit a21d5c
     * Pass argument list through to all children.
Packit a21d5c
     */
Packit a21d5c
    
Packit a21d5c
    {
Packit a21d5c
	ArgList f_args;
Packit a21d5c
	Cardinal f_num_args;
Packit a21d5c
Packit a21d5c
	_XmFilterArgs(args, *num_args, xm_std_filter, &f_args, &f_num_args);
Packit a21d5c
	_XmSetValuesOnChildren(set, f_args, f_num_args);
Packit a21d5c
	XtFree((XtPointer) f_args);
Packit a21d5c
    }
Packit a21d5c
    
Packit a21d5c
    if (XmColorS_color_mode(curr) != XmColorS_color_mode(csw))
Packit a21d5c
    {
Packit a21d5c
	new_mode(csw, XmColorS_color_mode(csw));
Packit a21d5c
	XmToggleButtonSetState(XmColorS_chose_mode(csw)[XmColorS_color_mode(csw)],
Packit a21d5c
			       True, True);
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    /* 
Packit a21d5c
    ** Don't compare pointers; they are allocated, so passing the same file
Packit a21d5c
    ** in twice will trip this expensive function unless we compare the 
Packit a21d5c
    ** values of the strings (when they exist)
Packit a21d5c
    */
Packit a21d5c
    if (AreDiff(XmColorS_rgb_file(curr), XmColorS_rgb_file(csw)))
Packit a21d5c
    {
Packit a21d5c
	read_rgb_file(csw, NULL, 0, False);
Packit a21d5c
    }
Packit a21d5c
    if (XmColorS_rgb_file(curr) != XmColorS_rgb_file(csw))
Packit a21d5c
    {
Packit a21d5c
    	XtFree((char*) XmColorS_rgb_file(curr));
Packit a21d5c
        XmColorS_rgb_file(csw) = XtNewString(XmColorS_rgb_file(csw));
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    if ((XmColorS_margin_height(curr) != XmColorS_margin_height(csw)) ||
Packit a21d5c
	(XmColorS_margin_width(curr) != XmColorS_margin_width(csw)))
Packit a21d5c
    {
Packit a21d5c
	compute_size(csw);
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    if (XmColorS_color_name(curr) != XmColorS_color_name(csw))
Packit a21d5c
    {
Packit a21d5c
	String		oldValue;	/* old color name, will free. */
Packit a21d5c
	String		newValue;	/* new color name, allocate   */
Packit a21d5c
	char            string_buffer[BUFSIZ];
Packit a21d5c
	
Packit a21d5c
	oldValue = XmColorS_color_name(curr);
Packit a21d5c
	newValue = XmColorS_color_name(csw);
Packit a21d5c
	
Packit a21d5c
	if (!streq(newValue, oldValue)) 
Packit a21d5c
	{
Packit a21d5c
	    /*
Packit a21d5c
	     * Color name changed will automatically free the old 
Packit a21d5c
	     * value on success...
Packit a21d5c
	     */
Packit a21d5c
Packit a21d5c
	    XmColorS_color_name(csw) = oldValue; /* so it free's the right thing. */
Packit a21d5c
	    if (!color_name_changed(csw, newValue)) {
Packit a21d5c
		snprintf(string_buffer, BUFSIZ, XmNunparsableColorMsg, newValue);
Packit a21d5c
		XmeWarning(set, string_buffer);
Packit a21d5c
Packit a21d5c
		XmColorS_color_name(csw) = oldValue;
Packit a21d5c
	    }
Packit a21d5c
	}
Packit a21d5c
	else {
Packit a21d5c
	    XtFree(oldValue);
Packit a21d5c
	    XmColorS_color_name(csw) = XtNewString(newValue);
Packit a21d5c
	}
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    {
Packit a21d5c
    int i;
Packit a21d5c
    for( i = 0; i < 3; i++ )
Packit a21d5c
	{
Packit a21d5c
    	if (XmColorS_strings(curr).slider_labels[i] != XmColorS_strings(csw).slider_labels[i])
Packit a21d5c
		{
Packit a21d5c
		XmStringFree(XmColorS_strings(curr).slider_labels[i]);
Packit a21d5c
    		XmColorS_strings(csw).slider_labels[i] = XmStringCopy(XmColorS_strings(csw).slider_labels[i]);
Packit a21d5c
		XtVaSetValues(XmColorS_sliders(csw)[i], XmNtitleString, XmColorS_strings(csw).slider_labels[i], NULL); 
Packit a21d5c
		}
Packit a21d5c
	}
Packit a21d5c
    for (i = 0; i< XmColorSelector_NUM_TOGGLES; i++) 
Packit a21d5c
	{
Packit a21d5c
	if (XmColorS_strings(curr).tog_labels[i] != XmColorS_strings(csw).tog_labels[i])
Packit a21d5c
		{
Packit a21d5c
		XmStringFree(XmColorS_strings(curr).tog_labels[i]);
Packit a21d5c
		XmColorS_strings(csw).tog_labels[i] = XmStringCopy(XmColorS_strings(csw).tog_labels[i]);
Packit a21d5c
		XtVaSetValues(XmColorS_chose_mode(csw)[i], XmNlabelString, XmColorS_strings(csw).tog_labels[i], NULL);
Packit a21d5c
		}
Packit a21d5c
	}
Packit a21d5c
Packit a21d5c
	if (XmColorS_strings(curr).file_read_error != XmColorS_strings(csw).file_read_error)
Packit a21d5c
	{
Packit a21d5c
		XmStringFree(XmColorS_strings(curr).file_read_error);
Packit a21d5c
		XmColorS_strings(csw).file_read_error = XmStringCopy(XmColorS_strings(csw).file_read_error);
Packit a21d5c
	}
Packit a21d5c
	if (XmColorS_strings(curr).no_cell_error != XmColorS_strings(csw).no_cell_error)
Packit a21d5c
	{
Packit a21d5c
		XmStringFree(XmColorS_strings(curr).no_cell_error);
Packit a21d5c
		XmColorS_strings(csw).no_cell_error = XmStringCopy(XmColorS_strings(csw).no_cell_error);
Packit a21d5c
	}
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    return FALSE;
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: GeometryHandler
Packit a21d5c
 *      Description:   handles request from children for size changes.
Packit a21d5c
 *      Arguments:     child - the child to change.
Packit a21d5c
 *                     request - desired geometry of child.
Packit a21d5c
 *                     result - what will be allowed if almost.
Packit a21d5c
 *      Returns:       status.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static XtGeometryResult
Packit a21d5c
GeometryHandler(Widget w, XtWidgetGeometry *request, XtWidgetGeometry *result)
Packit a21d5c
{
Packit a21d5c
    return(XtGeometryNo);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*	Function Name: QueryGeometry
Packit a21d5c
 *	Description:   Called when my parent wants to know what size
Packit a21d5c
 *                     I would like to be.
Packit a21d5c
 *	Arguments:     w - the widget to check.
Packit a21d5c
 *                     indended - constriants imposed by the parent.
Packit a21d5c
 *                     preferred - what I would like.
Packit a21d5c
 *	Returns:       See Xt Manual.
Packit a21d5c
 */
Packit a21d5c
    
Packit a21d5c
static XtGeometryResult 
Packit a21d5c
QueryGeometry(Widget w,XtWidgetGeometry *intended, XtWidgetGeometry *preferred)
Packit a21d5c
{
Packit a21d5c
    CalcPreferredSize((XmColorSelectorWidget) w, 
Packit a21d5c
		      &(preferred->width), &(preferred->height));
Packit a21d5c
Packit a21d5c
    return(_XmHWQuery(w, intended, preferred));
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*	Function Name: ChangeManaged
Packit a21d5c
 *	Description: Called when a management change happens.
Packit a21d5c
 *	Arguments: w - the csw widget.
Packit a21d5c
 *	Returns: none
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
static void
Packit a21d5c
ChangeManaged(Widget w)
Packit a21d5c
{
Packit a21d5c
    compute_size((XmColorSelectorWidget) w);
Packit a21d5c
Packit a21d5c
    XmeNavigChangeManaged(w);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/************************************************************
Packit a21d5c
 * Type Converters.
Packit a21d5c
 ************************************************************/
Packit a21d5c
Packit a21d5c
/*      Function Name: 	CvtStringToColorMode
Packit a21d5c
 *      Description:   	Converts a string to a ColorMode
Packit a21d5c
 *      Arguments:     	dpy - the X Display.
Packit a21d5c
 *                     	args, num_args - *** NOT USED ***
Packit a21d5c
 *                     	from - contains the string to convert.
Packit a21d5c
 *                     	to - contains the converted node state.
Packit a21d5c
 *                      junk - *** NOT USED *** .
Packit a21d5c
 *      Returns:       	
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static Boolean
Packit a21d5c
CvtStringToColorMode(Display *dpy, XrmValuePtr args, Cardinal num_args, 
Packit a21d5c
		     XrmValuePtr from, XrmValuePtr to, XtPointer * junk)
Packit a21d5c
{
Packit a21d5c
    static XmColorMode	mode;
Packit a21d5c
    char		lowerName[BUFSIZ];
Packit a21d5c
Packit a21d5c
    XmCopyISOLatin1Lowered(lowerName, (char *)from->addr);
Packit a21d5c
    
Packit a21d5c
    if (streq(lowerName, "listmode"))
Packit a21d5c
	mode = XmListMode;
Packit a21d5c
    else if (streq(lowerName, "scalemode"))
Packit a21d5c
	mode = XmScaleMode;
Packit a21d5c
    else {
Packit a21d5c
        XtDisplayStringConversionWarning(dpy, from->addr, XmRXmColorMode);
Packit a21d5c
        return(False);          /* Conversion failed. */
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    to->size = sizeof(XmColorMode);
Packit a21d5c
    if ( to->addr == NULL ) {
Packit a21d5c
        to->addr = (XtPointer)&mode;
Packit a21d5c
        return(True);
Packit a21d5c
    }
Packit a21d5c
    else if ( to->size >= sizeof(XmColorMode) ) {
Packit a21d5c
	XmColorMode *state = (XmColorMode *) to->addr;
Packit a21d5c
	
Packit a21d5c
	*state = mode;
Packit a21d5c
	return(True);
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    return(False);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/************************************************************
Packit a21d5c
 *      LOCAL CODE
Packit a21d5c
 ************************************************************/
Packit a21d5c
Packit a21d5c
/*	Function Name: CalcPreferredSize
Packit a21d5c
 *	Description: Calculates the size this widget would prefer to be.
Packit a21d5c
 *	Arguments: csw - the color selector widget.
Packit a21d5c
 *  RETURNED       width, height - preferred size of the color selector.
Packit a21d5c
 *	Returns: none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
static void 
Packit a21d5c
CalcPreferredSize(XmColorSelectorWidget csw, 
Packit a21d5c
		  Dimension *width, Dimension *height)
Packit a21d5c
{
Packit a21d5c
    XtWidgetGeometry geo;
Packit a21d5c
    Widget *childP;
Packit a21d5c
	
Packit a21d5c
    *height = *width = 0;
Packit a21d5c
    ForAllChildren(csw, childP) {	
Packit a21d5c
	if (*childP == XmColorS_bb(csw))
Packit a21d5c
	    continue;
Packit a21d5c
Packit a21d5c
	(void)XtQueryGeometry(*childP, NULL, &geo;;
Packit a21d5c
	
Packit a21d5c
	ASSIGN_MAX(*width, (geo.width + (2 * geo.border_width)));
Packit a21d5c
	
Packit a21d5c
	geo.height += 2 * geo.border_width;
Packit a21d5c
	if ( *childP == XtParent(XmColorS_color_window(csw)) )
Packit a21d5c
	    continue;
Packit a21d5c
	else if ( *childP == XmColorS_scrolled_list(csw) )	
Packit a21d5c
	    *height += (int)(4 * geo.height)/3;
Packit a21d5c
	else
Packit a21d5c
	    *height += geo.height;
Packit a21d5c
Packit a21d5c
	*height += XmColorS_margin_height(csw);
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    *width += 2 * XmColorS_margin_width(csw);
Packit a21d5c
    *height += 2 * XmColorS_margin_height(csw);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	color_name_changed
Packit a21d5c
 *      Description:   	Change in the color name string.
Packit a21d5c
 *      Arguments:     	csw - the color selector widget.
Packit a21d5c
 *                     	name - the color name.
Packit a21d5c
 *      Returns:       	True if successful
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static Boolean
Packit a21d5c
color_name_changed(XmColorSelectorWidget csw, char *name)
Packit a21d5c
{
Packit a21d5c
    String old_val = XmColorS_color_name(csw);
Packit a21d5c
Packit a21d5c
    if ( name == NULL ) {
Packit a21d5c
	XmColorS_color_name(csw) = NULL;
Packit a21d5c
	XtFree((XtPointer) old_val);
Packit a21d5c
	return(True);
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    XmColorS_color_name(csw) = XtNewString(name);
Packit a21d5c
Packit a21d5c
    if (!UpdateColorWindow(csw, True)) {
Packit a21d5c
	XtFree((XtPointer) XmColorS_color_name(csw));
Packit a21d5c
	XmColorS_color_name(csw) = old_val;
Packit a21d5c
	return(False);
Packit a21d5c
    }
Packit a21d5c
    
Packit a21d5c
    SetSliders(csw);
Packit a21d5c
    SelectColor(csw);
Packit a21d5c
    XtFree((XtPointer) old_val);
Packit a21d5c
    return(True);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*	Function Name: SetSliders
Packit a21d5c
 *	Description: Sets the values in the color sliders.
Packit a21d5c
 *	Arguments: csw - the color selector widget.
Packit a21d5c
 *	Returns: none
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
static void
Packit a21d5c
SetSliders(XmColorSelectorWidget csw)
Packit a21d5c
{
Packit a21d5c
    static Arg args[] = {
Packit a21d5c
	{ XmNvalue, (XtArgVal) NULL },
Packit a21d5c
    };
Packit a21d5c
Packit a21d5c
    args[0].value = (XtArgVal) XmColorS_slider_red(csw);
Packit a21d5c
    XtSetValues(XmColorS_sliders(csw)[0], args, XtNumber(args));
Packit a21d5c
Packit a21d5c
    args[0].value = (XtArgVal) XmColorS_slider_green(csw);
Packit a21d5c
    XtSetValues(XmColorS_sliders(csw)[1], args, XtNumber(args));
Packit a21d5c
Packit a21d5c
    args[0].value = (XtArgVal) XmColorS_slider_blue(csw);
Packit a21d5c
    XtSetValues(XmColorS_sliders(csw)[2], args, XtNumber(args));
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*	Function Name: SelectColor
Packit a21d5c
 *	Description: Selects the color in the list that corrosponds
Packit a21d5c
 *                   to the current values of the RGB sliders.
Packit a21d5c
 *	Arguments: csw - the color selector widget.
Packit a21d5c
 *	Returns: none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
static void 
Packit a21d5c
SelectColor(XmColorSelectorWidget csw)
Packit a21d5c
{
Packit a21d5c
    int color_num;
Packit a21d5c
Packit a21d5c
    if (FindColor(csw, &color_num)) {
Packit a21d5c
	XmListSelectPos(XmColorS_list(csw), color_num + 1, False);
Packit a21d5c
	XmListSetBottomPos(XmColorS_list(csw), color_num + 1);
Packit a21d5c
    }
Packit a21d5c
    else
Packit a21d5c
	XmListDeselectAllItems(XmColorS_list(csw));
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
Packit a21d5c
/*	Function Name:	EndsInDigits
Packit a21d5c
 *	Description:	Determines if a string ends in a digit
Packit a21d5c
 *	Returns:	True if it does
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
static int
Packit a21d5c
EndsInDigits(char *str)
Packit a21d5c
{
Packit a21d5c
    register char *c = str;
Packit a21d5c
    while(*c != '\0') c++;	/* advance to end of string marker */
Packit a21d5c
    c--;			/* back to the last character */
Packit a21d5c
    if(c >= str && isascii(*c) && isdigit(*c)) 
Packit a21d5c
	return True;
Packit a21d5c
    
Packit a21d5c
    return False;
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*	Function Name: FindColor
Packit a21d5c
 *	Description: Finds the index into the colors array associated with
Packit a21d5c
 *                   the current slider values.  Attempts to find the slot
Packit a21d5c
 *		     with a the best matching name.
Packit a21d5c
 *	Arguments: csw - The color selector widget.
Packit a21d5c
 * RETURNED        color_num - The color index that was found. 
Packit a21d5c
 *	Returns: True if color was found, false otherwise.
Packit a21d5c
 *
Packit a21d5c
 * NOTE: if False is returned then color_num has an undefined value.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
static Boolean
Packit a21d5c
FindColor(XmColorSelectorWidget csw, int *color_num)
Packit a21d5c
{
Packit a21d5c
    register ColorInfo *ptr;
Packit a21d5c
    register int i, red, green, blue;
Packit a21d5c
    
Packit a21d5c
    /*
Packit a21d5c
     * Obtain the color settings from the ColorSelector
Packit a21d5c
     * data structure
Packit a21d5c
     */
Packit a21d5c
    red = XmColorS_slider_red(csw);
Packit a21d5c
    green = XmColorS_slider_green(csw);
Packit a21d5c
    blue = XmColorS_slider_blue(csw);
Packit a21d5c
    ptr = XmColorS_colors(csw);
Packit a21d5c
    
Packit a21d5c
    /*
Packit a21d5c
     * Flag for finding color value
Packit a21d5c
     */
Packit a21d5c
    *color_num = -1;
Packit a21d5c
    
Packit a21d5c
    /*
Packit a21d5c
     * Find color within the exisiting colormap assigned to
Packit a21d5c
     * ColorSelector
Packit a21d5c
     */
Packit a21d5c
    for (i = 0; i < XmColorS_num_colors(csw); i++, ptr++) 
Packit a21d5c
    {
Packit a21d5c
	if ((ptr->red == red) && (ptr->green == green) && (ptr->blue == blue))
Packit a21d5c
	{
Packit a21d5c
	    if( *color_num < 0 ) 
Packit a21d5c
		*color_num = i;
Packit a21d5c
	    
Packit a21d5c
	    /* Only change the selected color if it is better in some way */
Packit a21d5c
	    if(XmColorS_color_name(csw)) {
Packit a21d5c
		if(XmColorS_color_name(csw)[0] == '#')
Packit a21d5c
		    *color_num = i;
Packit a21d5c
Packit a21d5c
		if(streq(XmColorS_color_name(csw), ptr->name) ||
Packit a21d5c
		   streq(XmColorS_color_name(csw), ptr->no_space_lower_name)) 
Packit a21d5c
		{	
Packit a21d5c
		    *color_num = i;
Packit a21d5c
		    return(True);
Packit a21d5c
		}	
Packit a21d5c
	    }
Packit a21d5c
	    if(! EndsInDigits(ptr->name)) {
Packit a21d5c
	        *color_num = i;
Packit a21d5c
		return(True);
Packit a21d5c
	    }
Packit a21d5c
	}
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    return(*color_num >= 0);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	slider_changed
Packit a21d5c
 *      Description:   	One of the sliders was pressed
Packit a21d5c
 *      Arguments:     	w - the slider widget.
Packit a21d5c
 *                     	csw - the color selector.
Packit a21d5c
 *                     	scale - the scale widget callback struct.
Packit a21d5c
 *      Returns:       	none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
slider_changed(Widget w, XtPointer csw_ptr, XtPointer scale_ptr)
Packit a21d5c
{
Packit a21d5c
    XmColorSelectorWidget csw = (XmColorSelectorWidget) csw_ptr;
Packit a21d5c
    XmScaleCallbackStruct *scale = (XmScaleCallbackStruct *) scale_ptr;
Packit a21d5c
Packit a21d5c
    if (scale_ptr != NULL) {	/* Set a new value. */
Packit a21d5c
	if (w == XmColorS_sliders(csw)[0])
Packit a21d5c
	    XmColorS_slider_red(csw) = scale->value;
Packit a21d5c
	else if(w == XmColorS_sliders(csw)[1])
Packit a21d5c
	    XmColorS_slider_green(csw) = scale->value;
Packit a21d5c
	else if(w == XmColorS_sliders(csw)[2])
Packit a21d5c
	    XmColorS_slider_blue(csw) = scale->value;
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    UpdateColorWindow(csw, False);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*	Function Name: UpdateColorWindow
Packit a21d5c
 *	Description: Updates the color window display.
Packit a21d5c
 *	Arguments: csw - the color selector widget.
Packit a21d5c
 *                 use_name - if TRUE then use the color name to update.
Packit a21d5c
 *                            if FALSE then use the color sliders to update.
Packit a21d5c
 *	Returns: True if successful
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
static Boolean
Packit a21d5c
UpdateColorWindow(XmColorSelectorWidget csw, Boolean use_name)
Packit a21d5c
{
Packit a21d5c
    int index;
Packit a21d5c
    XColor color;
Packit a21d5c
    Pixel foreground;
Packit a21d5c
    char buf[XmColorSelector_COLOR_NAME_SIZE], new_label[BUFSIZ];
Packit a21d5c
Packit a21d5c
    if (!use_name) /* Update color names */
Packit a21d5c
    {	
Packit a21d5c
	char	*freeMe;
Packit a21d5c
	
Packit a21d5c
	freeMe = XmColorS_color_name(csw);
Packit a21d5c
	sprintf(buf, "#%02x%02x%02x", XmColorS_slider_red(csw), 
Packit a21d5c
		XmColorS_slider_green(csw), XmColorS_slider_blue(csw));
Packit a21d5c
Packit a21d5c
	if (FindColor(csw, &index)) 
Packit a21d5c
	{
Packit a21d5c
	    XmColorS_color_name(csw) = XtNewString(XmColorS_colors(csw)[index].name);
Packit a21d5c
	    sprintf(new_label, "%s (%s)", XmColorS_color_name(csw), buf);
Packit a21d5c
	}	
Packit a21d5c
	else 	
Packit a21d5c
	{	
Packit a21d5c
	    XmColorS_color_name(csw) = XtNewString(buf);
Packit a21d5c
	    sprintf(new_label, "%s", buf);
Packit a21d5c
	}
Packit a21d5c
Packit a21d5c
	XtFree((XtPointer)freeMe );
Packit a21d5c
	color.red = XmColorS_slider_red(csw) * 256;
Packit a21d5c
	color.green = XmColorS_slider_green(csw) * 256;
Packit a21d5c
	color.blue = XmColorS_slider_blue(csw) * 256;
Packit a21d5c
    }
Packit a21d5c
    else /* Update color slider */
Packit a21d5c
    {
Packit a21d5c
	if(XParseColor(XtDisplay(csw), csw->core.colormap,
Packit a21d5c
		       XmColorS_color_name(csw), &color) == 0)
Packit a21d5c
	{	
Packit a21d5c
	    return(False);	
Packit a21d5c
	}
Packit a21d5c
Packit a21d5c
	XmColorS_slider_red(csw) = color.red / 256;
Packit a21d5c
	XmColorS_slider_green(csw) = color.green / 256;
Packit a21d5c
	XmColorS_slider_blue(csw) = color.blue / 256;
Packit a21d5c
Packit a21d5c
	/*
Packit a21d5c
	 * Attempt to replace a name that begins with a # with a real color
Packit a21d5c
	 * name.
Packit a21d5c
	 */
Packit a21d5c
Packit a21d5c
	if ((XmColorS_color_name(csw)[0] == '#') && FindColor(csw, &index)) 
Packit a21d5c
	{
Packit a21d5c
	    XtFree(XmColorS_color_name(csw));
Packit a21d5c
	    XmColorS_color_name(csw) = XtNewString(XmColorS_colors(csw)[index].name);
Packit a21d5c
	}
Packit a21d5c
	sprintf(buf, "#%02x%02x%02x", color.red/256, color.green/256, color.blue/256);
Packit a21d5c
	sprintf(new_label, "%s (%s)", XmColorS_color_name(csw), buf);
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    {
Packit a21d5c
	long test = (long) color.red;
Packit a21d5c
	test += (long) color.green;
Packit a21d5c
	test += (long) color.blue;
Packit a21d5c
Packit a21d5c
	if (test/3 > 0x7000)
Packit a21d5c
	{
Packit a21d5c
	    foreground = BlackPixelOfScreen(XtScreen((Widget) csw));
Packit a21d5c
	}
Packit a21d5c
	else
Packit a21d5c
	{
Packit a21d5c
	    foreground = WhitePixelOfScreen(XtScreen((Widget) csw));
Packit a21d5c
	}
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    /*
Packit a21d5c
     * Check on the default visual
Packit a21d5c
     */
Packit a21d5c
    if (DefaultVisualDisplay(csw, foreground, color, (char *)new_label)) 
Packit a21d5c
    {
Packit a21d5c
	return True;
Packit a21d5c
    } else 
Packit a21d5c
    {
Packit a21d5c
	return False;
Packit a21d5c
    }    
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
Packit a21d5c
/*      Function Name: 	list_selected
Packit a21d5c
 *      Description:   	One of the list widgets was selected.
Packit a21d5c
 *      Arguments:     	w - the slider widget.
Packit a21d5c
 *                     	csw - the color selector.
Packit a21d5c
 *                     	list - the list widget callback struct.
Packit a21d5c
 *      Returns:       	none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
list_selected(Widget w, XtPointer csw_ptr, XtPointer list_ptr)
Packit a21d5c
{
Packit a21d5c
  XmColorSelectorWidget csw = (XmColorSelectorWidget) csw_ptr;
Packit a21d5c
  XmListCallbackStruct *list = (XmListCallbackStruct *) list_ptr;
Packit a21d5c
Packit a21d5c
  XtFree(XmColorS_color_name(csw));
Packit a21d5c
Packit a21d5c
  XmColorS_color_name(csw) =
Packit a21d5c
    XmStringUnparse(list->item,
Packit a21d5c
        NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_ALL);
Packit a21d5c
  
Packit a21d5c
/* deprecated
Packit a21d5c
  XmStringGetLtoR(list->item, XmFONTLIST_DEFAULT_TAG, 
Packit a21d5c
		  &(XmColorS_color_name(csw))); 
Packit a21d5c
*/
Packit a21d5c
Packit a21d5c
  UpdateColorWindow(csw, True);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	change_mode
Packit a21d5c
 *      Description:   	One of the change mode buttons was pressed.
Packit a21d5c
 *      Arguments:     	w - the slider widget.
Packit a21d5c
 *                     	csw_ptr - the color selector.
Packit a21d5c
 *                     	tp - the toggle widget callback struct.
Packit a21d5c
 *      Returns:       	none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
change_mode(Widget w, XtPointer csw_ptr, XtPointer tp)
Packit a21d5c
{
Packit a21d5c
  XmColorSelectorWidget csw = (XmColorSelectorWidget) csw_ptr;
Packit a21d5c
  XmToggleButtonCallbackStruct *toggle = (XmToggleButtonCallbackStruct *) tp;
Packit a21d5c
  
Packit a21d5c
  /*
Packit a21d5c
   * Ignore unsets.
Packit a21d5c
   */
Packit a21d5c
  
Packit a21d5c
  if (toggle->reason == XmCR_VALUE_CHANGED && toggle->set) {
Packit a21d5c
    /*
Packit a21d5c
     * Change the mode if it is different.
Packit a21d5c
     */
Packit a21d5c
    
Packit a21d5c
    if ((w == XmColorS_chose_mode(csw)[XmListMode]) && 
Packit a21d5c
	(XmColorS_color_mode(csw) != XmListMode))
Packit a21d5c
      {
Packit a21d5c
	new_mode(csw, XmListMode);
Packit a21d5c
      }
Packit a21d5c
    else if ((w == XmColorS_chose_mode(csw)[XmScaleMode]) && 
Packit a21d5c
	     (XmColorS_color_mode(csw) != XmScaleMode))
Packit a21d5c
      {
Packit a21d5c
	new_mode(csw, XmScaleMode);
Packit a21d5c
      }
Packit a21d5c
  }
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	new_mode
Packit a21d5c
 *      Description:   	mode has changed
Packit a21d5c
 *      Arguments: 	csw - the color selector.
Packit a21d5c
 *                      mode - the new mode.
Packit a21d5c
 *      Returns:       	none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
new_mode(XmColorSelectorWidget csw, XmColorMode mode)
Packit a21d5c
{
Packit a21d5c
  XmColorS_color_mode(csw) = mode;
Packit a21d5c
  
Packit a21d5c
  if (mode == XmScaleMode) {
Packit a21d5c
    SetSliders(csw);
Packit a21d5c
    
Packit a21d5c
    XtUnmanageChild(XmColorS_scrolled_list(csw));
Packit a21d5c
    XtManageChild(XmColorS_bb(csw));
Packit a21d5c
  }
Packit a21d5c
  else {
Packit a21d5c
      SelectColor(csw);	/* Select the current color in the list. */
Packit a21d5c
Packit a21d5c
      XtUnmanageChild(XmColorS_bb(csw));
Packit a21d5c
      XtManageChild(XmColorS_scrolled_list(csw));
Packit a21d5c
  }
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	compute_size
Packit a21d5c
 *      Description:   	Do all the size and position computing.
Packit a21d5c
 *      Arguments: 	csw - the color selector.
Packit a21d5c
 *      Returns:       	none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
compute_size(XmColorSelectorWidget csw)
Packit a21d5c
{
Packit a21d5c
    XtWidgetGeometry	input, radio_geom, color_geom;
Packit a21d5c
    Dimension		width, height;
Packit a21d5c
    Position		x,y;			/* positions		*/
Packit a21d5c
Packit a21d5c
    /*
Packit a21d5c
     * First size and place the button box and scrolled list.
Packit a21d5c
     */
Packit a21d5c
    
Packit a21d5c
    y = XmColorS_margin_height(csw);
Packit a21d5c
    x = XmColorS_margin_width(csw);
Packit a21d5c
    width = csw->core.width - (2 * XmColorS_margin_width(csw));
Packit a21d5c
Packit a21d5c
    input.width = width;
Packit a21d5c
    input.request_mode = CWWidth;
Packit a21d5c
Packit a21d5c
    (void) XtQueryGeometry(XmColorS_chose_radio(csw), NULL, &radio_geom);
Packit a21d5c
    (void) XtQueryGeometry(XmColorS_color_window(csw), &input, &color_geom);
Packit a21d5c
	
Packit a21d5c
    height = (csw->core.height - 4 * XmColorS_margin_height(csw) - 
Packit a21d5c
	      (radio_geom.height + 2 * radio_geom.border_width));
Packit a21d5c
Packit a21d5c
    /*
Packit a21d5c
     * Leave space for the margins and make the color area 1/3 the height
Packit a21d5c
     * of the scrolled list and button box.
Packit a21d5c
     */
Packit a21d5c
Packit a21d5c
    color_geom.height = height / 4;
Packit a21d5c
    height -= color_geom.height;
Packit a21d5c
    color_geom.height -= 2 * color_geom.border_width;
Packit a21d5c
Packit a21d5c
    _XmConfigureWidget(XmColorS_bb(csw), x, y, width, height, 0);
Packit a21d5c
    _XmConfigureWidget(XmColorS_scrolled_list(csw), x, y, width, height, 0);
Packit a21d5c
    
Packit a21d5c
    y += height + XmColorS_margin_height(csw);
Packit a21d5c
    
Packit a21d5c
    /*
Packit a21d5c
     * Place the radio box.
Packit a21d5c
     */
Packit a21d5c
    
Packit a21d5c
    if ( radio_geom.width < csw->core.width )
Packit a21d5c
	x = (int)(csw->core.width - radio_geom.width) / 2;
Packit a21d5c
    else
Packit a21d5c
	x = XmColorS_margin_width(csw);
Packit a21d5c
Packit a21d5c
    _XmConfigureWidget(XmColorS_chose_radio(csw), x, y, radio_geom.width, 
Packit a21d5c
		       radio_geom.height, radio_geom.border_width);
Packit a21d5c
Packit a21d5c
    y += radio_geom.height + XmColorS_margin_height(csw);
Packit a21d5c
    
Packit a21d5c
    /*
Packit a21d5c
     * Lastly, place the color window
Packit a21d5c
     */
Packit a21d5c
Packit a21d5c
    _XmConfigureWidget(XtParent(XmColorS_color_window(csw)), XmColorS_margin_width(csw), y,
Packit a21d5c
		       width, color_geom.height, color_geom.border_width);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	read_rgb_file
Packit a21d5c
 *      Description:   	Read in all the color names and add them to the list.
Packit a21d5c
 *      Arguments: 	csw - the color selector.
Packit a21d5c
 *                      cargs, cnum_args - a filtered arg list that was
Packit a21d5c
 *                                       passed to create the color selector.
Packit a21d5c
 *      Returns:       	none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
read_rgb_file(XmColorSelectorWidget csw, ArgList cargs, Cardinal cnum_args, Boolean initial)
Packit a21d5c
{
Packit a21d5c
    FILE *file;
Packit a21d5c
    char buf[BUFSIZ];
Packit a21d5c
    char string_buffer[BUFSIZ];
Packit a21d5c
    char *color_name;
Packit a21d5c
    ColorInfo * color_info = NULL;
Packit a21d5c
    register int i;
Packit a21d5c
    Arg	*margs, args[20];
Packit a21d5c
 
Packit a21d5c
    /*
Packit a21d5c
     * Create new list if needed, or delete any old list items.
Packit a21d5c
     */ 
Packit a21d5c
    if (XmColorS_list(csw) == NULL) 
Packit a21d5c
    {
Packit a21d5c
	i = 0;
Packit a21d5c
	XtSetArg(args[i], XmNlistSizePolicy, XmCONSTANT); i++;
Packit a21d5c
	XtSetArg(args[i], XmNvisibleItemCount, 15); i++;
Packit a21d5c
	margs = XtMergeArgLists(args, i, cargs, cnum_args);
Packit a21d5c
	XmColorS_list(csw) = XmCreateScrolledList((Widget) csw, "list", 
Packit a21d5c
					    margs, i + cnum_args);
Packit a21d5c
Packit a21d5c
	XtManageChild(XmColorS_list(csw));
Packit a21d5c
	XmColorS_scrolled_list(csw) = XtParent(XmColorS_list(csw));
Packit a21d5c
Packit a21d5c
	if (XmColorS_color_mode(csw) != XmListMode)
Packit a21d5c
	{
Packit a21d5c
	    /* Hide the scrolled list until it need be visible... */
Packit a21d5c
	    XtUnmanageChild(XmColorS_scrolled_list(csw));
Packit a21d5c
	}
Packit a21d5c
Packit a21d5c
	XtFree((XtPointer) margs);
Packit a21d5c
    }
Packit a21d5c
    else
Packit a21d5c
    {
Packit a21d5c
	XmListDeleteAllItems(XmColorS_list(csw));
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    /* 
Packit a21d5c
    ** Because of the internal functioning of the XmList, it is better to
Packit a21d5c
    ** zero out the selected item list rather than to let the item currently
Packit a21d5c
    ** selected be re-selected by the XmList when the new list of colors is
Packit a21d5c
    ** assigned. As is, the XmList iteratively searches through the list of
Packit a21d5c
    ** selected items for each item added. Resetting the selectedItem list to
Packit a21d5c
    ** NULL/0 ensures that we don't have O(n*m) XmStringCompare operations
Packit a21d5c
    ** done when setting the new list below.
Packit a21d5c
    ** Also, resetting the list saves us in the case in which the rgb_file
Packit a21d5c
    ** is invalid or doesn't contain this selected string.
Packit a21d5c
    */
Packit a21d5c
    XtVaSetValues(XmColorS_list(csw),
Packit a21d5c
	XmNselectedItems, NULL, XmNselectedItemCount, 0, NULL);
Packit a21d5c
Packit a21d5c
    /*
Packit a21d5c
     * Read in all the colornames.
Packit a21d5c
     */
Packit a21d5c
    if ((file = fopen(XmColorS_rgb_file(csw), "r")) != NULL) {
Packit a21d5c
	register int alloc, count, len;
Packit a21d5c
	register char *name;
Packit a21d5c
Packit a21d5c
	alloc = count = 0;
Packit a21d5c
Packit a21d5c
    	while(fgets(buf, BUFSIZ, file)) {
Packit a21d5c
	    /*
Packit a21d5c
	     * Skip any comment lines in the file
Packit a21d5c
	     */
Packit a21d5c
	    if ( buf[0] == '!' ) continue;
Packit a21d5c
	    
Packit a21d5c
	    if (count >= alloc) {
Packit a21d5c
		if (0 == alloc)
Packit a21d5c
			alloc = 755;	/* rather than stat the file and determine a good value to use, just use enough for X11R5, X11R6, and OpenWindows3 */
Packit a21d5c
		else
Packit a21d5c
			{
Packit a21d5c
#define ALLOC_INC 	20
Packit a21d5c
			alloc += ALLOC_INC;
Packit a21d5c
			}
Packit a21d5c
		color_info = (ColorInfo *)XtRealloc((XtPointer) color_info,
Packit a21d5c
						    sizeof(ColorInfo) * alloc);
Packit a21d5c
	    }
Packit a21d5c
Packit a21d5c
	    sscanf(buf, "%hu %hu %hu", &(color_info[count].red),
Packit a21d5c
		   &(color_info[count].green), &(color_info[count].blue));
Packit a21d5c
Packit a21d5c
	    if ((color_name = find_name(buf)) == NULL)
Packit a21d5c
		continue;
Packit a21d5c
Packit a21d5c
	    len = strlen(color_name);
Packit a21d5c
	    if (len > XmColorSelector_COLOR_NAME_SIZE) {
Packit a21d5c
		color_name[XmColorSelector_COLOR_NAME_SIZE - 1] = '\0';
Packit a21d5c
		snprintf(string_buffer, BUFSIZ,
Packit a21d5c
			 XmNcolorNameTooLongMsg, buf, color_name);
Packit a21d5c
		XmeWarning((Widget)csw, string_buffer);
Packit a21d5c
	    }
Packit a21d5c
Packit a21d5c
	    name = color_info[count].no_space_lower_name;
Packit a21d5c
	    for (i = 0; i < len; i++) {
Packit a21d5c
		register char c = color_name[i];
Packit a21d5c
Packit a21d5c
		/*
Packit a21d5c
		 * Copy in all characters that are ascii and non-spaces.
Packit a21d5c
		 */
Packit a21d5c
		if (!isascii(c))
Packit a21d5c
		    continue;
Packit a21d5c
		if (!isspace(c))
Packit a21d5c
		    *name++ = tolower(c);
Packit a21d5c
	    }
Packit a21d5c
	    *name = '\0';
Packit a21d5c
Packit a21d5c
	    name = color_info[count].name;
Packit a21d5c
	    color_name[0] = toupper(color_name[0]);
Packit a21d5c
	    for (i = 0; i < len; i++) {
Packit a21d5c
		register char c = color_name[i];
Packit a21d5c
Packit a21d5c
		/*
Packit a21d5c
		 * Capitalize all characters after a space.
Packit a21d5c
		 */
Packit a21d5c
Packit a21d5c
		if (!isascii(c))
Packit a21d5c
		    continue;
Packit a21d5c
		if (isspace(c) && ((i + 1) < len)) {
Packit a21d5c
		    color_name[i + 1] = toupper(color_name[i + 1]);
Packit a21d5c
		}
Packit a21d5c
Packit a21d5c
		*name++ = c;
Packit a21d5c
	    }
Packit a21d5c
	    *name = '\0';
Packit a21d5c
Packit a21d5c
	    count++;
Packit a21d5c
	}
Packit a21d5c
	fclose(file);
Packit a21d5c
	    
Packit a21d5c
	qsort(color_info, count, sizeof(ColorInfo), CmpColors);
Packit a21d5c
Packit a21d5c
	/*
Packit a21d5c
	 * Remove duplicates.
Packit a21d5c
	 */
Packit a21d5c
	i = 0;
Packit a21d5c
	while (i < (count - 1)) {
Packit a21d5c
	    if (streq(color_info[i].no_space_lower_name,
Packit a21d5c
		      color_info[i + 1].no_space_lower_name))
Packit a21d5c
	    {
Packit a21d5c
		register int j;
Packit a21d5c
		register ColorInfo *ptr;
Packit a21d5c
Packit a21d5c
		ptr = color_info + i;
Packit a21d5c
		j = i;
Packit a21d5c
Packit a21d5c
		/*
Packit a21d5c
		 * This makes sure that the one with the space is
Packit a21d5c
		 * left in place in favor of the one without.
Packit a21d5c
		 */
Packit a21d5c
		if (strchr(ptr->name, ' ') != NULL) {
Packit a21d5c
		    j++;
Packit a21d5c
		    ptr++;
Packit a21d5c
		}
Packit a21d5c
Packit a21d5c
		while ( ++j < count) {
Packit a21d5c
		    ptr[0] = ptr[1];
Packit a21d5c
		    ptr++;
Packit a21d5c
		}
Packit a21d5c
Packit a21d5c
		count--;	/*Something has been removed, decrement count*/
Packit a21d5c
	    }
Packit a21d5c
	    else
Packit a21d5c
		i++;
Packit a21d5c
	}
Packit a21d5c
Packit a21d5c
	{
Packit a21d5c
		XmString *strs = (XmString*)XtMalloc(sizeof(XmString)*count);
Packit a21d5c
		for (i = 0; i < count; i++) 
Packit a21d5c
			strs[i] = XmStringCreateLocalized(color_info[i].name);
Packit a21d5c
		XtVaSetValues(XmColorS_list(csw),
Packit a21d5c
			XmNitems, strs,
Packit a21d5c
			XmNitemCount, count, 
Packit a21d5c
			NULL);
Packit a21d5c
		for (i = 0; i < count; i++) 
Packit a21d5c
			XmStringFree(strs[i]);
Packit a21d5c
	        XtFree((char*)strs);
Packit a21d5c
	}
Packit a21d5c
Packit a21d5c
	XtFree((char*)XmColorS_colors(csw));
Packit a21d5c
	XmColorS_colors(csw) = color_info;
Packit a21d5c
	XmColorS_num_colors(csw) = count;
Packit a21d5c
Packit a21d5c
	/* It would be better if we had cached the current index number so
Packit a21d5c
	** we could just reset the list to the string corresponding to that 
Packit a21d5c
	** value, but instead wind up going through FindColor to reestablish
Packit a21d5c
	** the selected string
Packit a21d5c
	*/
Packit a21d5c
	if (!initial)
Packit a21d5c
		SelectColor(csw);
Packit a21d5c
    }
Packit a21d5c
    else {
Packit a21d5c
	XmString 	str;
Packit a21d5c
Packit a21d5c
	XmListAddItem(XmColorS_list(csw), XmColorS_strings(csw).file_read_error, 0);
Packit a21d5c
Packit a21d5c
	str = XmStringCreateLocalized(XmColorS_rgb_file(csw));
Packit a21d5c
	XmListAddItem(XmColorS_list(csw), str, 0);
Packit a21d5c
	XmStringFree(str);
Packit a21d5c
Packit a21d5c
	XtFree((char*)XmColorS_colors(csw));
Packit a21d5c
	XmColorS_colors(csw) = NULL;
Packit a21d5c
	XmColorS_num_colors(csw) = 0;
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    XtAddCallback(XmColorS_list(csw), XmNsingleSelectionCallback,
Packit a21d5c
		  list_selected, csw);	
Packit a21d5c
    XtAddCallback(XmColorS_list(csw), XmNbrowseSelectionCallback,
Packit a21d5c
		  list_selected, csw);	
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*	Function Name: CmpColors
Packit a21d5c
 *	Description: Compares two colors.
Packit a21d5c
 *	Arguments: ptr_1, ptr_2 - two colors too compare.
Packit a21d5c
 *	Returns: none
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
static int
Packit a21d5c
CmpColors(const void * ptr_1, const void * ptr_2) 
Packit a21d5c
{
Packit a21d5c
    ColorInfo *color1, *color2;
Packit a21d5c
Packit a21d5c
    color1 = (ColorInfo *) ptr_1;
Packit a21d5c
    color2 = (ColorInfo *) ptr_2;
Packit a21d5c
Packit a21d5c
    return(strcmp(color1->no_space_lower_name, color2->no_space_lower_name));
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	find_name
Packit a21d5c
 *      Description:   	Go through the buffer for looking for the name 
Packit a21d5c
 *			of a color string.  
Packit a21d5c
 *      Arguments: 	buffer - list of color names.
Packit a21d5c
 *      Returns:       	pointer in the buffer where the string begins.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
static char*
Packit a21d5c
find_name(char *buffer)
Packit a21d5c
{
Packit a21d5c
    register char *curr, *temp;	/* current pointer */
Packit a21d5c
Packit a21d5c
    for (curr = buffer; curr != NULL && *curr != '\0'; curr++) {
Packit a21d5c
	/*
Packit a21d5c
	 * Look for first non number, non space or tab.
Packit a21d5c
	 */
Packit a21d5c
    
Packit a21d5c
	if (isascii(*curr) && (isdigit(*curr) || isspace(*curr)))
Packit a21d5c
	    continue;
Packit a21d5c
Packit a21d5c
	temp = (char *) strchr(curr, '\n');
Packit a21d5c
	*temp = '\0';
Packit a21d5c
Packit a21d5c
	return(curr);
Packit a21d5c
    }
Packit a21d5c
    return(NULL);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	CreateColorSliders
Packit a21d5c
 *      Description:   	creates a button with three sliders (Red, Green, Blue).
Packit a21d5c
 *      Arguments: 	csw - the color selector widget.
Packit a21d5c
 *                      cargs, cnum_args - a filtered arg list that was
Packit a21d5c
 *                                       passed to create the color selector.
Packit a21d5c
 *      Returns:       	none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
CreateColorSliders(XmColorSelectorWidget csw, 
Packit a21d5c
		   ArgList cargs, Cardinal cnum_args)
Packit a21d5c
{
Packit a21d5c
    register int i;
Packit a21d5c
    Cardinal	num_args, title;
Packit a21d5c
    Arg		*margs, args[10];
Packit a21d5c
    
Packit a21d5c
    num_args = 0;
Packit a21d5c
    XtSetArg(args[num_args], XmNborderWidth, 0); num_args++;
Packit a21d5c
    XtSetArg(args[num_args], XmNorientation, XmVERTICAL); num_args++;
Packit a21d5c
    XtSetArg(args[num_args], XmNfillOption, XmFillMinor); num_args++;
Packit a21d5c
    margs = XtMergeArgLists(args, num_args, cargs, cnum_args);
Packit a21d5c
    XmColorS_bb(csw) = XtCreateManagedWidget("buttonBox", xmButtonBoxWidgetClass, 
Packit a21d5c
				       (Widget) csw,
Packit a21d5c
				       margs, cnum_args + num_args);
Packit a21d5c
    XtFree((XtPointer) margs);
Packit a21d5c
Packit a21d5c
    num_args = 0;
Packit a21d5c
    XtSetArg(args[num_args], XmNmaximum, 255); num_args++;
Packit a21d5c
    XtSetArg(args[num_args], XmNorientation, XmHORIZONTAL); num_args++;
Packit a21d5c
    XtSetArg(args[num_args], XmNshowValue, True); num_args++;
Packit a21d5c
    XtSetArg(args[num_args], XmNprocessingDirection, XmMAX_ON_RIGHT);
Packit a21d5c
    num_args++;
Packit a21d5c
    XtSetArg(args[num_args], XmNtitleString, NULL); title = num_args++;
Packit a21d5c
Packit a21d5c
    margs = XtMergeArgLists(args, num_args, cargs, cnum_args);
Packit a21d5c
Packit a21d5c
    for( i = 0; i < 3; i++ ) {
Packit a21d5c
	margs[title].value = (XtArgVal) XmColorS_strings(csw).slider_labels[i];
Packit a21d5c
	XmColorS_sliders(csw)[i] = XtCreateManagedWidget("scale", 
Packit a21d5c
						   xmScaleWidgetClass,
Packit a21d5c
						   XmColorS_bb(csw), margs,
Packit a21d5c
						   num_args + cnum_args);
Packit a21d5c
    
Packit a21d5c
	XtAddCallback(XmColorS_sliders(csw)[i], XmNdragCallback,
Packit a21d5c
		      slider_changed, csw);
Packit a21d5c
	XtAddCallback(XmColorS_sliders(csw)[i], XmNvalueChangedCallback, 
Packit a21d5c
		      slider_changed, csw);
Packit a21d5c
    }
Packit a21d5c
    XtFree((XtPointer) margs);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	CreateSelectorRadio
Packit a21d5c
 *      Description:   	creates a radio box with two toggles for selector
Packit a21d5c
 *			type.
Packit a21d5c
 *      Arguments: 	csw - the color selector widget.
Packit a21d5c
 *                      cargs, cnum_args - a filtered arg list that was
Packit a21d5c
 *                                       passed to create the color selector.
Packit a21d5c
 *      Returns:       	none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
CreateSelectorRadio(XmColorSelectorWidget csw, 
Packit a21d5c
		    ArgList cargs, Cardinal cnum_args)
Packit a21d5c
{
Packit a21d5c
    Widget w;
Packit a21d5c
    Cardinal	i, label;
Packit a21d5c
    Arg		*margs, args[5];
Packit a21d5c
    int count;
Packit a21d5c
    static String names[] = { "colorListToggle", "colorSlidersToggle" };
Packit a21d5c
    
Packit a21d5c
    i = 0;
Packit a21d5c
    XtSetArg(args[i], XmNradioBehavior, True); i++;
Packit a21d5c
    XtSetArg(args[i], XmNpacking, XmPACK_COLUMN); i++;
Packit a21d5c
    XtSetArg(args[i], XmNnumColumns, 2); i++;
Packit a21d5c
    margs = XtMergeArgLists(args, i, cargs, cnum_args);
Packit a21d5c
    w = XtCreateManagedWidget("radioBox", xmRowColumnWidgetClass,
Packit a21d5c
			      (Widget) csw, margs, i + cnum_args);
Packit a21d5c
    XmColorS_chose_radio(csw) = w;
Packit a21d5c
    XtFree((XtPointer) margs);    
Packit a21d5c
Packit a21d5c
    i = 0;
Packit a21d5c
    XtSetArg(args[i], XmNlabelString, NULL); label = i++;
Packit a21d5c
    margs = XtMergeArgLists(args, i, cargs, cnum_args);
Packit a21d5c
Packit a21d5c
    for (count = 0; count < XmColorSelector_NUM_TOGGLES; count++) {
Packit a21d5c
	margs[label].value = (XtArgVal) XmColorS_strings(csw).tog_labels[count];
Packit a21d5c
Packit a21d5c
	w = XtCreateManagedWidget(names[count], xmToggleButtonWidgetClass,
Packit a21d5c
				  XmColorS_chose_radio(csw), margs, i + cnum_args);
Packit a21d5c
	XmColorS_chose_mode(csw)[count] = w;
Packit a21d5c
Packit a21d5c
	XtAddCallback(w, XmNvalueChangedCallback, change_mode, csw);
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    XtFree((XtPointer) margs);    
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	CreateColorWindow
Packit a21d5c
 *      Description:   	creates a label in a frame to display the 
Packit a21d5c
 *			currently selected color.
Packit a21d5c
 *      Arguments: 	csw - the color selector widget.
Packit a21d5c
 *                      cargs, cnum_args - a filtered arg list that was
Packit a21d5c
 *                                       passed to create the color selector.
Packit a21d5c
 *      Returns:       	none.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
CreateColorWindow(XmColorSelectorWidget csw,ArgList cargs, Cardinal cnum_args)
Packit a21d5c
{
Packit a21d5c
    Widget fr;
Packit a21d5c
    Arg *margs, args[10];
Packit a21d5c
    Cardinal n;
Packit a21d5c
Packit a21d5c
    fr = XtCreateManagedWidget("colorFrame", xmFrameWidgetClass,
Packit a21d5c
			       (Widget) csw, cargs, cnum_args);
Packit a21d5c
Packit a21d5c
    n = 0;
Packit a21d5c
    XtSetArg(args[n], XmNrecomputeSize, False); n++;
Packit a21d5c
    margs = XtMergeArgLists(args, n, cargs, cnum_args);
Packit a21d5c
    XmColorS_color_window(csw) = XtCreateManagedWidget("colorWindow", 
Packit a21d5c
						       xmLabelWidgetClass, 
Packit a21d5c
						       fr, margs, n + cnum_args);
Packit a21d5c
    XtFree((XtPointer) margs);    
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void GetValues_XmNredSliderLabel ( Widget w, int n, XtArgVal *value) 
Packit a21d5c
{
Packit a21d5c
    (*value) = (XtArgVal) XmStringCopy(XmColorS_strings(w).slider_labels[0]);
Packit a21d5c
}
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void GetValues_XmNgreenSliderLabel( Widget w, int n, XtArgVal *value) 
Packit a21d5c
{
Packit a21d5c
    (*value) = (XtArgVal) XmStringCopy(XmColorS_strings(w).slider_labels[1]);
Packit a21d5c
}
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void GetValues_XmNblueSliderLabel( Widget w, int n, XtArgVal *value) 
Packit a21d5c
{
Packit a21d5c
    (*value) = (XtArgVal) XmStringCopy(XmColorS_strings(w).slider_labels[2]);
Packit a21d5c
}
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void GetValues_XmNcolorListTogLabel( Widget w, int n, XtArgVal *value) 
Packit a21d5c
{
Packit a21d5c
    (*value) = (XtArgVal) XmStringCopy(XmColorS_strings(w).tog_labels[0]);
Packit a21d5c
}
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void GetValues_XmNsliderTogLabel( Widget w, int n, XtArgVal *value) 
Packit a21d5c
{
Packit a21d5c
    (*value) = (XtArgVal) XmStringCopy(XmColorS_strings(w).tog_labels[1]);
Packit a21d5c
}
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void GetValues_XmNnoCellError( Widget w, int n, XtArgVal *value) 
Packit a21d5c
{
Packit a21d5c
    (*value) = (XtArgVal) XmStringCopy(XmColorS_strings(w).no_cell_error);
Packit a21d5c
}
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void GetValues_XmNfileReadError( Widget w, int n, XtArgVal *value) 
Packit a21d5c
{
Packit a21d5c
    (*value) = (XtArgVal) XmStringCopy(XmColorS_strings(w).file_read_error);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	GetVisual
Packit a21d5c
 *      Description:   	Gets the defaults visual of the screen
Packit a21d5c
 *      Arguments: 	csw - the color selector widget.
Packit a21d5c
 *      Returns:       	Visual id.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static int
Packit a21d5c
GetVisual(XmColorSelectorWidget csw)
Packit a21d5c
{
Packit a21d5c
    Visual * vis;
Packit a21d5c
    int visual;
Packit a21d5c
    
Packit a21d5c
    vis = DefaultVisual(XtDisplay(csw), XDefaultScreen(XtDisplay(csw)));
Packit a21d5c
    visual = vis->class;
Packit a21d5c
    
Packit a21d5c
    return visual;
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	NoPrivateColormaps
Packit a21d5c
 *      Description:   	Determines the color to be used.
Packit a21d5c
 *      Arguments: 	csw - the color selector widget.
Packit a21d5c
 *			foreground - default color for the ColorSelector.
Packit a21d5c
 *			color - Current color attributes.
Packit a21d5c
 *			str - label for the ColorSelector.
Packit a21d5c
 *      Returns:       	None.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
NoPrivateColormaps(XmColorSelectorWidget csw, Pixel foreground, 
Packit a21d5c
		     XColor color, char *str)
Packit a21d5c
{
Packit a21d5c
    Arg args[5];
Packit a21d5c
    XmString xm_str;    
Packit a21d5c
    Cardinal num_args;
Packit a21d5c
Packit a21d5c
    xm_str = XmStringCreateLocalized(str);
Packit a21d5c
    num_args = 0;
Packit a21d5c
    
Packit a21d5c
    if (!XmColorS_good_cell(csw)) 
Packit a21d5c
    {
Packit a21d5c
	if(XAllocColor(XtDisplay(csw), csw->core.colormap, &color) )
Packit a21d5c
	{	
Packit a21d5c
	    XmColorS_color_pixel(csw) = color.pixel;
Packit a21d5c
	    XmColorS_good_cell(csw) = True;
Packit a21d5c
	}	
Packit a21d5c
    } else {
Packit a21d5c
	if (XAllocColor(XtDisplay(csw), csw->core.colormap, &color) )
Packit a21d5c
	{	
Packit a21d5c
	    XmColorS_color_pixel(csw) = color.pixel;
Packit a21d5c
	    XmColorS_good_cell(csw) = True;
Packit a21d5c
	} 
Packit a21d5c
	else 
Packit a21d5c
	{
Packit a21d5c
	    XmString out;
Packit a21d5c
	    out = XmStringConcatAndFree(xm_str, XmColorS_strings(csw).no_cell_error);
Packit a21d5c
	    xm_str = out;    
Packit a21d5c
	}
Packit a21d5c
    }
Packit a21d5c
    
Packit a21d5c
    if (XmColorS_good_cell(csw)) 
Packit a21d5c
    {
Packit a21d5c
	color.flags = DoRed | DoGreen | DoBlue;
Packit a21d5c
	color.pixel = XmColorS_color_pixel(csw);
Packit a21d5c
	XtSetArg(args[num_args], XmNforeground, foreground); num_args++;
Packit a21d5c
	XtSetArg(args[num_args], XmNbackground, XmColorS_color_pixel(csw)); 
Packit a21d5c
	num_args++;
Packit a21d5c
	XtSetValues(XmColorS_color_window(csw), args, num_args);
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    XtSetArg(args[num_args], XmNlabelString, xm_str); num_args++;
Packit a21d5c
    XtSetValues(XmColorS_color_window(csw), args, num_args);
Packit a21d5c
    XmStringFree(xm_str);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*      Function Name: 	DoPrivateColormaps
Packit a21d5c
 *      Description:   	Determines the color to be used.
Packit a21d5c
 *      Arguments: 	csw - the color selector widget.
Packit a21d5c
 *			foreground - default color for the ColorSelector.
Packit a21d5c
 *			color - Current color attributes.
Packit a21d5c
 *			str - label for the ColorSelector.
Packit a21d5c
 *      Returns:       	None.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static void
Packit a21d5c
PrivateColormaps(XmColorSelectorWidget csw, Pixel foreground, XColor color, char *str)
Packit a21d5c
{
Packit a21d5c
    Arg args[5];
Packit a21d5c
    XmString xm_str;    
Packit a21d5c
    Cardinal num_args;
Packit a21d5c
Packit a21d5c
    xm_str = XmStringCreateLocalized(str);
Packit a21d5c
    num_args = 0;
Packit a21d5c
Packit a21d5c
    if (!XmColorS_good_cell(csw)) {
Packit a21d5c
        if(XAllocColorCells(XtDisplay(csw), csw->core.colormap,
Packit a21d5c
                            0, 0, 0, &(XmColorS_color_pixel(csw)), 1))
Packit a21d5c
        {	
Packit a21d5c
            XmColorS_good_cell(csw) = True;
Packit a21d5c
        }
Packit a21d5c
        else {
Packit a21d5c
            XmString out;
Packit a21d5c
Packit a21d5c
	    out = XmStringConcatAndFree(xm_str, XmColorS_strings(csw).no_cell_error);
Packit a21d5c
            xm_str = out;
Packit a21d5c
        }
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    if (XmColorS_good_cell(csw)) {
Packit a21d5c
        color.flags = DoRed | DoGreen | DoBlue;
Packit a21d5c
        color.pixel = XmColorS_color_pixel(csw);
Packit a21d5c
        XStoreColor(XtDisplay((Widget) csw), csw->core.colormap, &color;;
Packit a21d5c
        XtSetArg(args[num_args], XmNforeground, foreground); num_args++;
Packit a21d5c
        XtSetArg(args[num_args], XmNbackground, XmColorS_color_pixel(csw));
Packit a21d5c
        num_args++;
Packit a21d5c
    }
Packit a21d5c
Packit a21d5c
    XtSetArg(args[num_args], XmNlabelString, xm_str); num_args++;
Packit a21d5c
    XtSetValues(XmColorS_color_window(csw), args, num_args);
Packit a21d5c
    XmStringFree(xm_str);
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/*
Packit a21d5c
 *      Function Name: 	DefaultVisualDisplay
Packit a21d5c
 *      Description:   	Determines the default visual and allocates
Packit a21d5c
 *			the color depending upon the visual classes
Packit a21d5c
 *      Arguments: 	csw - the color selector widget.
Packit a21d5c
 *			foreground - default color for the ColorSelector.
Packit a21d5c
 *			color - Current color attributes.
Packit a21d5c
 *			str - label for the ColorSelector.
Packit a21d5c
 *      Returns:       	Returns true on a valid visual class.
Packit a21d5c
 *			False otherwise.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
/* ARGSUSED */
Packit a21d5c
static Boolean
Packit a21d5c
DefaultVisualDisplay(XmColorSelectorWidget csw, Pixel foreground, XColor color, char *str)
Packit a21d5c
{
Packit a21d5c
    int visual = 0;
Packit a21d5c
    visual = GetVisual(csw);
Packit a21d5c
    
Packit a21d5c
    /*
Packit a21d5c
     * Obtain a valid color cell. In case, if one not available
Packit a21d5c
     */
Packit a21d5c
    if ( visual == StaticColor || visual == TrueColor || \
Packit a21d5c
	 visual == StaticGray ) 
Packit a21d5c
    {	
Packit a21d5c
	NoPrivateColormaps(csw, foreground, color, str);
Packit a21d5c
	return True;
Packit a21d5c
    } else if ( visual == PseudoColor || visual == DirectColor || \
Packit a21d5c
		visual == GrayScale ) 
Packit a21d5c
    {		
Packit a21d5c
	PrivateColormaps(csw, foreground, color, str);
Packit a21d5c
	return True;
Packit a21d5c
    } else 
Packit a21d5c
    {
Packit a21d5c
	return False;
Packit a21d5c
    }
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
/************************************************************
Packit a21d5c
 *
Packit a21d5c
 *  Public functions.
Packit a21d5c
 *
Packit a21d5c
 ************************************************************/
Packit a21d5c
Packit a21d5c
/*	Function Name: XmCreateColorSelector
Packit a21d5c
 *	Description: Creation Routine for UIL and ADA.
Packit a21d5c
 *	Arguments: parent - the parent widget.
Packit a21d5c
 *                 name - the name of the widget.
Packit a21d5c
 *                 args, num_args - the number and list of args.
Packit a21d5c
 *	Returns: The created widget.
Packit a21d5c
 */
Packit a21d5c
Packit a21d5c
Widget
Packit a21d5c
XmCreateColorSelector(Widget parent, String name,
Packit a21d5c
		      ArgList args, Cardinal num_args)
Packit a21d5c
{
Packit a21d5c
    return(XtCreateWidget(name, xmColorSelectorWidgetClass,
Packit a21d5c
			  parent, args, num_args));
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
Widget 
Packit a21d5c
XmVaCreateColorSelector(
Packit a21d5c
        Widget parent,
Packit a21d5c
        char *name,
Packit a21d5c
        ...)
Packit a21d5c
{
Packit a21d5c
    register Widget w;
Packit a21d5c
    va_list var;
Packit a21d5c
    int count;
Packit a21d5c
    
Packit a21d5c
    Va_start(var,name);
Packit a21d5c
    count = XmeCountVaListSimple(var);
Packit a21d5c
    va_end(var);
Packit a21d5c
Packit a21d5c
    
Packit a21d5c
    Va_start(var, name);
Packit a21d5c
    w = XmeVLCreateWidget(name, 
Packit a21d5c
                         xmColorSelectorWidgetClass,
Packit a21d5c
                         parent, False, 
Packit a21d5c
                         var, count);
Packit a21d5c
    va_end(var);   
Packit a21d5c
    return w;
Packit a21d5c
}
Packit a21d5c
Packit a21d5c
Widget
Packit a21d5c
XmVaCreateManagedColorSelector(
Packit a21d5c
        Widget parent,
Packit a21d5c
        char *name,
Packit a21d5c
        ...)
Packit a21d5c
{
Packit a21d5c
    Widget w = NULL;
Packit a21d5c
    va_list var;
Packit a21d5c
    int count;
Packit a21d5c
    
Packit a21d5c
    Va_start(var, name);
Packit a21d5c
    count = XmeCountVaListSimple(var);
Packit a21d5c
    va_end(var);
Packit a21d5c
    
Packit a21d5c
    Va_start(var, name);
Packit a21d5c
    w = XmeVLCreateWidget(name, 
Packit a21d5c
                         xmColorSelectorWidgetClass,
Packit a21d5c
                         parent, True, 
Packit a21d5c
                         var, count);
Packit a21d5c
    va_end(var);   
Packit a21d5c
    return w;
Packit a21d5c
}