Blame lib/Xm/RCHook.c

Packit b099d7
/* $XConsortium: RCHook.c /main/10 1996/12/16 18:32:29 drk $ */
Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 * 
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include "XmI.h"
Packit b099d7
#include "ColorObjI.h"
Packit b099d7
#include "RCHookI.h"
Packit b099d7
Packit b099d7
/**********************************************************************/
Packit b099d7
/** RCHook                                                           **/
Packit b099d7
/**    With new "per-display" color objects, we need to check to see **/
Packit b099d7
/**    if this ColorObj is using the color server before we set up   **/
Packit b099d7
/**    any special colors.                                           **/
Packit b099d7
/**                                                                  **/
Packit b099d7
/**********************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
void 
Packit b099d7
_XmRCColorHook(
Packit b099d7
        Widget w,
Packit b099d7
        ArgList alIn,		/* unused */
Packit b099d7
        Cardinal *acPtrIn )	/* unused */
Packit b099d7
{
Packit b099d7
    Arg al[10];
Packit b099d7
    int ac;
Packit b099d7
    unsigned char rcType;
Packit b099d7
    static int mono, color, colorPrim, init=0;
Packit b099d7
    static Screen *screen;
Packit b099d7
    Pixmap  ditherPix, solidPix;
Packit b099d7
    XmColorObj tmpColorObj=NULL;
Packit b099d7
    Pixel  defaultBackground;
Packit b099d7
    int depth = w->core.depth ;
Packit b099d7
    Display *ColorObjCacheDisplay;
Packit b099d7
    XContext ColorObjCache;
Packit b099d7
    XmColorObj DefaultColorObj;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    ColorObjCacheDisplay = _XmColorObjCacheDisplay;
Packit b099d7
    ColorObjCache = _XmColorObjCache;
Packit b099d7
    DefaultColorObj = _XmDefaultColorObj;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
Packit b099d7
    /** get the colorObj for this display connection **/
Packit b099d7
    if (XFindContext(ColorObjCacheDisplay, (XID)XtDisplay(w), 
Packit b099d7
		     ColorObjCache, (XPointer *)&tmpColorObj) != 0)
Packit b099d7
    {   /* none found, use default */
Packit b099d7
	if (DefaultColorObj)
Packit b099d7
	    tmpColorObj = DefaultColorObj;
Packit b099d7
	else  /* this should NEVER happen... RowColInitHook won't get called */
Packit b099d7
	    return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /** don't set colors if this display isn't using the color server **/
Packit b099d7
    if (!tmpColorObj->color_obj.colorIsRunning)	return;
Packit b099d7
Packit b099d7
    ac = 0;
Packit b099d7
    XtSetArg (al[ac], XmNrowColumnType, &rcType);                ac++;
Packit b099d7
    XtSetArg (al[ac], XmNbackground, &defaultBackground);        ac++;
Packit b099d7
    XtGetValues (w, al, ac);
Packit b099d7
Packit b099d7
    if (rcType == XmMENU_BAR)  /* set to secondary, rather than primary */
Packit b099d7
    {
Packit b099d7
	_XmProcessLock();
Packit b099d7
        if (!init)
Packit b099d7
        {
Packit b099d7
            if (tmpColorObj->color_obj.
Packit b099d7
		colorUse[tmpColorObj->color_obj.myScreen] == XmCO_BLACK_WHITE)
Packit b099d7
                mono = 1;
Packit b099d7
            else 
Packit b099d7
                mono = 0;
Packit b099d7
Packit b099d7
            color = tmpColorObj->color_obj.secondary;
Packit b099d7
            colorPrim = tmpColorObj->color_obj.primary;
Packit b099d7
            screen = XtScreen(tmpColorObj);
Packit b099d7
            init = 1;
Packit b099d7
        }
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
Packit b099d7
	/** if background didn't default to ColorObj, 
Packit b099d7
	  don't overwrite colors **/
Packit b099d7
	if (defaultBackground != tmpColorObj->color_obj.myColors[colorPrim].bg)
Packit b099d7
	    return;
Packit b099d7
Packit b099d7
        ac = 0;
Packit b099d7
        XtSetArg (al[ac], XmNbackground, 
Packit b099d7
                  tmpColorObj->color_obj.myColors[color].bg);        ac++;
Packit b099d7
        XtSetArg (al[ac], XmNforeground, 
Packit b099d7
                  tmpColorObj->color_obj.myColors[color].fg);        ac++;
Packit b099d7
        XtSetArg (al[ac], XmNtopShadowColor, 
Packit b099d7
                  tmpColorObj->color_obj.myColors[color].ts);        ac++;
Packit b099d7
        XtSetArg (al[ac], XmNbottomShadowColor, 
Packit b099d7
                  tmpColorObj->color_obj.myColors[color].bs);        ac++;
Packit b099d7
Packit b099d7
        /** put dithers for top shadows if needed **/
Packit b099d7
        if (XmCO_DitherTopShadow(tmpColorObj->color_obj.display, 
Packit b099d7
				 tmpColorObj->color_obj.myScreen,
Packit b099d7
				 &tmpColorObj->color_obj.myColors[color]))
Packit b099d7
        {
Packit b099d7
            if (mono)
Packit b099d7
                ditherPix = XmGetPixmapByDepth (screen, XmS50_foreground,
Packit b099d7
                                         BlackPixelOfScreen(screen),
Packit b099d7
                                         WhitePixelOfScreen(screen),
Packit b099d7
					 depth);
Packit b099d7
            else
Packit b099d7
                ditherPix = XmGetPixmapByDepth (screen, XmS50_foreground,
Packit b099d7
                                    tmpColorObj->color_obj.myColors[color].bg,
Packit b099d7
                                         WhitePixelOfScreen(screen),
Packit b099d7
					 depth);
Packit b099d7
Packit b099d7
            XtSetArg (al[ac], XmNtopShadowPixmap, ditherPix);         ac++;
Packit b099d7
        }
Packit b099d7
        else      /** see if we need to "undo" primary dither **/
Packit b099d7
        if (XmCO_DitherTopShadow(tmpColorObj->color_obj.display, 
Packit b099d7
				 tmpColorObj->color_obj.myScreen,
Packit b099d7
				 &tmpColorObj->color_obj.myColors[colorPrim]))
Packit b099d7
        {   /* simulate solid white (will happen for B_W case only)*/
Packit b099d7
            solidPix = XmGetPixmapByDepth (screen, "background",
Packit b099d7
					   WhitePixelOfScreen(screen),
Packit b099d7
					   WhitePixelOfScreen(screen),
Packit b099d7
					   depth);
Packit b099d7
            XtSetArg (al[ac], XmNtopShadowPixmap, solidPix);          ac++;
Packit b099d7
        }
Packit b099d7
Packit b099d7
        /** put dithers for bottom shadows if needed **/
Packit b099d7
        if (XmCO_DitherBottomShadow(tmpColorObj->color_obj.display, 
Packit b099d7
				    tmpColorObj->color_obj.myScreen,
Packit b099d7
				    &tmpColorObj->color_obj.myColors[color]))
Packit b099d7
        {
Packit b099d7
            if (mono)
Packit b099d7
                ditherPix = XmGetPixmapByDepth (screen, XmS50_foreground,
Packit b099d7
						BlackPixelOfScreen(screen),
Packit b099d7
						WhitePixelOfScreen(screen),
Packit b099d7
						depth);
Packit b099d7
            else
Packit b099d7
                ditherPix = XmGetPixmapByDepth (screen, XmS50_foreground,
Packit b099d7
                                   tmpColorObj->color_obj.myColors[color].bg,
Packit b099d7
						BlackPixelOfScreen(screen),
Packit b099d7
						depth);
Packit b099d7
            XtSetArg (al[ac], XmNbottomShadowPixmap, ditherPix);      ac++;
Packit b099d7
        }
Packit b099d7
        else      /** see if we need to "undo" primary dither **/
Packit b099d7
        if (XmCO_DitherBottomShadow(tmpColorObj->color_obj.display, 
Packit b099d7
				    tmpColorObj->color_obj.myScreen,
Packit b099d7
				    &tmpColorObj->color_obj.myColors[colorPrim]))
Packit b099d7
        {   /* simulate solid black (will happen for B_W case only)*/
Packit b099d7
            solidPix = XmGetPixmapByDepth (screen, "background",
Packit b099d7
					   BlackPixelOfScreen(screen),
Packit b099d7
					   BlackPixelOfScreen(screen),
Packit b099d7
					   depth);
Packit b099d7
            XtSetArg (al[ac], XmNbottomShadowPixmap, solidPix);       ac++;
Packit b099d7
        }
Packit b099d7
Packit b099d7
        XtSetValues (w, al, ac);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7