/* 
 *  @OPENGROUP_COPYRIGHT@
 *  COPYRIGHT NOTICE
 *  Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
 *  Copyright (c) 1996, 1997, 1998, 1999, 2000 The Open Group
 *  ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
 *  the full copyright text.
 *  
 *  This software is subject to an open license. It may only be
 *  used on, with or for operating systems which are themselves open
 *  source systems. You must contact The Open Group for a license
 *  allowing distribution and sublicensing of this software on, with,
 *  or for operating systems which are not Open Source programs.
 *  
 *  See http://www.opengroup.org/openmotif/license for full
 *  details of the license agreement. Any use, reproduction, or
 *  distribution of the program constitutes recipient's acceptance of
 *  this agreement.
 *  
 *  EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
 *  PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
 *  WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
 *  OR FITNESS FOR A PARTICULAR PURPOSE
 *  
 *  EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
 *  NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT,
 *  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 *  DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED
 *  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 *  ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
 *  EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGES.
*/ 
/* 
 * HISTORY
*/ 
#ifdef REV_INFO
#ifndef lint
static char rcsid[] = "$XConsortium: mvsSetValues.c /main/7 1995/07/14 11:23:35 drk $"
#endif
#endif
/***********************************************************************
	Calls:

	Summary:
		This function sets the resource values requested and
	then calls mvsCompareResources() to verify that the requested
	changes were made.
************************************************************************/

#include "mvslib.h"

extern void NormalizePixmap();

void mvsSetValues(widget_info,args,nargs)
MvsWidgetInfoRecord *widget_info;
ArgList args;
Cardinal nargs;
{
    int i,j, n;
    XtCallbackList cb_list;
    int t, x, y;
    Arg new_args[100];
    Cardinal new_nargs = 0;
    short num_resources;
    MvsResourceInfoRecord *resource_info;
    Widget widget;
    MvsArgVal *mvs_resources;
    Arg color_args[10];
    Pixel foreground, background;
    Window root;
    int pix_x, pix_y;
    unsigned int pix_width, pix_height, pix_border, depth;
    XImage *pix_image = NULL;
    Pixel pixel1, pixel2;
    GC gc;

    num_resources = widget_info->widget_class_info->num_resources;
    resource_info = widget_info->widget_class_info->resource_info;
    widget = widget_info->widget;
    mvs_resources = widget_info->mvs_resources;

    for(i=0; i<nargs; i++) {
        for (j=0;
             (j<num_resources)&&strcmp(args[i].name,resource_info[j].name);
             j++);

        if (j<num_resources) {
            t = resource_info[j].type_code;
            switch (mvsTypeInfo[t].ref_type) {

            case RefCallbackList:
		new_args[new_nargs].name = args[i].name;
		new_args[new_nargs].value = args[i].value;
		new_nargs++;
                break;
	    case RefValue:
                if (t != T_Pixel) {
			new_args[new_nargs].name = args[i].name;
			new_args[new_nargs].value = args[i].value;
			new_nargs++;
		}
                break;
	    default:
		new_args[new_nargs].name = args[i].name;
		new_args[new_nargs].value = args[i].value;
		new_nargs++;
                break;
	    }
        }
	else {
	    /* Don't change colors on Gadgets that are not ready in
	       automation for these when recording or comparing */
	    if ((mvsGetVisualMode() != VISUAL_MODE_DONT_CHECK) &&
		(XmIsGadget(widget) && 
		(mvsGetClassCode(widget) != mvsXmIconGadgetClass) &&
		(strcmp(args[i].name, "background") == 0 ||
		 strcmp(args[i].name, "foreground") == 0 ||
		 strcmp(args[i].name, "bottomShadowColor") == 0 ||
		 strcmp(args[i].name, "highlightColor") == 0 ||
		 strcmp(args[i].name, "topShadowColor") == 0 ||
		 strcmp(args[i].name, "borderColor") == 0))) {
		;
	    }
	    else {
		new_args[new_nargs].name = args[i].name;
		new_args[new_nargs].value = args[i].value;
		new_nargs++;
	    }
	}
    } /* for() */

    /* Normalize pixmap when in record or compare mode */

    if (mvsGetVisualMode() != VISUAL_MODE_DONT_CHECK) {
	for (i = 0; i < new_nargs; i++) {
	    if ((strcmp(new_args[i].name, "labelPixmap") == 0 		  ||
		 strcmp(new_args[i].name, "labelInsensitivePixmap") == 0  ||
		 strcmp(new_args[i].name, "symbolPixmap") == 0		  ||
		 strcmp(new_args[i].name, "selectPixmap") == 0		  ||
		 strcmp(new_args[i].name, "selectInsensitivePixmap") == 0 ||
		 strcmp(new_args[i].name, "armPixmap") == 0 		  ||
		 strcmp(new_args[i].name, "backgroundPixmap") == 0	  ||
		 strcmp(new_args[i].name, "highlightPixmap") == 0         ||
		 strcmp(new_args[i].name, "borderPixmap") == 0		  ||
		 strcmp(new_args[i].name, "topShadowPixmap") == 0	  ||
		 strcmp(new_args[i].name, "bottomShadowPixmap") == 0	  ||
		 strcmp(new_args[i].name, "cascadePixmap") == 0		  ||
		 strcmp(new_args[i].name, "largeIconPixmap") == 0	  ||
		 strcmp(new_args[i].name, "largeIconMask") == 0	          ||
		 strcmp(new_args[i].name, "smallIconPixmap") == 0         ||
		 strcmp(new_args[i].name, "smallIconMask") == 0	          ||
		 strcmp(new_args[i].name, "bindingPixmap") == 0	          ||
		 strcmp(new_args[i].name, "collapsedStatePixmap") == 0	  ||
		 strcmp(new_args[i].name, "expandedStatePixmap") == 0)	  &&
		(new_args[i].value != (XtArgVal) XmUNSPECIFIED_PIXMAP) &&
		new_args[i].value != (XtArgVal) None) {

		NormalizePixmap(widget_info, new_args[i].value);
	 
	    }
	}
    }

    if (mvsGetVisualMode() == VISUAL_MODE_GENERATE_PIXMAPS)
      XtSetValues(widget, new_args, new_nargs);
/*    else
      XtSetValues(widget, args, nargs);
*/
/* Don't change colors on gadgets until automation is really updated to 2.0
   and supports colors on gadgets */
    else
	if (XmIsGadget(widget) &&  
	    (mvsGetClassCode(widget) != mvsXmIconGadgetClass))
	    XtSetValues(widget, new_args, new_nargs);
        else
	    XtSetValues(widget, args, nargs);


    mvsSetLocalValues(widget_info, args, &nargs);

} /* End mvsSetValuesNoCheck() */