|
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 |
|