|
Packit |
b099d7 |
/* $TOG: IconG.c /main/28 1999/01/26 15:30:46 mgreess $ */
|
|
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 |
* 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 <Xm/AccColorT.h>
|
|
Packit |
b099d7 |
#include <Xm/CareVisualT.h>
|
|
Packit |
b099d7 |
#include <Xm/ContItemT.h>
|
|
Packit |
b099d7 |
#include <Xm/ContainerT.h>
|
|
Packit |
b099d7 |
#include <Xm/PointInT.h>
|
|
Packit |
b099d7 |
#include <Xm/DrawP.h>
|
|
Packit |
b099d7 |
#include <Xm/IconGP.h>
|
|
Packit |
b099d7 |
#include <Xm/TraitP.h> /* for XmeTraitSet */
|
|
Packit |
b099d7 |
#include <Xm/XmosP.h>
|
|
Packit |
b099d7 |
#include <Xm/VaSimpleP.h>
|
|
Packit |
b099d7 |
#include "BaseClassI.h"
|
|
Packit |
b099d7 |
#include "CacheI.h"
|
|
Packit |
b099d7 |
#include "ColorI.h"
|
|
Packit |
b099d7 |
#include "DrawI.h"
|
|
Packit |
b099d7 |
#include "ExtObjectI.h"
|
|
Packit |
b099d7 |
#include "ImageCachI.h"
|
|
Packit |
b099d7 |
#include "MessagesI.h"
|
|
Packit |
b099d7 |
#include "PixConvI.h"
|
|
Packit |
b099d7 |
#include "RepTypeI.h"
|
|
Packit |
b099d7 |
#include "ScreenI.h"
|
|
Packit |
b099d7 |
#include "SyntheticI.h"
|
|
Packit |
b099d7 |
#include "TravActI.h"
|
|
Packit |
b099d7 |
#include "XmI.h"
|
|
Packit |
b099d7 |
#include "XmTabListI.h"
|
|
Packit |
b099d7 |
#include "XmosI.h"
|
|
Packit |
b099d7 |
#include "IconGI.h"
|
|
Packit |
b099d7 |
#include <Xm/XmP.h>
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* spacing between the line and the detail string.
|
|
Packit |
b099d7 |
Those could be moved as plain resources later. */
|
|
Packit |
b099d7 |
#define DEFAULT_LABEL_MARGIN_WIDTH 2
|
|
Packit |
b099d7 |
#define DEFAULT_LABEL_MARGIN_HEIGHT 2
|
|
Packit |
b099d7 |
#define DEFAULT_HOR_SPACING 4
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* This macro should probably be put in XmI.h and used everywhere */
|
|
Packit |
b099d7 |
#define PIXMAP_VALID(pix) \
|
|
Packit |
b099d7 |
(pix != XmUNSPECIFIED_PIXMAP && pix != None)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define SHOW_DETAIL(wid, container_data) \
|
|
Packit |
b099d7 |
(IG_Detail(wid) && IG_DetailCount(wid) && \
|
|
Packit |
b099d7 |
(container_data)->detail_order_count)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define INVALID_DIMENSION ((Dimension)-1)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** Static Function Declarations ********/
|
|
Packit |
b099d7 |
/* XmRCallProcs */
|
|
Packit |
b099d7 |
static void CheckSetRenderTable(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
int offset,
|
|
Packit |
b099d7 |
XrmValue *value);
|
|
Packit |
b099d7 |
/* Converters */
|
|
Packit |
b099d7 |
static Boolean CvtStringToIconPixmap(
|
|
Packit |
b099d7 |
Display *dpy,
|
|
Packit |
b099d7 |
XrmValue *args,
|
|
Packit |
b099d7 |
Cardinal *numArgs,
|
|
Packit |
b099d7 |
XrmValue *fromVal,
|
|
Packit |
b099d7 |
XrmValue *toVal,
|
|
Packit |
b099d7 |
XtPointer *closure_ret) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Hooks */
|
|
Packit |
b099d7 |
static void GetLabelString(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
int offset,
|
|
Packit |
b099d7 |
XtArgVal *value);
|
|
Packit |
b099d7 |
/* BaseClass methods */
|
|
Packit |
b099d7 |
static void SecondaryObjectCreate(
|
|
Packit |
b099d7 |
Widget req,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args) ;
|
|
Packit |
b099d7 |
static void InitializePosthook(
|
|
Packit |
b099d7 |
Widget req,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args) ;
|
|
Packit |
b099d7 |
static Boolean SetValuesPrehook(
|
|
Packit |
b099d7 |
Widget oldParent,
|
|
Packit |
b099d7 |
Widget refParent,
|
|
Packit |
b099d7 |
Widget newParent,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args) ;
|
|
Packit |
b099d7 |
static void GetValuesPrehook(
|
|
Packit |
b099d7 |
Widget newParent,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args) ;
|
|
Packit |
b099d7 |
static void GetValuesPosthook(
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args) ;
|
|
Packit |
b099d7 |
static Boolean SetValuesPosthook(
|
|
Packit |
b099d7 |
Widget current,
|
|
Packit |
b099d7 |
Widget req,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args) ;
|
|
Packit |
b099d7 |
static int IconGCacheCompare(
|
|
Packit |
b099d7 |
XtPointer A,
|
|
Packit |
b099d7 |
XtPointer B) ;
|
|
Packit |
b099d7 |
static Cardinal GetIconGClassSecResData(
|
|
Packit |
b099d7 |
WidgetClass w_class,
|
|
Packit |
b099d7 |
XmSecondaryResourceData **data_rtn) ;
|
|
Packit |
b099d7 |
static XtPointer GetIconGClassSecResBase(
|
|
Packit |
b099d7 |
Widget widget,
|
|
Packit |
b099d7 |
XtPointer client_data) ;
|
|
Packit |
b099d7 |
/* RectObj methods */
|
|
Packit |
b099d7 |
static void ClassInitialize( void );
|
|
Packit |
b099d7 |
static void ClassPartInitialize(
|
|
Packit |
b099d7 |
WidgetClass wc);
|
|
Packit |
b099d7 |
static void Initialize(
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args);
|
|
Packit |
b099d7 |
static void Destroy(
|
|
Packit |
b099d7 |
Widget wid);
|
|
Packit |
b099d7 |
static void Redisplay(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
Region region);
|
|
Packit |
b099d7 |
static Boolean SetValues(
|
|
Packit |
b099d7 |
Widget cw,
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args);
|
|
Packit |
b099d7 |
static XtGeometryResult QueryGeometry(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XtWidgetGeometry *intended,
|
|
Packit |
b099d7 |
XtWidgetGeometry *reply);
|
|
Packit |
b099d7 |
/* XmGadget methods */
|
|
Packit |
b099d7 |
static void HighlightBorder(
|
|
Packit |
b099d7 |
Widget w) ;
|
|
Packit |
b099d7 |
static void UnhighlightBorder(
|
|
Packit |
b099d7 |
Widget w) ;
|
|
Packit |
b099d7 |
static void InputDispatch(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
Mask event_mask);
|
|
Packit |
b099d7 |
static Boolean GetBaselines(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
Dimension **baselines,
|
|
Packit |
b099d7 |
int *line_count);
|
|
Packit |
b099d7 |
static void MarginsProc(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XmBaselineMargins *margins_rec);
|
|
Packit |
b099d7 |
static Boolean GetDisplayRect(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XRectangle *displayrect);
|
|
Packit |
b099d7 |
/* XmIconGadget methods */
|
|
Packit |
b099d7 |
/* Action procs */
|
|
Packit |
b099d7 |
/* Internal functions */
|
|
Packit |
b099d7 |
static void GetLabelXY(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
Position * x_ret,
|
|
Packit |
b099d7 |
Position * y_ret);
|
|
Packit |
b099d7 |
static Position GetLargeIconX(
|
|
Packit |
b099d7 |
Widget wid);
|
|
Packit |
b099d7 |
static Position GetSmallIconY(
|
|
Packit |
b099d7 |
Widget wid);
|
|
Packit |
b099d7 |
static Dimension GetIconLabelWidth(
|
|
Packit |
b099d7 |
Widget wid);
|
|
Packit |
b099d7 |
static Dimension GetIconLabelHeight(
|
|
Packit |
b099d7 |
Widget wid);
|
|
Packit |
b099d7 |
static Cardinal GetShapeInfo(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
Position large_icon_x,
|
|
Packit |
b099d7 |
Position small_icon_y,
|
|
Packit |
b099d7 |
Position label_x,
|
|
Packit |
b099d7 |
Position label_y,
|
|
Packit |
b099d7 |
Dimension first_column_width,
|
|
Packit |
b099d7 |
Dimension ht,
|
|
Packit |
b099d7 |
XPoint * points);
|
|
Packit |
b099d7 |
static void GetContainerData(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XmContainerData container_data);
|
|
Packit |
b099d7 |
static void ChangeHighlightGC(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XtEnum selection_mode,
|
|
Packit |
b099d7 |
int line_width);
|
|
Packit |
b099d7 |
static void UpdateSelectGCs(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
Pixel select_color);
|
|
Packit |
b099d7 |
static void UpdateGCs(
|
|
Packit |
b099d7 |
Widget wid);
|
|
Packit |
b099d7 |
static XmStringTable GetStringTableReOrdered(
|
|
Packit |
b099d7 |
XmStringTable st,
|
|
Packit |
b099d7 |
Cardinal st_count,
|
|
Packit |
b099d7 |
Cardinal * order,
|
|
Packit |
b099d7 |
Cardinal order_count);
|
|
Packit |
b099d7 |
static void GetStringTableExtent(
|
|
Packit |
b099d7 |
Screen * screen,
|
|
Packit |
b099d7 |
XmStringTable st,
|
|
Packit |
b099d7 |
Cardinal st_count,
|
|
Packit |
b099d7 |
XmRenderTable render_table,
|
|
Packit |
b099d7 |
XmTabList tab_list,
|
|
Packit |
b099d7 |
Dimension hor_spacing,
|
|
Packit |
b099d7 |
Dimension * width_ret,
|
|
Packit |
b099d7 |
Dimension * height_ret,
|
|
Packit |
b099d7 |
Position * baseline_ret);
|
|
Packit |
b099d7 |
static void GetSize(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
Dimension *ideal_width,
|
|
Packit |
b099d7 |
Dimension *ideal_height);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Trait methods */
|
|
Packit |
b099d7 |
static void ContItemSetValues(Widget w,
|
|
Packit |
b099d7 |
XmContainerItemData contItemData);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ContItemGetValues(Widget w,
|
|
Packit |
b099d7 |
XmContainerItemData contItemData);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Boolean HandleRedraw (Widget kid,
|
|
Packit |
b099d7 |
Widget cur_parent,
|
|
Packit |
b099d7 |
Widget new_parent,
|
|
Packit |
b099d7 |
Mask visual_flag);
|
|
Packit |
b099d7 |
static void GetColors(Widget widget,
|
|
Packit |
b099d7 |
XmAccessColorData color_data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Boolean PointIn(Widget widget,
|
|
Packit |
b099d7 |
Position x, Position y);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** End Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*** Xt trivia: How do you manage a flag that tells you that something
|
|
Packit |
b099d7 |
happened during a resource conversion ?
|
|
Packit |
b099d7 |
We need a association outside the widget instance for the
|
|
Packit |
b099d7 |
OwnIconMask flag. This is because the converter sets this flag
|
|
Packit |
b099d7 |
and the widget Initialize cannot initialize it afterward without
|
|
Packit |
b099d7 |
overiding it.
|
|
Packit |
b099d7 |
So we use the XContext manager for that.
|
|
Packit |
b099d7 |
(I could probably have used private resource too...) ***/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* those are created in ClassInitialize and filled by the
|
|
Packit |
b099d7 |
IconConverter. */
|
|
Packit |
b099d7 |
static XContext largeIconContext = (XContext) NULL;
|
|
Packit |
b099d7 |
static XContext smallIconContext = (XContext) NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XPointer dummy;
|
|
Packit |
b099d7 |
#define OwnLargeMask(widget) \
|
|
Packit |
b099d7 |
(XFindContext(XtDisplay(widget), \
|
|
Packit |
b099d7 |
(Window) widget, \
|
|
Packit |
b099d7 |
largeIconContext, \
|
|
Packit |
b099d7 |
&dummy) == 0)
|
|
Packit |
b099d7 |
#define OwnSmallMask(widget) \
|
|
Packit |
b099d7 |
(XFindContext(XtDisplay(widget), \
|
|
Packit |
b099d7 |
(Window) widget, \
|
|
Packit |
b099d7 |
smallIconContext, \
|
|
Packit |
b099d7 |
&dummy) == 0)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MESSAGE0 _XmMMsgPixConv_0000
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***** The resources of this class */
|
|
Packit |
b099d7 |
static XtResource resources[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* The following hackery is a way in Xt to see if a
|
|
Packit |
b099d7 |
widget has been initialized. We need to know whether or not
|
|
Packit |
b099d7 |
the gadget cache is valid. We use "." in the name so that
|
|
Packit |
b099d7 |
an end user cannot access it from a resource file.
|
|
Packit |
b099d7 |
With that in place, we just need to check IG_Cache(w) != NULL
|
|
Packit |
b099d7 |
to see if the gadget has been initialized. */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNdotCache, XmCDotCache, XmRPointer, sizeof(XtPointer),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget, icong.cache),
|
|
Packit |
b099d7 |
XtRImmediate, (XtPointer) NULL},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNlabelString,XmCXmString,XmRXmString,sizeof(XmString),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget,icong.label_string),
|
|
Packit |
b099d7 |
XmRImmediate,(XtPointer)NULL},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNlargeIconMask,XmCIconMask,XmRBitmap,sizeof(Pixmap),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget,icong.large_icon_mask),
|
|
Packit |
b099d7 |
XmRImmediate,(XtPointer)XmUNSPECIFIED_PIXMAP},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNlargeIconPixmap,XmCIconPixmap,XmRLargeIconPixmap,sizeof(Pixmap),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget,icong.large_icon_pixmap),
|
|
Packit |
b099d7 |
XmRImmediate,(XtPointer)XmUNSPECIFIED_PIXMAP},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNsmallIconMask,XmCIconMask,XmRBitmap,sizeof(Pixmap),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget,icong.small_icon_mask),
|
|
Packit |
b099d7 |
XmRImmediate,(XtPointer)XmUNSPECIFIED_PIXMAP},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNsmallIconPixmap,XmCIconMask,XmRSmallIconPixmap,sizeof(Pixmap),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget,icong.small_icon_pixmap),
|
|
Packit |
b099d7 |
XmRImmediate,(XtPointer)XmUNSPECIFIED_PIXMAP},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNviewType,XmCViewType,XmRViewType,sizeof(unsigned char),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget,icong.viewtype),
|
|
Packit |
b099d7 |
XmRImmediate,(XtPointer)XmLARGE_ICON},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNvisualEmphasis,XmCVisualEmphasis,XmRVisualEmphasis,
|
|
Packit |
b099d7 |
sizeof(unsigned char),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget,icong.visual_emphasis),
|
|
Packit |
b099d7 |
XmRImmediate,(XtPointer)XmNOT_SELECTED},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNdetail,XmCDetail,XmRXmStringTable,
|
|
Packit |
b099d7 |
sizeof(XmStringTable),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget,icong.detail),
|
|
Packit |
b099d7 |
XmRImmediate,(XtPointer)NULL},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNdetailCount,XmCDetailCount,XmRCardinal,sizeof(Cardinal),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget,icong.detail_count),
|
|
Packit |
b099d7 |
XmRImmediate,(XtPointer)0},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
"pri.vate","Pri.vate",XmRBoolean,
|
|
Packit |
b099d7 |
sizeof(Boolean),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget, icong.check_set_render_table),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) False},
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource cache_resources[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNfontList, XmCFontList, XmRFontList,
|
|
Packit |
b099d7 |
sizeof(XmRenderTable),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.render_table),
|
|
Packit |
b099d7 |
XmRCallProc,(XtPointer)CheckSetRenderTable
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNrenderTable, XmCRenderTable, XmRRenderTable,
|
|
Packit |
b099d7 |
sizeof(XmRenderTable),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.render_table),
|
|
Packit |
b099d7 |
XmRCallProc,(XtPointer)CheckSetRenderTable
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNbackground, XmCBackground, XmRPixel,
|
|
Packit |
b099d7 |
sizeof (Pixel),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.background),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) _XmBackgroundColorDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNforeground, XmCForeground, XmRPixel,
|
|
Packit |
b099d7 |
sizeof (Pixel),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.foreground),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) _XmForegroundColorDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNtopShadowColor, XmCTopShadowColor, XmRPixel,
|
|
Packit |
b099d7 |
sizeof (Pixel),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.top_shadow_color),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) _XmTopShadowColorDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNbottomShadowColor, XmCBottomShadowColor, XmRPixel,
|
|
Packit |
b099d7 |
sizeof (Pixel),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.bottom_shadow_color),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) _XmBottomShadowColorDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNhighlightColor, XmCHighlightColor, XmRPixel,
|
|
Packit |
b099d7 |
sizeof (Pixel),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.highlight_color),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) _XmHighlightColorDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNbackgroundPixmap, XmCBackgroundPixmap, XmRPixmap,
|
|
Packit |
b099d7 |
sizeof (Pixmap),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.background_pixmap),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNtopShadowPixmap, XmCTopShadowPixmap, XmRTopShadowPixmap,
|
|
Packit |
b099d7 |
sizeof (Pixmap),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.top_shadow_pixmap),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) _XmTopShadowPixmapDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNbottomShadowPixmap, XmCBottomShadowPixmap, XmRBottomShadowPixmap,
|
|
Packit |
b099d7 |
sizeof (Pixmap),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.bottom_shadow_pixmap),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNhighlightPixmap, XmCHighlightPixmap, XmRHighlightPixmap,
|
|
Packit |
b099d7 |
sizeof (Pixmap),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.highlight_pixmap),
|
|
Packit |
b099d7 |
XmRCallProc, (XtPointer) _XmHighlightPixmapDefault
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNalignment, XmCAlignment, XmRAlignment, sizeof(unsigned char),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.alignment),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmALIGNMENT_CENTER
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNspacing, XmCSpacing, XmRHorizontalDimension, sizeof(Dimension),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.spacing),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) 4
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNmarginWidth, XmCMarginWidth, XmRHorizontalDimension,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.margin_width),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) 2
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNmarginHeight, XmCMarginHeight, XmRVerticalDimension,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.margin_height),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) 2
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmSyntheticResource syn_resources[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNlabelString,sizeof(XmString),
|
|
Packit |
b099d7 |
XtOffset(XmIconGadget,icong.label_string),GetLabelString,NULL
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmSyntheticResource cache_syn_resources[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNspacing, sizeof(Dimension),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.spacing),
|
|
Packit |
b099d7 |
XmeFromHorizontalPixels, XmeToHorizontalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNmarginWidth, sizeof(Dimension),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.margin_width),
|
|
Packit |
b099d7 |
XmeFromHorizontalPixels, XmeToHorizontalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNmarginHeight, sizeof(Dimension),
|
|
Packit |
b099d7 |
XtOffsetOf(XmIconGCacheObjRec, icon_cache.margin_height),
|
|
Packit |
b099d7 |
XmeFromVerticalPixels, XmeToVerticalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ext rec static initialization */
|
|
Packit |
b099d7 |
externaldef(xmicongcacheobjclassrec)
|
|
Packit |
b099d7 |
XmIconGCacheObjClassRec xmIconGCacheObjClassRec =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* superclass */ (WidgetClass) &xmExtClassRec,
|
|
Packit |
b099d7 |
/* class_name */ "XmIconGadget",
|
|
Packit |
b099d7 |
/* widget_size */ sizeof(XmIconGCacheObjRec),
|
|
Packit |
b099d7 |
/* class_initialize */ NULL,
|
|
Packit |
b099d7 |
/* chained class init */ NULL,
|
|
Packit |
b099d7 |
/* class_inited */ False,
|
|
Packit |
b099d7 |
/* initialize */ NULL,
|
|
Packit |
b099d7 |
/* initialize hook */ NULL,
|
|
Packit |
b099d7 |
/* realize */ NULL,
|
|
Packit |
b099d7 |
/* actions */ NULL,
|
|
Packit |
b099d7 |
/* num_actions */ 0,
|
|
Packit |
b099d7 |
/* resources */ cache_resources,
|
|
Packit |
b099d7 |
/* num_resources */ XtNumber(cache_resources),
|
|
Packit |
b099d7 |
/* xrm_class */ NULLQUARK,
|
|
Packit |
b099d7 |
/* compress_motion */ False,
|
|
Packit |
b099d7 |
/* compress_exposure */ False,
|
|
Packit |
b099d7 |
/* compress enter/exit*/ False,
|
|
Packit |
b099d7 |
/* visible_interest */ False,
|
|
Packit |
b099d7 |
/* destroy */ NULL,
|
|
Packit |
b099d7 |
/* resize */ NULL,
|
|
Packit |
b099d7 |
/* expose */ NULL,
|
|
Packit |
b099d7 |
/* set_values */ NULL,
|
|
Packit |
b099d7 |
/* set values hook */ NULL,
|
|
Packit |
b099d7 |
/* set values almost */ NULL,
|
|
Packit |
b099d7 |
/* get values hook */ NULL,
|
|
Packit |
b099d7 |
/* accept_focus */ NULL,
|
|
Packit |
b099d7 |
/* version */ XtVersion,
|
|
Packit |
b099d7 |
/* callback offsetlst */ NULL,
|
|
Packit |
b099d7 |
/* default trans */ NULL,
|
|
Packit |
b099d7 |
/* query geo proc */ NULL,
|
|
Packit |
b099d7 |
/* display accelerator*/ NULL,
|
|
Packit |
b099d7 |
/* extension record */ NULL,
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* synthetic resources */ cache_syn_resources,
|
|
Packit |
b099d7 |
/* num_syn_resources */ XtNumber(cache_syn_resources),
|
|
Packit |
b099d7 |
/* extension */ NULL,
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmBaseClassExtRec iconGBaseClassExtRec = {
|
|
Packit |
b099d7 |
NULL, /* next_extension */
|
|
Packit |
b099d7 |
NULLQUARK, /* record_typ */
|
|
Packit |
b099d7 |
XmBaseClassExtVersion, /* version */
|
|
Packit |
b099d7 |
sizeof(XmBaseClassExtRec), /* record_size */
|
|
Packit |
b099d7 |
XmInheritInitializePrehook, /* initializePrehook */
|
|
Packit |
b099d7 |
SetValuesPrehook, /* setValuesPrehook */
|
|
Packit |
b099d7 |
InitializePosthook, /* initializePosthook */
|
|
Packit |
b099d7 |
SetValuesPosthook, /* setValuesPosthook */
|
|
Packit |
b099d7 |
(WidgetClass)&xmIconGCacheObjClassRec, /* secondaryObjectClass */
|
|
Packit |
b099d7 |
SecondaryObjectCreate, /* secondaryObjectCreate */
|
|
Packit |
b099d7 |
GetIconGClassSecResData, /* getSecResData */
|
|
Packit |
b099d7 |
{0}, /* Other Flags */
|
|
Packit |
b099d7 |
GetValuesPrehook, /* getValuesPrehook */
|
|
Packit |
b099d7 |
GetValuesPosthook, /* getValuesPosthook */
|
|
Packit |
b099d7 |
NULL, /* classPartInitPrehook */
|
|
Packit |
b099d7 |
NULL, /* classPartInitPosthook*/
|
|
Packit |
b099d7 |
NULL, /* ext_resources */
|
|
Packit |
b099d7 |
NULL, /* compiled_ext_resources*/
|
|
Packit |
b099d7 |
0, /* num_ext_resources */
|
|
Packit |
b099d7 |
FALSE, /* use_sub_resources */
|
|
Packit |
b099d7 |
XmInheritWidgetNavigable, /* widgetNavigable */
|
|
Packit |
b099d7 |
XmInheritFocusChange, /* focusChange */
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmCacheClassPart IconGClassCachePart = {
|
|
Packit |
b099d7 |
{NULL, 0, 0}, /* head of class cache list */
|
|
Packit |
b099d7 |
_XmCacheCopy, /* Copy routine */
|
|
Packit |
b099d7 |
_XmCacheDelete, /* Delete routine */
|
|
Packit |
b099d7 |
IconGCacheCompare, /* Comparison routine */
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmGadgetClassExtRec GadClassExtRec = {
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULLQUARK,
|
|
Packit |
b099d7 |
XmGadgetClassExtVersion,
|
|
Packit |
b099d7 |
sizeof(XmGadgetClassExtRec),
|
|
Packit |
b099d7 |
GetBaselines, /* widget_baseline */
|
|
Packit |
b099d7 |
GetDisplayRect, /* widget_display_rect */
|
|
Packit |
b099d7 |
MarginsProc, /* widget_margins */
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef( xmicongadgetclassrec) XmIconGadgetClassRec xmIconGadgetClassRec =
|
|
Packit |
b099d7 |
{ /* RectObjClassPart */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
(WidgetClass) &xmGadgetClassRec, /* superclass */
|
|
Packit |
b099d7 |
"XmIconGadget", /* class_name */
|
|
Packit |
b099d7 |
sizeof (XmIconGadgetRec), /* widget_size */
|
|
Packit |
b099d7 |
ClassInitialize, /* class_initialize */
|
|
Packit |
b099d7 |
ClassPartInitialize, /* class_part_initialize*/
|
|
Packit |
b099d7 |
False, /* class_inited */
|
|
Packit |
b099d7 |
Initialize, /* initialize */
|
|
Packit |
b099d7 |
NULL, /* initialize_hook */
|
|
Packit |
b099d7 |
NULL, /* realize */
|
|
Packit |
b099d7 |
NULL, /* actions */
|
|
Packit |
b099d7 |
0, /* num_actions */
|
|
Packit |
b099d7 |
resources, /* resources */
|
|
Packit |
b099d7 |
XtNumber (resources), /* num_resources */
|
|
Packit |
b099d7 |
NULLQUARK, /* xrm_class */
|
|
Packit |
b099d7 |
True, /* compress_motion */
|
|
Packit |
b099d7 |
True, /* compress_exposure */
|
|
Packit |
b099d7 |
True, /* compress_enterleave */
|
|
Packit |
b099d7 |
False, /* visible_interest */
|
|
Packit |
b099d7 |
Destroy, /* destroy */
|
|
Packit |
b099d7 |
NULL, /* resize */
|
|
Packit |
b099d7 |
Redisplay, /* expose */
|
|
Packit |
b099d7 |
SetValues, /* set_values */
|
|
Packit |
b099d7 |
NULL, /* set_values_hook */
|
|
Packit |
b099d7 |
XtInheritSetValuesAlmost, /* set_values_almost */
|
|
Packit |
b099d7 |
NULL, /* get_values_hook */
|
|
Packit |
b099d7 |
NULL, /* accept_focus */
|
|
Packit |
b099d7 |
XtVersion, /* version */
|
|
Packit |
b099d7 |
NULL, /* callback private */
|
|
Packit |
b099d7 |
NULL, /* tm_table */
|
|
Packit |
b099d7 |
QueryGeometry, /* query_geometry */
|
|
Packit |
b099d7 |
NULL, /* display_accelerator */
|
|
Packit |
b099d7 |
(XtPointer)&iconGBaseClassExtRec, /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* XmGadget Class Part */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
HighlightBorder, /* border_highlight */
|
|
Packit |
b099d7 |
UnhighlightBorder, /* border_unhighlight */
|
|
Packit |
b099d7 |
NULL, /* arm_and_activate */
|
|
Packit |
b099d7 |
InputDispatch, /* input_dispatch */
|
|
Packit |
b099d7 |
NULL, /* visual_change */
|
|
Packit |
b099d7 |
syn_resources, /* get_resources */
|
|
Packit |
b099d7 |
XtNumber(syn_resources), /* num_get_resources */
|
|
Packit |
b099d7 |
&IconGClassCachePart, /* class_cache_part */
|
|
Packit |
b099d7 |
(XtPointer)&GadClassExtRec, /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* XmIconGadget Class Part */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
NULL, /* get_container_parent */
|
|
Packit |
b099d7 |
NULL, /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(xmicongadgetclass) WidgetClass
|
|
Packit |
b099d7 |
xmIconGadgetClass=(WidgetClass)&xmIconGadgetClassRec;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ContainerItem Trait record for IconGadget */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmConst XmContainerItemTraitRec iconCIT = {
|
|
Packit |
b099d7 |
0, /* version */
|
|
Packit |
b099d7 |
ContItemSetValues,
|
|
Packit |
b099d7 |
ContItemGetValues,
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* CareVisual Trait record for IconGadget */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmConst XmCareVisualTraitRec iconCVT = {
|
|
Packit |
b099d7 |
0, /* version */
|
|
Packit |
b099d7 |
HandleRedraw,
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Access Colors Trait record for IconGadget */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmConst XmAccessColorsTraitRec iconACT = {
|
|
Packit |
b099d7 |
0, /* version */
|
|
Packit |
b099d7 |
GetColors
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Point In Trait record for IconGadget */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmConst XmPointInTraitRec iconPIT = {
|
|
Packit |
b099d7 |
0, /* version */
|
|
Packit |
b099d7 |
PointIn,
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** for the special IconPixmap/Mask converter */
|
|
Packit |
b099d7 |
static XtConvertArgRec largeIconArgs[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ XtBaseOffset, (XtPointer) 0, sizeof (int) },
|
|
Packit |
b099d7 |
{ XtAddress, (XtPointer)(int)XmLARGE_ICON, 0}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtConvertArgRec smallIconArgs[] =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ XtBaseOffset, (XtPointer) 0, sizeof (int) },
|
|
Packit |
b099d7 |
{ XtAddress, (XtPointer)(int)XmSMALL_ICON, 0}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*** XmRCallProcs ***/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* XmRCallProc routine for checking icon_cache.render_table before setting
|
|
Packit |
b099d7 |
* it to NULL. If "check_set_render_table" is True, then function has
|
|
Packit |
b099d7 |
* been called twice on same widget, thus resource needs to be set NULL,
|
|
Packit |
b099d7 |
* otherwise leave it alone.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
CheckSetRenderTable(Widget wid,
|
|
Packit |
b099d7 |
int offset,
|
|
Packit |
b099d7 |
XrmValue *value)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmIconGadget ig = (XmIconGadget)wid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Check if been here before */
|
|
Packit |
b099d7 |
if (ig->icong.check_set_render_table)
|
|
Packit |
b099d7 |
value->addr = NULL;
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
ig->icong.check_set_render_table = True;
|
|
Packit |
b099d7 |
value->addr = (char*)&(IG_RenderTable(ig));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* FetchPixmap
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
FetchPixmap(
|
|
Packit |
b099d7 |
Widget widget,
|
|
Packit |
b099d7 |
String image_name,
|
|
Packit |
b099d7 |
unsigned char res_type,
|
|
Packit |
b099d7 |
Pixmap * pixmap)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int depth ;
|
|
Packit |
b099d7 |
XtPointer mask_addr ;
|
|
Packit |
b099d7 |
XmAccessColorDataRec acc_color_rec;
|
|
Packit |
b099d7 |
XmAccessColorsTrait access_colors_trait ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
depth = - XtParent(widget)->core.depth;
|
|
Packit |
b099d7 |
/* this is the convention used by XmGetPixmapByDepth, pass
|
|
Packit |
b099d7 |
a negative depth means do bitmap if you can */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* always called when the cache is valid and the colors
|
|
Packit |
b099d7 |
can be returned */
|
|
Packit |
b099d7 |
access_colors_trait = (XmAccessColorsTrait)
|
|
Packit |
b099d7 |
XmeTraitGet((XtPointer)XtClass(widget), XmQTaccessColors) ;
|
|
Packit |
b099d7 |
access_colors_trait->getColors(widget, &acc_color_rec);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*pixmap = _XmGetScaledPixmap (XtScreen(widget), widget,
|
|
Packit |
b099d7 |
image_name, &acc_color_rec,
|
|
Packit |
b099d7 |
depth, FALSE, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (*pixmap == XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
return ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* now we see if a mask is to be fetched too */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (res_type == XmLARGE_ICON) {
|
|
Packit |
b099d7 |
mask_addr = (XtPointer)&(IG_LargeIconMask(widget)) ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
mask_addr = (XtPointer)&(IG_SmallIconMask(widget)) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* fetch only if a mask has not been specified in the resource slot */
|
|
Packit |
b099d7 |
if (*(Pixmap *)mask_addr == XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
char mask_name[255] ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Fetch the mask out of image_name and ask for it.
|
|
Packit |
b099d7 |
ImageCache:
|
|
Packit |
b099d7 |
The mask_name returned is the same as the one used by the
|
|
Packit |
b099d7 |
ImageCache reader to cache the mask associated with an XPM file,
|
|
Packit |
b099d7 |
so we will get it from the cache if an XPM file with a mask was
|
|
Packit |
b099d7 |
specified for image_name. When an XPM file with a mask
|
|
Packit |
b099d7 |
in it is read, the mask is cached with mask_name. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmOSGenerateMaskName(image_name, mask_name) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*(Pixmap*)mask_addr = (Pixmap) XmGetScaledPixmap(widget,
|
|
Packit |
b099d7 |
mask_name,
|
|
Packit |
b099d7 |
1, 0, 1, 0);
|
|
Packit |
b099d7 |
/* mark that we have to destroy the mask */
|
|
Packit |
b099d7 |
if (*(Pixmap *)mask_addr != XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
if (res_type == XmLARGE_ICON) {
|
|
Packit |
b099d7 |
XSaveContext(XtDisplay(widget),
|
|
Packit |
b099d7 |
(Window) widget,
|
|
Packit |
b099d7 |
largeIconContext,
|
|
Packit |
b099d7 |
(XPointer) True);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XSaveContext(XtDisplay(widget),
|
|
Packit |
b099d7 |
(Window) widget,
|
|
Packit |
b099d7 |
smallIconContext,
|
|
Packit |
b099d7 |
(XPointer) True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* CvtStringToIconPixmap
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
CvtStringToIconPixmap(
|
|
Packit |
b099d7 |
Display *dpy,
|
|
Packit |
b099d7 |
XrmValue *args,
|
|
Packit |
b099d7 |
Cardinal *numArgs,
|
|
Packit |
b099d7 |
XrmValue *fromVal,
|
|
Packit |
b099d7 |
XrmValue *toVal,
|
|
Packit |
b099d7 |
XtPointer *closure_ret) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Pixmap pixmap = XmUNSPECIFIED_PIXMAP;
|
|
Packit |
b099d7 |
String image_name = (String) (fromVal->addr);
|
|
Packit |
b099d7 |
Widget widget ;
|
|
Packit |
b099d7 |
unsigned char res_type;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (*numArgs != 2) {
|
|
Packit |
b099d7 |
XtAppWarningMsg (XtDisplayToApplicationContext(dpy),
|
|
Packit |
b099d7 |
"wrongParameters", "cvtStringToPixmap",
|
|
Packit |
b099d7 |
"XtToolkitError", MESSAGE0,
|
|
Packit |
b099d7 |
(String *) NULL, (Cardinal *)NULL);
|
|
Packit |
b099d7 |
return False;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* CR 7568: Set widget before we use it. */
|
|
Packit |
b099d7 |
widget = *((Widget *) args[0].addr);
|
|
Packit |
b099d7 |
/* get back the resource type: LARGE or SMALL_ICON */
|
|
Packit |
b099d7 |
res_type = (unsigned char) (int) (long) args[1].addr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XmeNamesAreEqual(image_name, "none")) {
|
|
Packit |
b099d7 |
pixmap = None ;
|
|
Packit |
b099d7 |
_XM_CONVERTER_DONE ( toVal, Pixmap, pixmap,
|
|
Packit |
b099d7 |
XmDestroyPixmap(XtScreen(widget), pixmap) ;)
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XmeNamesAreEqual(image_name, XmSunspecified_pixmap)) {
|
|
Packit |
b099d7 |
pixmap = XmUNSPECIFIED_PIXMAP ;
|
|
Packit |
b099d7 |
_XM_CONVERTER_DONE ( toVal, Pixmap, pixmap,
|
|
Packit |
b099d7 |
XmDestroyPixmap(XtScreen(widget), pixmap) ;)
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* First we have to check if the gadget has been initialized
|
|
Packit |
b099d7 |
before trying to create the pixmap. We need the colors
|
|
Packit |
b099d7 |
and if the cache is not yet created, we have to delay
|
|
Packit |
b099d7 |
the conversion. */
|
|
Packit |
b099d7 |
if (!IG_Cache(widget)) {
|
|
Packit |
b099d7 |
pixmap = XmDELAYED_PIXMAP;
|
|
Packit |
b099d7 |
/* we need to stach away the name of the pixmap resource,
|
|
Packit |
b099d7 |
since we'll need it in Initialize, when XmDELAYED_PIXMAP is
|
|
Packit |
b099d7 |
treated, and XtGetSubResources is not going to work for
|
|
Packit |
b099d7 |
XtVaTypeArg time resource, which are not in the database. */
|
|
Packit |
b099d7 |
if (res_type == XmLARGE_ICON)
|
|
Packit |
b099d7 |
IG_LargePixmapName(widget) = image_name ;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
IG_SmallPixmapName(widget) = image_name ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XM_CONVERTER_DONE ( toVal, Pixmap, pixmap,
|
|
Packit |
b099d7 |
XmDestroyPixmap(XtScreen(widget), pixmap) ;)
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* fetch the pixmap */
|
|
Packit |
b099d7 |
FetchPixmap(widget, image_name, res_type, &pixmap);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (pixmap == XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
XtDisplayStringConversionWarning(dpy, image_name,
|
|
Packit |
b099d7 |
"Large/SmallIconPixmap");
|
|
Packit |
b099d7 |
return False;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XM_CONVERTER_DONE ( toVal, Pixmap, pixmap,
|
|
Packit |
b099d7 |
XmDestroyPixmap(XtScreen(widget), pixmap) ;)
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetLabelString
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetLabelString(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
int offset, /* unused */
|
|
Packit |
b099d7 |
XtArgVal *value)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmString string = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_LabelString(wid))
|
|
Packit |
b099d7 |
string = XmStringCopy(IG_LabelString(wid));
|
|
Packit |
b099d7 |
*value = (XtArgVal)string;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SecondaryObjectCreate
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
SecondaryObjectCreate(
|
|
Packit |
b099d7 |
Widget req,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmBaseClassExt *cePtr;
|
|
Packit |
b099d7 |
XmWidgetExtData extData;
|
|
Packit |
b099d7 |
WidgetClass wc;
|
|
Packit |
b099d7 |
Cardinal size;
|
|
Packit |
b099d7 |
XtPointer newSec, reqSec;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
cePtr = _XmGetBaseClassExtPtr(XtClass(new_w), XmQmotif);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
wc = (*cePtr)->secondaryObjectClass;
|
|
Packit |
b099d7 |
size = wc->core_class.widget_size;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
newSec = _XmExtObjAlloc(size);
|
|
Packit |
b099d7 |
reqSec = _XmExtObjAlloc(size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Update pointers in instance records now so references to resources
|
|
Packit |
b099d7 |
* in the cache record will be valid for use in CallProcs.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_Cache(new_w) = &(((XmIconGCacheObject)newSec)->icon_cache);
|
|
Packit |
b099d7 |
IG_Cache(req) = &(((XmIconGCacheObject)reqSec)->icon_cache);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* fetch the resources in superclass to subclass order
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
XtGetSubresources(new_w,
|
|
Packit |
b099d7 |
newSec,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
wc->core_class.resources,
|
|
Packit |
b099d7 |
wc->core_class.num_resources,
|
|
Packit |
b099d7 |
args, *num_args );
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
extData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
|
|
Packit |
b099d7 |
extData->widget = (Widget)newSec;
|
|
Packit |
b099d7 |
extData->reqWidget = (Widget)reqSec;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
((XmIconGCacheObject)newSec)->ext.extensionType = XmCACHE_EXTENSION;
|
|
Packit |
b099d7 |
((XmIconGCacheObject)newSec)->ext.logicalParent = new_w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmPushWidgetExtData(new_w, extData,
|
|
Packit |
b099d7 |
((XmIconGCacheObject)newSec)->ext.extensionType);
|
|
Packit |
b099d7 |
memcpy(reqSec, newSec, size);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* InitializePosthook
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
InitializePosthook(
|
|
Packit |
b099d7 |
Widget req,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmWidgetExtData ext;
|
|
Packit |
b099d7 |
XmIconGadget sw = (XmIconGadget)new_w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* - register parts in cache.
|
|
Packit |
b099d7 |
* - update cache pointers
|
|
Packit |
b099d7 |
* - and free req
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
IG_Cache(sw) = (XmIconGCacheObjPart *)
|
|
Packit |
b099d7 |
_XmCachePart( IG_ClassCachePart(sw),
|
|
Packit |
b099d7 |
(XtPointer) IG_Cache(sw),
|
|
Packit |
b099d7 |
sizeof(XmIconGCacheObjPart));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* might want to break up into per-class work that gets explicitly
|
|
Packit |
b099d7 |
* chained. For right now, each class has to replicate all
|
|
Packit |
b099d7 |
* superclass logic in hook routine
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* free the req subobject used for comparisons
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
_XmPopWidgetExtData((Widget) sw, &ext, XmCACHE_EXTENSION);
|
|
Packit |
b099d7 |
_XmExtObjFree((XtPointer) ext->widget);
|
|
Packit |
b099d7 |
_XmExtObjFree((XtPointer) ext->reqWidget);
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
XtFree( (char *) ext);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SetValuesPrehook
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
SetValuesPrehook(
|
|
Packit |
b099d7 |
Widget oldParent,
|
|
Packit |
b099d7 |
Widget refParent,
|
|
Packit |
b099d7 |
Widget newParent,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmWidgetExtData extData;
|
|
Packit |
b099d7 |
XmBaseClassExt *cePtr;
|
|
Packit |
b099d7 |
WidgetClass ec;
|
|
Packit |
b099d7 |
XmIconGCacheObject newSec, reqSec;
|
|
Packit |
b099d7 |
Cardinal size;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
cePtr = _XmGetBaseClassExtPtr(XtClass(newParent), XmQmotif);
|
|
Packit |
b099d7 |
ec = (*cePtr)->secondaryObjectClass;
|
|
Packit |
b099d7 |
size = ec->core_class.widget_size;
|
|
Packit |
b099d7 |
newSec = (XmIconGCacheObject)_XmExtObjAlloc(size);
|
|
Packit |
b099d7 |
reqSec = (XmIconGCacheObject)_XmExtObjAlloc(size);
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
newSec->object.self = (Widget)newSec;
|
|
Packit |
b099d7 |
newSec->object.widget_class = ec;
|
|
Packit |
b099d7 |
newSec->object.parent = XtParent(newParent);
|
|
Packit |
b099d7 |
newSec->object.xrm_name = newParent->core.xrm_name;
|
|
Packit |
b099d7 |
newSec->object.being_destroyed = False;
|
|
Packit |
b099d7 |
newSec->object.destroy_callbacks = NULL;
|
|
Packit |
b099d7 |
newSec->object.constraints = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
newSec->ext.logicalParent = newParent;
|
|
Packit |
b099d7 |
newSec->ext.extensionType = XmCACHE_EXTENSION;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
memcpy( &(newSec->icon_cache),
|
|
Packit |
b099d7 |
IG_Cache(newParent),
|
|
Packit |
b099d7 |
sizeof(XmIconGCacheObjPart));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
extData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
|
|
Packit |
b099d7 |
extData->widget = (Widget)newSec;
|
|
Packit |
b099d7 |
extData->reqWidget = (Widget)reqSec;
|
|
Packit |
b099d7 |
_XmPushWidgetExtData(newParent, extData, XmCACHE_EXTENSION);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtSetSubvalues((XtPointer)newSec,
|
|
Packit |
b099d7 |
ec->core_class.resources,
|
|
Packit |
b099d7 |
ec->core_class.num_resources,
|
|
Packit |
b099d7 |
args, *num_args);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
memcpy((XtPointer)reqSec, (XtPointer)newSec, size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_Cache(newParent) = &(((XmIconGCacheObject)newSec)->icon_cache);
|
|
Packit |
b099d7 |
IG_Cache(refParent) =
|
|
Packit |
b099d7 |
&(((XmIconGCacheObject)extData->reqWidget)->icon_cache);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmExtImportArgs((Widget)newSec, args, num_args);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* GetValuesPrehook
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetValuesPrehook(
|
|
Packit |
b099d7 |
Widget newParent,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmWidgetExtData extData;
|
|
Packit |
b099d7 |
XmBaseClassExt *cePtr;
|
|
Packit |
b099d7 |
WidgetClass ec;
|
|
Packit |
b099d7 |
XmIconGCacheObject newSec;
|
|
Packit |
b099d7 |
Cardinal size;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
cePtr = _XmGetBaseClassExtPtr(XtClass(newParent), XmQmotif);
|
|
Packit |
b099d7 |
ec = (*cePtr)->secondaryObjectClass;
|
|
Packit |
b099d7 |
size = ec->core_class.widget_size;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
newSec = (XmIconGCacheObject)_XmExtObjAlloc(size);
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
newSec->object.self = (Widget)newSec;
|
|
Packit |
b099d7 |
newSec->object.widget_class = ec;
|
|
Packit |
b099d7 |
newSec->object.parent = XtParent(newParent);
|
|
Packit |
b099d7 |
newSec->object.xrm_name = newParent->core.xrm_name;
|
|
Packit |
b099d7 |
newSec->object.being_destroyed = False;
|
|
Packit |
b099d7 |
newSec->object.destroy_callbacks = NULL;
|
|
Packit |
b099d7 |
newSec->object.constraints = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
newSec->ext.logicalParent = newParent;
|
|
Packit |
b099d7 |
newSec->ext.extensionType = XmCACHE_EXTENSION;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
memcpy( &(newSec->icon_cache),
|
|
Packit |
b099d7 |
IG_Cache(newParent),
|
|
Packit |
b099d7 |
sizeof(XmIconGCacheObjPart));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
extData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
|
|
Packit |
b099d7 |
extData->widget = (Widget)newSec;
|
|
Packit |
b099d7 |
_XmPushWidgetExtData(newParent, extData, XmCACHE_EXTENSION);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtGetSubvalues((XtPointer)newSec,
|
|
Packit |
b099d7 |
ec->core_class.resources,
|
|
Packit |
b099d7 |
ec->core_class.num_resources,
|
|
Packit |
b099d7 |
args, *num_args);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmExtGetValuesHook((Widget)newSec, args, num_args);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* GetValuesPosthook
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetValuesPosthook(
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmWidgetExtData ext;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmPopWidgetExtData(new_w, &ext, XmCACHE_EXTENSION);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
_XmExtObjFree((XtPointer) ext->widget);
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
XtFree( (char *) ext);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SetValuesPosthook
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
SetValuesPosthook(
|
|
Packit |
b099d7 |
Widget current,
|
|
Packit |
b099d7 |
Widget req,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmWidgetExtData ext;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* - register parts in cache.
|
|
Packit |
b099d7 |
* - update cache pointers
|
|
Packit |
b099d7 |
* - and free req
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* assign if changed! */
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
if (!IconGCacheCompare((XtPointer) IG_Cache(new_w),
|
|
Packit |
b099d7 |
(XtPointer) IG_Cache(current)))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* delete the old one */
|
|
Packit |
b099d7 |
_XmCacheDelete( (XtPointer) IG_Cache(current));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_Cache(new_w) = (XmIconGCacheObjPart *)
|
|
Packit |
b099d7 |
_XmCachePart(IG_ClassCachePart(new_w),
|
|
Packit |
b099d7 |
(XtPointer) IG_Cache(new_w),
|
|
Packit |
b099d7 |
sizeof(XmIconGCacheObjPart));
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
IG_Cache(new_w) = IG_Cache(current);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmPopWidgetExtData(new_w, &ext, XmCACHE_EXTENSION);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmExtObjFree((XtPointer) ext->widget);
|
|
Packit |
b099d7 |
_XmExtObjFree((XtPointer) ext->reqWidget);
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree( (char *) ext);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*----------------
|
|
Packit |
b099d7 |
| RectObj methods |
|
|
Packit |
b099d7 |
----------------*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* ClassInitialize
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ClassInitialize( void )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
iconGBaseClassExtRec.record_type = XmQmotif;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Install the special converters for pixmap/mask */
|
|
Packit |
b099d7 |
XtSetTypeConverter (XmRString, XmRLargeIconPixmap,
|
|
Packit |
b099d7 |
CvtStringToIconPixmap,
|
|
Packit |
b099d7 |
largeIconArgs, XtNumber(largeIconArgs),
|
|
Packit |
b099d7 |
(XtCacheNone | XtCacheRefCount), NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtSetTypeConverter (XmRString, XmRSmallIconPixmap,
|
|
Packit |
b099d7 |
CvtStringToIconPixmap,
|
|
Packit |
b099d7 |
smallIconArgs, XtNumber(smallIconArgs),
|
|
Packit |
b099d7 |
(XtCacheNone | XtCacheRefCount), NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
largeIconContext = XUniqueContext();
|
|
Packit |
b099d7 |
smallIconContext = XUniqueContext();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* ClassPartInitialize
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ClassPartInitialize(
|
|
Packit |
b099d7 |
WidgetClass wc)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmFastSubclassInit(wc, XmICONGADGET_BIT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Install the containerItem trait for me and all subclasses */
|
|
Packit |
b099d7 |
XmeTraitSet((XtPointer) wc, XmQTcontainerItem, (XtPointer)&iconCIT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Install the care Visual trait for me and all subclasses */
|
|
Packit |
b099d7 |
XmeTraitSet((XtPointer) wc, XmQTcareParentVisual, (XtPointer)&iconCVT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Install the accessColors trait for all subclasses as well. */
|
|
Packit |
b099d7 |
XmeTraitSet((XtPointer) wc, XmQTaccessColors, (XtPointer)&iconACT);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Install the pointIn trait for all subclasses as well. */
|
|
Packit |
b099d7 |
XmeTraitSet((XtPointer) wc, XmQTpointIn, (XtPointer)&iconPIT);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* Initialize
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Initialize(
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args, /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmIconGadget new_ig = (XmIconGadget)nw;
|
|
Packit |
b099d7 |
unsigned int w = 0, h = 0;
|
|
Packit |
b099d7 |
Cardinal i ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* XmNviewType */
|
|
Packit |
b099d7 |
if (!XmRepTypeValidValue(XmRID_VIEW_TYPE,IG_ViewType(nw),nw))
|
|
Packit |
b099d7 |
IG_ViewType(nw) = XmLARGE_ICON;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* XmNvisualEmphasis */
|
|
Packit |
b099d7 |
if (!XmRepTypeValidValue(XmRID_VISUAL_EMPHASIS,
|
|
Packit |
b099d7 |
IG_VisualEmphasis(nw),nw))
|
|
Packit |
b099d7 |
IG_VisualEmphasis(nw) = XmNOT_SELECTED;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* XmNalignment */
|
|
Packit |
b099d7 |
if (!XmRepTypeValidValue(XmRID_ALIGNMENT, IG_Alignment(nw), nw))
|
|
Packit |
b099d7 |
IG_Alignment(nw) = XmALIGNMENT_CENTER;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* XmNrenderTable */
|
|
Packit |
b099d7 |
if (IG_RenderTable(nw) == NULL) {
|
|
Packit |
b099d7 |
XmRenderTable defaultRT = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtVaGetValues(XtParent(nw), XmNrenderTable, &defaultRT, NULL);
|
|
Packit |
b099d7 |
if (defaultRT == NULL)
|
|
Packit |
b099d7 |
defaultRT = XmeGetDefaultRenderTable(nw, XmLABEL_FONTLIST);
|
|
Packit |
b099d7 |
IG_RenderTable(nw) = XmRenderTableCopy(defaultRT, NULL, 0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
IG_RenderTable(nw) = XmRenderTableCopy(IG_RenderTable(nw), NULL, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* XmNlabelString */
|
|
Packit |
b099d7 |
if (!IG_LabelString(nw)) {
|
|
Packit |
b099d7 |
IG_LabelString(nw) = XmeGetLocalizedString (
|
|
Packit |
b099d7 |
(char *) NULL, nw, XmNlabelString,
|
|
Packit |
b099d7 |
XrmQuarkToString(new_ig->object.xrm_name));
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
IG_LabelString(nw) = XmStringCopy(IG_LabelString(nw));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* XmNdetail */
|
|
Packit |
b099d7 |
if (IG_Detail(nw) && IG_DetailCount(nw)) {
|
|
Packit |
b099d7 |
IG_Detail(nw) = (XmStringTable)
|
|
Packit |
b099d7 |
XtMalloc(IG_DetailCount(nw) * sizeof(XmString));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0; i
|
|
Packit |
b099d7 |
IG_Detail(nw)[i] = XmStringCopy(IG_Detail(rw)[i]);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* get the label size */
|
|
Packit |
b099d7 |
if (!XmStringEmpty(IG_LabelString(nw)))
|
|
Packit |
b099d7 |
XmStringExtent(IG_RenderTable(nw), IG_LabelString(nw),
|
|
Packit |
b099d7 |
&(IG_LabelRectWidth(nw)),
|
|
Packit |
b099d7 |
&(IG_LabelRectHeight(nw)));
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
IG_LabelRectWidth(nw) = 0 ;
|
|
Packit |
b099d7 |
IG_LabelRectHeight(nw) = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
/* put the margins in the label size, we'll remove them when
|
|
Packit |
b099d7 |
it's time to draw the label */
|
|
Packit |
b099d7 |
IG_LabelRectWidth(nw) += 2*DEFAULT_LABEL_MARGIN_WIDTH ;
|
|
Packit |
b099d7 |
IG_LabelRectHeight(nw) += 2*DEFAULT_LABEL_MARGIN_HEIGHT ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* before doing anything with the pixmap, check if we have to
|
|
Packit |
b099d7 |
re-ask for a conversion */
|
|
Packit |
b099d7 |
if (IG_LargeIconPixmap(nw) == XmDELAYED_PIXMAP) {
|
|
Packit |
b099d7 |
/* this test means that a conversion was asked for
|
|
Packit |
b099d7 |
but failed because the colors were not accessible
|
|
Packit |
b099d7 |
prior to Initialize, because the cache wasn't there yet.
|
|
Packit |
b099d7 |
We have to try again from here. */
|
|
Packit |
b099d7 |
FetchPixmap(nw, IG_LargePixmapName(nw), XmLARGE_ICON,
|
|
Packit |
b099d7 |
&(IG_LargeIconPixmap(nw)));
|
|
Packit |
b099d7 |
if (IG_LargeIconPixmap(nw) == XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
XtDisplayStringConversionWarning(XtDisplay(nw),
|
|
Packit |
b099d7 |
IG_LargePixmapName(nw),
|
|
Packit |
b099d7 |
"Large/SmallIconPixmap");
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_SmallIconPixmap(nw) == XmDELAYED_PIXMAP) {
|
|
Packit |
b099d7 |
FetchPixmap(nw, IG_SmallPixmapName(nw), XmSMALL_ICON,
|
|
Packit |
b099d7 |
&(IG_SmallIconPixmap(nw)));
|
|
Packit |
b099d7 |
if (IG_SmallIconPixmap(nw) == XmUNSPECIFIED_PIXMAP) {
|
|
Packit |
b099d7 |
XtDisplayStringConversionWarning(XtDisplay(nw),
|
|
Packit |
b099d7 |
IG_SmallPixmapName(nw),
|
|
Packit |
b099d7 |
"Large/SmallIconPixmap");
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* get the large icon size */
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_LargeIconPixmap(nw)))
|
|
Packit |
b099d7 |
XmeGetPixmapData(XtScreen(nw),
|
|
Packit |
b099d7 |
IG_LargeIconPixmap(nw),
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
&w, &h);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w = h = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_LargeIconRectWidth(nw) = (Dimension)w;
|
|
Packit |
b099d7 |
IG_LargeIconRectHeight(nw) = (Dimension)h;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* get the small icon size */
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_SmallIconPixmap(nw)))
|
|
Packit |
b099d7 |
XmeGetPixmapData(XtScreen(nw),
|
|
Packit |
b099d7 |
IG_SmallIconPixmap(nw),
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
&w, &h);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w = h = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_SmallIconRectWidth(nw) = (Dimension)w;
|
|
Packit |
b099d7 |
IG_SmallIconRectHeight(nw) = (Dimension)h;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* turn None in unspecified, since it is the only value
|
|
Packit |
b099d7 |
Container supports */
|
|
Packit |
b099d7 |
if (IG_LargeIconPixmap(nw) == None)
|
|
Packit |
b099d7 |
IG_LargeIconPixmap(nw) = XmUNSPECIFIED_PIXMAP ;
|
|
Packit |
b099d7 |
if (IG_SmallIconPixmap(nw) == None)
|
|
Packit |
b099d7 |
IG_SmallIconPixmap(nw) = XmUNSPECIFIED_PIXMAP ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****
|
|
Packit |
b099d7 |
we want the mask to act as a max for the size of the
|
|
Packit |
b099d7 |
overall pixmap .
|
|
Packit |
b099d7 |
We need to get the mask sizes first.
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_LargeMaskWidth(nw))
|
|
Packit |
b099d7 |
IG_LargeIconRectWidth(nw) = MIN(IG_LargeIconRectWidth(nw),
|
|
Packit |
b099d7 |
IG_LargeMaskWidth(nw)) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_LargeMaskHeight(nw))
|
|
Packit |
b099d7 |
IG_LargeIconRectHeight(nw) = MIN(IG_LargeIconRectHeight(nw),
|
|
Packit |
b099d7 |
IG_LargeMaskHeight(nw)) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_SmallMaskWidth(nw))
|
|
Packit |
b099d7 |
IG_SmallIconRectWidth(nw) = MIN(IG_SmallIconRectWidth(nw),
|
|
Packit |
b099d7 |
IG_SmallMaskWidth(nw)) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_SmallMaskHeight(nw))
|
|
Packit |
b099d7 |
IG_SmallIconRectHeight(nw) = MIN(IG_SmallIconRectHeight(nw),
|
|
Packit |
b099d7 |
IG_SmallMaskHeight(nw)) ;
|
|
Packit |
b099d7 |
*****/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* undo our superclass size check */
|
|
Packit |
b099d7 |
if (((XmGadget)rw)->rectangle.width == 0)
|
|
Packit |
b099d7 |
new_ig->rectangle.width = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (((XmGadget)rw)->rectangle.height == 0)
|
|
Packit |
b099d7 |
new_ig->rectangle.height = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* if a size has been specified (not 0), it won't be altered
|
|
Packit |
b099d7 |
by the GetSize function */
|
|
Packit |
b099d7 |
GetSize(nw, &new_ig->rectangle.width, &new_ig->rectangle.height);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_NormalGC(nw) = NULL;
|
|
Packit |
b099d7 |
IG_BackgroundGC(nw) = NULL;
|
|
Packit |
b099d7 |
IG_InsensitiveGC(nw) = NULL;
|
|
Packit |
b099d7 |
#ifdef FIX_1381
|
|
Packit |
b099d7 |
IG_ShadowGC(nw) = NULL;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
IG_TopShadowGC(nw) = NULL;
|
|
Packit |
b099d7 |
IG_BottomShadowGC(nw) = NULL;
|
|
Packit |
b099d7 |
IG_HighlightGC(nw) = NULL;
|
|
Packit |
b099d7 |
IG_InverseGC(nw) = NULL;
|
|
Packit |
b099d7 |
IG_SelectedGC(nw) = NULL; /* otherwize UpdateGCs frees them */
|
|
Packit |
b099d7 |
UpdateGCs(nw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
new_ig->gadget.event_mask = XmHELP_EVENT |
|
|
Packit |
b099d7 |
XmFOCUS_IN_EVENT | XmFOCUS_OUT_EVENT | XmENTER_EVENT | XmLEAVE_EVENT ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* Destroy
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Destroy(
|
|
Packit |
b099d7 |
Widget wid)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Cardinal i ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_RenderTable(wid) != NULL) XmRenderTableFree(IG_RenderTable(wid));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_LabelString(wid) != NULL) XmStringFree(IG_LabelString(wid));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_Detail(wid) && IG_DetailCount(wid)) {
|
|
Packit |
b099d7 |
for (i=0; i
|
|
Packit |
b099d7 |
XmStringFree(IG_Detail(wid)[i]);
|
|
Packit |
b099d7 |
XtFree((char*)IG_Detail(wid));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (OwnLargeMask(wid)) {
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_LargeIconMask(wid)) )
|
|
Packit |
b099d7 |
XmDestroyPixmap(XtScreen(wid),IG_LargeIconMask(wid));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (OwnSmallMask(wid)) {
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_SmallIconMask(wid)))
|
|
Packit |
b099d7 |
XmDestroyPixmap(XtScreen(wid),IG_SmallIconMask(wid));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
/* the IconPixmap is freed by the converter destructor */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_NormalGC(wid));
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_InsensitiveGC(wid));
|
|
Packit |
b099d7 |
#ifdef FIX_1381
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_ShadowGC(wid));
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_BackgroundGC(wid));
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_SelectedGC(wid));
|
|
Packit |
b099d7 |
if (IG_InverseGC(wid)) XtReleaseGC(XtParent(wid),IG_InverseGC(wid));
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_TopShadowGC(wid));
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_BottomShadowGC(wid));
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_HighlightGC(wid));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
_XmCacheDelete((XtPointer) IG_Cache(wid));
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetLabelXY
|
|
Packit |
b099d7 |
* from origin of gadget
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetLabelXY(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
Position * x_ret,
|
|
Packit |
b099d7 |
Position * y_ret)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension ist = IG_ShadowThickness(wid);
|
|
Packit |
b099d7 |
Position label_x = ist;
|
|
Packit |
b099d7 |
Position label_y = ist;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define HAS_PIXMAP(wid) \
|
|
Packit |
b099d7 |
(((IG_ViewType(wid) == XmLARGE_ICON) && \
|
|
Packit |
b099d7 |
(PIXMAP_VALID(IG_LargeIconPixmap(wid)))) || \
|
|
Packit |
b099d7 |
((IG_ViewType(wid) == XmSMALL_ICON) && \
|
|
Packit |
b099d7 |
(PIXMAP_VALID(IG_SmallIconPixmap(wid)))))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define SPACING(wid) (HAS_PIXMAP(wid) ? IG_Spacing(wid) : 0)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define HAS_MASK(wid) \
|
|
Packit |
b099d7 |
(((IG_ViewType(wid) == XmSMALL_ICON) && \
|
|
Packit |
b099d7 |
(PIXMAP_VALID(IG_SmallIconMask(wid)))) ||\
|
|
Packit |
b099d7 |
((IG_ViewType(wid) == XmLARGE_ICON) && \
|
|
Packit |
b099d7 |
(PIXMAP_VALID(IG_LargeIconMask(wid)))))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_ViewType(wid) == XmLARGE_ICON) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((IG_Alignment(wid) == XmALIGNMENT_CENTER) && !HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid)))
|
|
Packit |
b099d7 |
label_x += (IG_LargeIconRectWidth(wid) - IG_LabelRectWidth(wid))/2;
|
|
Packit |
b099d7 |
else if ((IG_Alignment(wid) == XmALIGNMENT_CENTER) && HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid) + 2*ist))
|
|
Packit |
b099d7 |
label_x += (IG_LargeIconRectWidth(wid) -
|
|
Packit |
b099d7 |
IG_LabelRectWidth(wid) - 2*ist)/2;
|
|
Packit |
b099d7 |
else if ((IG_Alignment(wid) == XmALIGNMENT_END) && !HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid)))
|
|
Packit |
b099d7 |
label_x += IG_LargeIconRectWidth(wid) - IG_LabelRectWidth(wid);
|
|
Packit |
b099d7 |
else if ((IG_Alignment(wid) == XmALIGNMENT_END) && HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid) + 2*ist))
|
|
Packit |
b099d7 |
label_x +=
|
|
Packit |
b099d7 |
IG_LargeIconRectWidth(wid) - IG_LabelRectWidth(wid) - 2*ist;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
label_y += IG_LargeIconRectHeight(wid) + SPACING(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} else { /* XmSMALL_ICON */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
label_x += IG_SmallIconRectWidth(wid) + SPACING(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_SmallIconRectHeight(wid) > IG_LabelRectHeight(wid)))
|
|
Packit |
b099d7 |
label_y += (IG_SmallIconRectHeight(wid) -
|
|
Packit |
b099d7 |
IG_LabelRectHeight(wid))/2 ;
|
|
Packit |
b099d7 |
else if (HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_SmallIconRectHeight(wid) > IG_LabelRectHeight(wid) + 2*ist))
|
|
Packit |
b099d7 |
label_y += (IG_SmallIconRectHeight(wid) -
|
|
Packit |
b099d7 |
IG_LabelRectHeight(wid) - 2*ist)/2 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
label_x += IG_MarginWidth(wid);
|
|
Packit |
b099d7 |
/* test LayoutIsRtoLG(wid) here */
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid)) {
|
|
Packit |
b099d7 |
label_x = XtWidth(wid) - label_x - IG_LabelRectWidth(wid)
|
|
Packit |
b099d7 |
- IG_HLThickness(wid);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
label_x += IG_HLThickness(wid) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (x_ret) *x_ret = label_x;
|
|
Packit |
b099d7 |
if (y_ret) *y_ret = label_y + IG_HLThickness(wid) + IG_MarginHeight(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetLargeIconX
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static Position
|
|
Packit |
b099d7 |
GetLargeIconX(
|
|
Packit |
b099d7 |
Widget wid)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* no test LayoutIsRtoLG(wid) here */
|
|
Packit |
b099d7 |
Dimension ist = IG_ShadowThickness(wid);
|
|
Packit |
b099d7 |
Position large_x = IG_HLThickness(wid) + IG_MarginWidth(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((IG_Alignment(wid) == XmALIGNMENT_CENTER) && !HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LabelRectWidth(wid) > IG_LargeIconRectWidth(wid)))
|
|
Packit |
b099d7 |
large_x += (IG_LabelRectWidth(wid) - IG_LargeIconRectWidth(wid)) /2;
|
|
Packit |
b099d7 |
else if ((IG_Alignment(wid) == XmALIGNMENT_CENTER) && HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LabelRectWidth(wid) + 2*ist > IG_LargeIconRectWidth(wid)))
|
|
Packit |
b099d7 |
large_x +=
|
|
Packit |
b099d7 |
(IG_LabelRectWidth(wid) + 2*ist - IG_LargeIconRectWidth(wid)) /2;
|
|
Packit |
b099d7 |
else if ((IG_Alignment(wid) == XmALIGNMENT_END) && !HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LargeIconRectWidth(wid) < IG_LabelRectWidth(wid)))
|
|
Packit |
b099d7 |
large_x += IG_LabelRectWidth(wid) - IG_LargeIconRectWidth(wid);
|
|
Packit |
b099d7 |
else if ((IG_Alignment(wid) == XmALIGNMENT_END) && HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LargeIconRectWidth(wid) < IG_LabelRectWidth(wid) + 2*ist))
|
|
Packit |
b099d7 |
large_x += IG_LabelRectWidth(wid) + 2*ist - IG_LargeIconRectWidth(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!HAS_MASK(wid))
|
|
Packit |
b099d7 |
large_x += ist;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return large_x;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetLargeIconY
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/* the shadow thickness is only incorporated when there is no mask */
|
|
Packit |
b099d7 |
#define GetLargeIconY(wid) (IG_HLThickness(wid) + IG_MarginHeight(wid) + \
|
|
Packit |
b099d7 |
(HAS_MASK(wid) ? 0 : IG_ShadowThickness(wid)))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetSmallIconX
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/* the shadow thickness is only incorporated when there is no mask */
|
|
Packit |
b099d7 |
#define GetSmallIconX(wid) (IG_HLThickness(wid) + IG_MarginWidth(wid) + \
|
|
Packit |
b099d7 |
(HAS_MASK(wid) ? 0 : IG_ShadowThickness(wid)))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetSmallIconY
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static Position
|
|
Packit |
b099d7 |
GetSmallIconY(
|
|
Packit |
b099d7 |
Widget wid)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension ist = IG_ShadowThickness(wid);
|
|
Packit |
b099d7 |
Position small_y = IG_HLThickness(wid) + IG_MarginHeight(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LabelRectHeight(wid) > IG_SmallIconRectHeight(wid)))
|
|
Packit |
b099d7 |
small_y += (IG_LabelRectHeight(wid) - IG_SmallIconRectHeight(wid))/2;
|
|
Packit |
b099d7 |
else if (HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LabelRectHeight(wid) + 2*ist > IG_SmallIconRectHeight(wid)))
|
|
Packit |
b099d7 |
small_y += (IG_LabelRectHeight(wid) + 2*ist -
|
|
Packit |
b099d7 |
IG_SmallIconRectHeight(wid))/2;
|
|
Packit |
b099d7 |
if (!HAS_MASK(wid))
|
|
Packit |
b099d7 |
small_y += ist;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return small_y;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetIconLabelWidth
|
|
Packit |
b099d7 |
* including the shadows, the spacing, and the margin
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
GetIconLabelWidth(
|
|
Packit |
b099d7 |
Widget wid)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension width = 2*IG_MarginWidth(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_ViewType(wid) == XmLARGE_ICON) {
|
|
Packit |
b099d7 |
if (!HAS_MASK(wid))
|
|
Packit |
b099d7 |
width += MAX(IG_LargeIconRectWidth(wid),
|
|
Packit |
b099d7 |
IG_LabelRectWidth(wid)) + 2*IG_ShadowThickness(wid);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
width += MAX(IG_LargeIconRectWidth(wid),
|
|
Packit |
b099d7 |
IG_LabelRectWidth(wid) + 2*IG_ShadowThickness(wid));
|
|
Packit |
b099d7 |
} else { /* XmSMALL_ICON */
|
|
Packit |
b099d7 |
width += IG_SmallIconRectWidth(wid) + IG_LabelRectWidth(wid) +
|
|
Packit |
b099d7 |
2*IG_ShadowThickness(wid) + SPACING(wid);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetIconLabelHeight
|
|
Packit |
b099d7 |
* including the shadows, the possible spacing, and the margin
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static Dimension
|
|
Packit |
b099d7 |
GetIconLabelHeight(
|
|
Packit |
b099d7 |
Widget wid)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension height = 2*IG_MarginHeight(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_ViewType(wid) == XmLARGE_ICON) {
|
|
Packit |
b099d7 |
height += IG_LargeIconRectHeight(wid) + IG_LabelRectHeight(wid) +
|
|
Packit |
b099d7 |
2*IG_ShadowThickness(wid) + SPACING(wid);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
if (!HAS_MASK(wid))
|
|
Packit |
b099d7 |
height += MAX(IG_SmallIconRectHeight(wid),
|
|
Packit |
b099d7 |
IG_LabelRectHeight(wid)) + 2*IG_ShadowThickness(wid);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
height += MAX(IG_SmallIconRectHeight(wid),
|
|
Packit |
b099d7 |
IG_LabelRectHeight(wid) + 2*IG_ShadowThickness(wid));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return height;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***********
|
|
Packit |
b099d7 |
* GetShapeInfo.
|
|
Packit |
b099d7 |
* This return the points that defines the shadow rectangle.
|
|
Packit |
b099d7 |
* Since this function is used for both shadow and highlight,
|
|
Packit |
b099d7 |
* the ht parameter is used to differentiate both case. It is -1
|
|
Packit |
b099d7 |
* for the highlight case and the real highlightthickness for
|
|
Packit |
b099d7 |
* the shadow case.
|
|
Packit |
b099d7 |
* The coordinates passed in should not have integrate any RtoL
|
|
Packit |
b099d7 |
* layout yet, since the function is doing mirroring at the end.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* The function returns the number of valid points (8 points in
|
|
Packit |
b099d7 |
* the generic case or only 2 points for a rectangle).
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
**********/
|
|
Packit |
b099d7 |
static Cardinal
|
|
Packit |
b099d7 |
GetShapeInfo(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
Position large_icon_x,
|
|
Packit |
b099d7 |
Position small_icon_y,
|
|
Packit |
b099d7 |
Position label_x,
|
|
Packit |
b099d7 |
Position label_y,
|
|
Packit |
b099d7 |
Dimension first_column_width,
|
|
Packit |
b099d7 |
Dimension ht,
|
|
Packit |
b099d7 |
XPoint * points)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension ist = IG_ShadowThickness(wid), rht = IG_HLThickness(wid);
|
|
Packit |
b099d7 |
Cardinal i, n = 8;
|
|
Packit |
b099d7 |
XmIconGadget ig = (XmIconGadget) wid ;
|
|
Packit |
b099d7 |
Boolean highlight_case ;
|
|
Packit |
b099d7 |
Dimension mh, mw, rmh = IG_MarginHeight(wid), rmw = IG_MarginWidth(wid);
|
|
Packit |
b099d7 |
Dimension maxX;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (ht == INVALID_DIMENSION) {
|
|
Packit |
b099d7 |
/* If we're doing the highlight case, mark the dimension
|
|
Packit |
b099d7 |
as zero but remember it so that the shadow is not drawn
|
|
Packit |
b099d7 |
later on in this routine */
|
|
Packit |
b099d7 |
ht = 0 ;
|
|
Packit |
b099d7 |
highlight_case = True ;
|
|
Packit |
b099d7 |
mw = mh = 0;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
highlight_case = False ;
|
|
Packit |
b099d7 |
mw = rmw;
|
|
Packit |
b099d7 |
mh = rmh;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* then first treat the simple case where either the pixmap or
|
|
Packit |
b099d7 |
the label is missing */
|
|
Packit |
b099d7 |
points[0].x = ht + mw;
|
|
Packit |
b099d7 |
points[0].y = ht + mh;
|
|
Packit |
b099d7 |
points[1].x = 2*ist + 2*rht - ht + 2*rmw - mw;
|
|
Packit |
b099d7 |
points[1].y = 2*ist + 2*rht - ht + 2*rmh - mh;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XmStringEmpty(IG_LabelString(wid))) { /* no label */
|
|
Packit |
b099d7 |
if ((IG_ViewType(wid) == XmLARGE_ICON) &&
|
|
Packit |
b099d7 |
(PIXMAP_VALID(IG_LargeIconPixmap(wid)))) {
|
|
Packit |
b099d7 |
points[1].x += IG_LargeIconRectWidth(wid) ;
|
|
Packit |
b099d7 |
points[1].y += IG_LargeIconRectHeight(wid) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if ((IG_ViewType(wid) == XmSMALL_ICON) &&
|
|
Packit |
b099d7 |
(PIXMAP_VALID(IG_SmallIconPixmap(wid)))) {
|
|
Packit |
b099d7 |
points[1].x += IG_SmallIconRectWidth(wid) ;
|
|
Packit |
b099d7 |
points[1].y += IG_SmallIconRectHeight(wid) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
n = 2 ;
|
|
Packit |
b099d7 |
} else {/* a label */
|
|
Packit |
b099d7 |
if (!HAS_PIXMAP(wid)) { /* but no pixmap */
|
|
Packit |
b099d7 |
points[1].x += IG_LabelRectWidth(wid) ;
|
|
Packit |
b099d7 |
points[1].y += IG_LabelRectHeight(wid) ;
|
|
Packit |
b099d7 |
n = 2 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (n == 8 && IG_ViewType(wid) == XmLARGE_ICON) {
|
|
Packit |
b099d7 |
/* point #0 is top left corner of label */
|
|
Packit |
b099d7 |
points[0].x = label_x - ist - rht + ht - rmw + mw;
|
|
Packit |
b099d7 |
points[0].y = ht + mh + IG_LargeIconRectHeight(wid);
|
|
Packit |
b099d7 |
if ((!HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid))) ||
|
|
Packit |
b099d7 |
(HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_LargeIconRectWidth(wid) > IG_LabelRectWidth(wid) + 2*ist))) {
|
|
Packit |
b099d7 |
points[0].y += 2*rht - 2*ht + 2*rmh - 2*mh;
|
|
Packit |
b099d7 |
if (!HAS_MASK(wid)) points[0].y += 2*ist -1;
|
|
Packit |
b099d7 |
else if (highlight_case) points[0].y -= 1;
|
|
Packit |
b099d7 |
if (!highlight_case && HAS_MASK(wid))
|
|
Packit |
b099d7 |
points[0].y += SPACING(wid);
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
points[0].y += SPACING(wid);
|
|
Packit |
b099d7 |
points[1].x = large_icon_x - (ist + rht - ht + rmw - mw);
|
|
Packit |
b099d7 |
if (highlight_case && HAS_MASK(wid)) points[1].x += ist;
|
|
Packit |
b099d7 |
points[1].y = points[0].y ;
|
|
Packit |
b099d7 |
points[2].x = points[1].x ;
|
|
Packit |
b099d7 |
points[2].y = ht + mh;
|
|
Packit |
b099d7 |
points[3].x = large_icon_x +
|
|
Packit |
b099d7 |
IG_LargeIconRectWidth(wid) + ist + rht - ht + rmw - mw -1;
|
|
Packit |
b099d7 |
if (highlight_case && HAS_MASK(wid)) points[3].x -= ist;
|
|
Packit |
b099d7 |
points[3].y = points[2].y ;
|
|
Packit |
b099d7 |
points[4].x = points[3].x ;
|
|
Packit |
b099d7 |
points[4].y = points[0].y;
|
|
Packit |
b099d7 |
points[5].x = label_x +
|
|
Packit |
b099d7 |
IG_LabelRectWidth(wid) + ist + rht - ht + rmw - mw -1;
|
|
Packit |
b099d7 |
if (!highlight_case && HAS_MASK(wid) && ist) points[5].x += 1 ;
|
|
Packit |
b099d7 |
points[5].y = points[0].y ;
|
|
Packit |
b099d7 |
points[6].x = points[5].x ;
|
|
Packit |
b099d7 |
points[6].y = IG_LargeIconRectHeight(wid) + IG_LabelRectHeight(wid) +
|
|
Packit |
b099d7 |
2*ist + 2*rht - ht + 2*rmh - mh + SPACING(wid) -1;
|
|
Packit |
b099d7 |
if (!highlight_case && HAS_MASK(wid) && ist) points[6].y += 1 ;
|
|
Packit |
b099d7 |
points[7].x = points[0].x ;
|
|
Packit |
b099d7 |
points[7].y = points[6].y ;
|
|
Packit |
b099d7 |
} else if (n == 8) { /* SMALL_ICON */
|
|
Packit |
b099d7 |
/* point #0 is top left corner of pixmap */
|
|
Packit |
b099d7 |
points[0].x = ht + mw;
|
|
Packit |
b099d7 |
points[0].y = small_icon_y - ist - rht + ht - rmh + mh;
|
|
Packit |
b099d7 |
if (highlight_case && HAS_MASK(wid)) points[0].y += ist;
|
|
Packit |
b099d7 |
points[1].x = IG_SmallIconRectWidth(wid) + ht + mw;
|
|
Packit |
b099d7 |
if ((!HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_SmallIconRectHeight(wid) > IG_LabelRectHeight(wid))) ||
|
|
Packit |
b099d7 |
(HAS_MASK(wid) &&
|
|
Packit |
b099d7 |
(IG_SmallIconRectHeight(wid) > IG_LabelRectHeight(wid) + 2*ist))){
|
|
Packit |
b099d7 |
points[1].x += 2*rht - 2*ht + 2*rmw - 2*mw;
|
|
Packit |
b099d7 |
if (!HAS_MASK(wid)) points[1].x += 2*ist -1;
|
|
Packit |
b099d7 |
else if (highlight_case) points[1].x -= 1;
|
|
Packit |
b099d7 |
if (!highlight_case && HAS_MASK(wid))
|
|
Packit |
b099d7 |
points[1].x += SPACING(wid);
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
points[1].x += SPACING(wid);
|
|
Packit |
b099d7 |
points[1].y = points[0].y;
|
|
Packit |
b099d7 |
points[2].x = points[1].x;
|
|
Packit |
b099d7 |
points[2].y = label_y - ist - rht + ht - rmh + mh;
|
|
Packit |
b099d7 |
points[3].x = IG_SmallIconRectWidth(wid) + SPACING(wid) +
|
|
Packit |
b099d7 |
IG_LabelRectWidth(wid) + 2*ist + 2*rht - ht + 2*rmw - mw -1;
|
|
Packit |
b099d7 |
if (highlight_case && HAS_MASK(wid)) points[3].x -= 1 ;
|
|
Packit |
b099d7 |
points[3].y = points[2].y;
|
|
Packit |
b099d7 |
points[4].x = points[3].x;
|
|
Packit |
b099d7 |
points[4].y = label_y + IG_LabelRectHeight(wid) +
|
|
Packit |
b099d7 |
ist + rht - ht + rmh - mh -1;
|
|
Packit |
b099d7 |
if (!highlight_case && HAS_MASK(wid) && ist) points[4].y += 1;
|
|
Packit |
b099d7 |
points[5].x = points[1].x;
|
|
Packit |
b099d7 |
points[5].y = points[4].y;
|
|
Packit |
b099d7 |
points[6].x = points[5].x;
|
|
Packit |
b099d7 |
points[6].y = small_icon_y +
|
|
Packit |
b099d7 |
IG_SmallIconRectHeight(wid) + ist + rht - ht + rmh - mh -1;
|
|
Packit |
b099d7 |
if (highlight_case && HAS_MASK(wid)) points[6].y -= ist;
|
|
Packit |
b099d7 |
points[7].x = points[0].x ;
|
|
Packit |
b099d7 |
points[7].y = points[6].y;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* now treat the case where the pixmap is present
|
|
Packit |
b099d7 |
but it has a mask: no shadow around the pixmap, just the
|
|
Packit |
b099d7 |
label, if there is a label of course.
|
|
Packit |
b099d7 |
Only aply for the shadow, not for the highlight, so we
|
|
Packit |
b099d7 |
checked that using the ht parameter at the beginning */
|
|
Packit |
b099d7 |
if (HAS_MASK(wid) && !highlight_case) {
|
|
Packit |
b099d7 |
if (XmStringEmpty(IG_LabelString(wid))) {
|
|
Packit |
b099d7 |
return 0 ;
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
if (n == 8) {
|
|
Packit |
b099d7 |
/* uses the points already computed for the polygon shadow case */
|
|
Packit |
b099d7 |
if (IG_ViewType(wid) == XmLARGE_ICON) {
|
|
Packit |
b099d7 |
points[0].x = points[0].x ;
|
|
Packit |
b099d7 |
points[0].y = points[0].y ;
|
|
Packit |
b099d7 |
points[1].x = points[6].x ;
|
|
Packit |
b099d7 |
points[1].y = points[6].y ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
points[0].x = points[2].x ;
|
|
Packit |
b099d7 |
points[0].y = points[2].y ;
|
|
Packit |
b099d7 |
points[1].x = points[4].x ;
|
|
Packit |
b099d7 |
points[1].y = points[4].y ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
n = 2 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* put the points in the frame */
|
|
Packit |
b099d7 |
if (highlight_case)
|
|
Packit |
b099d7 |
maxX = ig->rectangle.width - ht - mw;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
maxX = MIN(ig->rectangle.width - ht - mw, first_column_width);
|
|
Packit |
b099d7 |
for (i=0; i
|
|
Packit |
b099d7 |
if (points[i].x > maxX)
|
|
Packit |
b099d7 |
points[i].x = maxX;
|
|
Packit |
b099d7 |
if (points[i].y > ig->rectangle.height - ht - mh)
|
|
Packit |
b099d7 |
points[i].y = ig->rectangle.height - ht - mh;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* add the gadget position in its parent */
|
|
Packit |
b099d7 |
points[i].x += ig->rectangle.x ;
|
|
Packit |
b099d7 |
points[i].y += ig->rectangle.y ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* test LayoutIsRtoLG(wid) here */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid) ) {
|
|
Packit |
b099d7 |
/* mirror the x position */
|
|
Packit |
b099d7 |
for (i = 0; i < n; i++)
|
|
Packit |
b099d7 |
points[i].x = 2*ig->rectangle.x + XtWidth(wid) - points[i].x -1;
|
|
Packit |
b099d7 |
/* + in the rectangle case, switch x because of XmeDrawShadow
|
|
Packit |
b099d7 |
required left-upper right-bottom point order */
|
|
Packit |
b099d7 |
if (n == 2) {
|
|
Packit |
b099d7 |
Position save_x = points[1].x ;
|
|
Packit |
b099d7 |
points[1].x = points[0].x +1;
|
|
Packit |
b099d7 |
points[0].x = save_x +1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return n ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***********
|
|
Packit |
b099d7 |
* GetContainerData
|
|
Packit |
b099d7 |
**********/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetContainerData(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XmContainerData container_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmIconGadgetClass igc = (XmIconGadgetClass) XtClass(wid);
|
|
Packit |
b099d7 |
Widget container_id ;
|
|
Packit |
b099d7 |
XmContainerTrait container_trait ;
|
|
Packit |
b099d7 |
XmIconGadget ig = (XmIconGadget)wid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** initialize the trait struct */
|
|
Packit |
b099d7 |
/* need to set detail_order_count and first_column so that
|
|
Packit |
b099d7 |
container gets a min base. The problem we're trying to solve here
|
|
Packit |
b099d7 |
is when the first kid gets created, when it computes its preferred
|
|
Packit |
b099d7 |
size from its Initialize method, the container cannot come up
|
|
Packit |
b099d7 |
for a valid dynamic detail_order_count or first_column_width
|
|
Packit |
b099d7 |
since it doesn't have any child in it yet (this one hasn't
|
|
Packit |
b099d7 |
been inserted yet: Initialize < InsertChild in Xt). So we
|
|
Packit |
b099d7 |
pass the current kid value and the Container will use them
|
|
Packit |
b099d7 |
as min, or default if you want. */
|
|
Packit |
b099d7 |
container_data->detail_order_count = IG_DetailCount(wid);
|
|
Packit |
b099d7 |
container_data->first_column_width =
|
|
Packit |
b099d7 |
IG_HLThickness(wid) + GetIconLabelWidth(wid) - IG_MarginWidth(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
container_data->selection_mode = XmNORMAL_MODE ;
|
|
Packit |
b099d7 |
container_data->detail_order = NULL ;
|
|
Packit |
b099d7 |
container_data->detail_tablist = NULL ;
|
|
Packit |
b099d7 |
container_data->select_color = XmREVERSED_GROUND_COLORS ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*** get the Container information using the trait */
|
|
Packit |
b099d7 |
/* first get the widget id from which to fetch the trait */
|
|
Packit |
b099d7 |
container_id = (igc->icong_class.get_container_parent)?
|
|
Packit |
b099d7 |
(*(igc->icong_class.get_container_parent))(wid) : XtParent(wid);
|
|
Packit |
b099d7 |
/* then get the trait info */
|
|
Packit |
b099d7 |
container_trait = (XmContainerTrait) XmeTraitGet((XtPointer)
|
|
Packit |
b099d7 |
XtClass(container_id),
|
|
Packit |
b099d7 |
XmQTcontainer) ;
|
|
Packit |
b099d7 |
if (container_trait)
|
|
Packit |
b099d7 |
container_trait->getValues(container_id, container_data);
|
|
Packit |
b099d7 |
else return ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*** detail_order_count might be 0: mean no detail displayed,
|
|
Packit |
b099d7 |
even if the icon has some.
|
|
Packit |
b099d7 |
detail_order might be NULL: mean if there is detail to display,
|
|
Packit |
b099d7 |
we'll use a default order [1..N] when we need it.
|
|
Packit |
b099d7 |
detail_tablist might be null, mean concat for the kid.
|
|
Packit |
b099d7 |
(XmContainer returns NULL unless it can't come up with a reasonable
|
|
Packit |
b099d7 |
tablist due to its size being NULL or too small)
|
|
Packit |
b099d7 |
first_column_width might be 0, which mean spatial: use icon/label only */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* a return of 0 for first column width means we are
|
|
Packit |
b099d7 |
in spatial, in this case, don't use rectangle.x at all */
|
|
Packit |
b099d7 |
if (!container_data->first_column_width) {
|
|
Packit |
b099d7 |
container_data->first_column_width =
|
|
Packit |
b099d7 |
IG_HLThickness(wid) + GetIconLabelWidth(wid) - IG_MarginWidth(wid);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* remove the current hor indentation */
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid)) {
|
|
Packit |
b099d7 |
if (XtWidth(XtParent(wid))) {
|
|
Packit |
b099d7 |
if ((Position)container_data->first_column_width >
|
|
Packit |
b099d7 |
(XtWidth(XtParent(wid)) - ig->rectangle.width -
|
|
Packit |
b099d7 |
ig->rectangle.x)) {
|
|
Packit |
b099d7 |
container_data->first_column_width -=
|
|
Packit |
b099d7 |
(XtWidth(XtParent(wid)) - ig->rectangle.width -
|
|
Packit |
b099d7 |
ig->rectangle.x) ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
container_data->first_column_width =
|
|
Packit |
b099d7 |
IG_HLThickness(wid) + IG_MarginWidth(wid);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else { /* parent not sized yet */
|
|
Packit |
b099d7 |
if ((Position)container_data->first_column_width >
|
|
Packit |
b099d7 |
ig->rectangle.x)
|
|
Packit |
b099d7 |
container_data->first_column_width -= ig->rectangle.x ;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
container_data->first_column_width =
|
|
Packit |
b099d7 |
IG_HLThickness(wid) + IG_MarginWidth(wid);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else /* regular case: not RtoL*/
|
|
Packit |
b099d7 |
/* here we have to worry of special cases where
|
|
Packit |
b099d7 |
the first_column_width and the position of the kid
|
|
Packit |
b099d7 |
are extreme */
|
|
Packit |
b099d7 |
if (((Position)container_data->first_column_width >
|
|
Packit |
b099d7 |
ig->rectangle.x)
|
|
Packit |
b099d7 |
&& ig->rectangle.x >= 0) {
|
|
Packit |
b099d7 |
container_data->first_column_width -= ig->rectangle.x ;
|
|
Packit |
b099d7 |
if (container_data->first_column_width <
|
|
Packit |
b099d7 |
IG_HLThickness(wid) + IG_MarginWidth(wid))
|
|
Packit |
b099d7 |
container_data->first_column_width
|
|
Packit |
b099d7 |
= IG_HLThickness(wid) + IG_MarginWidth(wid);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
container_data->first_column_width =
|
|
Packit |
b099d7 |
IG_HLThickness(wid) + IG_MarginWidth(wid);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*** leaving this routine:
|
|
Packit |
b099d7 |
detail_order_count might be 0: no detail to display
|
|
Packit |
b099d7 |
detail_order might be NULL. : use implicit order
|
|
Packit |
b099d7 |
container_data->detail_tablist might be NULL: use concat
|
|
Packit |
b099d7 |
container_data->first_column_width is:
|
|
Packit |
b099d7 |
in spatial, Container returned first_column_width=0, and
|
|
Packit |
b099d7 |
we turned it in GetContainerData into icon_width (included highlight).
|
|
Packit |
b099d7 |
in outline/detail, first_column_width is the clipping width
|
|
Packit |
b099d7 |
from the current position of the icon to the start of
|
|
Packit |
b099d7 |
the detail rendering (included highlight too). */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* Redisplay
|
|
Packit |
b099d7 |
* This is the main routine of this baby.
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Redisplay(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event, /* unused */
|
|
Packit |
b099d7 |
Region region) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmIconGadget ig = (XmIconGadget)wid;
|
|
Packit |
b099d7 |
GC gc;
|
|
Packit |
b099d7 |
GC background_gc;
|
|
Packit |
b099d7 |
Dimension pm_width,pm_height;
|
|
Packit |
b099d7 |
XRectangle clip_rect;
|
|
Packit |
b099d7 |
Boolean clip_set = False;
|
|
Packit |
b099d7 |
int depth;
|
|
Packit |
b099d7 |
XmContainerDataRec container_data ;
|
|
Packit |
b099d7 |
Position large_icon_x = 0, small_icon_y = 0, small_icon_x,
|
|
Packit |
b099d7 |
label_x = 0, label_y = 0 ;
|
|
Packit |
b099d7 |
Dimension w, h, ist = IG_ShadowThickness(wid), ht = IG_HLThickness(wid);
|
|
Packit |
b099d7 |
Dimension mw = IG_MarginWidth(wid), mh = IG_MarginHeight(wid);
|
|
Packit |
b099d7 |
Cardinal i ;
|
|
Packit |
b099d7 |
XPoint shad_points[8] ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* a gc for the ink (text only) */
|
|
Packit |
b099d7 |
if (!XtIsSensitive(wid))
|
|
Packit |
b099d7 |
gc = IG_InsensitiveGC(wid);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
gc = IG_NormalGC(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** invert the background gc for selected view */
|
|
Packit |
b099d7 |
if (IG_VisualEmphasis(wid) == XmSELECTED) {
|
|
Packit |
b099d7 |
background_gc = IG_SelectedGC(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* if inverse_gc has been set, it holds the parent background
|
|
Packit |
b099d7 |
as its foreground (ink). Use it when in selected mode */
|
|
Packit |
b099d7 |
if (IG_InverseGC(wid))
|
|
Packit |
b099d7 |
gc = IG_InverseGC(wid);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
background_gc = IG_BackgroundGC(wid);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** get the container information */
|
|
Packit |
b099d7 |
container_data.valueMask = ContAllValid ;
|
|
Packit |
b099d7 |
GetContainerData(wid, &container_data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** clear the background */
|
|
Packit |
b099d7 |
/* in detail mode, clear the entire gadget area using
|
|
Packit |
b099d7 |
background_gc (which, depending on the selected mode is the
|
|
Packit |
b099d7 |
selectedGC or the BackgroundGC of the icon), while in
|
|
Packit |
b099d7 |
iconlabel only, only clear the iconlabel using cleararea
|
|
Packit |
b099d7 |
(and we will later clear the label part using background_gc) */
|
|
Packit |
b099d7 |
if (SHOW_DETAIL(wid, &container_data)) {
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay(wid), background_gc, None);
|
|
Packit |
b099d7 |
XFillRectangle(XtDisplay(wid), XtWindow(wid), background_gc,
|
|
Packit |
b099d7 |
ig->rectangle.x, ig->rectangle.y,
|
|
Packit |
b099d7 |
ig->rectangle.width, ig->rectangle.height);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay(wid), IG_BackgroundGC(wid), None);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** render the pixmap first */
|
|
Packit |
b099d7 |
if ((IG_ViewType(wid) == XmLARGE_ICON) &&
|
|
Packit |
b099d7 |
(PIXMAP_VALID(IG_LargeIconPixmap(wid)))) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
large_icon_x = GetLargeIconX(wid); /* no rtl yet */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeGetPixmapData(XtScreen(wid),
|
|
Packit |
b099d7 |
IG_LargeIconPixmap(wid),
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
&depth,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
NULL, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pm_width = IG_LargeIconRectWidth(wid);
|
|
Packit |
b099d7 |
if (large_icon_x + pm_width >
|
|
Packit |
b099d7 |
MIN(ig->rectangle.width, container_data.first_column_width)) {
|
|
Packit |
b099d7 |
pm_width = MIN(ig->rectangle.width - 2*ht,
|
|
Packit |
b099d7 |
container_data.first_column_width - ht);
|
|
Packit |
b099d7 |
pm_width -= MIN(pm_width, (Dimension)large_icon_x);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid))
|
|
Packit |
b099d7 |
large_icon_x = ig->rectangle.width -
|
|
Packit |
b099d7 |
MIN(ig->rectangle.width - 2*ht,
|
|
Packit |
b099d7 |
container_data.first_column_width - ht) ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid))
|
|
Packit |
b099d7 |
large_icon_x = ig->rectangle.width - large_icon_x - pm_width ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pm_height = IG_LargeIconRectHeight(wid) ;
|
|
Packit |
b099d7 |
if (ht + ist + pm_height > ig->rectangle.height - 2*ht)
|
|
Packit |
b099d7 |
pm_height = ig->rectangle.height - ist - ht;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* clip with the mask if any */
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_LargeIconMask(wid))) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay(wid), IG_NormalGC(wid),
|
|
Packit |
b099d7 |
IG_LargeIconMask(wid));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetClipOrigin(XtDisplay(wid), IG_NormalGC(wid),
|
|
Packit |
b099d7 |
ig->rectangle.x + large_icon_x,
|
|
Packit |
b099d7 |
ig->rectangle.y + ht + mh);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay(wid), IG_NormalGC(wid),None);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (depth == XtParent(wid)->core.depth)
|
|
Packit |
b099d7 |
XCopyArea(XtDisplay(wid),IG_LargeIconPixmap(wid),
|
|
Packit |
b099d7 |
XtWindow(wid), IG_NormalGC(wid), 0,0,
|
|
Packit |
b099d7 |
pm_width, pm_height,
|
|
Packit |
b099d7 |
ig->rectangle.x + large_icon_x,
|
|
Packit |
b099d7 |
ig->rectangle.y + GetLargeIconY(wid));
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
if (depth == 1)
|
|
Packit |
b099d7 |
XCopyPlane(XtDisplay(wid),IG_LargeIconPixmap(wid),
|
|
Packit |
b099d7 |
XtWindow(wid), IG_NormalGC(wid),
|
|
Packit |
b099d7 |
0,0,
|
|
Packit |
b099d7 |
pm_width, pm_height,
|
|
Packit |
b099d7 |
ig->rectangle.x + large_icon_x,
|
|
Packit |
b099d7 |
ig->rectangle.y + GetLargeIconY(wid), 1);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((IG_ViewType(wid) == XmSMALL_ICON) &&
|
|
Packit |
b099d7 |
(PIXMAP_VALID(IG_SmallIconPixmap(wid)))) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
small_icon_y = GetSmallIconY(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeGetPixmapData(XtScreen(wid),
|
|
Packit |
b099d7 |
IG_SmallIconPixmap(wid),
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
&depth,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
NULL, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pm_width = IG_SmallIconRectWidth(wid);
|
|
Packit |
b099d7 |
small_icon_x = GetSmallIconX(wid);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (small_icon_x + pm_width > MIN(ig->rectangle.width - 2*ht,
|
|
Packit |
b099d7 |
container_data.first_column_width - 2*ht)) {
|
|
Packit |
b099d7 |
pm_width = MIN(ig->rectangle.width,
|
|
Packit |
b099d7 |
container_data.first_column_width) - 2*ht;
|
|
Packit |
b099d7 |
pm_width -= MIN(pm_width, (Dimension)small_icon_x);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid))
|
|
Packit |
b099d7 |
small_icon_x = ig->rectangle.width + 2*ht -
|
|
Packit |
b099d7 |
MIN(ig->rectangle.width,
|
|
Packit |
b099d7 |
container_data.first_column_width) ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid))
|
|
Packit |
b099d7 |
small_icon_x = ig->rectangle.width - small_icon_x - pm_width ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pm_height = IG_SmallIconRectHeight(wid);
|
|
Packit |
b099d7 |
if (small_icon_y + pm_height > ig->rectangle.height - 2*ht)
|
|
Packit |
b099d7 |
pm_height = ig->rectangle.height - small_icon_y;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* clip with the mask if any */
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_SmallIconMask(wid))) {
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay(wid), IG_NormalGC(wid),
|
|
Packit |
b099d7 |
IG_SmallIconMask(wid));
|
|
Packit |
b099d7 |
XSetClipOrigin(XtDisplay(wid), IG_NormalGC(wid),
|
|
Packit |
b099d7 |
ig->rectangle.x + small_icon_x,
|
|
Packit |
b099d7 |
ig->rectangle.y + small_icon_y);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay(wid), IG_NormalGC(wid),None);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (depth == XtParent(wid)->core.depth)
|
|
Packit |
b099d7 |
XCopyArea(XtDisplay(wid),IG_SmallIconPixmap(wid),
|
|
Packit |
b099d7 |
XtWindow(wid), IG_NormalGC(wid),0,0,
|
|
Packit |
b099d7 |
pm_width,pm_height,
|
|
Packit |
b099d7 |
ig->rectangle.x + small_icon_x,
|
|
Packit |
b099d7 |
ig->rectangle.y + small_icon_y);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
if (depth == 1)
|
|
Packit |
b099d7 |
XCopyPlane(XtDisplay(wid),IG_SmallIconPixmap(wid),
|
|
Packit |
b099d7 |
XtWindow(wid), IG_NormalGC(wid),0,0,
|
|
Packit |
b099d7 |
pm_width,pm_height,
|
|
Packit |
b099d7 |
ig->rectangle.x + small_icon_x,
|
|
Packit |
b099d7 |
ig->rectangle.y + small_icon_y, 1);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
clip_rect.y = ig->rectangle.y + ht + mh;
|
|
Packit |
b099d7 |
clip_rect.width = MIN(ig->rectangle.width - 2*ht - 2*mw,
|
|
Packit |
b099d7 |
container_data.first_column_width - ht - mw);
|
|
Packit |
b099d7 |
clip_rect.height = ig->rectangle.height - 2*ht - 2*mh;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid)) {
|
|
Packit |
b099d7 |
clip_rect.x = ig->rectangle.x + ig->rectangle.width -
|
|
Packit |
b099d7 |
ht - clip_rect.width - mw;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
clip_rect.x = ig->rectangle.x + ht + mw;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetClipRectangles(XtDisplay(wid),gc,0,0,&clip_rect,1,Unsorted);
|
|
Packit |
b099d7 |
XSetClipRectangles(XtDisplay(wid),background_gc,0,0,&clip_rect,1,Unsorted);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** then draw the label part of the icon */
|
|
Packit |
b099d7 |
GetLabelXY(wid, &label_x, &label_y) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XmStringEmpty(IG_LabelString(wid))) {
|
|
Packit |
b099d7 |
XFillRectangle(XtDisplay(wid), XtWindow(wid), background_gc,
|
|
Packit |
b099d7 |
ig->rectangle.x + label_x,
|
|
Packit |
b099d7 |
ig->rectangle.y + label_y,
|
|
Packit |
b099d7 |
IG_LabelRectWidth(wid),
|
|
Packit |
b099d7 |
IG_LabelRectHeight(wid));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* if we are in the inverse_color case, we need to draw
|
|
Packit |
b099d7 |
the string with parent background ink, and
|
|
Packit |
b099d7 |
parent foreground as back color (The previous fillrectangle
|
|
Packit |
b099d7 |
took care of that last part). gc has been set
|
|
Packit |
b099d7 |
up to IG_InverseGC at the beginning of this routine,
|
|
Packit |
b099d7 |
so what's left is the forcing of this ink/foreground */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef FIX_1381
|
|
Packit |
b099d7 |
/*Draw shadow for insensitive text*/
|
|
Packit |
b099d7 |
if (!XtIsSensitive(wid)) {
|
|
Packit |
b099d7 |
XmStringDraw(XtDisplay(wid),XtWindow(wid),
|
|
Packit |
b099d7 |
IG_RenderTable(wid),IG_LabelString(wid), IG_ShadowGC(wid),
|
|
Packit |
b099d7 |
ig->rectangle.x + label_x+1 + DEFAULT_LABEL_MARGIN_WIDTH,
|
|
Packit |
b099d7 |
ig->rectangle.y + label_y+1 + DEFAULT_LABEL_MARGIN_HEIGHT,
|
|
Packit |
b099d7 |
IG_LabelRectWidth(wid) - 2*DEFAULT_LABEL_MARGIN_WIDTH,
|
|
Packit |
b099d7 |
XmALIGNMENT_BEGINNING,
|
|
Packit |
b099d7 |
LayoutG(wid), NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
XmStringDraw(XtDisplay(wid),XtWindow(wid),
|
|
Packit |
b099d7 |
IG_RenderTable(wid),IG_LabelString(wid), gc,
|
|
Packit |
b099d7 |
ig->rectangle.x + label_x + DEFAULT_LABEL_MARGIN_WIDTH,
|
|
Packit |
b099d7 |
ig->rectangle.y + label_y + DEFAULT_LABEL_MARGIN_HEIGHT,
|
|
Packit |
b099d7 |
IG_LabelRectWidth(wid) - 2*DEFAULT_LABEL_MARGIN_WIDTH,
|
|
Packit |
b099d7 |
XmALIGNMENT_BEGINNING,
|
|
Packit |
b099d7 |
LayoutG(wid), NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay(wid),background_gc,None);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** now the polygon shadow around the icon+label, or the
|
|
Packit |
b099d7 |
square shadow around a masked pixmap or a no pixmap icon */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* only draw shadows if there is something inside */
|
|
Packit |
b099d7 |
if (container_data.first_column_width) {
|
|
Packit |
b099d7 |
Cardinal n ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* undo the ltr layout for label_x, because getshapeinfo
|
|
Packit |
b099d7 |
does it */
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid)) {
|
|
Packit |
b099d7 |
label_x = XtWidth(wid) - IG_LabelRectWidth(wid) - label_x ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
n = GetShapeInfo(wid, GetLargeIconX(wid), small_icon_y,
|
|
Packit |
b099d7 |
label_x, label_y,
|
|
Packit |
b099d7 |
container_data.first_column_width, ht,
|
|
Packit |
b099d7 |
&shad_points[0]) ;
|
|
Packit |
b099d7 |
/* only draw the polygon shadow if there is no mask
|
|
Packit |
b099d7 |
and an existing pixmap */
|
|
Packit |
b099d7 |
if (n == 2) {
|
|
Packit |
b099d7 |
XmeDrawShadows(XtDisplay(wid),XtWindow(wid),
|
|
Packit |
b099d7 |
IG_TopShadowGC(wid), IG_BottomShadowGC(wid),
|
|
Packit |
b099d7 |
shad_points[0].x, shad_points[0].y,
|
|
Packit |
b099d7 |
shad_points[1].x - shad_points[0].x,
|
|
Packit |
b099d7 |
shad_points[1].y - shad_points[0].y,
|
|
Packit |
b099d7 |
ist, XmSHADOW_OUT);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (n == 8) {
|
|
Packit |
b099d7 |
XmeDrawPolygonShadow (XtDisplay(wid),XtWindow(wid),
|
|
Packit |
b099d7 |
IG_TopShadowGC(wid), IG_BottomShadowGC(wid),
|
|
Packit |
b099d7 |
shad_points, n, ist, XmSHADOW_OUT);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** then comes the details rendering */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (SHOW_DETAIL(wid, &container_data)&&
|
|
Packit |
b099d7 |
container_data.first_column_width >= ht + mw) {
|
|
Packit |
b099d7 |
unsigned int tab_count = 0 ;
|
|
Packit |
b099d7 |
Dimension detail_x, detail_y;
|
|
Packit |
b099d7 |
XmStringTable new_detail ;
|
|
Packit |
b099d7 |
int lab_baseline = 0, detail_baseline ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* get the detail table to be displayed */
|
|
Packit |
b099d7 |
new_detail =
|
|
Packit |
b099d7 |
GetStringTableReOrdered(IG_Detail(wid), IG_DetailCount(wid),
|
|
Packit |
b099d7 |
container_data.detail_order,
|
|
Packit |
b099d7 |
container_data.detail_order_count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (container_data.detail_tablist)
|
|
Packit |
b099d7 |
tab_count = XmTabListTabCount(container_data.detail_tablist) ;
|
|
Packit |
b099d7 |
/* the extra tabs are ignored */
|
|
Packit |
b099d7 |
tab_count = MIN(tab_count, container_data.detail_order_count);
|
|
Packit |
b099d7 |
/* tab_count might be 0 at this point, but it won't be treated as
|
|
Packit |
b099d7 |
a special case */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_LabelString(wid))
|
|
Packit |
b099d7 |
lab_baseline = XmStringBaseline(IG_RenderTable(wid),
|
|
Packit |
b099d7 |
IG_LabelString(wid)) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* detail_x is in gadget relative coordinate */
|
|
Packit |
b099d7 |
detail_x = container_data.first_column_width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0 ; i < IG_DetailCount(wid) ; i++) {
|
|
Packit |
b099d7 |
Position next_tab_x = 0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
w = 0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
detail_x += DEFAULT_HOR_SPACING ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (container_data.detail_tablist)
|
|
Packit |
b099d7 |
next_tab_x = container_data.first_column_width +
|
|
Packit |
b099d7 |
_XmTabListGetPosition(XtScreen(wid),
|
|
Packit |
b099d7 |
container_data.detail_tablist,
|
|
Packit |
b099d7 |
XmPIXELS, i);
|
|
Packit |
b099d7 |
if (new_detail[i]) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* if we have a tab, use it, don't bother to call an
|
|
Packit |
b099d7 |
expensive string extent. */
|
|
Packit |
b099d7 |
if (i < tab_count) {
|
|
Packit |
b099d7 |
clip_rect.width = MIN (next_tab_x - detail_x,
|
|
Packit |
b099d7 |
ig->rectangle.width - 2*ht - 2*mw -
|
|
Packit |
b099d7 |
detail_x);
|
|
Packit |
b099d7 |
clip_rect.x = ig->rectangle.x + detail_x;
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid))
|
|
Packit |
b099d7 |
clip_rect.x = ig->rectangle.x + ig->rectangle.width
|
|
Packit |
b099d7 |
- detail_x - clip_rect.width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
clip_rect.y = ig->rectangle.y + ht + mh;
|
|
Packit |
b099d7 |
clip_rect.height = ig->rectangle.height - 2*ht - 2*mh;
|
|
Packit |
b099d7 |
XSetClipRectangles(XtDisplay(wid),gc,0,0,&clip_rect,1,
|
|
Packit |
b099d7 |
Unsorted);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XmStringExtent(IG_RenderTable(wid), new_detail[i], &w, &h);
|
|
Packit |
b099d7 |
if (!clip_set) {
|
|
Packit |
b099d7 |
clip_rect.x = ig->rectangle.x + ht + mw;
|
|
Packit |
b099d7 |
clip_rect.y = ig->rectangle.y + ht + mh;
|
|
Packit |
b099d7 |
clip_rect.width = ig->rectangle.width - 2*ht - 2*mw;
|
|
Packit |
b099d7 |
clip_rect.height = ig->rectangle.height - 2*ht - 2*mh;
|
|
Packit |
b099d7 |
XSetClipRectangles(XtDisplay(wid),gc,0,0,&clip_rect,1,
|
|
Packit |
b099d7 |
Unsorted);
|
|
Packit |
b099d7 |
/* only set this clip once */
|
|
Packit |
b099d7 |
clip_set = True ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
detail_baseline = XmStringBaseline(IG_RenderTable(wid),
|
|
Packit |
b099d7 |
new_detail[i]);
|
|
Packit |
b099d7 |
detail_y = label_y + DEFAULT_LABEL_MARGIN_HEIGHT +
|
|
Packit |
b099d7 |
lab_baseline - detail_baseline;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmStringDraw(XtDisplay(wid),XtWindow(wid),
|
|
Packit |
b099d7 |
IG_RenderTable(wid), new_detail[i], gc,
|
|
Packit |
b099d7 |
(LayoutIsRtoLG(wid)) ?
|
|
Packit |
b099d7 |
(ig->rectangle.x + ig->rectangle.width - detail_x
|
|
Packit |
b099d7 |
- ((i < tab_count) ? clip_rect.width : w))
|
|
Packit |
b099d7 |
: (ig->rectangle.x + detail_x),
|
|
Packit |
b099d7 |
ig->rectangle.y + detail_y,
|
|
Packit |
b099d7 |
((i < tab_count) ? clip_rect.width : w),
|
|
Packit |
b099d7 |
XmALIGNMENT_BEGINNING,
|
|
Packit |
b099d7 |
LayoutG(wid),
|
|
Packit |
b099d7 |
NULL); /* clip is done in gc */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (i < tab_count) {
|
|
Packit |
b099d7 |
detail_x = next_tab_x;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
detail_x += w ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** draw the highlight if needed */
|
|
Packit |
b099d7 |
if (ig->gadget.highlighted) {
|
|
Packit |
b099d7 |
if(((XmGadgetClass) XtClass(wid))->gadget_class.border_highlight){
|
|
Packit |
b099d7 |
(*(((XmGadgetClass) XtClass(wid))
|
|
Packit |
b099d7 |
->gadget_class.border_highlight))(wid) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* SetValues
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
SetValues(
|
|
Packit |
b099d7 |
Widget cw,
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args, /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Boolean Relayout = False;
|
|
Packit |
b099d7 |
Boolean Redraw = False;
|
|
Packit |
b099d7 |
unsigned int w, h ;
|
|
Packit |
b099d7 |
Cardinal i ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_ViewType(nw) != IG_ViewType(cw)) {
|
|
Packit |
b099d7 |
if (XmRepTypeValidValue(XmRID_VIEW_TYPE,IG_ViewType(nw),nw))
|
|
Packit |
b099d7 |
Relayout = Redraw = True;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
IG_ViewType(nw) = IG_ViewType(cw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_VisualEmphasis(nw) != IG_VisualEmphasis(cw)) {
|
|
Packit |
b099d7 |
if (XmRepTypeValidValue(XmRID_VISUAL_EMPHASIS,
|
|
Packit |
b099d7 |
IG_VisualEmphasis(nw),nw))
|
|
Packit |
b099d7 |
Redraw = True;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
IG_VisualEmphasis(nw) = IG_VisualEmphasis(cw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_Alignment(nw) != IG_Alignment(cw)) {
|
|
Packit |
b099d7 |
if (XmRepTypeValidValue(XmRID_ALIGNMENT, IG_Alignment(nw), nw))
|
|
Packit |
b099d7 |
Relayout = Redraw = True;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
IG_Alignment(nw) = IG_Alignment(cw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((IG_Background(nw) != IG_Background(cw)) ||
|
|
Packit |
b099d7 |
(IG_Foreground(nw) != IG_Foreground(cw)) ||
|
|
Packit |
b099d7 |
(IG_TopShadowColor(nw) != IG_TopShadowColor(cw)) ||
|
|
Packit |
b099d7 |
(IG_BottomShadowColor(nw) != IG_BottomShadowColor(cw)) ||
|
|
Packit |
b099d7 |
(IG_HighlightColor(nw) != IG_HighlightColor(cw)) ||
|
|
Packit |
b099d7 |
(IG_BackgroundPixmap(nw) != IG_BackgroundPixmap(cw)) ||
|
|
Packit |
b099d7 |
(IG_TopShadowPixmap(nw) != IG_TopShadowPixmap(cw)) ||
|
|
Packit |
b099d7 |
(IG_BottomShadowPixmap(nw) != IG_BottomShadowPixmap(cw)) ||
|
|
Packit |
b099d7 |
(IG_HighlightPixmap(nw) != IG_HighlightPixmap(cw))) {
|
|
Packit |
b099d7 |
UpdateGCs(nw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_RenderTable(nw) != IG_RenderTable(cw)) {
|
|
Packit |
b099d7 |
XmRenderTableFree(IG_RenderTable(cw));
|
|
Packit |
b099d7 |
IG_RenderTable(nw) = XmRenderTableCopy(IG_RenderTable(nw), NULL, 0);
|
|
Packit |
b099d7 |
UpdateGCs(nw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XmStringEmpty(IG_LabelString(nw)))
|
|
Packit |
b099d7 |
XmStringExtent(IG_RenderTable(nw), IG_LabelString(nw),
|
|
Packit |
b099d7 |
&(IG_LabelRectWidth(nw)),
|
|
Packit |
b099d7 |
&(IG_LabelRectHeight(nw)));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_LabelRectWidth(nw) += 2*DEFAULT_LABEL_MARGIN_WIDTH ;
|
|
Packit |
b099d7 |
IG_LabelRectHeight(nw) += 2*DEFAULT_LABEL_MARGIN_HEIGHT ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Relayout = Redraw = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_LabelString(nw) != IG_LabelString(cw)) {
|
|
Packit |
b099d7 |
XmStringFree(IG_LabelString(cw));
|
|
Packit |
b099d7 |
IG_LabelString(nw) = XmStringCopy(IG_LabelString(nw));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XmStringEmpty(IG_LabelString(nw)))
|
|
Packit |
b099d7 |
XmStringExtent(IG_RenderTable(nw), IG_LabelString(nw),
|
|
Packit |
b099d7 |
&(IG_LabelRectWidth(nw)),
|
|
Packit |
b099d7 |
&(IG_LabelRectHeight(nw)));
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
IG_LabelRectWidth(nw) = 0 ;
|
|
Packit |
b099d7 |
IG_LabelRectHeight(nw) = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
IG_LabelRectWidth(nw) += 2*DEFAULT_LABEL_MARGIN_WIDTH ;
|
|
Packit |
b099d7 |
IG_LabelRectHeight(nw) += 2*DEFAULT_LABEL_MARGIN_HEIGHT ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Relayout = Redraw = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_LargeIconMask(nw) != IG_LargeIconMask(cw)) {
|
|
Packit |
b099d7 |
if (OwnLargeMask(cw)) {
|
|
Packit |
b099d7 |
XDeleteContext(XtDisplay(nw),
|
|
Packit |
b099d7 |
(Window) nw,
|
|
Packit |
b099d7 |
largeIconContext) ;
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_LargeIconMask(cw)))
|
|
Packit |
b099d7 |
XmDestroyPixmap(XtScreen(cw),
|
|
Packit |
b099d7 |
IG_LargeIconMask(cw));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (IG_ViewType(nw) == XmLARGE_ICON)
|
|
Packit |
b099d7 |
Relayout = Redraw = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_LargeIconPixmap(nw) != IG_LargeIconPixmap(cw)) {
|
|
Packit |
b099d7 |
if (IG_ViewType(nw) == XmLARGE_ICON)
|
|
Packit |
b099d7 |
Relayout = Redraw = True;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* if the new icon is different, refetch the sizes */
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_LargeIconPixmap(nw)))
|
|
Packit |
b099d7 |
XmeGetPixmapData(XtScreen(nw),
|
|
Packit |
b099d7 |
IG_LargeIconPixmap(nw),
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
&w, &h);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w = h = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_LargeIconRectWidth(nw) = (unsigned short)w;
|
|
Packit |
b099d7 |
IG_LargeIconRectHeight(nw) = (unsigned short)h;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_SmallIconMask(nw) != IG_SmallIconMask(cw)) {
|
|
Packit |
b099d7 |
if (OwnSmallMask(cw)) {
|
|
Packit |
b099d7 |
XDeleteContext(XtDisplay(nw),
|
|
Packit |
b099d7 |
(Window) nw,
|
|
Packit |
b099d7 |
smallIconContext) ;
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_SmallIconMask(cw)))
|
|
Packit |
b099d7 |
XmDestroyPixmap(XtScreen(cw),
|
|
Packit |
b099d7 |
IG_SmallIconMask(cw));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (IG_ViewType(nw) == XmSMALL_ICON)
|
|
Packit |
b099d7 |
Relayout = Redraw = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_SmallIconPixmap(nw) != IG_SmallIconPixmap(cw)) {
|
|
Packit |
b099d7 |
if (IG_ViewType(nw) == XmSMALL_ICON)
|
|
Packit |
b099d7 |
Relayout = Redraw = True;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_SmallIconPixmap(nw)))
|
|
Packit |
b099d7 |
XmeGetPixmapData(XtScreen(nw),
|
|
Packit |
b099d7 |
IG_SmallIconPixmap(nw),
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
NULL, NULL,
|
|
Packit |
b099d7 |
&w, &h);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
w = h = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_SmallIconRectWidth(nw) = (unsigned short)w;
|
|
Packit |
b099d7 |
IG_SmallIconRectHeight(nw) = (unsigned short)h;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_Detail(nw) != IG_Detail(cw)) {
|
|
Packit |
b099d7 |
/* new XmNdetail copy in */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* first free the current detail table and strings if present */
|
|
Packit |
b099d7 |
if (IG_Detail(cw) && IG_DetailCount(cw)) {
|
|
Packit |
b099d7 |
for (i=0; i
|
|
Packit |
b099d7 |
XmStringFree(IG_Detail(cw)[i]);
|
|
Packit |
b099d7 |
XtFree((char*)IG_Detail(cw));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* now copy */
|
|
Packit |
b099d7 |
if (IG_Detail(nw) && IG_DetailCount(nw)) {
|
|
Packit |
b099d7 |
IG_Detail(nw) = (XmStringTable)
|
|
Packit |
b099d7 |
XtMalloc(IG_DetailCount(nw) * sizeof(XmString));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0; i
|
|
Packit |
b099d7 |
IG_Detail(nw)[i] = XmStringCopy(IG_Detail(rw)[i]);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
Relayout = Redraw = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_DetailCount(nw) != IG_DetailCount(cw)) {
|
|
Packit |
b099d7 |
Relayout = Redraw = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (LayoutG(nw) != LayoutG(cw) || XtIsSensitive(nw) != XtIsSensitive(cw)) {
|
|
Packit |
b099d7 |
Redraw = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((Relayout) ||
|
|
Packit |
b099d7 |
(IG_Spacing(nw) != IG_Spacing(cw)) ||
|
|
Packit |
b099d7 |
(IG_MarginWidth(nw) != IG_MarginWidth(cw)) ||
|
|
Packit |
b099d7 |
(IG_MarginHeight(nw) != IG_MarginHeight(cw)) ||
|
|
Packit |
b099d7 |
(IG_HLThickness(nw) != IG_HLThickness(cw)) ||
|
|
Packit |
b099d7 |
(IG_ShadowThickness(nw) != IG_ShadowThickness(cw))) {
|
|
Packit |
b099d7 |
if (IG_RecomputeSize(nw)) {
|
|
Packit |
b099d7 |
/* if a specific size has not been requested at the same time
|
|
Packit |
b099d7 |
just forget the current size */
|
|
Packit |
b099d7 |
if (rw->core.width == cw->core.width)
|
|
Packit |
b099d7 |
nw->core.width = 0;
|
|
Packit |
b099d7 |
if (rw->core.height == cw->core.height)
|
|
Packit |
b099d7 |
nw->core.height = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
GetSize(nw, &nw->core.width, &nw->core.height);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(Redraw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* QueryGeometry
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static XtGeometryResult
|
|
Packit |
b099d7 |
QueryGeometry(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XtWidgetGeometry *intended,
|
|
Packit |
b099d7 |
XtWidgetGeometry *desired)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_RecomputeSize(wid) == False) {
|
|
Packit |
b099d7 |
desired->width = XtWidth(wid) ;
|
|
Packit |
b099d7 |
desired->height = XtHeight(wid) ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
desired->width = 0 ;
|
|
Packit |
b099d7 |
desired->height = 0 ;
|
|
Packit |
b099d7 |
GetSize(wid, &desired->width, &desired->height);
|
|
Packit |
b099d7 |
/* the above asks for the containertrait firstColumnWidth */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return XmeReplyToQueryGeometry(wid, intended, desired) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*-----------------
|
|
Packit |
b099d7 |
| XmGadget methods |
|
|
Packit |
b099d7 |
-----------------*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* HighlightBorder
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
HighlightBorder(
|
|
Packit |
b099d7 |
Widget w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmIconGadget ig = (XmIconGadget) w ;
|
|
Packit |
b099d7 |
XmContainerDataRec container_data ;
|
|
Packit |
b099d7 |
Dimension ht = IG_HLThickness(w) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* test LayoutIsRtoLG(wid) here */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ig->gadget.highlighted = True ;
|
|
Packit |
b099d7 |
ig->gadget.highlight_drawn = True ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(ig->rectangle.width == 0 || ig->rectangle.height == 0
|
|
Packit |
b099d7 |
|| ig->gadget.highlight_thickness == 0) return ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* The highlight is different depending if there is a detail
|
|
Packit |
b099d7 |
or not. With a detail, it's a rectangular shadow,
|
|
Packit |
b099d7 |
otherwise it's drawn around the icon+label */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** get the container information */
|
|
Packit |
b099d7 |
container_data.valueMask = ContFirstColumnWidth | ContSelectionMode ;
|
|
Packit |
b099d7 |
GetContainerData(w, &container_data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay(w), IG_HighlightGC(w), None);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (SHOW_DETAIL(w, &container_data)) {
|
|
Packit |
b099d7 |
ChangeHighlightGC(w, container_data.selection_mode, ht);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (container_data.selection_mode == XmADD_MODE)
|
|
Packit |
b099d7 |
_XmDrawHighlight(XtDisplay(w),XtWindow(w),
|
|
Packit |
b099d7 |
IG_HighlightGC(w),
|
|
Packit |
b099d7 |
ig->rectangle.x, ig->rectangle.y,
|
|
Packit |
b099d7 |
ig->rectangle.width, ig->rectangle.height,
|
|
Packit |
b099d7 |
ht, LineDoubleDash);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
XmeDrawHighlight(XtDisplay(w),XtWindow(w),
|
|
Packit |
b099d7 |
IG_HighlightGC(w),
|
|
Packit |
b099d7 |
ig->rectangle.x, ig->rectangle.y,
|
|
Packit |
b099d7 |
ig->rectangle.width, ig->rectangle.height,
|
|
Packit |
b099d7 |
ht);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
Position label_x, label_y ;
|
|
Packit |
b099d7 |
XPoint points[8] ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* do the polygon highlight around the icon + label part */
|
|
Packit |
b099d7 |
GetLabelXY(w, &label_x, &label_y) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* undo the ltr layout for label_x, because getshapeinfo
|
|
Packit |
b099d7 |
does it */
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(w)) {
|
|
Packit |
b099d7 |
label_x = XtWidth(w) - IG_LabelRectWidth(w) - label_x ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (GetShapeInfo(w, GetLargeIconX(w), GetSmallIconY(w),
|
|
Packit |
b099d7 |
label_x, label_y,
|
|
Packit |
b099d7 |
container_data.first_column_width, INVALID_DIMENSION,
|
|
Packit |
b099d7 |
points) == 2) {
|
|
Packit |
b099d7 |
/* only 2 points have been set, that's the simple case */
|
|
Packit |
b099d7 |
if (container_data.selection_mode == XmADD_MODE) {
|
|
Packit |
b099d7 |
ChangeHighlightGC(w, container_data.selection_mode, ht);
|
|
Packit |
b099d7 |
_XmDrawHighlight(XtDisplay(w),XtWindow(w),
|
|
Packit |
b099d7 |
IG_HighlightGC(w),
|
|
Packit |
b099d7 |
points[0].x, points[0].y,
|
|
Packit |
b099d7 |
points[1].x - points[0].x,
|
|
Packit |
b099d7 |
points[1].y - points[0].y,
|
|
Packit |
b099d7 |
ht, LineDoubleDash);
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
XmeDrawHighlight(XtDisplay(w),XtWindow(w),
|
|
Packit |
b099d7 |
IG_HighlightGC(w),
|
|
Packit |
b099d7 |
points[0].x, points[0].y,
|
|
Packit |
b099d7 |
points[1].x - points[0].x,
|
|
Packit |
b099d7 |
points[1].y - points[0].y,
|
|
Packit |
b099d7 |
ht);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
ChangeHighlightGC(w, container_data.selection_mode, 1);
|
|
Packit |
b099d7 |
XmeDrawPolygonShadow (XtDisplay(w),XtWindow(w),
|
|
Packit |
b099d7 |
IG_HighlightGC(w), IG_HighlightGC(w),
|
|
Packit |
b099d7 |
points, 8, ht, XmSHADOW_OUT);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* UnhighlightBorder
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
UnhighlightBorder(
|
|
Packit |
b099d7 |
Widget w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmIconGadget ig = (XmIconGadget) w ;
|
|
Packit |
b099d7 |
XmContainerDataRec container_data ;
|
|
Packit |
b099d7 |
Dimension ht = IG_HLThickness(w) ;
|
|
Packit |
b099d7 |
GC background_gc ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* test LayoutIsRtoLG(wid) here */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ig->gadget.highlighted = False ;
|
|
Packit |
b099d7 |
ig->gadget.highlight_drawn = False ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(ig->rectangle.width == 0 || ig->rectangle.height == 0
|
|
Packit |
b099d7 |
|| ig->gadget.highlight_thickness == 0) return ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* unhighlight has to use the current selected background,
|
|
Packit |
b099d7 |
it cannot call the superclass unhighlight as in highlight
|
|
Packit |
b099d7 |
because Gadget does a simple clearborder. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** get the container information */
|
|
Packit |
b099d7 |
container_data.valueMask = ContFirstColumnWidth ;
|
|
Packit |
b099d7 |
GetContainerData(w, &container_data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(XmIsManager (XtParent(w))) {
|
|
Packit |
b099d7 |
background_gc = ((XmManagerWidget)XtParent(w))
|
|
Packit |
b099d7 |
->manager.background_GC ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XSetClipMask(XtDisplay(w), IG_BackgroundGC(w), None);
|
|
Packit |
b099d7 |
background_gc = IG_BackgroundGC(w) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (SHOW_DETAIL(w, &container_data)) {
|
|
Packit |
b099d7 |
/* unhighlight the entire gadget area */
|
|
Packit |
b099d7 |
XmeDrawHighlight(XtDisplay(w),XtWindow(w),
|
|
Packit |
b099d7 |
background_gc,
|
|
Packit |
b099d7 |
ig->rectangle.x, ig->rectangle.y,
|
|
Packit |
b099d7 |
ig->rectangle.width, ig->rectangle.height,
|
|
Packit |
b099d7 |
ht);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
Position label_x, label_y ;
|
|
Packit |
b099d7 |
XPoint points[8] ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* do the polygon unhighlight around the icon + label part */
|
|
Packit |
b099d7 |
GetLabelXY(w, &label_x, &label_y) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* undo the ltr layout for label_x, because getshapeinfo
|
|
Packit |
b099d7 |
does it */
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(w)) {
|
|
Packit |
b099d7 |
label_x = XtWidth(w) - IG_LabelRectWidth(w) - label_x ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (GetShapeInfo(w, GetLargeIconX(w), GetSmallIconY(w),
|
|
Packit |
b099d7 |
label_x, label_y,
|
|
Packit |
b099d7 |
container_data.first_column_width, INVALID_DIMENSION,
|
|
Packit |
b099d7 |
points) == 2) {
|
|
Packit |
b099d7 |
/* only 2 points have been set, that's the simple case */
|
|
Packit |
b099d7 |
XmeDrawHighlight(XtDisplay(w),XtWindow(w),
|
|
Packit |
b099d7 |
background_gc,
|
|
Packit |
b099d7 |
points[0].x, points[0].y,
|
|
Packit |
b099d7 |
points[1].x - points[0].x,
|
|
Packit |
b099d7 |
points[1].y - points[0].y,
|
|
Packit |
b099d7 |
ht);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XmeDrawPolygonShadow (XtDisplay(w),XtWindow(w),
|
|
Packit |
b099d7 |
background_gc, background_gc,
|
|
Packit |
b099d7 |
points, 8, ht, XmSHADOW_OUT);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*******************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* IconGCacheCompare
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*******************************************************************/
|
|
Packit |
b099d7 |
static int
|
|
Packit |
b099d7 |
IconGCacheCompare(
|
|
Packit |
b099d7 |
XtPointer A,
|
|
Packit |
b099d7 |
XtPointer B )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmIconGCacheObjPart *icon_inst = (XmIconGCacheObjPart *) A ;
|
|
Packit |
b099d7 |
XmIconGCacheObjPart *icon_cache_inst = (XmIconGCacheObjPart *) B ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if((icon_inst-> render_table == icon_cache_inst->render_table) &&
|
|
Packit |
b099d7 |
(icon_inst-> selected_GC == icon_cache_inst->selected_GC) &&
|
|
Packit |
b099d7 |
(icon_inst-> inverse_GC == icon_cache_inst->inverse_GC) &&
|
|
Packit |
b099d7 |
(icon_inst-> normal_GC == icon_cache_inst->normal_GC) &&
|
|
Packit |
b099d7 |
(icon_inst-> background_GC == icon_cache_inst->background_GC) &&
|
|
Packit |
b099d7 |
(icon_inst-> insensitive_GC == icon_cache_inst->insensitive_GC) &&
|
|
Packit |
b099d7 |
(icon_inst-> top_shadow_GC == icon_cache_inst->top_shadow_GC) &&
|
|
Packit |
b099d7 |
(icon_inst-> bottom_shadow_GC == icon_cache_inst->bottom_shadow_GC) &&
|
|
Packit |
b099d7 |
(icon_inst-> highlight_GC == icon_cache_inst->highlight_GC) &&
|
|
Packit |
b099d7 |
(icon_inst-> background == icon_cache_inst->background) &&
|
|
Packit |
b099d7 |
(icon_inst-> foreground == icon_cache_inst->foreground) &&
|
|
Packit |
b099d7 |
(icon_inst-> top_shadow_color == icon_cache_inst->top_shadow_color) &&
|
|
Packit |
b099d7 |
(icon_inst-> highlight_color == icon_cache_inst->highlight_color) &&
|
|
Packit |
b099d7 |
(icon_inst-> top_shadow_pixmap == icon_cache_inst->background_pixmap) &&
|
|
Packit |
b099d7 |
(icon_inst-> background_pixmap == icon_cache_inst->top_shadow_pixmap) &&
|
|
Packit |
b099d7 |
(icon_inst-> highlight_pixmap == icon_cache_inst->highlight_pixmap) &&
|
|
Packit |
b099d7 |
(icon_inst-> bottom_shadow_color ==
|
|
Packit |
b099d7 |
icon_cache_inst->bottom_shadow_color) &&
|
|
Packit |
b099d7 |
(icon_inst-> bottom_shadow_pixmap ==
|
|
Packit |
b099d7 |
icon_cache_inst->bottom_shadow_pixmap) &&
|
|
Packit |
b099d7 |
(icon_inst-> alignment == icon_cache_inst->alignment) &&
|
|
Packit |
b099d7 |
(icon_inst-> spacing == icon_cache_inst->spacing) &&
|
|
Packit |
b099d7 |
(icon_inst-> margin_width == icon_cache_inst->margin_width) &&
|
|
Packit |
b099d7 |
(icon_inst-> margin_height == icon_cache_inst->margin_height) )
|
|
Packit |
b099d7 |
return 1;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
return 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/****************************************************
|
|
Packit |
b099d7 |
* Functions for manipulating Secondary Resources.
|
|
Packit |
b099d7 |
*********************************************************/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* GetIconGClassSecResData()
|
|
Packit |
b099d7 |
* Create a XmSecondaryResourceDataRec for each secondary resource;
|
|
Packit |
b099d7 |
* Put the pointers to these records in an array of pointers;
|
|
Packit |
b099d7 |
* Return the pointer to the array of pointers.
|
|
Packit |
b099d7 |
* client_data = Address of the structure in the class record which
|
|
Packit |
b099d7 |
* represents the (template of ) the secondary data.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static Cardinal
|
|
Packit |
b099d7 |
GetIconGClassSecResData(
|
|
Packit |
b099d7 |
WidgetClass w_class, /* unused */
|
|
Packit |
b099d7 |
XmSecondaryResourceData **data_rtn )
|
|
Packit |
b099d7 |
{ int arrayCount;
|
|
Packit |
b099d7 |
XmBaseClassExt bcePtr;
|
|
Packit |
b099d7 |
String resource_class, resource_name;
|
|
Packit |
b099d7 |
XtPointer client_data;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
bcePtr = &(iconGBaseClassExtRec );
|
|
Packit |
b099d7 |
client_data = NULL;
|
|
Packit |
b099d7 |
resource_class = NULL;
|
|
Packit |
b099d7 |
resource_name = NULL;
|
|
Packit |
b099d7 |
arrayCount =
|
|
Packit |
b099d7 |
_XmSecondaryResourceData ( bcePtr, data_rtn, client_data,
|
|
Packit |
b099d7 |
resource_name, resource_class,
|
|
Packit |
b099d7 |
GetIconGClassSecResBase);
|
|
Packit |
b099d7 |
return (arrayCount);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* GetIconGClassResBase ()
|
|
Packit |
b099d7 |
* retrun the address of the base of resources.
|
|
Packit |
b099d7 |
* If client data is the same as the address of the secndary data in the
|
|
Packit |
b099d7 |
* class record then send the base address of the cache-resources for this
|
|
Packit |
b099d7 |
* instance of the widget.
|
|
Packit |
b099d7 |
* Right now we do not try to get the address of the cached_data from
|
|
Packit |
b099d7 |
* the Gadget component of this instance - since Gadget class does not
|
|
Packit |
b099d7 |
* have any cached_resources defined. If later secondary resources are
|
|
Packit |
b099d7 |
* defined for Gadget class then this routine will have to change.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static XtPointer
|
|
Packit |
b099d7 |
GetIconGClassSecResBase(
|
|
Packit |
b099d7 |
Widget widget,
|
|
Packit |
b099d7 |
XtPointer client_data ) /* unused */
|
|
Packit |
b099d7 |
{ XtPointer widgetSecdataPtr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
widgetSecdataPtr = (XtPointer) (IG_Cache(widget));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (widgetSecdataPtr);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* InputDispatch
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
InputDispatch(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XEvent *event,
|
|
Packit |
b099d7 |
Mask event_mask)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (event_mask & XmHELP_EVENT) _XmSocorro(wid,event,NULL,NULL);
|
|
Packit |
b099d7 |
else if (event_mask & XmFOCUS_IN_EVENT)
|
|
Packit |
b099d7 |
_XmFocusInGadget (wid, event, NULL, NULL);
|
|
Packit |
b099d7 |
else if (event_mask & XmFOCUS_OUT_EVENT)
|
|
Packit |
b099d7 |
_XmFocusOutGadget (wid, event, NULL, NULL);
|
|
Packit |
b099d7 |
else if (event_mask & XmENTER_EVENT)
|
|
Packit |
b099d7 |
_XmEnterGadget (wid, event, NULL, NULL);
|
|
Packit |
b099d7 |
else if (event_mask & XmLEAVE_EVENT)
|
|
Packit |
b099d7 |
_XmLeaveGadget (wid, event, NULL, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetBaselines
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
GetBaselines(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
Dimension **baselines,
|
|
Packit |
b099d7 |
int *line_count)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension * base_array;
|
|
Packit |
b099d7 |
Position label_y ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*line_count = 1;
|
|
Packit |
b099d7 |
base_array = (Dimension *)XtMalloc(sizeof(Dimension));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
GetLabelXY(wid, NULL, &label_y);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_LabelString(wid) == NULL) {
|
|
Packit |
b099d7 |
base_array[0] = IG_HLThickness(wid) + label_y ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
base_array[0] = IG_HLThickness(wid) + label_y
|
|
Packit |
b099d7 |
+ DEFAULT_LABEL_MARGIN_HEIGHT
|
|
Packit |
b099d7 |
+ XmStringBaseline(IG_RenderTable(wid), IG_LabelString(wid));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*baselines = base_array;
|
|
Packit |
b099d7 |
return(True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetDisplayRect
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
GetDisplayRect(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XRectangle *displayrect)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension w = 0, h = 0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(*displayrect).x = IG_HLThickness(wid);
|
|
Packit |
b099d7 |
(*displayrect).y = IG_HLThickness(wid);
|
|
Packit |
b099d7 |
GetSize(wid, &w, &h);
|
|
Packit |
b099d7 |
(*displayrect).width = w - 2*IG_HLThickness(wid);
|
|
Packit |
b099d7 |
(*displayrect).height = h - 2*IG_HLThickness(wid) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* MarginsProc
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
MarginsProc(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XmBaselineMargins *margins_rec)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (margins_rec->get_or_set == XmBASELINE_GET) {
|
|
Packit |
b099d7 |
margins_rec->margin_top = DEFAULT_LABEL_MARGIN_HEIGHT;
|
|
Packit |
b099d7 |
margins_rec->margin_bottom = DEFAULT_LABEL_MARGIN_HEIGHT;
|
|
Packit |
b099d7 |
margins_rec->shadow = IG_ShadowThickness(w);
|
|
Packit |
b099d7 |
margins_rec->highlight = IG_HLThickness(w);
|
|
Packit |
b099d7 |
margins_rec->text_height = IG_LabelRectHeight(w);
|
|
Packit |
b099d7 |
margins_rec->margin_height = DEFAULT_LABEL_MARGIN_HEIGHT;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*---------------------
|
|
Packit |
b099d7 |
| XmIconGadget methods |
|
|
Packit |
b099d7 |
---------------------*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*------------
|
|
Packit |
b099d7 |
| ActionProcs |
|
|
Packit |
b099d7 |
------------*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*-------------------
|
|
Packit |
b099d7 |
| Internal functions |
|
|
Packit |
b099d7 |
-------------------*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* ChangeHighlightGC
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ChangeHighlightGC(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
XtEnum selection_mode,
|
|
Packit |
b099d7 |
int line_width)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtGCMask valueMask;
|
|
Packit |
b099d7 |
XGCValues values;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
valueMask = GCLineStyle | GCLineWidth | GCDashList | GCCapStyle ;
|
|
Packit |
b099d7 |
values.line_width = line_width;
|
|
Packit |
b099d7 |
values.dashes = MAX(IG_HLThickness(wid), 8);
|
|
Packit |
b099d7 |
values.cap_style = CapProjecting;
|
|
Packit |
b099d7 |
values.line_style = (selection_mode == XmADD_MODE)
|
|
Packit |
b099d7 |
? LineDoubleDash
|
|
Packit |
b099d7 |
: LineSolid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XChangeGC(XtDisplay(wid), IG_HighlightGC(wid), valueMask, &values);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* UpdateSelectGCs
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
UpdateSelectGCs(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
Pixel select_color)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XGCValues values;
|
|
Packit |
b099d7 |
XtGCMask valueMask;
|
|
Packit |
b099d7 |
XFontStruct *fs = (XFontStruct *)NULL;
|
|
Packit |
b099d7 |
XtGCMask modifyMask = GCClipMask | GCClipXOrigin | GCClipYOrigin;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_SelectedGC(wid))
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_SelectedGC(wid));
|
|
Packit |
b099d7 |
if (IG_InverseGC(wid))
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_InverseGC(wid));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
valueMask = GCForeground | GCBackground | GCGraphicsExposures;
|
|
Packit |
b099d7 |
values.graphics_exposures = FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* we need a font becasue the inverse gc is going to be
|
|
Packit |
b099d7 |
used to render some text */
|
|
Packit |
b099d7 |
if (XmeRenderTableGetDefaultFont(IG_RenderTable(wid), &fs)) {
|
|
Packit |
b099d7 |
values.font = fs->fid;
|
|
Packit |
b099d7 |
valueMask |= GCFont;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* the select color can take the special value XmREVERSED_GROUND_COLORS,
|
|
Packit |
b099d7 |
which means use parent background as ink for text and parent
|
|
Packit |
b099d7 |
foreground as back for the icon rendering */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
values.background = IG_Foreground(wid) ;
|
|
Packit |
b099d7 |
if (select_color != XmREVERSED_GROUND_COLORS) {
|
|
Packit |
b099d7 |
values.foreground = select_color ;
|
|
Packit |
b099d7 |
IG_InverseGC(wid) = NULL ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* we need a GC to hold the parent background as ink */
|
|
Packit |
b099d7 |
XtVaGetValues(XtParent(wid),
|
|
Packit |
b099d7 |
XmNbackground, &(values.foreground), NULL);
|
|
Packit |
b099d7 |
IG_InverseGC(wid) = XtAllocateGC(XtParent(wid),
|
|
Packit |
b099d7 |
XtParent(wid)->core.depth,
|
|
Packit |
b099d7 |
valueMask, &values, modifyMask, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* get the foreground for the inversed selected background */
|
|
Packit |
b099d7 |
values.background = IG_Background(wid) ;
|
|
Packit |
b099d7 |
XtVaGetValues(XtParent(wid),
|
|
Packit |
b099d7 |
XmNforeground, &(values.foreground), NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_SelectedGC(wid) = XtAllocateGC(XtParent(wid),
|
|
Packit |
b099d7 |
XtParent(wid)->core.depth,
|
|
Packit |
b099d7 |
valueMask, &values, modifyMask, 0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* UpdateGCs
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
UpdateGCs(
|
|
Packit |
b099d7 |
Widget wid)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XGCValues values;
|
|
Packit |
b099d7 |
XtGCMask valueMask;
|
|
Packit |
b099d7 |
XFontStruct *fs = (XFontStruct *)NULL;
|
|
Packit |
b099d7 |
XmContainerDataRec container_data ;
|
|
Packit |
b099d7 |
Pixel select_color;
|
|
Packit |
b099d7 |
XtGCMask modifyMask = GCClipMask | GCClipXOrigin | GCClipYOrigin;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_NormalGC(wid))
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_NormalGC(wid));
|
|
Packit |
b099d7 |
if (IG_InsensitiveGC(wid))
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_InsensitiveGC(wid));
|
|
Packit |
b099d7 |
if (IG_BackgroundGC(wid))
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_BackgroundGC(wid));
|
|
Packit |
b099d7 |
if (IG_TopShadowGC(wid))
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_TopShadowGC(wid));
|
|
Packit |
b099d7 |
if (IG_BottomShadowGC(wid))
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_BottomShadowGC(wid));
|
|
Packit |
b099d7 |
if (IG_HighlightGC(wid))
|
|
Packit |
b099d7 |
XtReleaseGC(XtParent(wid),IG_HighlightGC(wid));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/** normal gc **/
|
|
Packit |
b099d7 |
valueMask = GCForeground | GCBackground | GCGraphicsExposures;
|
|
Packit |
b099d7 |
values.foreground = IG_Foreground(wid) ;
|
|
Packit |
b099d7 |
values.background = IG_Background(wid) ;
|
|
Packit |
b099d7 |
values.graphics_exposures = FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XmeRenderTableGetDefaultFont(IG_RenderTable(wid), &fs)) {
|
|
Packit |
b099d7 |
values.font = fs->fid;
|
|
Packit |
b099d7 |
valueMask |= GCFont;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_NormalGC(wid) = XtAllocateGC(XtParent(wid),
|
|
Packit |
b099d7 |
XtParent(wid)->core.depth,
|
|
Packit |
b099d7 |
valueMask, &values, modifyMask, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/** background gc **/
|
|
Packit |
b099d7 |
values.foreground = IG_Background(wid) ;
|
|
Packit |
b099d7 |
values.background = IG_Foreground(wid) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (PIXMAP_VALID(IG_BackgroundPixmap(wid))) {
|
|
Packit |
b099d7 |
int depth ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeGetPixmapData(XtScreen(wid),IG_BackgroundPixmap(wid) ,
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
&depth,
|
|
Packit |
b099d7 |
NULL, NULL, NULL, NULL, NULL, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (depth == 1) {
|
|
Packit |
b099d7 |
valueMask |= GCFillStyle | GCStipple ;
|
|
Packit |
b099d7 |
values.fill_style = FillOpaqueStippled;
|
|
Packit |
b099d7 |
values.stipple = IG_BackgroundPixmap(wid);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
valueMask |= GCFillStyle | GCTile ;
|
|
Packit |
b099d7 |
values.fill_style = FillTiled;
|
|
Packit |
b099d7 |
values.tile = IG_BackgroundPixmap(wid);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_BackgroundGC(wid) = XtAllocateGC(XtParent(wid),
|
|
Packit |
b099d7 |
XtParent(wid)->core.depth,
|
|
Packit |
b099d7 |
valueMask, &values, modifyMask, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/** selected gcs **/
|
|
Packit |
b099d7 |
/* use a select color from the trait if possible,
|
|
Packit |
b099d7 |
otherwise default to select background of the parent
|
|
Packit |
b099d7 |
(or is it of the container logical parent ? not really
|
|
Packit |
b099d7 |
important for the header case is not selectable... */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* get the container information */
|
|
Packit |
b099d7 |
/* I need the selection mode for the highlight init value */
|
|
Packit |
b099d7 |
container_data.valueMask = ContSelectColor | ContSelectionMode;
|
|
Packit |
b099d7 |
GetContainerData(wid, &container_data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (container_data.valueMask & ContSelectColor) {
|
|
Packit |
b099d7 |
select_color = container_data.select_color;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
select_color = XmREVERSED_GROUND_COLORS ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
UpdateSelectGCs(wid, select_color) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/** insensitive gc **/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef FIX_1381
|
|
Packit |
b099d7 |
/*generally gray insensitive foreground (instead stipple)*/
|
|
Packit |
b099d7 |
values.foreground = _XmAssignInsensitiveColor( wid);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
values.foreground = IG_Foreground(wid) ;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
values.background = IG_Background(wid) ;
|
|
Packit |
b099d7 |
#ifdef FIX_1381
|
|
Packit |
b099d7 |
valueMask |= GCFillStyle;
|
|
Packit |
b099d7 |
values.fill_style = FillSolid;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
valueMask |= GCFillStyle | GCStipple;
|
|
Packit |
b099d7 |
values.fill_style = FillOpaqueStippled;
|
|
Packit |
b099d7 |
values.stipple = _XmGetInsensitiveStippleBitmap(wid);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_InsensitiveGC(wid) = XtAllocateGC(XtParent(wid),
|
|
Packit |
b099d7 |
XtParent(wid)->core.depth,
|
|
Packit |
b099d7 |
valueMask, &values, modifyMask, 0);
|
|
Packit |
b099d7 |
#ifdef FIX_1381
|
|
Packit |
b099d7 |
/*light shadow for insensitive text (instead stipple)*/
|
|
Packit |
b099d7 |
values.foreground = IG_TopShadowColor(wid);
|
|
Packit |
b099d7 |
IG_ShadowGC(wid) = XtAllocateGC(XtParent(wid),
|
|
Packit |
b099d7 |
XtParent(wid)->core.depth,
|
|
Packit |
b099d7 |
valueMask, &values, modifyMask, 0);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/** highlight **/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
valueMask = (GCForeground | GCBackground | GCLineWidth |
|
|
Packit |
b099d7 |
GCLineStyle | GCDashList);
|
|
Packit |
b099d7 |
modifyMask = (GCLineStyle | GCLineWidth | GCDashList |
|
|
Packit |
b099d7 |
GCClipXOrigin | GCClipYOrigin | GCClipMask);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
values.foreground = IG_HighlightColor(wid);
|
|
Packit |
b099d7 |
XtVaGetValues(XtParent(wid), XmNbackground, &(values.background), NULL);
|
|
Packit |
b099d7 |
values.line_width = IG_HLThickness(wid);
|
|
Packit |
b099d7 |
values.dashes = MAX(values.line_width, 8);
|
|
Packit |
b099d7 |
values.line_style = (container_data.selection_mode == XmADD_MODE) ?
|
|
Packit |
b099d7 |
LineDoubleDash : LineSolid;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_HighlightGC(wid) = XtAllocateGC(XtParent(wid),
|
|
Packit |
b099d7 |
XtParent(wid)->core.depth,
|
|
Packit |
b099d7 |
valueMask, &values,
|
|
Packit |
b099d7 |
modifyMask, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/** topshadow, bottomshadow gc */
|
|
Packit |
b099d7 |
IG_TopShadowGC(wid) =
|
|
Packit |
b099d7 |
_XmGetPixmapBasedGC (wid,
|
|
Packit |
b099d7 |
IG_TopShadowColor(wid),
|
|
Packit |
b099d7 |
IG_Background(wid),
|
|
Packit |
b099d7 |
IG_TopShadowPixmap(wid));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
IG_BottomShadowGC(wid) =
|
|
Packit |
b099d7 |
_XmGetPixmapBasedGC (wid,
|
|
Packit |
b099d7 |
IG_BottomShadowColor(wid),
|
|
Packit |
b099d7 |
IG_Background(wid),
|
|
Packit |
b099d7 |
IG_BottomShadowPixmap(wid));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetStringTableReOrdered.
|
|
Packit |
b099d7 |
* lazy alloc/filling using realloc
|
|
Packit |
b099d7 |
* --- Never free the returned array.---
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static XmStringTable
|
|
Packit |
b099d7 |
GetStringTableReOrdered(
|
|
Packit |
b099d7 |
XmStringTable st,
|
|
Packit |
b099d7 |
Cardinal st_count,
|
|
Packit |
b099d7 |
Cardinal * order,
|
|
Packit |
b099d7 |
Cardinal order_count)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
static XmString * Default_st = NULL ;
|
|
Packit |
b099d7 |
static Cardinal Max_st_count = 0;
|
|
Packit |
b099d7 |
Cardinal i, count ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!order_count || !st_count) return NULL ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* here we are filling up a new string table out of an existing
|
|
Packit |
b099d7 |
one and a new order table. Take only the minimum number of both */
|
|
Packit |
b099d7 |
count = MIN(order_count, st_count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (count > Max_st_count) {
|
|
Packit |
b099d7 |
Max_st_count = MAX(count, 33);
|
|
Packit |
b099d7 |
Default_st = (XmStringTable) XtRealloc((char*) Default_st,
|
|
Packit |
b099d7 |
Max_st_count * sizeof(XmString));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0; i < count; i++) {
|
|
Packit |
b099d7 |
if (order) {
|
|
Packit |
b099d7 |
if (order[i] <= st_count)
|
|
Packit |
b099d7 |
Default_st[i] = st[order[i] - 1];
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
Default_st[i] = NULL ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
Default_st[i] = st[i];
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return Default_st ;
|
|
Packit |
b099d7 |
/* This is realloced memory, be sure that no one is keeping
|
|
Packit |
b099d7 |
reference to this stuff longer enough for it to be realloced again */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetStringTableExtent
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
1> If the XmTablist has exactly as many entries as
|
|
Packit |
b099d7 |
XmNdetailOrderCount, the last entry is clipped, and consequently,
|
|
Packit |
b099d7 |
all IconGadgets will ask for the same size.
|
|
Packit |
b099d7 |
2> If the XmTablist is greater than XmNdetailOrderCount, the extra
|
|
Packit |
b099d7 |
tabs are ignored
|
|
Packit |
b099d7 |
3> if the XmTablist is XmNdetailOrderCount-1, then the last detail
|
|
Packit |
b099d7 |
is not clipped, but extends as far as needed. The IconGadget
|
|
Packit |
b099d7 |
geometry request will be for the full size. The Container
|
|
Packit |
b099d7 |
will ask for the maximum width requested by all its IconGadgets.
|
|
Packit |
b099d7 |
4> If the XmTablist is less than XmNdetailOrderCount-1, then,
|
|
Packit |
b099d7 |
concatenate the extra details at the end and request
|
|
Packit |
b099d7 |
the additional width.
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetStringTableExtent(
|
|
Packit |
b099d7 |
Screen * screen,
|
|
Packit |
b099d7 |
XmStringTable st,
|
|
Packit |
b099d7 |
Cardinal st_count,
|
|
Packit |
b099d7 |
XmRenderTable render_table,
|
|
Packit |
b099d7 |
XmTabList tab_list,
|
|
Packit |
b099d7 |
Dimension hor_spacing, /* for the tab-less concat details */
|
|
Packit |
b099d7 |
Dimension * width_ret,
|
|
Packit |
b099d7 |
Dimension * height_ret,
|
|
Packit |
b099d7 |
Position * baseline_ret)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Cardinal i ;
|
|
Packit |
b099d7 |
Dimension w, h, baseline ;
|
|
Packit |
b099d7 |
unsigned int tab_count = 0 ;
|
|
Packit |
b099d7 |
Dimension height_under_max = 0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*baseline_ret = 0 ;
|
|
Packit |
b099d7 |
*width_ret = 0 ;
|
|
Packit |
b099d7 |
*height_ret = 0 ;
|
|
Packit |
b099d7 |
if (tab_list) tab_count = XmTabListTabCount(tab_list) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (st == NULL || !st_count) return ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* the extra tabs are ignored */
|
|
Packit |
b099d7 |
tab_count = MIN(tab_count, st_count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* the width is given by the last tab position + the remaining items */
|
|
Packit |
b099d7 |
if (tab_count) *width_ret = _XmTabListGetPosition(screen,
|
|
Packit |
b099d7 |
tab_list,
|
|
Packit |
b099d7 |
XmPIXELS, tab_count-1);
|
|
Packit |
b099d7 |
/* the height is the sum of max baseline + max height under baseline */
|
|
Packit |
b099d7 |
for (i = 0; i < st_count; i++) {
|
|
Packit |
b099d7 |
if (st[i]) {
|
|
Packit |
b099d7 |
XmStringExtent(render_table, st[i], &w, &h);
|
|
Packit |
b099d7 |
baseline = XmStringBaseline(render_table, st[i]);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
h = 0 ;
|
|
Packit |
b099d7 |
w = 0 ;
|
|
Packit |
b099d7 |
baseline = 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
height_under_max = MAX(height_under_max, h - baseline);
|
|
Packit |
b099d7 |
*baseline_ret = MAX(*baseline_ret, (Position)baseline);
|
|
Packit |
b099d7 |
if (i >= tab_count) *width_ret += w + hor_spacing;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*height_ret = *baseline_ret + height_under_max ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* GetSize
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetSize(
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
Dimension * ret_width,
|
|
Packit |
b099d7 |
Dimension * ret_height)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmContainerDataRec container_data ;
|
|
Packit |
b099d7 |
Dimension ht = IG_HLThickness(wid);
|
|
Packit |
b099d7 |
Dimension mw = IG_MarginWidth(wid), mh = IG_MarginHeight(wid);
|
|
Packit |
b099d7 |
int ideal_width, ideal_height;
|
|
Packit |
b099d7 |
Dimension detail_width, detail_height;
|
|
Packit |
b099d7 |
XmStringTable new_detail ;
|
|
Packit |
b099d7 |
Position label_y, lab_baseline, detail_baseline ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* get the container information */
|
|
Packit |
b099d7 |
container_data.valueMask = ContAllValid ;
|
|
Packit |
b099d7 |
GetContainerData(wid, &container_data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**** first the size without the detail */
|
|
Packit |
b099d7 |
ideal_width = GetIconLabelWidth(wid) ;
|
|
Packit |
b099d7 |
ideal_height = GetIconLabelHeight(wid) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (SHOW_DETAIL(wid, &container_data)) {
|
|
Packit |
b099d7 |
/* get the detail table to be displayed */
|
|
Packit |
b099d7 |
new_detail =
|
|
Packit |
b099d7 |
GetStringTableReOrdered(IG_Detail(wid), IG_DetailCount(wid),
|
|
Packit |
b099d7 |
container_data.detail_order,
|
|
Packit |
b099d7 |
container_data.detail_order_count);
|
|
Packit |
b099d7 |
/* ask for its extent using the provided container tab list */
|
|
Packit |
b099d7 |
/* new_detail might be NULL at this point, extent should
|
|
Packit |
b099d7 |
return 0 size if so. some new_detail[i] might also be NULL,
|
|
Packit |
b099d7 |
in which case extent should go to the next tab. note that
|
|
Packit |
b099d7 |
tab might also be NULL. */
|
|
Packit |
b099d7 |
GetStringTableExtent(XtScreen(wid),
|
|
Packit |
b099d7 |
new_detail, MIN(container_data.detail_order_count,
|
|
Packit |
b099d7 |
IG_DetailCount(wid)),
|
|
Packit |
b099d7 |
IG_RenderTable(wid),
|
|
Packit |
b099d7 |
container_data.detail_tablist,
|
|
Packit |
b099d7 |
DEFAULT_HOR_SPACING,
|
|
Packit |
b099d7 |
&detail_width, &detail_height, &detail_baseline);
|
|
Packit |
b099d7 |
/* width in detail is sum of first_column_width (where
|
|
Packit |
b099d7 |
the x has been removed already) + the detail width */
|
|
Packit |
b099d7 |
ideal_width = container_data.first_column_width + (int)detail_width
|
|
Packit |
b099d7 |
+ mw - ht;
|
|
Packit |
b099d7 |
/* the baseline have to be taken into account in the calculation
|
|
Packit |
b099d7 |
of the height needed */
|
|
Packit |
b099d7 |
GetLabelXY(wid, NULL, &label_y);
|
|
Packit |
b099d7 |
lab_baseline = XmStringBaseline(IG_RenderTable(wid),
|
|
Packit |
b099d7 |
IG_LabelString(wid));
|
|
Packit |
b099d7 |
ideal_height = MAX(ideal_height,
|
|
Packit |
b099d7 |
label_y - ht + DEFAULT_LABEL_MARGIN_HEIGHT +
|
|
Packit |
b099d7 |
lab_baseline - mh -
|
|
Packit |
b099d7 |
detail_baseline + detail_height);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* do not set non null dimensions */
|
|
Packit |
b099d7 |
if (*ret_width == 0) *ret_width = ideal_width + 2*ht;
|
|
Packit |
b099d7 |
if (*ret_height == 0) *ret_height = ideal_height + 2*ht;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*-------------------
|
|
Packit |
b099d7 |
| Trait methods |
|
|
Packit |
b099d7 |
-------------------*/
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* ContItemSetValues
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Deal with a container setting new attributes on me
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ContItemSetValues(Widget w,
|
|
Packit |
b099d7 |
XmContainerItemData contItemData)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtExposeProc expose;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* here there is a match between the containerItem and the IconGadget
|
|
Packit |
b099d7 |
resource values, because we are doing both at the same time and it's
|
|
Packit |
b099d7 |
convenient. Others IconGadget kind might have to map our
|
|
Packit |
b099d7 |
viewType, visualEmphasis values onto their corresponding types */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (contItemData->valueMask & ContItemViewType)
|
|
Packit |
b099d7 |
XtVaSetValues(w, XmNviewType, contItemData->view_type, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (contItemData->valueMask & ContItemVisualEmphasis) {
|
|
Packit |
b099d7 |
IG_VisualEmphasis(w) = contItemData->visual_emphasis ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized(XtParent(w)))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
expose = w->core.widget_class->core_class.expose;
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(* (expose)) (w, NULL, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* ContItemGetValues
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ContItemGetValues(Widget w,
|
|
Packit |
b099d7 |
XmContainerItemData contItemData)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (contItemData->valueMask & ContItemViewType)
|
|
Packit |
b099d7 |
contItemData->view_type = IG_ViewType(w);
|
|
Packit |
b099d7 |
if (contItemData->valueMask & ContItemVisualEmphasis)
|
|
Packit |
b099d7 |
contItemData->visual_emphasis = IG_VisualEmphasis(w);
|
|
Packit |
b099d7 |
if (contItemData->valueMask & ContItemIconWidth) {
|
|
Packit |
b099d7 |
contItemData->icon_width = 2*IG_HLThickness(w) + GetIconLabelWidth(w);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (contItemData->valueMask & ContItemDetailCount) {
|
|
Packit |
b099d7 |
contItemData->detail_count = IG_DetailCount(w);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
HandleRedraw (
|
|
Packit |
b099d7 |
Widget kid,
|
|
Packit |
b099d7 |
Widget cur_parent, /* unused */
|
|
Packit |
b099d7 |
Widget new_parent, /* unused */
|
|
Packit |
b099d7 |
Mask visual_flag)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmIconGadget ig = (XmIconGadget) kid ;
|
|
Packit |
b099d7 |
Boolean redraw = False;
|
|
Packit |
b099d7 |
XmIconGCacheObjPart oldCopy;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (visual_flag & VisualSelectColor) {
|
|
Packit |
b099d7 |
XmContainerDataRec container_data ;
|
|
Packit |
b099d7 |
Pixel select_color;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* this is all shared data, so we need to make a copy
|
|
Packit |
b099d7 |
because changing any field */
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
_XmCacheCopy((XtPointer) IG_Cache(ig), (XtPointer) &oldCopy,
|
|
Packit |
b099d7 |
sizeof(XmIconGCacheObjPart));
|
|
Packit |
b099d7 |
_XmCacheDelete ((XtPointer) IG_Cache(ig));
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
IG_Cache(ig) = &oldCopy;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* use a select color from the trait if possible,
|
|
Packit |
b099d7 |
otherwise default to select background of the parent
|
|
Packit |
b099d7 |
(or is it of the container logical parent ? not really
|
|
Packit |
b099d7 |
important for the header case is not selectable... */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* get the container information */
|
|
Packit |
b099d7 |
/* I need the selection mode for the highlight init value */
|
|
Packit |
b099d7 |
container_data.valueMask = ContSelectColor ;
|
|
Packit |
b099d7 |
GetContainerData(kid, &container_data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (container_data.valueMask & ContSelectColor) {
|
|
Packit |
b099d7 |
select_color = container_data.select_color;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
select_color = XmREVERSED_GROUND_COLORS ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
UpdateSelectGCs(kid, select_color) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
redraw = True;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* now cache back the new version */
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
IG_Cache(ig) = (XmIconGCacheObjPart *)
|
|
Packit |
b099d7 |
_XmCachePart( IG_ClassCachePart(ig),
|
|
Packit |
b099d7 |
(XtPointer) IG_Cache(ig),
|
|
Packit |
b099d7 |
sizeof(XmIconGCacheObjPart));
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return redraw ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetColors(Widget w,
|
|
Packit |
b099d7 |
XmAccessColorData color_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmContainerDataRec container_data ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* since we use our own private converter, no real
|
|
Packit |
b099d7 |
need to check for validity here, we already do it
|
|
Packit |
b099d7 |
in the converter itself, but it doesn't hurt
|
|
Packit |
b099d7 |
and if we ever change IconG to use a generic pixmap
|
|
Packit |
b099d7 |
converter (solve the mask pixmap setting), it will work
|
|
Packit |
b099d7 |
all by itself */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (IG_Cache(w)) { /* mean it's valid */
|
|
Packit |
b099d7 |
color_data->valueMask = AccessForeground | AccessBackgroundPixel |
|
|
Packit |
b099d7 |
AccessHighlightColor | AccessTopShadowColor |
|
|
Packit |
b099d7 |
AccessBottomShadowColor | AccessSelectColor;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
color_data->background = IG_Background(w);
|
|
Packit |
b099d7 |
color_data->foreground = IG_Foreground(w);
|
|
Packit |
b099d7 |
color_data->highlight_color = IG_Foreground(w);
|
|
Packit |
b099d7 |
color_data->top_shadow_color = IG_TopShadowColor(w);
|
|
Packit |
b099d7 |
color_data->bottom_shadow_color = IG_BottomShadowColor(w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
container_data.valueMask = ContSelectColor ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*** get the Container select color using the trait */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmIconGadgetClass igc = (XmIconGadgetClass) XtClass(w);
|
|
Packit |
b099d7 |
Widget container_id ;
|
|
Packit |
b099d7 |
XmContainerTrait container_trait ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
container_id = (igc->icong_class.get_container_parent) ?
|
|
Packit |
b099d7 |
(*(igc->icong_class.get_container_parent))(w) : XtParent(w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
container_trait = (XmContainerTrait)
|
|
Packit |
b099d7 |
XmeTraitGet((XtPointer)XtClass(container_id), XmQTcontainer) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* remove message about uninitialized memory read */
|
|
Packit |
b099d7 |
container_data.first_column_width = 0;
|
|
Packit |
b099d7 |
container_data.select_color = XmREVERSED_GROUND_COLORS;
|
|
Packit |
b099d7 |
if (container_trait)
|
|
Packit |
b099d7 |
container_trait->getValues(container_id, &container_data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (container_data.valueMask & ContSelectColor) {
|
|
Packit |
b099d7 |
color_data->select_color = container_data.select_color;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
color_data->select_color = XmREVERSED_GROUND_COLORS ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} else { /* cannot access the color of the gadget,
|
|
Packit |
b099d7 |
because the cache is not yet present.
|
|
Packit |
b099d7 |
Return that value, so that the converter
|
|
Packit |
b099d7 |
(probably the one calling it)
|
|
Packit |
b099d7 |
can take the appropriate step */
|
|
Packit |
b099d7 |
color_data->valueMask = AccessColorInvalid ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
PointIn(Widget wid,
|
|
Packit |
b099d7 |
Position x,
|
|
Packit |
b099d7 |
Position y)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmContainerDataRec container_data ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* x, y in parent coordinates system */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* first check that point is in bbox */
|
|
Packit |
b099d7 |
if (!(x >= wid->core.x && y >= wid->core.y &&
|
|
Packit |
b099d7 |
x < wid->core.x + wid->core.width &&
|
|
Packit |
b099d7 |
y < wid->core.y + wid->core.height))
|
|
Packit |
b099d7 |
return False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* if we have detail then it's enough to answer yes */
|
|
Packit |
b099d7 |
container_data.valueMask = ContAllValid ;
|
|
Packit |
b099d7 |
GetContainerData(wid, &container_data);
|
|
Packit |
b099d7 |
if (SHOW_DETAIL(wid, &container_data))
|
|
Packit |
b099d7 |
return True;
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
Position label_x, label_y;
|
|
Packit |
b099d7 |
XPoint points[8];
|
|
Packit |
b099d7 |
Cardinal n;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* now check if it's not in empty space at the corners */
|
|
Packit |
b099d7 |
GetLabelXY(wid, &label_x, &label_y);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* undo the ltr layout for label_x, because getshapeinfo does it */
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid)) {
|
|
Packit |
b099d7 |
label_x = XtWidth(wid) - IG_LabelRectWidth(wid) - label_x;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
n = GetShapeInfo(wid, GetLargeIconX(wid), GetSmallIconY(wid),
|
|
Packit |
b099d7 |
label_x, label_y,
|
|
Packit |
b099d7 |
container_data.first_column_width, INVALID_DIMENSION,
|
|
Packit |
b099d7 |
points);
|
|
Packit |
b099d7 |
if (n == 2) {
|
|
Packit |
b099d7 |
return (x >= points[0].x && x <= points[1].x &&
|
|
Packit |
b099d7 |
y >= points[0].y && y <= points[1].y);
|
|
Packit |
b099d7 |
} else if (n == 8) {
|
|
Packit |
b099d7 |
if (IG_ViewType(wid) == XmLARGE_ICON) {
|
|
Packit |
b099d7 |
Cardinal p0, p2, p3, p5;
|
|
Packit |
b099d7 |
if (!LayoutIsRtoLG(wid)) {
|
|
Packit |
b099d7 |
p0 = 0; p2 = 2; p3 = 3; p5 = 5;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
p0 = 5; p2 = 3; p3 = 2; p5 = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return (y <= points[1].y && /* pixmap row */
|
|
Packit |
b099d7 |
x >= points[p2].x && x <= points[p3].x) ||
|
|
Packit |
b099d7 |
(y >= points[1].y && /* label row */
|
|
Packit |
b099d7 |
x >= points[p0].x && x <= points[p5].x);
|
|
Packit |
b099d7 |
} else { /* SMALL_ICON */
|
|
Packit |
b099d7 |
return (((!LayoutIsRtoLG(wid) && x <= points[1].x) ||
|
|
Packit |
b099d7 |
(LayoutIsRtoLG(wid) && x >= points[1].x)) &&
|
|
Packit |
b099d7 |
/* pixmap column */
|
|
Packit |
b099d7 |
y >= points[0].y && y <= points[7].y) ||
|
|
Packit |
b099d7 |
(((!LayoutIsRtoLG(wid) && x >= points[1].x) ||
|
|
Packit |
b099d7 |
(LayoutIsRtoLG(wid) && x <= points[1].x)) &&
|
|
Packit |
b099d7 |
/* label row */
|
|
Packit |
b099d7 |
y >= points[2].y && y <= points[5].y);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return True; /* actually we should never get there */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*-------------------
|
|
Packit |
b099d7 |
| _Xm functions |
|
|
Packit |
b099d7 |
--------------------*/
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmIconGadgetIconPos(Widget wid, int *x, int *y)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmIconGadget ig = (XmIconGadget)wid;
|
|
Packit |
b099d7 |
Position icon_x;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (ig -> icong.viewtype == XmSMALL_ICON) {
|
|
Packit |
b099d7 |
icon_x = GetSmallIconX(wid);
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid))
|
|
Packit |
b099d7 |
icon_x = XtWidth(wid) - icon_x - IG_SmallIconRectWidth(wid);
|
|
Packit |
b099d7 |
*x = icon_x;
|
|
Packit |
b099d7 |
*y = GetSmallIconY(wid);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
icon_x = GetLargeIconX(wid);
|
|
Packit |
b099d7 |
if (LayoutIsRtoLG(wid))
|
|
Packit |
b099d7 |
icon_x = XtWidth(wid) - icon_x - IG_LargeIconRectWidth(wid);
|
|
Packit |
b099d7 |
*x = icon_x;
|
|
Packit |
b099d7 |
*y = GetLargeIconY(wid);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*-------------------
|
|
Packit |
b099d7 |
| External functions |
|
|
Packit |
b099d7 |
-------------------*/
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
* XmCreateIconGadget
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmCreateIconGadget(
|
|
Packit |
b099d7 |
Widget parent,
|
|
Packit |
b099d7 |
char *name,
|
|
Packit |
b099d7 |
ArgList arglist,
|
|
Packit |
b099d7 |
Cardinal argcount)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return(XtCreateWidget(name,xmIconGadgetClass,parent,arglist,argcount));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmVaCreateIconGadget(
|
|
Packit |
b099d7 |
Widget parent,
|
|
Packit |
b099d7 |
char *name,
|
|
Packit |
b099d7 |
...)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register Widget w;
|
|
Packit |
b099d7 |
va_list var;
|
|
Packit |
b099d7 |
int count;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var,name);
|
|
Packit |
b099d7 |
count = XmeCountVaListSimple(var);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var, name);
|
|
Packit |
b099d7 |
w = XmeVLCreateWidget(name,
|
|
Packit |
b099d7 |
xmIconGadgetClass,
|
|
Packit |
b099d7 |
parent, False,
|
|
Packit |
b099d7 |
var, count);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
return w;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmVaCreateManagedIconGadget(
|
|
Packit |
b099d7 |
Widget parent,
|
|
Packit |
b099d7 |
char *name,
|
|
Packit |
b099d7 |
...)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget w = NULL;
|
|
Packit |
b099d7 |
va_list var;
|
|
Packit |
b099d7 |
int count;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var, name);
|
|
Packit |
b099d7 |
count = XmeCountVaListSimple(var);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var, name);
|
|
Packit |
b099d7 |
w = XmeVLCreateWidget(name,
|
|
Packit |
b099d7 |
xmIconGadgetClass,
|
|
Packit |
b099d7 |
parent, True,
|
|
Packit |
b099d7 |
var, count);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
return w;
|
|
Packit |
b099d7 |
}
|