|
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 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
b099d7 |
#include <config.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define FIX_1152
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef REV_INFO
|
|
Packit |
b099d7 |
#ifndef lint
|
|
Packit |
b099d7 |
static char rcsid[] = "$TOG: XmRenderT.c /main/14 1998/10/26 20:14:42 samborn $"
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifndef X_NOT_STDC_ENV
|
|
Packit |
b099d7 |
#include <stdlib.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#include <string.h>
|
|
Packit |
b099d7 |
#include <ctype.h>
|
|
Packit |
b099d7 |
#include <math.h>
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef __cplusplus
|
|
Packit |
b099d7 |
extern "C" { /* some 'locale.h' do not have prototypes (sun) */
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#include <X11/Xlocale.h>
|
|
Packit |
b099d7 |
#ifdef __cplusplus
|
|
Packit |
b099d7 |
} /* Close scope of 'extern "C"' declaration */
|
|
Packit |
b099d7 |
#endif /* __cplusplus */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <Xm/XmosP.h> /* For ALLOCATE/DEALLOCATE_LOCAL */
|
|
Packit |
b099d7 |
#include <X11/IntrinsicP.h>
|
|
Packit |
b099d7 |
#include <X11/ShellP.h>
|
|
Packit |
b099d7 |
#include <X11/Xresource.h>
|
|
Packit |
b099d7 |
#include <Xm/Display.h> /* For XmGetXmDisplay */
|
|
Packit |
b099d7 |
#include <Xm/DisplayP.h> /* For direct access to callback fields */
|
|
Packit |
b099d7 |
#include "MessagesI.h"
|
|
Packit |
b099d7 |
#include "XmI.h"
|
|
Packit |
b099d7 |
#include "XmRenderTI.h"
|
|
Packit |
b099d7 |
#include "XmStringI.h"
|
|
Packit |
b099d7 |
#include "XmTabListI.h"
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
#include <X11/Xft/Xft.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Warning Messages */
|
|
Packit |
b099d7 |
#define NO_NULL_TAG_MSG _XmMMsgXmRenderT_0000
|
|
Packit |
b099d7 |
#define NULL_DISPLAY_MSG _XmMMsgXmRenderT_0001
|
|
Packit |
b099d7 |
#define INVALID_TYPE_MSG _XmMMsgXmRenderT_0002
|
|
Packit |
b099d7 |
#define CONVERSION_FAILED_MSG _XmMMsgXmRenderT_0003
|
|
Packit |
b099d7 |
#define NULL_FONT_TYPE_MSG _XmMMsgXmRenderT_0004
|
|
Packit |
b099d7 |
#define NULL_LOAD_IMMEDIATE_MSG _XmMMsgXmRenderT_0005
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* local macros */
|
|
Packit |
b099d7 |
#define GetHandle(type) (type *)XtMalloc(sizeof(type))
|
|
Packit |
b099d7 |
#define FreeHandle(handle) XtFree((char *)handle)
|
|
Packit |
b099d7 |
#define SetPtr(handle, ptr) *(handle) = ptr
|
|
Packit |
b099d7 |
#define GetPtr(handle) *(handle)
|
|
Packit |
b099d7 |
#define NameIsString(fontname) \
|
|
Packit |
b099d7 |
(((fontname) != NULL) && ((fontname) != (String)XmAS_IS))
|
|
Packit |
b099d7 |
#define ListIsList(tablist) \
|
|
Packit |
b099d7 |
(((tablist) != NULL) && \
|
|
Packit |
b099d7 |
((unsigned int)(unsigned long)(tablist) != XmAS_IS))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define FIX_1414
|
|
Packit |
b099d7 |
#define FIX_1449
|
|
Packit |
b099d7 |
#define FIX_1444
|
|
Packit |
b099d7 |
#define FIX_1451
|
|
Packit |
b099d7 |
#define FIX_1536
|
|
Packit |
b099d7 |
/**********************************************************************
|
|
Packit |
b099d7 |
* IMPORTANT NOTE: IMPLEMENTATION OF SHARING
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Instances of XmRenderTable and XmRendition are shared via a
|
|
Packit |
b099d7 |
* reference counting mechanism. This comment provides a general
|
|
Packit |
b099d7 |
* overview of how this is done.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* First, both rendertable and renditions are indirectly
|
|
Packit |
b099d7 |
* referenced via a handle mechanism. See the GetHandle,
|
|
Packit |
b099d7 |
* FreeHandle, SetPtr and GetPtr macros above. This allows
|
|
Packit |
b099d7 |
* either the handle to change without the underlying data
|
|
Packit |
b099d7 |
* structure changing, or the underlying data structure to change
|
|
Packit |
b099d7 |
* without the handle changing. I will indicate below where this
|
|
Packit |
b099d7 |
* happens.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Second, the real data structure for rendertable and rendition
|
|
Packit |
b099d7 |
* contain a reference count. This count is incremented on copy
|
|
Packit |
b099d7 |
* and decremented on free. If a decrement produces a zero
|
|
Packit |
b099d7 |
* refcount, the actual memory is freed. If an increment
|
|
Packit |
b099d7 |
* produces a zero refcount, then the refcount has overflowed. The
|
|
Packit |
b099d7 |
* refcount is decremented, and new memory is allocated for a new
|
|
Packit |
b099d7 |
* copy.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Finally, I have defined a terminology for the different types
|
|
Packit |
b099d7 |
* of "copying" that can done based on allocating a new handle or
|
|
Packit |
b099d7 |
* not and allocating a new data structure or not. This probably
|
|
Packit |
b099d7 |
* conflicts with some other existing terminology, probably in
|
|
Packit |
b099d7 |
* object oriented programming. Sorry about that.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Function: Clone Copy Renew Duplicate
|
|
Packit |
b099d7 |
* (Mutate) (Update)
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* handle new new old old
|
|
Packit |
b099d7 |
* structure new inc new inc
|
|
Packit |
b099d7 |
* (changed) (changed)
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* (changed) indicates that the data in the new structure has
|
|
Packit |
b099d7 |
* been changed from the data in the old structure.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* I will use these terms as a short hand in describing the
|
|
Packit |
b099d7 |
* functions below.
|
|
Packit |
b099d7 |
**********************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void CopyInto(XmRendition toRend,
|
|
Packit |
b099d7 |
XmRendition fromRend);
|
|
Packit |
b099d7 |
static void MergeInto(XmRendition toRend,
|
|
Packit |
b099d7 |
XmRendition fromRend);
|
|
Packit |
b099d7 |
static XmRendition CloneRendition(XmRendition rend);
|
|
Packit |
b099d7 |
static XmRendition CopyRendition(XmRendition rend);
|
|
Packit |
b099d7 |
static XmRendition RenewRendition(XmRendition rend);
|
|
Packit |
b099d7 |
static XmRendition DuplicateRendition(XmRendition rend);
|
|
Packit |
b099d7 |
static Boolean FreeRendition(XmRendition rend);
|
|
Packit |
b099d7 |
static void RenditionWarning(char *tag, char *type,
|
|
Packit |
b099d7 |
char *message, Display *dpy);
|
|
Packit |
b099d7 |
static void CleanupResources(XmRendition rend, Boolean copy);
|
|
Packit |
b099d7 |
static void ValidateTag(XmRendition rend,
|
|
Packit |
b099d7 |
XmStringTag dflt);
|
|
Packit |
b099d7 |
static void ValidateAndLoadFont(XmRendition rend, Display *display);
|
|
Packit |
b099d7 |
static void SetRend(XmRendition to,
|
|
Packit |
b099d7 |
XmRendition from);
|
|
Packit |
b099d7 |
static Boolean RendComplete(XmRendition rend);
|
|
Packit |
b099d7 |
static void CopyFromArg(XtArgVal src,
|
|
Packit |
b099d7 |
char *dst,
|
|
Packit |
b099d7 |
unsigned int size);
|
|
Packit |
b099d7 |
static void CopyToArg(char *src,
|
|
Packit |
b099d7 |
XtArgVal *dst,
|
|
Packit |
b099d7 |
unsigned int size);
|
|
Packit |
b099d7 |
static Cardinal GetNamesAndClasses(Widget w,
|
|
Packit |
b099d7 |
XrmNameList names,
|
|
Packit |
b099d7 |
XrmClassList classes);
|
|
Packit |
b099d7 |
static XrmResourceList CompileResourceTable(XtResourceList resources,
|
|
Packit |
b099d7 |
Cardinal num_resources);
|
|
Packit |
b099d7 |
static Boolean GetResources(XmRendition rend,
|
|
Packit |
b099d7 |
Display *dsp,
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
String resname,
|
|
Packit |
b099d7 |
String resclass,
|
|
Packit |
b099d7 |
XmStringTag tag,
|
|
Packit |
b099d7 |
ArgList arglist,
|
|
Packit |
b099d7 |
Cardinal argcount);
|
|
Packit |
b099d7 |
static void SetDefault(XmRendition rend);
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
#ifdef FIX_1536
|
|
Packit |
b099d7 |
static XftColor GetCachedXftColor(Display *display, Pixel color);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** End Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Resource List. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************/
|
|
Packit |
b099d7 |
/* N.B.: The SetDefault procedure has a hardcoded list of all the */
|
|
Packit |
b099d7 |
/* common resources. Be sure to update it when adding resources. */
|
|
Packit |
b099d7 |
/************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define DEFAULT_loadModel XmAS_IS
|
|
Packit |
b099d7 |
#define DEFAULT_tag XmS
|
|
Packit |
b099d7 |
#define DEFAULT_fontName (String)XmAS_IS
|
|
Packit |
b099d7 |
#define DEFAULT_fontType (XmFontType)XmAS_IS
|
|
Packit |
b099d7 |
#define DEFAULT_font (XtPointer)XmAS_IS
|
|
Packit |
b099d7 |
#define DEFAULT_tabs (XmTabList)XmAS_IS
|
|
Packit |
b099d7 |
#define DEFAULT_background XmUNSPECIFIED_PIXEL
|
|
Packit |
b099d7 |
#define DEFAULT_foreground XmUNSPECIFIED_PIXEL
|
|
Packit |
b099d7 |
#define DEFAULT_underlineType XmAS_IS
|
|
Packit |
b099d7 |
#define DEFAULT_strikethruType XmAS_IS
|
|
Packit |
b099d7 |
#define DEFAULT_backgroundState XmAS_IS
|
|
Packit |
b099d7 |
#define DEFAULT_foregroundState XmAS_IS
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
#define DEFAULT_xftFont (XtPointer)XmAS_IS
|
|
Packit |
b099d7 |
#define DEFAULT_fontStyle (String)NULL
|
|
Packit |
b099d7 |
#define DEFAULT_fontFoundry (String)NULL
|
|
Packit |
b099d7 |
#define DEFAULT_fontEncoding (String)NULL
|
|
Packit |
b099d7 |
#define DEFAULT_fontSize 0
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource _XmRenditionResources[] = {
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNtag, XmCTag, XmRString,
|
|
Packit |
b099d7 |
sizeof(XmStringTag), XtOffsetOf(_XmRenditionRec, tag),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_tag
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNfontName, XmCFontName, XmRString,
|
|
Packit |
b099d7 |
sizeof(String), XtOffsetOf(_XmRenditionRec, fontName),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_fontName
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNfontType, XmCFontType, XmRFontType,
|
|
Packit |
b099d7 |
sizeof(XmFontType), XtOffsetOf(_XmRenditionRec, fontType),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_fontType
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNfont, XmCFont, XmRFontStruct,
|
|
Packit |
b099d7 |
sizeof(XtPointer), XtOffsetOf(_XmRenditionRec, font),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_font
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNloadModel, XmCLoadModel, XmRLoadModel,
|
|
Packit |
b099d7 |
sizeof(unsigned char), XtOffsetOf(_XmRenditionRec, loadModel),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_loadModel
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNtabList, XmCTabList, XmRTabList,
|
|
Packit |
b099d7 |
sizeof(XmTabList), XtOffsetOf(_XmRenditionRec, tabs),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_tabs
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNxftFont, XmCXftFont, XmRPointer,
|
|
Packit |
b099d7 |
sizeof (XtPointer), XtOffsetOf (_XmRenditionRec, xftFont),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_xftFont
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNrenditionBackground, XmCRenditionBackground, XmRRenditionPixel,
|
|
Packit |
b099d7 |
sizeof (Pixel), XtOffsetOf (_XmRenditionRec, xftBackground.pixel),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_background
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNrenditionForeground, XmCRenditionForeground, XmRRenditionPixel,
|
|
Packit |
b099d7 |
sizeof (Pixel), XtOffsetOf (_XmRenditionRec, xftForeground.pixel),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_foreground
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNfontStyle, XmCFontStyle, XmRString,
|
|
Packit |
b099d7 |
sizeof(String), XtOffsetOf (_XmRenditionRec, fontStyle),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_fontStyle
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNfontFoundry, XmCFontFoundry, XmRString,
|
|
Packit |
b099d7 |
sizeof(String), XtOffsetOf (_XmRenditionRec, fontFoundry),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_fontFoundry
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNfontEncoding, XmCFontEncoding, XmRString,
|
|
Packit |
b099d7 |
sizeof(String), XtOffsetOf (_XmRenditionRec, fontEncoding),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_fontEncoding
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNfontSize, XmCFontSize, XmRInt,
|
|
Packit |
b099d7 |
sizeof(int), XtOffsetOf (_XmRenditionRec, fontSize),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_fontSize
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNrenditionBackground, XmCRenditionBackground, XmRRenditionPixel,
|
|
Packit |
b099d7 |
sizeof (Pixel), XtOffsetOf (_XmRenditionRec, background),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_background
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNrenditionForeground, XmCRenditionForeground, XmRRenditionPixel,
|
|
Packit |
b099d7 |
sizeof (Pixel), XtOffsetOf (_XmRenditionRec, foreground),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_foreground
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNunderlineType, XmCUnderlineType, XmRLineType,
|
|
Packit |
b099d7 |
sizeof(unsigned char), XtOffsetOf(_XmRenditionRec, underlineType),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_underlineType
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNstrikethruType, XmCStrikethruType, XmRLineType,
|
|
Packit |
b099d7 |
sizeof(unsigned char), XtOffsetOf(_XmRenditionRec, strikethruType),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_strikethruType
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNforegroundState, XmCGroundState, XmRGroundState,
|
|
Packit |
b099d7 |
sizeof(unsigned char), XtOffsetOf(_XmRenditionRec, foregroundState),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_foregroundState
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmNbackgroundState, XmCGroundState, XmRGroundState,
|
|
Packit |
b099d7 |
sizeof(unsigned char), XtOffsetOf(_XmRenditionRec, backgroundState),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) DEFAULT_backgroundState
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmConst Cardinal _XmNumRenditionResources =
|
|
Packit |
b099d7 |
XtNumber(_XmRenditionResources);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Searches up widget hierarchy, quarkifying ancestor names and */
|
|
Packit |
b099d7 |
/* classes. */
|
|
Packit |
b099d7 |
static Cardinal
|
|
Packit |
b099d7 |
GetNamesAndClasses(Widget w, XrmNameList names, XrmClassList classes)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Cardinal length, j;
|
|
Packit |
b099d7 |
XrmQuark t;
|
|
Packit |
b099d7 |
WidgetClass wc;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Return null-terminated quark arrays, with length the number of
|
|
Packit |
b099d7 |
quarks (not including NULL) */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (length = 0; w != NULL; w = (Widget)w->core.parent)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
names[length] = w->core.xrm_name;
|
|
Packit |
b099d7 |
wc = XtClass(w);
|
|
Packit |
b099d7 |
/* KLUDGE KLUDGE KLUDGE KLUDGE */
|
|
Packit |
b099d7 |
if (w->core.parent == NULL && XtIsApplicationShell(w)) {
|
|
Packit |
b099d7 |
classes[length] =
|
|
Packit |
b099d7 |
((ApplicationShellWidget) w)->application.xrm_class;
|
|
Packit |
b099d7 |
} else classes[length] = wc->core_class.xrm_class;
|
|
Packit |
b099d7 |
length++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
/* They're in backwards order, flop them around */
|
|
Packit |
b099d7 |
for (j = 0; j < length/2; j++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
t = names[j];
|
|
Packit |
b099d7 |
names[j] = names[length-j-1];
|
|
Packit |
b099d7 |
names[length-j-1] = t;
|
|
Packit |
b099d7 |
t = classes[j];
|
|
Packit |
b099d7 |
classes[j] = classes[length-j-1];
|
|
Packit |
b099d7 |
classes[length-j-1] = t;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
names[length] = NULLQUARK;
|
|
Packit |
b099d7 |
classes[length] = NULLQUARK;
|
|
Packit |
b099d7 |
return length;
|
|
Packit |
b099d7 |
} /* GetNamesAndClasses */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Converts resource list to quarkified list. */
|
|
Packit |
b099d7 |
static XrmResourceList
|
|
Packit |
b099d7 |
CompileResourceTable(XtResourceList resources,
|
|
Packit |
b099d7 |
Cardinal num_resources)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Cardinal count;
|
|
Packit |
b099d7 |
XrmResourceList table, tPtr;
|
|
Packit |
b099d7 |
XtResourceList rPtr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tPtr = table = (XrmResourceList)XtMalloc(num_resources * sizeof(XrmResource));
|
|
Packit |
b099d7 |
rPtr = resources;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (count = 0; count < num_resources; count++, tPtr++, rPtr++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
tPtr->xrm_name = XrmPermStringToQuark(rPtr->resource_name);
|
|
Packit |
b099d7 |
tPtr->xrm_class = XrmPermStringToQuark(rPtr->resource_class);
|
|
Packit |
b099d7 |
tPtr->xrm_type = XrmPermStringToQuark(rPtr->resource_type);
|
|
Packit |
b099d7 |
tPtr->xrm_size = rPtr->resource_size;
|
|
Packit |
b099d7 |
tPtr->xrm_offset = rPtr->resource_offset;
|
|
Packit |
b099d7 |
tPtr->xrm_default_type = XrmPermStringToQuark(rPtr->default_type);
|
|
Packit |
b099d7 |
tPtr->xrm_default_addr = rPtr->default_addr;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return(table);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Does resource database lookup for arglist, filling in defaults from */
|
|
Packit |
b099d7 |
/* resource list as necessary. */
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
GetResources(XmRendition rend,
|
|
Packit |
b099d7 |
Display *dsp,
|
|
Packit |
b099d7 |
Widget wid,
|
|
Packit |
b099d7 |
String resname,
|
|
Packit |
b099d7 |
String resclass,
|
|
Packit |
b099d7 |
XmStringTag tag,
|
|
Packit |
b099d7 |
ArgList arglist,
|
|
Packit |
b099d7 |
Cardinal argcount)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XrmName names[100];
|
|
Packit |
b099d7 |
XrmClass classes[100];
|
|
Packit |
b099d7 |
Cardinal length = 0;
|
|
Packit |
b099d7 |
static XrmQuarkList quarks = NULL;
|
|
Packit |
b099d7 |
static Cardinal num_quarks = 0;
|
|
Packit |
b099d7 |
static Boolean *found = NULL;
|
|
Packit |
b099d7 |
int i, j;
|
|
Packit |
b099d7 |
static XrmResourceList table = NULL;
|
|
Packit |
b099d7 |
static XrmQuark QString;
|
|
Packit |
b099d7 |
static XrmQuark Qfont;
|
|
Packit |
b099d7 |
Arg *arg;
|
|
Packit |
b099d7 |
XrmName argName;
|
|
Packit |
b099d7 |
XrmResource *res;
|
|
Packit |
b099d7 |
XrmDatabase db = NULL;
|
|
Packit |
b099d7 |
XrmHashTable stackSearchList[100];
|
|
Packit |
b099d7 |
XrmHashTable *searchList = stackSearchList;
|
|
Packit |
b099d7 |
unsigned int searchListSize = 100;
|
|
Packit |
b099d7 |
Boolean got_one = False;
|
|
Packit |
b099d7 |
XrmValue value;
|
|
Packit |
b099d7 |
XrmQuark rawType;
|
|
Packit |
b099d7 |
XrmValue convValue;
|
|
Packit |
b099d7 |
Boolean have_value, copied;
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
XtAppContext app=NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (wid)
|
|
Packit |
b099d7 |
app = XtWidgetToApplicationContext(wid);
|
|
Packit |
b099d7 |
else if (dsp)
|
|
Packit |
b099d7 |
app = XtDisplayToApplicationContext(dsp);
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
/* Initialize quark cache */
|
|
Packit |
b099d7 |
if (quarks == NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
quarks = (XrmQuark *)XtMalloc(_XmNumRenditionResources *
|
|
Packit |
b099d7 |
sizeof(XrmQuark));
|
|
Packit |
b099d7 |
num_quarks = _XmNumRenditionResources;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Initialize found */
|
|
Packit |
b099d7 |
if (found == NULL)
|
|
Packit |
b099d7 |
found = (Boolean *)XtMalloc(_XmNumRenditionResources * sizeof(Boolean));
|
|
Packit |
b099d7 |
bzero(found, _XmNumRenditionResources * sizeof(Boolean));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Compile names and classes. */
|
|
Packit |
b099d7 |
if (wid != NULL)
|
|
Packit |
b099d7 |
length = GetNamesAndClasses(wid, names, classes);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
names[length] = XrmStringToQuark(resname);
|
|
Packit |
b099d7 |
classes[length] = XrmStringToQuark(resclass);
|
|
Packit |
b099d7 |
length++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tag != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
names[length] = XrmStringToQuark(tag);
|
|
Packit |
b099d7 |
classes[length] = XrmPermStringToQuark(XmCRendition);
|
|
Packit |
b099d7 |
length++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
names[length] = NULLQUARK;
|
|
Packit |
b099d7 |
classes[length] = NULLQUARK;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Cache arglist */
|
|
Packit |
b099d7 |
if (num_quarks < argcount)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
quarks = (XrmQuark *)XtRealloc((char *)quarks,
|
|
Packit |
b099d7 |
argcount * sizeof(XrmQuark));
|
|
Packit |
b099d7 |
num_quarks = argcount;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
for (i = 0; i < argcount; i++)
|
|
Packit |
b099d7 |
quarks[i] = XrmStringToQuark(arglist[i].name);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Compile resource description into XrmResourceList if not already done. */
|
|
Packit |
b099d7 |
if (table == NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
table = CompileResourceTable(_XmRenditionResources,
|
|
Packit |
b099d7 |
_XmNumRenditionResources);
|
|
Packit |
b099d7 |
QString = XrmPermStringToQuark(XtCString);
|
|
Packit |
b099d7 |
Qfont = XrmPermStringToQuark(XmNfont);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Set resources from arglist. */
|
|
Packit |
b099d7 |
for (arg = arglist, i = 0; i < argcount; arg++, i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
argName = quarks[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (j = 0, res = table; j < _XmNumRenditionResources; j++, res++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (res->xrm_name == argName)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
CopyFromArg((arg->value),
|
|
Packit |
b099d7 |
((char *)GetPtr(rend) + res->xrm_offset),
|
|
Packit |
b099d7 |
res->xrm_size);
|
|
Packit |
b099d7 |
found[j] = TRUE;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* DB query */
|
|
Packit |
b099d7 |
/* Get database */
|
|
Packit |
b099d7 |
if ((wid != NULL) || (dsp != NULL))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (wid != NULL)
|
|
Packit |
b099d7 |
db = XtScreenDatabase(XtScreenOfObject(wid));
|
|
Packit |
b099d7 |
else db = XtScreenDatabase(DefaultScreenOfDisplay(dsp));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Get searchlist */
|
|
Packit |
b099d7 |
while (!XrmQGetSearchList(db, names, classes,
|
|
Packit |
b099d7 |
searchList, searchListSize))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (searchList == stackSearchList)
|
|
Packit |
b099d7 |
searchList = NULL;
|
|
Packit |
b099d7 |
searchList = (XrmHashTable *)XtRealloc((char*)searchList,
|
|
Packit |
b099d7 |
sizeof(XrmHashTable) *
|
|
Packit |
b099d7 |
(searchListSize *= 2));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Loop over table */
|
|
Packit |
b099d7 |
for (j = 0, res = table; j < _XmNumRenditionResources; j++, res++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (!found[j])
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
copied = False;
|
|
Packit |
b099d7 |
have_value = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((db != NULL) &&
|
|
Packit |
b099d7 |
(XrmQGetSearchResource(searchList, res->xrm_name,
|
|
Packit |
b099d7 |
res->xrm_class, &rawType, &value)))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* convert if necessary */
|
|
Packit |
b099d7 |
if (rawType != res->xrm_type)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (wid != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
convValue.size = res->xrm_size;
|
|
Packit |
b099d7 |
convValue.addr = (char *)GetPtr(rend) + res->xrm_offset;
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Check for special font case.
|
|
Packit |
b099d7 |
* Depending upon the fontType resource, try to convert
|
|
Packit |
b099d7 |
* to a FontSet, else to a FontStruct.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if ((res->xrm_name == Qfont) &&
|
|
Packit |
b099d7 |
(_XmRendFontType(rend) == XmFONT_IS_FONTSET))
|
|
Packit |
b099d7 |
copied = have_value =
|
|
Packit |
b099d7 |
XtConvertAndStore(wid,
|
|
Packit |
b099d7 |
XrmQuarkToString(rawType),
|
|
Packit |
b099d7 |
&value,
|
|
Packit |
b099d7 |
"FontSet",
|
|
Packit |
b099d7 |
&convValue);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
copied = have_value =
|
|
Packit |
b099d7 |
XtConvertAndStore(wid,
|
|
Packit |
b099d7 |
XrmQuarkToString(rawType),
|
|
Packit |
b099d7 |
&value,
|
|
Packit |
b099d7 |
XrmQuarkToString(res->xrm_type),
|
|
Packit |
b099d7 |
&convValue);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else have_value = False;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else have_value = True;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Check for special font case */
|
|
Packit |
b099d7 |
if (have_value)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (res->xrm_name == Qfont)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRendFontName(rend) = value.addr;
|
|
Packit |
b099d7 |
copied = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!got_one && have_value) got_one = True;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Set defaults */
|
|
Packit |
b099d7 |
if (!have_value)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
CopyFromArg((XtArgVal)(res->xrm_default_addr),
|
|
Packit |
b099d7 |
((char *)GetPtr(rend) + res->xrm_offset),
|
|
Packit |
b099d7 |
res->xrm_size);
|
|
Packit |
b099d7 |
copied = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Copy if needed */
|
|
Packit |
b099d7 |
if (!copied)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (res->xrm_type == QString)
|
|
Packit |
b099d7 |
*((String *)((char *)GetPtr(rend) + res->xrm_offset)) =
|
|
Packit |
b099d7 |
value.addr;
|
|
Packit |
b099d7 |
else if (value.addr != NULL)
|
|
Packit |
b099d7 |
memcpy(((char *)GetPtr(rend) + res->xrm_offset),
|
|
Packit |
b099d7 |
value.addr, res->xrm_size);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
bzero(((char *)GetPtr(rend) + res->xrm_offset), res->xrm_size);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (searchList != stackSearchList) XtFree((char *)searchList);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
return(got_one);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Sets all resources to defaults from resource list. */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
SetDefault(XmRendition rend)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* A more robust implementation of this routine would to to loop
|
|
Packit |
b099d7 |
* over _XmRenditionResources and use CopyFromArg to reset values
|
|
Packit |
b099d7 |
* in rend, but to improve performance we use direct assignments.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (rend == NULL) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
memset (&(_XmRendXftFG(rend)), 0, sizeof (XftColor));
|
|
Packit |
b099d7 |
memset (&(_XmRendXftBG(rend)), 0, sizeof (XftColor));
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Leave _XmRendFontOnly unchanged. */
|
|
Packit |
b099d7 |
/* Leave _XmRendRefcount unchanged. */
|
|
Packit |
b099d7 |
_XmRendLoadModel(rend) = DEFAULT_loadModel;
|
|
Packit |
b099d7 |
_XmRendTag(rend) = DEFAULT_tag;
|
|
Packit |
b099d7 |
_XmRendFontName(rend) = DEFAULT_fontName;
|
|
Packit |
b099d7 |
_XmRendFontType(rend) = DEFAULT_fontType;
|
|
Packit |
b099d7 |
_XmRendFont(rend) = DEFAULT_font;
|
|
Packit |
b099d7 |
/* Leave _XmRendDisplay unchanged. */
|
|
Packit |
b099d7 |
/* Leave _XmRendGC unchanged. */
|
|
Packit |
b099d7 |
/* Leave _XmRendTags unchanged. */
|
|
Packit |
b099d7 |
/* Leave _XmRendCount unchanged. */
|
|
Packit |
b099d7 |
/* Leave _XmRendHadEnds unchanged. */
|
|
Packit |
b099d7 |
_XmRendTabs(rend) = DEFAULT_tabs;
|
|
Packit |
b099d7 |
_XmRendBG(rend) = DEFAULT_background;
|
|
Packit |
b099d7 |
_XmRendFG(rend) = DEFAULT_foreground;
|
|
Packit |
b099d7 |
_XmRendUnderlineType(rend) = DEFAULT_underlineType;
|
|
Packit |
b099d7 |
_XmRendStrikethruType(rend) = DEFAULT_strikethruType;
|
|
Packit |
b099d7 |
_XmRendBGState(rend) = DEFAULT_backgroundState;
|
|
Packit |
b099d7 |
_XmRendFGState(rend) = DEFAULT_foregroundState;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
_XmRendXftFG (rend).color.alpha = 0xFFFF; /*TODO: it is really needed? (yura)*/
|
|
Packit |
b099d7 |
_XmRendXftBG (rend).color.alpha = 0xFFFF; /*TODO: it is really needed? (yura)*/
|
|
Packit |
b099d7 |
_XmRendXftFont(rend) = DEFAULT_xftFont;
|
|
Packit |
b099d7 |
_XmRendPattern(rend) = NULL;
|
|
Packit |
b099d7 |
_XmRendFontStyle(rend) = DEFAULT_fontStyle;
|
|
Packit |
b099d7 |
_XmRendFontFoundry(rend) = DEFAULT_fontFoundry;
|
|
Packit |
b099d7 |
_XmRendFontEncoding(rend) = DEFAULT_fontEncoding;
|
|
Packit |
b099d7 |
_XmRendFontSize(rend) = DEFAULT_fontSize;
|
|
Packit |
b099d7 |
_XmRendPixelSize(rend) = 0;
|
|
Packit |
b099d7 |
_XmRendFontSlant(rend) = 0;
|
|
Packit |
b099d7 |
_XmRendFontSpacing(rend) = 0;
|
|
Packit |
b099d7 |
_XmRendFontWeight(rend) = 0;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Extern function to pick out display from rendertable. */
|
|
Packit |
b099d7 |
Display *
|
|
Packit |
b099d7 |
_XmRenderTableDisplay(XmRenderTable table)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return(_XmRTDisplay(table));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Find a rendition in table with matching tag. Call callback if not */
|
|
Packit |
b099d7 |
/* found and callback available. Fail if need_font is true and */
|
|
Packit |
b099d7 |
/* rendition found does not provide font. */
|
|
Packit |
b099d7 |
XmRendition
|
|
Packit |
b099d7 |
_XmRenderTableFindRendition(XmRenderTable table,
|
|
Packit |
b099d7 |
XmStringTag tag,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int cached_tag,
|
|
Packit |
b099d7 |
int need_font,
|
|
Packit |
b099d7 |
int call,
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean cached_tag,
|
|
Packit |
b099d7 |
Boolean need_font,
|
|
Packit |
b099d7 |
Boolean call,
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
short *index)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i, j;
|
|
Packit |
b099d7 |
XmRendition rend;
|
|
Packit |
b099d7 |
Boolean hit = FALSE;
|
|
Packit |
b099d7 |
XmDisplayCallbackStruct cb;
|
|
Packit |
b099d7 |
XmDisplay dsp;
|
|
Packit |
b099d7 |
XmRenderTable copy;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((table == NULL) || (tag == NULL)) return(NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (;;) /* May have to try twice */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
for (i = 0; i < _XmRTCount(table); i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
rend = _XmRTRenditions(table)[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((cached_tag) ?
|
|
Packit |
b099d7 |
(_XmRendTag(rend) == tag) :
|
|
Packit |
b099d7 |
(strcmp(_XmRendTag(rend), tag) == 0))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
hit = TRUE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((_XmRendFont(rend) == NULL) && (_XmRendXftFont (rend) == NULL) &&
|
|
Packit |
b099d7 |
NameIsString(_XmRendFontName(rend)))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (_XmRendLoadModel(rend) == XmLOAD_DEFERRED)
|
|
Packit |
b099d7 |
_XmRendLoadModel(rend) = XmLOAD_IMMEDIATE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ValidateAndLoadFont(rend, _XmRendDisplay(rend));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (need_font && (_XmRendFont(rend) == NULL &&
|
|
Packit |
b099d7 |
_XmRendXftFont(rend) == NULL))
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (index != NULL) *index = i;
|
|
Packit |
b099d7 |
return(rend);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Are we done? */
|
|
Packit |
b099d7 |
if (hit || !call) break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
call = FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Call callback */
|
|
Packit |
b099d7 |
if (_XmRTDisplay(table) != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
dsp = (XmDisplay) XmGetXmDisplay(_XmRTDisplay(table));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* CR 7964: XtHasCallbacks is surprisingly expensive, */
|
|
Packit |
b099d7 |
/* so we use a conservative approximation here. */
|
|
Packit |
b099d7 |
if (dsp && dsp->display.noRenditionCallback)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
copy = XmRenderTableCopy(table, NULL, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
cb.reason = XmCR_NO_RENDITION;
|
|
Packit |
b099d7 |
cb.event = NULL;
|
|
Packit |
b099d7 |
cb.render_table = copy;
|
|
Packit |
b099d7 |
cb.tag = tag;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtCallCallbackList((Widget)dsp,
|
|
Packit |
b099d7 |
dsp->display.noRenditionCallback,
|
|
Packit |
b099d7 |
&cb;;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (cb.render_table != copy)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Callback mutated table. Update table with */
|
|
Packit |
b099d7 |
/* substitution and search again. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (j = 0; j < _XmRTCount(table); j++)
|
|
Packit |
b099d7 |
if (FreeRendition(_XmRTRenditions(table)[j]))
|
|
Packit |
b099d7 |
FreeHandle(_XmRTRenditions(table)[j]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRTRefcountDec(table) == 0)
|
|
Packit |
b099d7 |
XtFree((char *)GetPtr(table));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
SetPtr(table, GetPtr(cb.render_table));
|
|
Packit |
b099d7 |
FreeHandle(cb.render_table);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Didn't find it. */
|
|
Packit |
b099d7 |
if (index != NULL) *index = -1;
|
|
Packit |
b099d7 |
return(NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* If to has resource unset and from has it set, set in to. */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
SetRend(XmRendition to,
|
|
Packit |
b099d7 |
XmRendition from)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (NameIsString(_XmRendFontName(from)) &&
|
|
Packit |
b099d7 |
!NameIsString(_XmRendFontName(to)))
|
|
Packit |
b099d7 |
_XmRendFontName(to) = _XmRendFontName(from);
|
|
Packit |
b099d7 |
if ((_XmRendFontType(from) != XmAS_IS) &&
|
|
Packit |
b099d7 |
(_XmRendFontType(to) == XmAS_IS))
|
|
Packit |
b099d7 |
_XmRendFontType(to) = _XmRendFontType(from);
|
|
Packit |
b099d7 |
if ((_XmRendLoadModel(from) != XmAS_IS) &&
|
|
Packit |
b099d7 |
(_XmRendLoadModel(to) == XmAS_IS))
|
|
Packit |
b099d7 |
_XmRendLoadModel(to) = _XmRendLoadModel(from);
|
|
Packit |
b099d7 |
if ((_XmRendFont(from) != NULL) &&
|
|
Packit |
b099d7 |
((unsigned int)(unsigned long)_XmRendFont(to) == XmAS_IS))
|
|
Packit |
b099d7 |
_XmRendFont(to) = _XmRendFont(from);
|
|
Packit |
b099d7 |
if (ListIsList(_XmRendTabs(from)) &&
|
|
Packit |
b099d7 |
!ListIsList(_XmRendTabs(to)))
|
|
Packit |
b099d7 |
_XmRendTabs(to) = _XmRendTabs(from);
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
if ((_XmRendFG(from) != XmUNSPECIFIED_PIXEL) &&
|
|
Packit |
b099d7 |
(_XmRendFG(to) == XmUNSPECIFIED_PIXEL))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#ifdef FIX_1536
|
|
Packit |
b099d7 |
_XmRendFG(to) = _XmRendFG(from);
|
|
Packit |
b099d7 |
_XmRendXftFG(to) = GetCachedXftColor(_XmRendDisplay(to), _XmRendFG(to));
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
XColor xcolor;
|
|
Packit |
b099d7 |
_XmRendFG(to) = _XmRendFG(from);
|
|
Packit |
b099d7 |
xcolor.pixel = _XmRendFG(to);
|
|
Packit |
b099d7 |
XQueryColor(_XmRendDisplay(to), DefaultColormapOfScreen(
|
|
Packit |
b099d7 |
DefaultScreenOfDisplay(_XmRendDisplay(to))), &xcolor);
|
|
Packit |
b099d7 |
/* doesn't needed (_XmRendXftFG (to)).pixel = xcolor.pixel; */
|
|
Packit |
b099d7 |
(_XmRendXftFG(to)).color.red = xcolor.red;
|
|
Packit |
b099d7 |
(_XmRendXftFG(to)).color.green = xcolor.green;
|
|
Packit |
b099d7 |
(_XmRendXftFG(to)).color.blue = xcolor.blue;
|
|
Packit |
b099d7 |
(_XmRendXftFG(to)).color.alpha = 0xFFFF;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if ((_XmRendBG(from) != XmUNSPECIFIED_PIXEL) &&
|
|
Packit |
b099d7 |
(_XmRendBG(to) == XmUNSPECIFIED_PIXEL))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#ifdef FIX_1536
|
|
Packit |
b099d7 |
_XmRendBG(to) = _XmRendBG (from);
|
|
Packit |
b099d7 |
_XmRendXftBG(to) = GetCachedXftColor(_XmRendDisplay(to), _XmRendBG(to));
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
XColor xcolor;
|
|
Packit |
b099d7 |
_XmRendBG(to) = _XmRendBG (from);
|
|
Packit |
b099d7 |
xcolor.pixel = _XmRendBG (to);
|
|
Packit |
b099d7 |
XQueryColor(_XmRendDisplay(to), DefaultColormapOfScreen(
|
|
Packit |
b099d7 |
DefaultScreenOfDisplay(_XmRendDisplay(to))), &xcolor);
|
|
Packit |
b099d7 |
/* doesn't needed (_XmRendXftBG (to)).pixel = xcolor.pixel; */
|
|
Packit |
b099d7 |
(_XmRendXftBG(to)).color.red = xcolor.red;
|
|
Packit |
b099d7 |
(_XmRendXftBG(to)).color.green = xcolor.green;
|
|
Packit |
b099d7 |
(_XmRendXftBG(to)).color.blue = xcolor.blue;
|
|
Packit |
b099d7 |
(_XmRendXftBG(to)).color.alpha = 0xFFFF;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if ((_XmRendXftFont (from) != NULL) &&
|
|
Packit |
b099d7 |
((unsigned int) (unsigned long) _XmRendXftFont (to) == XmAS_IS))
|
|
Packit |
b099d7 |
_XmRendXftFont (to) = _XmRendXftFont (from);
|
|
Packit |
b099d7 |
if ((_XmRendFontStyle (from) != NULL) && _XmRendFontStyle (to) == NULL)
|
|
Packit |
b099d7 |
_XmRendFontStyle (to) = _XmRendFontStyle (from);
|
|
Packit |
b099d7 |
if ((_XmRendFontFoundry (from) != NULL) && _XmRendFontFoundry (to) == NULL)
|
|
Packit |
b099d7 |
_XmRendFontFoundry (to) = _XmRendFontFoundry (from);
|
|
Packit |
b099d7 |
if ((_XmRendFontEncoding (from) != NULL) && _XmRendFontEncoding (to) == NULL)
|
|
Packit |
b099d7 |
_XmRendFontEncoding (to) = _XmRendFontEncoding (from);
|
|
Packit |
b099d7 |
if (_XmRendFontSize (to) == 0)
|
|
Packit |
b099d7 |
_XmRendFontSize (to) = _XmRendFontSize (from);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
if ((_XmRendFG(from) != XmUNSPECIFIED_PIXEL) &&
|
|
Packit |
b099d7 |
(_XmRendFG(to) == XmUNSPECIFIED_PIXEL))
|
|
Packit |
b099d7 |
_XmRendFG(to) = _XmRendFG (from);
|
|
Packit |
b099d7 |
if ((_XmRendBG(from) != XmUNSPECIFIED_PIXEL) &&
|
|
Packit |
b099d7 |
(_XmRendBG(to) == XmUNSPECIFIED_PIXEL))
|
|
Packit |
b099d7 |
_XmRendBG(to) = _XmRendBG (from);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
if ((_XmRendUnderlineType(from) != XmAS_IS) &&
|
|
Packit |
b099d7 |
(_XmRendUnderlineType(to) == XmAS_IS))
|
|
Packit |
b099d7 |
_XmRendUnderlineType(to) = _XmRendUnderlineType(from);
|
|
Packit |
b099d7 |
if ((_XmRendStrikethruType(from) != XmAS_IS) &&
|
|
Packit |
b099d7 |
(_XmRendStrikethruType(to) == XmAS_IS))
|
|
Packit |
b099d7 |
_XmRendStrikethruType(to) = _XmRendStrikethruType(from);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Check that all resources are not default values. */
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
RendComplete(XmRendition rend)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return(((unsigned int)(unsigned long)_XmRendFontName(rend) != XmAS_IS) &&
|
|
Packit |
b099d7 |
(_XmRendFontType(rend) != XmAS_IS) &&
|
|
Packit |
b099d7 |
(_XmRendLoadModel(rend) != XmAS_IS) &&
|
|
Packit |
b099d7 |
(
|
|
Packit |
b099d7 |
((unsigned int) (unsigned long) _XmRendFont (rend) != XmAS_IS)
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
|| ((unsigned int) (unsigned long) _XmRendXftFont (rend) != XmAS_IS)
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
) &&
|
|
Packit |
b099d7 |
((unsigned int)(unsigned long)_XmRendTabs(rend) != XmAS_IS) &&
|
|
Packit |
b099d7 |
(_XmRendFG(rend) != XmUNSPECIFIED_PIXEL) &&
|
|
Packit |
b099d7 |
(_XmRendBG(rend) != XmUNSPECIFIED_PIXEL) &&
|
|
Packit |
b099d7 |
(_XmRendUnderlineType(rend) != XmAS_IS) &&
|
|
Packit |
b099d7 |
(_XmRendStrikethruType(rend) != XmAS_IS));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Search rt for all renditions matching tags, successively merging */
|
|
Packit |
b099d7 |
/* resource values in scr rendition. */
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
XmRendition
|
|
Packit |
b099d7 |
_XmRenditionMerge(Display *d, /* unused */
|
|
Packit |
b099d7 |
XmRendition *scr,
|
|
Packit |
b099d7 |
XmRendition base_rend,
|
|
Packit |
b099d7 |
XmRenderTable rt,
|
|
Packit |
b099d7 |
XmStringTag base_tag,
|
|
Packit |
b099d7 |
XmStringTag *tags,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
unsigned int tag_count,
|
|
Packit |
b099d7 |
unsigned int copy
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
unsigned short tag_count,
|
|
Packit |
b099d7 |
Boolean copy
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRendition rend, tmp;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (scr == NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
rend = XmRenditionCreate(NULL, XmS, NULL, 0); /* Create new */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
rend = *scr;
|
|
Packit |
b099d7 |
if (copy)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (NameIsString(_XmRendFontName(rend)))
|
|
Packit |
b099d7 |
XtFree(_XmRendFontName(rend));
|
|
Packit |
b099d7 |
if (ListIsList(_XmRendTabs(rend)))
|
|
Packit |
b099d7 |
XmTabListFree(_XmRendTabs(rend));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
SetDefault(rend); /* Reset state */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = (tag_count - 1); i >= 0; i--)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
tmp = _XmRenderTableFindRendition(rt, tags[i], TRUE, FALSE, TRUE, NULL);
|
|
Packit |
b099d7 |
if (tmp == NULL) continue;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
SetRend(rend, tmp);
|
|
Packit |
b099d7 |
if (RendComplete(rend)) break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!RendComplete(rend))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
short index;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRenderTableFindFallback(rt, base_tag, TRUE, &index, &tmp);
|
|
Packit |
b099d7 |
if (tmp != NULL) SetRend(rend, tmp);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (base_rend != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
SetRend(rend, base_rend);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendFGState(base_rend) == XmFORCE_COLOR)
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
_XmRendXftFG(rend) = _XmRendXftFG(base_rend);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_XmRendFG(rend) = _XmRendFG(base_rend);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendBGState(base_rend) == XmFORCE_COLOR)
|
|
Packit |
b099d7 |
_XmRendBG(rend) = _XmRendBG(base_rend);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
CleanupResources(rend, copy);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(rend);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/****************
|
|
Packit |
b099d7 |
* If the cached_tag flag is true, _XmRenderTableFindFallback assumes that the
|
|
Packit |
b099d7 |
* tag pointer is a pointer out of the (local) tag cache.
|
|
Packit |
b099d7 |
* Since XmRenditionCreate also uses tag pointers out of this cache,
|
|
Packit |
b099d7 |
* a string compare is avoided by simply comparing pointer values.
|
|
Packit |
b099d7 |
****************/
|
|
Packit |
b099d7 |
extern Boolean
|
|
Packit |
b099d7 |
_XmRenderTableFindFallback(
|
|
Packit |
b099d7 |
XmRenderTable rendertable,
|
|
Packit |
b099d7 |
XmStringTag tag,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int cached_tag,
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean cached_tag,
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
short *indx,
|
|
Packit |
b099d7 |
XmRendition *rend_ptr )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmStringTag search_cset = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*indx = -1 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((rendertable != NULL) && (_XmRTCount(rendertable) == 0))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*rend_ptr = NULL;
|
|
Packit |
b099d7 |
return(FALSE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (rendertable != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (tag != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (cached_tag) /* No XmSTRING_DEFAULT_CHARSET */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*rend_ptr = (XmRendition)
|
|
Packit |
b099d7 |
_XmRenderTableFindRendition(rendertable, tag, TRUE, TRUE, FALSE,
|
|
Packit |
b099d7 |
indx);
|
|
Packit |
b099d7 |
if (*rend_ptr != NULL) return(TRUE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmStringTag curtag;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((strcmp(tag, XmSTRING_DEFAULT_CHARSET) == 0))
|
|
Packit |
b099d7 |
curtag = _XmStringGetCurrentCharset();
|
|
Packit |
b099d7 |
else curtag = tag;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*rend_ptr = (XmRendition)
|
|
Packit |
b099d7 |
_XmRenderTableFindRendition(rendertable, curtag, FALSE, TRUE, FALSE,
|
|
Packit |
b099d7 |
indx);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (*rend_ptr != NULL) return(TRUE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Didn't find a match. See if tag is one of the defaults
|
|
Packit |
b099d7 |
and search for the other. */
|
|
Packit |
b099d7 |
if (_XmStringIsCurrentCharset(tag))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
search_cset = XmFONTLIST_DEFAULT_TAG;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*rend_ptr = (XmRendition)
|
|
Packit |
b099d7 |
_XmRenderTableFindRendition(rendertable, search_cset, TRUE,
|
|
Packit |
b099d7 |
TRUE, FALSE, indx);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (*rend_ptr != NULL) return(TRUE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if ((tag == XmFONTLIST_DEFAULT_TAG) ||
|
|
Packit |
b099d7 |
(strcmp(tag, XmFONTLIST_DEFAULT_TAG) == 0))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
search_cset = _XmStringGetCurrentCharset();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*rend_ptr = (XmRendition)
|
|
Packit |
b099d7 |
_XmRenderTableFindRendition(rendertable, search_cset, FALSE,
|
|
Packit |
b099d7 |
TRUE, FALSE, indx);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (*rend_ptr != NULL) return(TRUE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Otherwise pick up first font(set) if tag a default value. */
|
|
Packit |
b099d7 |
if ((tag == NULL) ||
|
|
Packit |
b099d7 |
(tag == XmFONTLIST_DEFAULT_TAG) ||
|
|
Packit |
b099d7 |
(strcmp(tag, XmFONTLIST_DEFAULT_TAG) == 0) ||
|
|
Packit |
b099d7 |
_XmStringIsCurrentCharset(tag))
|
|
Packit |
b099d7 |
return(_XmRenderTableFindFirstFont(rendertable, indx, rend_ptr));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
*rend_ptr = NULL;
|
|
Packit |
b099d7 |
*indx = -1;
|
|
Packit |
b099d7 |
return(FALSE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
extern Boolean
|
|
Packit |
b099d7 |
_XmRenderTableFindFirstFont(XmRenderTable rendertable,
|
|
Packit |
b099d7 |
short *indx,
|
|
Packit |
b099d7 |
XmRendition *rend_ptr)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i, f_idx = -1, fs_idx = -1;
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
int xft_idx = -1;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = _XmRTCount(rendertable) - 1; i >= 0; i--)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*rend_ptr = _XmRTRenditions(rendertable)[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendFont(*rend_ptr) != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (_XmRendFontType(*rend_ptr) == XmFONT_IS_FONT) f_idx = i;
|
|
Packit |
b099d7 |
else if (_XmRendFontType(*rend_ptr) == XmFONT_IS_FONTSET) fs_idx = i;
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
} else if (_XmRendXftFont(*rend_ptr) != NULL) {
|
|
Packit |
b099d7 |
if (_XmRendFontType(*rend_ptr) == XmFONT_IS_XFT) xft_idx = i;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
if (xft_idx >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*rend_ptr = _XmRTRenditions (rendertable)[xft_idx];
|
|
Packit |
b099d7 |
*indx = xft_idx;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
if (fs_idx >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*rend_ptr = _XmRTRenditions(rendertable)[fs_idx];
|
|
Packit |
b099d7 |
*indx = fs_idx;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (f_idx >= 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*rend_ptr = _XmRTRenditions(rendertable)[f_idx];
|
|
Packit |
b099d7 |
*indx = f_idx;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*rend_ptr = NULL;
|
|
Packit |
b099d7 |
*indx = -1;
|
|
Packit |
b099d7 |
return(FALSE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(TRUE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Put value of every resource in fromRend into toRend, copying where */
|
|
Packit |
b099d7 |
/* necessary. */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
CopyInto(XmRendition toRend,
|
|
Packit |
b099d7 |
XmRendition fromRend)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRendTag(toRend) = _XmStringCacheTag(_XmRendTag(fromRend),
|
|
Packit |
b099d7 |
XmSTRING_TAG_STRLEN);
|
|
Packit |
b099d7 |
/* CR 7890 - the fontName might be XmAS_IS here - if so, we
|
|
Packit |
b099d7 |
** obviously don't want to do an XtNewString (implicit strcpy)
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (!NameIsString(_XmRendFontName(fromRend)))
|
|
Packit |
b099d7 |
_XmRendFontName(toRend) = NULL;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
_XmRendFontName(toRend) = XtNewString(_XmRendFontName(fromRend));
|
|
Packit |
b099d7 |
_XmRendFontType(toRend) = _XmRendFontType(fromRend);
|
|
Packit |
b099d7 |
_XmRendLoadModel(toRend) = _XmRendLoadModel(fromRend);
|
|
Packit |
b099d7 |
_XmRendFont(toRend) = _XmRendFont(fromRend);
|
|
Packit |
b099d7 |
_XmRendDisplay(toRend) = _XmRendDisplay(fromRend);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!ListIsList(_XmRendTabs(fromRend)))
|
|
Packit |
b099d7 |
_XmRendTabs(toRend) = NULL;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
_XmRendTabs(toRend) = XmTabListCopy(_XmRendTabs(fromRend), 0, 0);
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
_XmRendXftFont (toRend) = _XmRendXftFont (fromRend);
|
|
Packit |
b099d7 |
_XmRendXftBG (toRend) = _XmRendXftBG (fromRend);
|
|
Packit |
b099d7 |
_XmRendXftFG (toRend) = _XmRendXftFG (fromRend);
|
|
Packit |
b099d7 |
_XmRendFontStyle (toRend) = _XmRendFontStyle (fromRend);
|
|
Packit |
b099d7 |
_XmRendFontFoundry (toRend) = _XmRendFontFoundry (fromRend);
|
|
Packit |
b099d7 |
_XmRendFontEncoding (toRend) = _XmRendFontEncoding (fromRend);
|
|
Packit |
b099d7 |
_XmRendFontSize (toRend) = _XmRendFontSize (fromRend);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_XmRendBG (toRend) = _XmRendBG (fromRend);
|
|
Packit |
b099d7 |
_XmRendFG (toRend) = _XmRendFG (fromRend);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
_XmRendUnderlineType(toRend) = _XmRendUnderlineType(fromRend);
|
|
Packit |
b099d7 |
_XmRendStrikethruType(toRend) = _XmRendStrikethruType(fromRend);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* As above, except only change resources in toRend that are default. */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
MergeInto(XmRendition toRend,
|
|
Packit |
b099d7 |
XmRendition fromRend)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRendTag(toRend) = _XmStringCacheTag(_XmRendTag(fromRend),
|
|
Packit |
b099d7 |
XmSTRING_TAG_STRLEN);
|
|
Packit |
b099d7 |
if ((_XmRendFontName(toRend) == NULL) &&
|
|
Packit |
b099d7 |
NameIsString(_XmRendFontName(fromRend)))
|
|
Packit |
b099d7 |
_XmRendFontName(toRend) = XtNewString(_XmRendFontName(fromRend));
|
|
Packit |
b099d7 |
if (_XmRendFontType(toRend) == XmAS_IS)
|
|
Packit |
b099d7 |
_XmRendFontType(toRend) = _XmRendFontType(fromRend);
|
|
Packit |
b099d7 |
if (_XmRendLoadModel(toRend) == XmAS_IS)
|
|
Packit |
b099d7 |
_XmRendLoadModel(toRend) = _XmRendLoadModel(fromRend);
|
|
Packit |
b099d7 |
if (_XmRendFont(toRend) == NULL)
|
|
Packit |
b099d7 |
_XmRendFont(toRend) = _XmRendFont(fromRend);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!ListIsList(_XmRendTabs(toRend)) &&
|
|
Packit |
b099d7 |
ListIsList(_XmRendTabs(fromRend)))
|
|
Packit |
b099d7 |
_XmRendTabs(toRend) = XmTabListCopy(_XmRendTabs(fromRend), 0, 0);
|
|
Packit |
b099d7 |
#if USE_XFT
|
|
Packit |
b099d7 |
if (_XmRendXftFont(toRend) == NULL)
|
|
Packit |
b099d7 |
_XmRendXftFont(toRend) = _XmRendXftFont(fromRend);
|
|
Packit |
b099d7 |
if (_XmRendBG(toRend) == XmUNSPECIFIED_PIXEL)
|
|
Packit |
b099d7 |
_XmRendXftBG(toRend) = _XmRendXftBG(fromRend);
|
|
Packit |
b099d7 |
if (_XmRendFG(toRend) == XmUNSPECIFIED_PIXEL)
|
|
Packit |
b099d7 |
_XmRendXftFG(toRend) = _XmRendXftFG(fromRend);
|
|
Packit |
b099d7 |
if (_XmRendFontStyle(toRend) == NULL)
|
|
Packit |
b099d7 |
_XmRendFontStyle(toRend) = _XmRendFontStyle(fromRend);
|
|
Packit |
b099d7 |
if (_XmRendFontFoundry(toRend) == NULL)
|
|
Packit |
b099d7 |
_XmRendFontFoundry(toRend) = _XmRendFontFoundry(fromRend);
|
|
Packit |
b099d7 |
if (_XmRendFontEncoding(toRend) == NULL)
|
|
Packit |
b099d7 |
_XmRendFontEncoding(toRend) = _XmRendFontEncoding(fromRend);
|
|
Packit |
b099d7 |
if (_XmRendFontSize(toRend) == 0)
|
|
Packit |
b099d7 |
_XmRendFontSize(toRend) = _XmRendFontSize(fromRend);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
if (_XmRendBG(toRend) == XmUNSPECIFIED_PIXEL)
|
|
Packit |
b099d7 |
_XmRendBG(toRend) = _XmRendBG (fromRend);
|
|
Packit |
b099d7 |
if (_XmRendFG(toRend) == XmUNSPECIFIED_PIXEL)
|
|
Packit |
b099d7 |
_XmRendFG(toRend) = _XmRendFG (fromRend);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
if (_XmRendUnderlineType(toRend) == XmAS_IS)
|
|
Packit |
b099d7 |
_XmRendUnderlineType(toRend) = _XmRendUnderlineType(fromRend);
|
|
Packit |
b099d7 |
if (_XmRendUnderlineType(toRend) == XmAS_IS)
|
|
Packit |
b099d7 |
_XmRendStrikethruType(toRend) = _XmRendStrikethruType(fromRend);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Make a Clone--new handle and new data structure--of a rendition. */
|
|
Packit |
b099d7 |
static XmRendition
|
|
Packit |
b099d7 |
CloneRendition(XmRendition rend)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRendition copy;
|
|
Packit |
b099d7 |
XmRendition copy_handle;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (rend == NULL) return(NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
copy = (_XmRendition)XtMalloc(sizeof(_XmRenditionRec));
|
|
Packit |
b099d7 |
bzero((char*)copy, sizeof(_XmRenditionRec));
|
|
Packit |
b099d7 |
copy_handle = GetHandle(_XmRendition);
|
|
Packit |
b099d7 |
SetPtr(copy_handle, copy);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRendFontOnly(copy_handle) = FALSE;
|
|
Packit |
b099d7 |
_XmRendRefcount(copy_handle) = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
CopyInto(copy_handle, rend);
|
|
Packit |
b099d7 |
return(copy_handle);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Set the old handle to point to a new data structure. */
|
|
Packit |
b099d7 |
static XmRendition
|
|
Packit |
b099d7 |
RenewRendition(XmRendition rend)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRendition copy;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (rend == NULL) return(NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
copy = (_XmRendition)XtMalloc(sizeof(_XmRenditionRec));
|
|
Packit |
b099d7 |
memcpy((char *)copy, (char *)GetPtr(rend), sizeof(_XmRenditionRec));
|
|
Packit |
b099d7 |
SetPtr(rend, copy);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRendFontOnly(rend) = FALSE;
|
|
Packit |
b099d7 |
_XmRendRefcount(rend) = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(rend);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Allocate a new handle which points to the old data structure with */
|
|
Packit |
b099d7 |
/* an incremented refcount. */
|
|
Packit |
b099d7 |
static XmRendition
|
|
Packit |
b099d7 |
CopyRendition(XmRendition rend)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRendition copy;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (rend == NULL) return(NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendRefcountInc(rend) == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRendRefcountDec(rend);
|
|
Packit |
b099d7 |
return(CloneRendition(rend));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
copy = GetHandle(_XmRendition);
|
|
Packit |
b099d7 |
SetPtr(copy, GetPtr(rend));
|
|
Packit |
b099d7 |
return(copy);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Increment the refcount. Clone if overflow. */
|
|
Packit |
b099d7 |
static XmRendition
|
|
Packit |
b099d7 |
DuplicateRendition(XmRendition rend)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (rend == NULL) return(NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendRefcountInc(rend) == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRendRefcountDec(rend);
|
|
Packit |
b099d7 |
return(CloneRendition(rend));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return(rend);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Make a copy of a rendition, *including* the "scratch" info (tags,
|
|
Packit |
b099d7 |
* GC, hadEnds).
|
|
Packit |
b099d7 |
* Shared indicates whether or not this is a shared copy.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
XmRendition
|
|
Packit |
b099d7 |
_XmRenditionCopy(XmRendition rend,
|
|
Packit |
b099d7 |
Boolean shared)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRendition toRend;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (rend == NULL) return(NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (shared) toRend = CopyRendition(rend);
|
|
Packit |
b099d7 |
else toRend = CloneRendition(rend);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* If we had to clone, copy the 'scratch' info. */
|
|
Packit |
b099d7 |
if (*toRend != *rend)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRendGC(toRend) = _XmRendGC(rend);
|
|
Packit |
b099d7 |
_XmRendTagCount(toRend) = _XmRendTagCount(rend);
|
|
Packit |
b099d7 |
_XmRendHadEnds(toRend) = _XmRendHadEnds(rend);
|
|
Packit |
b099d7 |
_XmRendTags(toRend) =
|
|
Packit |
b099d7 |
(XmStringTag *)XtMalloc(sizeof(XmStringTag) * _XmRendTagCount(rend));
|
|
Packit |
b099d7 |
for (i = 0; i < _XmRendTagCount(rend); i++)
|
|
Packit |
b099d7 |
_XmRendTags(toRend)[i] = _XmRendTags(rend)[i];
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(toRend);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Creates new rendertable, adding any new renditions. */
|
|
Packit |
b099d7 |
/* Mutate rendertable. Copy renditions. */
|
|
Packit |
b099d7 |
XmRenderTable
|
|
Packit |
b099d7 |
XmRenderTableAddRenditions(XmRenderTable oldtable,
|
|
Packit |
b099d7 |
XmRendition *renditions,
|
|
Packit |
b099d7 |
Cardinal rendition_count,
|
|
Packit |
b099d7 |
XmMergeMode merge_mode)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i, next;
|
|
Packit |
b099d7 |
int count = rendition_count;
|
|
Packit |
b099d7 |
XmRendition rend, match;
|
|
Packit |
b099d7 |
_XmRenderTable table;
|
|
Packit |
b099d7 |
XmRenderTable newtable, tmptable = NULL;
|
|
Packit |
b099d7 |
Boolean *matches;
|
|
Packit |
b099d7 |
short idx;
|
|
Packit |
b099d7 |
XtAppContext app=NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((renditions == NULL) || (rendition_count == 0))
|
|
Packit |
b099d7 |
return(oldtable);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
if (_XmRendDisplay(renditions[0]))
|
|
Packit |
b099d7 |
app = XtDisplayToApplicationContext(_XmRendDisplay(renditions[0]));
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
if (oldtable == NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Malloc new table */
|
|
Packit |
b099d7 |
table =
|
|
Packit |
b099d7 |
(_XmRenderTable)XtMalloc(sizeof(_XmRenderTableRec) +
|
|
Packit |
b099d7 |
(sizeof(XmRendition) *
|
|
Packit |
b099d7 |
(rendition_count -
|
|
Packit |
b099d7 |
RENDITIONS_IN_STRUCT)));
|
|
Packit |
b099d7 |
oldtable = GetHandle(_XmRenderTable);
|
|
Packit |
b099d7 |
SetPtr(oldtable, table);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRTCount(oldtable) = rendition_count;
|
|
Packit |
b099d7 |
_XmRTDisplay(oldtable) = NULL;
|
|
Packit |
b099d7 |
_XmRTRefcount(oldtable) = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Copy renditions */
|
|
Packit |
b099d7 |
for (i = 0; i < rendition_count; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRTRenditions(oldtable)[i] = CopyRendition(renditions[i]);
|
|
Packit |
b099d7 |
if (_XmRTDisplay(oldtable) == NULL)
|
|
Packit |
b099d7 |
_XmRTDisplay(oldtable) = _XmRendDisplay(renditions[i]);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
matches =
|
|
Packit |
b099d7 |
(Boolean *)ALLOCATE_LOCAL(rendition_count * sizeof(Boolean));
|
|
Packit |
b099d7 |
bzero(matches, rendition_count * sizeof(Boolean));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* May have to copy table if shared. */
|
|
Packit |
b099d7 |
if (_XmRTRefcount(oldtable) > 1)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Allocate new table */
|
|
Packit |
b099d7 |
table = (_XmRenderTable)
|
|
Packit |
b099d7 |
XtMalloc(sizeof(_XmRenderTableRec) +
|
|
Packit |
b099d7 |
(sizeof(XmRendition) *
|
|
Packit |
b099d7 |
(_XmRTCount(oldtable) - RENDITIONS_IN_STRUCT)));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
newtable = GetHandle(_XmRenderTable);
|
|
Packit |
b099d7 |
SetPtr(newtable, table);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRTDisplay(newtable) = _XmRTDisplay(oldtable);
|
|
Packit |
b099d7 |
_XmRTRefcount(newtable) = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Move old Renditions. */
|
|
Packit |
b099d7 |
for (i = 0; i < _XmRTCount(oldtable); i++)
|
|
Packit |
b099d7 |
_XmRTRenditions(newtable)[i] = _XmRTRenditions(oldtable)[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRTCount(newtable) = _XmRTCount(oldtable);
|
|
Packit |
b099d7 |
_XmRTRefcountDec(oldtable);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Free at end so we don't get same memory from malloc. */
|
|
Packit |
b099d7 |
tmptable = oldtable;
|
|
Packit |
b099d7 |
oldtable = newtable;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Merge matching renditions */
|
|
Packit |
b099d7 |
for (i = 0; i < rendition_count; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
rend = renditions[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
match =
|
|
Packit |
b099d7 |
_XmRenderTableFindRendition(oldtable, _XmRendTag(rend),
|
|
Packit |
b099d7 |
TRUE, FALSE, FALSE, &idx);
|
|
Packit |
b099d7 |
if ((match != NULL) && (merge_mode != XmDUPLICATE))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Merge renditions. */
|
|
Packit |
b099d7 |
switch (merge_mode)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case XmMERGE_REPLACE:
|
|
Packit |
b099d7 |
if (FreeRendition(match)) FreeHandle(match);
|
|
Packit |
b099d7 |
_XmRTRenditions(oldtable)[idx] =
|
|
Packit |
b099d7 |
CopyRendition(rend);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XmSKIP:
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XmMERGE_OLD:
|
|
Packit |
b099d7 |
if (_XmRendRefcount(match) > 1)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
match = CloneRendition(match);
|
|
Packit |
b099d7 |
_XmRTRenditions(oldtable)[idx] = match;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
MergeInto(match, rend);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XmMERGE_NEW:
|
|
Packit |
b099d7 |
rend = CloneRendition(rend);
|
|
Packit |
b099d7 |
MergeInto(rend, match);
|
|
Packit |
b099d7 |
_XmRTRenditions(oldtable)[idx] = rend;
|
|
Packit |
b099d7 |
if (FreeRendition(match)) FreeHandle(match);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
printf("NYI");
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
matches[i] = TRUE;
|
|
Packit |
b099d7 |
--count;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (count > 0) /* Allocate new table */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
table = (_XmRenderTable)
|
|
Packit |
b099d7 |
XtMalloc(sizeof(_XmRenderTableRec) +
|
|
Packit |
b099d7 |
(sizeof(XmRendition) *
|
|
Packit |
b099d7 |
(_XmRTCount(oldtable) + count - RENDITIONS_IN_STRUCT)));
|
|
Packit |
b099d7 |
newtable = GetHandle(_XmRenderTable);
|
|
Packit |
b099d7 |
SetPtr(newtable, table);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRTDisplay(newtable) = _XmRTDisplay(oldtable);
|
|
Packit |
b099d7 |
_XmRTRefcount(newtable) = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Move old Renditions. */
|
|
Packit |
b099d7 |
for (i = 0; i < _XmRTCount(oldtable); i++)
|
|
Packit |
b099d7 |
_XmRTRenditions(newtable)[i] = _XmRTRenditions(oldtable)[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Copy new renditions. */
|
|
Packit |
b099d7 |
next = _XmRTCount(oldtable);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0; i < rendition_count; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (!matches[i])
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRTRenditions(newtable)[next] =
|
|
Packit |
b099d7 |
CopyRendition(renditions[i]);
|
|
Packit |
b099d7 |
if (_XmRTDisplay(newtable) == NULL)
|
|
Packit |
b099d7 |
_XmRTDisplay(newtable) = _XmRTDisplay(oldtable);
|
|
Packit |
b099d7 |
++next;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRTCount(newtable) = _XmRTCount(oldtable) + count;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Deallocate oldtable */
|
|
Packit |
b099d7 |
XtFree((char *)GetPtr(oldtable));
|
|
Packit |
b099d7 |
FreeHandle(oldtable);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
/* Otherwise just return newhandle to oldtable */
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
table = GetPtr(oldtable);
|
|
Packit |
b099d7 |
newtable = GetHandle(_XmRenderTable);
|
|
Packit |
b099d7 |
SetPtr(newtable, table);
|
|
Packit |
b099d7 |
FreeHandle(oldtable);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
DEALLOCATE_LOCAL((char *)matches);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
oldtable = newtable;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tmptable != NULL) FreeHandle(tmptable);
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
return(oldtable);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Remove matching renditions. */
|
|
Packit |
b099d7 |
/* Mutates oldtable, decrements removed renditions. */
|
|
Packit |
b099d7 |
XmRenderTable
|
|
Packit |
b099d7 |
XmRenderTableRemoveRenditions(XmRenderTable oldtable,
|
|
Packit |
b099d7 |
XmStringTag *tags,
|
|
Packit |
b099d7 |
int tag_count)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRenderTable ret_val;
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
XtAppContext app=NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRTDisplay(oldtable))
|
|
Packit |
b099d7 |
app = XtDisplayToApplicationContext(_XmRTDisplay(oldtable));
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
ret_val = _XmRenderTableRemoveRenditions(oldtable, tags,tag_count,
|
|
Packit |
b099d7 |
FALSE, XmFONT_IS_FONT, NULL);
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Remove matching renditions. */
|
|
Packit |
b099d7 |
/* Mutates oldtable, decrements removed renditions. */
|
|
Packit |
b099d7 |
/* If chk_font TRUE, checks that font and type also match. */
|
|
Packit |
b099d7 |
XmRenderTable
|
|
Packit |
b099d7 |
_XmRenderTableRemoveRenditions(XmRenderTable oldtable,
|
|
Packit |
b099d7 |
XmStringTag *tags,
|
|
Packit |
b099d7 |
int tag_count,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int chk_font,
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean chk_font,
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
XmFontType type,
|
|
Packit |
b099d7 |
XtPointer font)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i, j;
|
|
Packit |
b099d7 |
int count;
|
|
Packit |
b099d7 |
_XmRenderTable table;
|
|
Packit |
b099d7 |
XmRenderTable newtable = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((oldtable == NULL) || (tags == NULL) || (tag_count == 0))
|
|
Packit |
b099d7 |
return(oldtable);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRTRefcount(oldtable) > 1)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Allocate new table */
|
|
Packit |
b099d7 |
table = (_XmRenderTable)
|
|
Packit |
b099d7 |
XtMalloc(sizeof(_XmRenderTableRec) +
|
|
Packit |
b099d7 |
(sizeof(XmRendition) *
|
|
Packit |
b099d7 |
(_XmRTCount(oldtable) - RENDITIONS_IN_STRUCT)));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
newtable = GetHandle(_XmRenderTable);
|
|
Packit |
b099d7 |
SetPtr(newtable, table);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRTDisplay(newtable) = _XmRTDisplay(oldtable);
|
|
Packit |
b099d7 |
_XmRTRefcount(newtable) = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Move old Renditions. */
|
|
Packit |
b099d7 |
for (i = 0; i < _XmRTCount(oldtable); i++)
|
|
Packit |
b099d7 |
_XmRTRenditions(newtable)[i] = _XmRTRenditions(oldtable)[i];
|
|
Packit |
b099d7 |
_XmRTCount(newtable) = _XmRTCount(oldtable);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRTRefcountDec(oldtable) == 0)
|
|
Packit |
b099d7 |
XtFree((char *)GetPtr(oldtable));
|
|
Packit |
b099d7 |
FreeHandle(oldtable);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
oldtable = newtable;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
/* Iterate over renditions */
|
|
Packit |
b099d7 |
for (i = 0; i < _XmRTCount(oldtable); i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Match against tags */
|
|
Packit |
b099d7 |
for (j = 0; j < tag_count; j++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ((strcmp(_XmRendTag(_XmRTRenditions(oldtable)[i]),
|
|
Packit |
b099d7 |
tags[j]) == 0) &&
|
|
Packit |
b099d7 |
(!chk_font ||
|
|
Packit |
b099d7 |
((font == _XmRendFont(_XmRTRenditions(oldtable)[i])) &&
|
|
Packit |
b099d7 |
(type == _XmRendFontType(_XmRTRenditions(oldtable)[i])))))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (FreeRendition(_XmRTRenditions(oldtable)[i]))
|
|
Packit |
b099d7 |
FreeHandle(_XmRTRenditions(oldtable)[i]);
|
|
Packit |
b099d7 |
_XmRTRenditions(oldtable)[i] = NULL;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (_XmRTRenditions(oldtable)[i] != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (count != i)
|
|
Packit |
b099d7 |
_XmRTRenditions(oldtable)[count] = _XmRTRenditions(oldtable)[i];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (count == 0)
|
|
Packit |
b099d7 |
/* No renditions left. Return NULL. */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRenderTableFree(oldtable);
|
|
Packit |
b099d7 |
return(NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (count < _XmRTCount(oldtable))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Realloc table */
|
|
Packit |
b099d7 |
table = (_XmRenderTable)XtRealloc((char *)*oldtable,
|
|
Packit |
b099d7 |
sizeof(_XmRenderTableRec) +
|
|
Packit |
b099d7 |
(sizeof(XmRendition) *
|
|
Packit |
b099d7 |
(count - RENDITIONS_IN_STRUCT)));
|
|
Packit |
b099d7 |
if (newtable == NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
newtable = GetHandle(_XmRenderTable);
|
|
Packit |
b099d7 |
FreeHandle(oldtable);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
SetPtr(newtable, table);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRTCount(newtable) = count;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(newtable);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return(oldtable);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
CopyFromArg(XtArgVal src, char *dst, unsigned int size)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (size > sizeof(XtArgVal))
|
|
Packit |
b099d7 |
memcpy((char *)dst, (char *)src, (size_t)size);
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
union {
|
|
Packit |
b099d7 |
long longval;
|
|
Packit |
b099d7 |
#ifdef FIX_1152
|
|
Packit |
b099d7 |
int intval;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
short shortval;
|
|
Packit |
b099d7 |
char charval;
|
|
Packit |
b099d7 |
char* charptr;
|
|
Packit |
b099d7 |
XtPointer ptr;
|
|
Packit |
b099d7 |
} u;
|
|
Packit |
b099d7 |
char *p = (char*)&u;
|
|
Packit |
b099d7 |
if (size == sizeof(long)) u.longval = (long)src;
|
|
Packit |
b099d7 |
#ifdef FIX_1152
|
|
Packit |
b099d7 |
else if (size == sizeof(int)) u.intval = (int) src;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
else if (size == sizeof(short)) u.shortval = (short)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(char)) u.charval = (char)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(XtPointer)) u.ptr = (XtPointer)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(char*)) u.charptr = (char*)src;
|
|
Packit |
b099d7 |
else p = (char*)&src;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
memcpy((char *)dst, p, (size_t)size);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} /* CopyFromArg */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
CopyToArg(char *src, XtArgVal *dst, unsigned int size)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ((void *)(*dst) == NULL) {
|
|
Packit |
b099d7 |
/* old GetValues semantics (storing directly into arglists) are bad,
|
|
Packit |
b099d7 |
* but preserve for compatibility as long as arglist contains NULL.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (size == sizeof(long)) *dst = (XtArgVal)*(long*)src;
|
|
Packit |
b099d7 |
#ifdef FIX_1152
|
|
Packit |
b099d7 |
else if (size == sizeof(int)) *dst = (XtArgVal)*(int*)src;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
else if (size == sizeof(short)) *dst = (XtArgVal)*(short*)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(char)) *dst = (XtArgVal)*(char*)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(XtPointer)) *dst = (XtArgVal)*(XtPointer*)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(char*)) *dst = (XtArgVal)*(char**)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(XtArgVal)) *dst = *(XtArgVal*)src;
|
|
Packit |
b099d7 |
else memcpy((char*)dst, (char*)src, (size_t)size);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
/* proper GetValues semantics: argval is pointer to destination */
|
|
Packit |
b099d7 |
if (size == sizeof(long)) *((long*)*dst) = *(long*)src;
|
|
Packit |
b099d7 |
#ifdef FIX_1152
|
|
Packit |
b099d7 |
else if (size == sizeof(int)) *((int*)*dst) = *(int*)src;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
else if (size == sizeof(short)) *((short*)*dst) = *(short*)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(char)) *((char*)*dst) = *(char*)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(XtPointer)) *((XtPointer*)*dst) = *(XtPointer*)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(char*)) *((char**)*dst) = *(char**)src;
|
|
Packit |
b099d7 |
else if (size == sizeof(XtArgVal)) *((XtArgVal*)*dst)= *(XtArgVal*)src;
|
|
Packit |
b099d7 |
else memcpy((char *)*dst, (char *)src, (size_t)size);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} /* CopyToArg */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Copies renditions matching tags to a new table. */
|
|
Packit |
b099d7 |
/* If all renditions copied then duplicate rendertable, duplicate */
|
|
Packit |
b099d7 |
/* renditions. Otherwise, mutate rendertable, duplicate renditions. */
|
|
Packit |
b099d7 |
XmRenderTable
|
|
Packit |
b099d7 |
XmRenderTableCopy(XmRenderTable table,
|
|
Packit |
b099d7 |
XmStringTag *tags,
|
|
Packit |
b099d7 |
int tag_count)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRenderTable rt = NULL;
|
|
Packit |
b099d7 |
_XmRenderTable t = NULL;
|
|
Packit |
b099d7 |
int i, j, count;
|
|
Packit |
b099d7 |
int size;
|
|
Packit |
b099d7 |
XmRendition rend = NULL;
|
|
Packit |
b099d7 |
XtAppContext app = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (table == NULL) return((XmRenderTable)NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
if (_XmRTDisplay(table))
|
|
Packit |
b099d7 |
app = XtDisplayToApplicationContext(_XmRTDisplay(table));
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((_XmRTRefcountInc(table) == 0) || (tags != NULL))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Malloc new table */
|
|
Packit |
b099d7 |
_XmRTRefcountDec(table);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tag_count > 0)
|
|
Packit |
b099d7 |
size = (sizeof(_XmRendition) * (tag_count - RENDITIONS_IN_STRUCT));
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
size = (sizeof(_XmRendition) *
|
|
Packit |
b099d7 |
(_XmRTCount(table) - RENDITIONS_IN_STRUCT));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
size = (size < 0) ? 0 : size;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
t = (_XmRenderTable)XtMalloc(sizeof(_XmRenderTableRec) + size);
|
|
Packit |
b099d7 |
rt = GetHandle(_XmRenderTable);
|
|
Packit |
b099d7 |
SetPtr(rt, t);
|
|
Packit |
b099d7 |
_XmRTRefcount(rt) = 1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tags == NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Increment renditions. */
|
|
Packit |
b099d7 |
for (i = 0; i < _XmRTCount(table); i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
rend = DuplicateRendition(_XmRTRenditions(table)[i]);
|
|
Packit |
b099d7 |
/* Check for overflow. */
|
|
Packit |
b099d7 |
if (rend != _XmRTRenditions(table)[i]) break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (i < _XmRTCount(table)) /* Overflow! */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Malloc new table. */
|
|
Packit |
b099d7 |
t = (_XmRenderTable)XtMalloc(sizeof(_XmRenderTableRec) +
|
|
Packit |
b099d7 |
(sizeof(_XmRendition) *
|
|
Packit |
b099d7 |
(_XmRTCount(table) - RENDITIONS_IN_STRUCT)));
|
|
Packit |
b099d7 |
rt = GetHandle(_XmRenderTable);
|
|
Packit |
b099d7 |
SetPtr(rt, t);
|
|
Packit |
b099d7 |
_XmRTRefcount(rt) = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRTCount(rt) = _XmRTCount(table);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Move renditions done already. */
|
|
Packit |
b099d7 |
for (j = 0; j < i; j++)
|
|
Packit |
b099d7 |
_XmRTRenditions(rt)[j] = _XmRTRenditions(table)[j];
|
|
Packit |
b099d7 |
_XmRTRenditions(rt)[i] = rend;
|
|
Packit |
b099d7 |
/* Copy rest */
|
|
Packit |
b099d7 |
for (j = i + 1; j < _XmRTCount(rt); j++)
|
|
Packit |
b099d7 |
_XmRTRenditions(rt)[j] = DuplicateRendition(_XmRTRenditions(table)[j]);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
rt = GetHandle(_XmRenderTable);
|
|
Packit |
b099d7 |
SetPtr(rt, GetPtr(table));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Copy matching renditions. */
|
|
Packit |
b099d7 |
for (i = 0; i < tag_count; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRendition match;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
match = XmRenderTableGetRendition(table, tags[i]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (match != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRTRenditions(rt)[i] = match;
|
|
Packit |
b099d7 |
++count;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Realloc table */
|
|
Packit |
b099d7 |
t = (_XmRenderTable)XtRealloc((char *)t,
|
|
Packit |
b099d7 |
sizeof(_XmRenderTableRec) +
|
|
Packit |
b099d7 |
(sizeof(XmRendition) *
|
|
Packit |
b099d7 |
(count - RENDITIONS_IN_STRUCT)));
|
|
Packit |
b099d7 |
SetPtr(rt, t);
|
|
Packit |
b099d7 |
_XmRTCount(rt) = count;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRTDisplay(rt) = _XmRTDisplay(table);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
return(rt);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Decrement rendertable, free if refcount is zero. XmRenditionFree */
|
|
Packit |
b099d7 |
/* renditions. */
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmRenderTableFree(XmRenderTable table)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
for (i = 0; i < _XmRTCount(table); i++)
|
|
Packit |
b099d7 |
if (FreeRendition(_XmRTRenditions(table)[i]))
|
|
Packit |
b099d7 |
FreeHandle(_XmRTRenditions(table)[i]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRTRefcountDec(table) == 0)
|
|
Packit |
b099d7 |
XtFree((char *)GetPtr(table));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
FreeHandle(table);
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Get list of tags of all renditions in table. */
|
|
Packit |
b099d7 |
int
|
|
Packit |
b099d7 |
XmRenderTableGetTags(XmRenderTable table,
|
|
Packit |
b099d7 |
XmStringTag **tag_list)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i, ret_val;
|
|
Packit |
b099d7 |
XtAppContext app = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (table == NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*tag_list = NULL;
|
|
Packit |
b099d7 |
return(0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
app = XtDisplayToApplicationContext(_XmRTDisplay(table));
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
*tag_list =
|
|
Packit |
b099d7 |
(XmStringTag *)XtMalloc(sizeof(XmStringTag) * _XmRTCount(table));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0; i < _XmRTCount(table); i++)
|
|
Packit |
b099d7 |
(*tag_list)[i] =
|
|
Packit |
b099d7 |
XtNewString(_XmRendTag(_XmRTRenditions(table)[i]));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ret_val = _XmRTCount(table);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Returns copy of matching rendition. */
|
|
Packit |
b099d7 |
XmRendition
|
|
Packit |
b099d7 |
XmRenderTableGetRendition(XmRenderTable table,
|
|
Packit |
b099d7 |
XmStringTag tag)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRendition ret_val;
|
|
Packit |
b099d7 |
_XmDisplayToAppContext(_XmRTDisplay(table));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
ret_val = CopyRendition(_XmRenderTableFindRendition(table, tag,
|
|
Packit |
b099d7 |
FALSE, FALSE, FALSE, NULL));
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Returns array of copies of matching renditions. */
|
|
Packit |
b099d7 |
XmRendition *
|
|
Packit |
b099d7 |
XmRenderTableGetRenditions(XmRenderTable table,
|
|
Packit |
b099d7 |
char **tags,
|
|
Packit |
b099d7 |
Cardinal tag_count)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRendition rend, *rends;
|
|
Packit |
b099d7 |
int i, count;
|
|
Packit |
b099d7 |
XtAppContext app = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((table == NULL) || (tags == NULL) || (tag_count == 0))
|
|
Packit |
b099d7 |
return(NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
if (_XmRTDisplay(table))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
app = XtDisplayToApplicationContext(_XmRTDisplay(table));
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
rends = (XmRendition *)XtMalloc(tag_count * sizeof(XmRendition));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
for (i = 0; i < tag_count; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
rend = _XmRenderTableFindRendition(table, tags[i],
|
|
Packit |
b099d7 |
FALSE, FALSE, FALSE, NULL);
|
|
Packit |
b099d7 |
if (rend != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
rends[count] = CopyRendition(rend);
|
|
Packit |
b099d7 |
count++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (count < tag_count)
|
|
Packit |
b099d7 |
rends = (XmRendition *)XtRealloc((char *)rends, count * sizeof(XmRendition));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
return(rends);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Wrapper for calling XtWarning functions. */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
RenditionWarning(char *tag,
|
|
Packit |
b099d7 |
char *type,
|
|
Packit |
b099d7 |
char *message,
|
|
Packit |
b099d7 |
Display *dpy)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
char *params[1];
|
|
Packit |
b099d7 |
Cardinal num_params = 1 ;
|
|
Packit |
b099d7 |
Display *d;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* the MotifWarningHandler installed in VendorS.c knows about
|
|
Packit |
b099d7 |
this convention */
|
|
Packit |
b099d7 |
params[0] = XME_WARNING;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (dpy)
|
|
Packit |
b099d7 |
d = dpy;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
d = _XmGetDefaultDisplay();
|
|
Packit |
b099d7 |
if (d)
|
|
Packit |
b099d7 |
XtAppWarningMsg (XtDisplayToApplicationContext(d),
|
|
Packit |
b099d7 |
tag, type, "XmRendition",
|
|
Packit |
b099d7 |
message, params, &num_params);
|
|
Packit |
b099d7 |
else XtWarning(message);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Replace XmAS_IS and copy as necessary. */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
CleanupResources(XmRendition rend,
|
|
Packit |
b099d7 |
Boolean copy)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ((unsigned int)(unsigned long)_XmRendFont(rend) == XmAS_IS)
|
|
Packit |
b099d7 |
_XmRendFont(rend) = NULL;
|
|
Packit |
b099d7 |
else if (_XmRendFontType(rend) == XmAS_IS)
|
|
Packit |
b099d7 |
_XmRendFontType(rend) = XmFONT_IS_FONT;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
if ((unsigned int)(unsigned long)_XmRendXftFont (rend) == XmAS_IS)
|
|
Packit |
b099d7 |
_XmRendXftFont (rend) = NULL;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (((unsigned int)(unsigned long)_XmRendFontName(rend) == XmAS_IS) ||
|
|
Packit |
b099d7 |
(strcmp(_XmRendFontName(rend), XmSXmAS_IS) == 0))
|
|
Packit |
b099d7 |
_XmRendFontName(rend) = NULL;
|
|
Packit |
b099d7 |
else if (copy)
|
|
Packit |
b099d7 |
_XmRendFontName(rend) = XtNewString(_XmRendFontName(rend));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((unsigned int)(unsigned long)_XmRendTabs(rend) == XmAS_IS)
|
|
Packit |
b099d7 |
_XmRendTabs(rend) = NULL;
|
|
Packit |
b099d7 |
else if (copy)
|
|
Packit |
b099d7 |
_XmRendTabs(rend) = XmTabListCopy(_XmRendTabs(rend), 0, 0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Emit warning and set default if tag is NULL. */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ValidateTag(XmRendition rend,
|
|
Packit |
b099d7 |
XmStringTag dflt)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (_XmRendTag(rend) == NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
RenditionWarning(_XmRendTag(rend), "NO_NULL_TAG",
|
|
Packit |
b099d7 |
NO_NULL_TAG_MSG, _XmRendDisplay(rend));
|
|
Packit |
b099d7 |
_XmRendTag(rend) = _XmStringCacheTag(dflt, XmSTRING_TAG_STRLEN);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef FIX_1414
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
static int
|
|
Packit |
b099d7 |
GetSameRenditions(XmRendition *rend_cache, XmRendition rend, int count_rend)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
for (i=0; i
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ( rend_cache && (rend_cache[i])
|
|
Packit |
b099d7 |
&& (((_XmRendFontName(rend) && _XmRendFontName(rend_cache[i]) ) && !strcmp(_XmRendFontName(rend_cache[i]), _XmRendFontName(rend))
|
|
Packit |
b099d7 |
|| (!_XmRendFontName(rend) && !_XmRendFontName(rend_cache[i])))
|
|
Packit |
b099d7 |
&& (((_XmRendFontFoundry(rend) && _XmRendFontFoundry(rend_cache[i])) && !strcmp(_XmRendFontFoundry(rend_cache[i]), _XmRendFontFoundry(rend)))
|
|
Packit |
b099d7 |
|| (!_XmRendFontFoundry(rend) && !_XmRendFontFoundry(rend_cache[i])))
|
|
Packit |
b099d7 |
&& (((_XmRendFontEncoding(rend) && _XmRendFontEncoding(rend_cache[i])) && !strcmp(_XmRendFontEncoding(rend_cache[i]), _XmRendFontEncoding(rend)))
|
|
Packit |
b099d7 |
|| (!_XmRendFontEncoding(rend) && !_XmRendFontEncoding(rend_cache[i])))
|
|
Packit |
b099d7 |
&& (((_XmRendFontStyle(rend) && _XmRendFontStyle(rend_cache[i])) && !strcmp(_XmRendFontStyle(rend_cache[i]), _XmRendFontStyle(rend)))
|
|
Packit |
b099d7 |
|| (!_XmRendFontStyle(rend) && !_XmRendFontStyle(rend_cache[i])) )
|
|
Packit |
b099d7 |
&& _XmRendFontSize(rend) == _XmRendFontSize(rend_cache[i])
|
|
Packit |
b099d7 |
&& _XmRendPixelSize(rend) == _XmRendPixelSize(rend_cache[i])
|
|
Packit |
b099d7 |
&& _XmRendFontSlant(rend) == _XmRendFontSlant(rend_cache[i])
|
|
Packit |
b099d7 |
&& _XmRendFontWeight(rend) == _XmRendFontWeight(rend_cache[i])
|
|
Packit |
b099d7 |
&& _XmRendFontSpacing(rend) == _XmRendFontSpacing(rend_cache[i]))
|
|
Packit |
b099d7 |
)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return i;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return -1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Make sure all the font related resources make sense together and */
|
|
Packit |
b099d7 |
/* then load the font specified by fontName if necessary. */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ValidateAndLoadFont(XmRendition rend, Display *display)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XrmString locale;
|
|
Packit |
b099d7 |
XtPointer font;
|
|
Packit |
b099d7 |
XrmValue args[2];
|
|
Packit |
b099d7 |
Cardinal num_args = 0;
|
|
Packit |
b099d7 |
XrmValue fromVal;
|
|
Packit |
b099d7 |
XrmValue toVal;
|
|
Packit |
b099d7 |
Boolean result = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRendDisplay(rend) = display;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendLoadModel(rend) != XmLOAD_DEFERRED)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmDisplay dsp = NULL;
|
|
Packit |
b099d7 |
XmDisplayCallbackStruct cb;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((_XmRendFont(rend) == NULL) &&
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
(_XmRendXftFont (rend) == NULL) &&
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
(_XmRendFontName(rend) != NULL))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (_XmRendFontType(rend) != XmAS_IS)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (display == NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
RenditionWarning(_XmRendTag(rend), "NULL_DISPLAY",
|
|
Packit |
b099d7 |
NULL_DISPLAY_MSG, NULL);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
args[0].addr = (XPointer) &display;
|
|
Packit |
b099d7 |
args[0].size = sizeof(Display*);
|
|
Packit |
b099d7 |
num_args++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
fromVal.addr = _XmRendFontName(rend);
|
|
Packit |
b099d7 |
fromVal.size = strlen(_XmRendFontName(rend));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
toVal.addr = (XPointer) &fon;;
|
|
Packit |
b099d7 |
toVal.size = sizeof (XtPointer);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (_XmRendFontType(rend))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case XmFONT_IS_FONT:
|
|
Packit |
b099d7 |
result =
|
|
Packit |
b099d7 |
XtCallConverter(display, XtCvtStringToFontStruct,
|
|
Packit |
b099d7 |
args, num_args, &fromVal, &toVal, NULL);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case XmFONT_IS_FONTSET:
|
|
Packit |
b099d7 |
locale =
|
|
Packit |
b099d7 |
XrmQuarkToString(XrmStringToQuark(setlocale(LC_ALL, NULL)));
|
|
Packit |
b099d7 |
args[1].addr = (XPointer) &locale;
|
|
Packit |
b099d7 |
args[1].size = sizeof(XrmString);
|
|
Packit |
b099d7 |
num_args++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
result = XtCallConverter (display, XtCvtStringToFontSet, args,
|
|
Packit |
b099d7 |
num_args, &fromVal, &toVal, NULL);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
case XmFONT_IS_XFT:
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
FcResult res;
|
|
Packit |
b099d7 |
FcPattern *p;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef FIX_1414
|
|
Packit |
b099d7 |
static XmRendition *rend_cache;
|
|
Packit |
b099d7 |
static int count_rend=0, num_rend;
|
|
Packit |
b099d7 |
num_rend = GetSameRenditions(rend_cache, rend, count_rend);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_rend>=0)
|
|
Packit |
b099d7 |
_XmRendXftFont(rend) = _XmRendXftFont(rend_cache[num_rend]);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
_XmRendPattern(rend) = FcPatternCreate();
|
|
Packit |
b099d7 |
if (_XmRendFontName(rend))
|
|
Packit |
b099d7 |
FcPatternAddString(_XmRendPattern(rend), FC_FAMILY,
|
|
Packit |
b099d7 |
(XftChar8 *)_XmRendFontName(rend));
|
|
Packit |
b099d7 |
if (_XmRendFontFoundry(rend))
|
|
Packit |
b099d7 |
FcPatternAddString(_XmRendPattern(rend), FC_FOUNDRY,
|
|
Packit |
b099d7 |
(XftChar8 *)_XmRendFontFoundry(rend));
|
|
Packit |
b099d7 |
if (_XmRendFontEncoding(rend))
|
|
Packit |
b099d7 |
FcPatternAddString(_XmRendPattern(rend), XFT_ENCODING,
|
|
Packit |
b099d7 |
(XftChar8 *)_XmRendFontEncoding(rend));
|
|
Packit |
b099d7 |
if (_XmRendFontStyle(rend))
|
|
Packit |
b099d7 |
FcPatternAddString(_XmRendPattern(rend), FC_STYLE,
|
|
Packit |
b099d7 |
(XftChar8 *)_XmRendFontStyle(rend));
|
|
Packit |
b099d7 |
if (_XmRendFontSize(rend))
|
|
Packit |
b099d7 |
FcPatternAddInteger(_XmRendPattern(rend), FC_SIZE,
|
|
Packit |
b099d7 |
_XmRendFontSize(rend));
|
|
Packit |
b099d7 |
if (_XmRendPixelSize(rend))
|
|
Packit |
b099d7 |
FcPatternAddInteger(_XmRendPattern(rend), FC_PIXEL_SIZE,
|
|
Packit |
b099d7 |
_XmRendPixelSize(rend));
|
|
Packit |
b099d7 |
if (_XmRendFontSlant(rend))
|
|
Packit |
b099d7 |
FcPatternAddInteger(_XmRendPattern(rend), FC_SLANT,
|
|
Packit |
b099d7 |
_XmRendFontSlant(rend));
|
|
Packit |
b099d7 |
if (_XmRendFontWeight(rend))
|
|
Packit |
b099d7 |
FcPatternAddInteger(_XmRendPattern(rend), FC_WEIGHT,
|
|
Packit |
b099d7 |
_XmRendFontWeight(rend));
|
|
Packit |
b099d7 |
if (_XmRendFontSpacing(rend))
|
|
Packit |
b099d7 |
FcPatternAddInteger(_XmRendPattern(rend), FC_SPACING,
|
|
Packit |
b099d7 |
_XmRendFontSpacing(rend));
|
|
Packit |
b099d7 |
p = XftFontMatch(display, 0, _XmRendPattern(rend), &res;;
|
|
Packit |
b099d7 |
#ifdef FIX_1414
|
|
Packit |
b099d7 |
_XmRendXftFont(rend) = XftFontOpenPattern(display, p);
|
|
Packit |
b099d7 |
rend_cache = (XmRendition *) XtRealloc((char *)rend_cache,
|
|
Packit |
b099d7 |
(Cardinal)(sizeof(XmRendition) * (count_rend + 1)));
|
|
Packit |
b099d7 |
rend_cache[count_rend] =_XmRenditionCopy(rend, TRUE);
|
|
Packit |
b099d7 |
count_rend++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_XmRendXftFont(rend) = XftFontOpenPattern(display, p);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
result = _XmRendXftFont(rend) != NULL;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
RenditionWarning(_XmRendTag(rend), "INVALID_TYPE",
|
|
Packit |
b099d7 |
INVALID_TYPE_MSG,
|
|
Packit |
b099d7 |
_XmRendDisplay(rend));
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* NoFontCallback. */
|
|
Packit |
b099d7 |
if (!result)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (display != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
dsp = (XmDisplay) XmGetXmDisplay(display);
|
|
Packit |
b099d7 |
cb.reason = XmCR_NO_FONT;
|
|
Packit |
b099d7 |
cb.event = NULL;
|
|
Packit |
b099d7 |
cb.rendition = rend;
|
|
Packit |
b099d7 |
cb.font_name = _XmRendFontName(rend);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* We must know for sure whether there are any */
|
|
Packit |
b099d7 |
/* callbacks, so we have to use XtHasCallbacks. */
|
|
Packit |
b099d7 |
if (XtHasCallbacks((Widget)dsp, XmNnoFontCallback) ==
|
|
Packit |
b099d7 |
XtCallbackHasSome)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtCallCallbackList((Widget)dsp,
|
|
Packit |
b099d7 |
dsp->display.noFontCallback,
|
|
Packit |
b099d7 |
&cb;;
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
RenditionWarning(_XmRendTag(rend), "CONVERSION_FAILED",
|
|
Packit |
b099d7 |
CONVERSION_FAILED_MSG,
|
|
Packit |
b099d7 |
_XmRendDisplay(rend));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
if (_XmRendFontType(rend) != XmFONT_IS_XFT)
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
_XmRendFont(rend) = font;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
RenditionWarning(_XmRendTag(rend), "NULL_FONT_TYPE",
|
|
Packit |
b099d7 |
NULL_FONT_TYPE_MSG,
|
|
Packit |
b099d7 |
_XmRendDisplay(rend));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if ((_XmRendLoadModel(rend) == XmLOAD_IMMEDIATE) &&
|
|
Packit |
b099d7 |
(_XmRendFont(rend) == NULL) &&
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
(_XmRendXftFont (rend) == NULL) &&
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
(_XmRendFontName(rend) == NULL))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
RenditionWarning(_XmRendTag(rend), "NULL_LOAD_IMMEDIATE",
|
|
Packit |
b099d7 |
NULL_LOAD_IMMEDIATE_MSG,
|
|
Packit |
b099d7 |
_XmRendDisplay(rend));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Create new rendition. */
|
|
Packit |
b099d7 |
XmRendition
|
|
Packit |
b099d7 |
XmRenditionCreate(Widget widget,
|
|
Packit |
b099d7 |
XmStringTag tag,
|
|
Packit |
b099d7 |
ArgList arglist,
|
|
Packit |
b099d7 |
Cardinal argcount)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRendition ret_val;
|
|
Packit |
b099d7 |
XtAppContext app=NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* If cannot applock, assume its an internal call (from
|
|
Packit |
b099d7 |
* fontlist code, etc.) and already process locked.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (widget)
|
|
Packit |
b099d7 |
app = XtWidgetToApplicationContext(widget);
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
ret_val = _XmRenditionCreate(NULL, widget, XmS, XmCRenderTable,
|
|
Packit |
b099d7 |
tag, arglist, argcount, NULL);
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return ret_val;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Internal function. Called from XmRenditionCreate, resource */
|
|
Packit |
b099d7 |
/* converter, and Mrm create function. */
|
|
Packit |
b099d7 |
XmRendition
|
|
Packit |
b099d7 |
_XmRenditionCreate(Display *display,
|
|
Packit |
b099d7 |
Widget widget,
|
|
Packit |
b099d7 |
String resname,
|
|
Packit |
b099d7 |
String resclass,
|
|
Packit |
b099d7 |
XmStringTag tag,
|
|
Packit |
b099d7 |
ArgList arglist,
|
|
Packit |
b099d7 |
Cardinal argcount,
|
|
Packit |
b099d7 |
Boolean *in_db)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRendition rend;
|
|
Packit |
b099d7 |
_XmRendition rend_int;
|
|
Packit |
b099d7 |
Boolean result;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((display == NULL) && (widget != NULL))
|
|
Packit |
b099d7 |
display = XtDisplayOfObject(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((tag != NULL) &&
|
|
Packit |
b099d7 |
(tag != XmFONTLIST_DEFAULT_TAG) &&
|
|
Packit |
b099d7 |
(strcmp(tag, XmSTRING_DEFAULT_CHARSET) == 0))
|
|
Packit |
b099d7 |
tag = _XmStringGetCurrentCharset();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Allocate rendition. */
|
|
Packit |
b099d7 |
rend_int = (_XmRendition)XtMalloc(sizeof(_XmRenditionRec));
|
|
Packit |
b099d7 |
bzero((char*)rend_int, sizeof(_XmRenditionRec));
|
|
Packit |
b099d7 |
rend = GetHandle(_XmRendition);
|
|
Packit |
b099d7 |
SetPtr(rend, rend_int);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRendRefcount(rend) = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* For now, FontOnly renditions aren't implemented. */
|
|
Packit |
b099d7 |
_XmRendFontOnly(rend) = FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* X resource DB query */
|
|
Packit |
b099d7 |
result =
|
|
Packit |
b099d7 |
GetResources(rend, display, widget, resname, resclass, tag,
|
|
Packit |
b099d7 |
arglist, argcount);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (in_db != NULL) *in_db = result;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (tag == NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (result == FALSE)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtFree((char *)rend_int);
|
|
Packit |
b099d7 |
FreeHandle(rend);
|
|
Packit |
b099d7 |
return(NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else tag = _MOTIF_DEFAULT_LOCALE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmRendTag(rend) = _XmStringCacheTag(tag, XmSTRING_TAG_STRLEN);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Cleanup and validate resources. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
CleanupResources(rend, TRUE);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ValidateTag(rend, XmS);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ValidateAndLoadFont(rend, display);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(rend);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Mrm create function for rendertables. */
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
_XmCreateRenderTable(Widget parent,
|
|
Packit |
b099d7 |
String name, /* unused */
|
|
Packit |
b099d7 |
ArgList arglist, /* unused */
|
|
Packit |
b099d7 |
Cardinal argcount) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRenderTable newtable;
|
|
Packit |
b099d7 |
_XmRenderTable table;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Malloc new table */
|
|
Packit |
b099d7 |
table = (_XmRenderTable)XtMalloc(sizeof(_XmRenderTableRec));
|
|
Packit |
b099d7 |
newtable = GetHandle(_XmRenderTable);
|
|
Packit |
b099d7 |
SetPtr(newtable, table);
|
|
Packit |
b099d7 |
_XmRTCount(newtable) = 0;
|
|
Packit |
b099d7 |
_XmRTRefcount(newtable) = 1;
|
|
Packit |
b099d7 |
_XmRTDisplay(newtable) = XtDisplay(parent);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return((Widget)newtable);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Mrm create function for renditions. */
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
_XmCreateRendition(Widget parent,
|
|
Packit |
b099d7 |
String name,
|
|
Packit |
b099d7 |
ArgList arglist,
|
|
Packit |
b099d7 |
Cardinal argcount)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRenderTable rt = (XmRenderTable)parent;
|
|
Packit |
b099d7 |
_XmRenderTable table;
|
|
Packit |
b099d7 |
XmRendition rend;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
table = GetPtr(rt);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
rend = _XmRenditionCreate(_XmRTDisplay(rt), NULL, XmS, XmCRenderTable,
|
|
Packit |
b099d7 |
name, arglist, argcount, NULL);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Ignore repeats */
|
|
Packit |
b099d7 |
if (_XmRenderTableFindRendition(rt, _XmRendTag(rend),
|
|
Packit |
b099d7 |
TRUE, FALSE, FALSE, NULL)
|
|
Packit |
b099d7 |
!= NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (FreeRendition(rend)) FreeHandle(rend);
|
|
Packit |
b099d7 |
return((Widget)NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
table = (_XmRenderTable)
|
|
Packit |
b099d7 |
XtRealloc((char *)table,
|
|
Packit |
b099d7 |
sizeof(_XmRenderTableRec) +
|
|
Packit |
b099d7 |
(sizeof(XmRendition) *
|
|
Packit |
b099d7 |
((_XmRTCount(rt) + 1) - RENDITIONS_IN_STRUCT)));
|
|
Packit |
b099d7 |
SetPtr(rt, table);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Copy new rendition. */
|
|
Packit |
b099d7 |
_XmRTRenditions(rt)[_XmRTCount(rt)] = CopyRendition(rend);
|
|
Packit |
b099d7 |
_XmRTCount(rt)++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return((Widget)rend);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Free data structure and any copied values. */
|
|
Packit |
b099d7 |
/* TRUE return -> freed. FALSE -> just decremented. */
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
FreeRendition(XmRendition rendition)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (rendition == NULL) return(FALSE);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendRefcountDec(rendition) == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* CR 7890 - the fontName might be XmAS_IS here */
|
|
Packit |
b099d7 |
if (NameIsString(_XmRendFontName(rendition)))
|
|
Packit |
b099d7 |
XtFree(_XmRendFontName(rendition));
|
|
Packit |
b099d7 |
if (ListIsList(_XmRendTabs(rendition)))
|
|
Packit |
b099d7 |
XmTabListFree(_XmRendTabs(rendition));
|
|
Packit |
b099d7 |
if (_XmRendTagCount(rendition) != 0)
|
|
Packit |
b099d7 |
XtFree((char *)_XmRendTags(rendition));
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
if (_XmRendXftFont(rendition))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XftFontClose(_XmRendDisplay(rendition),
|
|
Packit |
b099d7 |
_XmRendXftFont(rendition));
|
|
Packit |
b099d7 |
_XmRendXftFont(rendition) = NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (_XmRendPattern(rendition))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
FcPatternDestroy(_XmRendPattern(rendition));
|
|
Packit |
b099d7 |
_XmRendPattern(rendition) = NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree((char *)GetPtr(rendition));
|
|
Packit |
b099d7 |
return(TRUE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return(FALSE);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmRenditionFree(XmRendition rendition)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtAppContext app;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (rendition == NULL) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
FreeRendition(rendition);
|
|
Packit |
b099d7 |
FreeHandle(rendition);
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Get resource values from rendition. */
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmRenditionRetrieve(XmRendition rendition,
|
|
Packit |
b099d7 |
ArgList arglist,
|
|
Packit |
b099d7 |
Cardinal argcount)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i, j;
|
|
Packit |
b099d7 |
Arg *arg;
|
|
Packit |
b099d7 |
XtResource *res;
|
|
Packit |
b099d7 |
char *as_is = (char *)XmAS_IS;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (rendition == NULL) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
/* Get resources */
|
|
Packit |
b099d7 |
for (i = 0; i < argcount; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
arg = &(arglist[i]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (j = 0; j < _XmNumRenditionResources; j++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
res = &(_XmRenditionResources[j]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (strcmp(res->resource_name, arg->name) == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* CR 7890: Font hook - if there's a fontName but the
|
|
Packit |
b099d7 |
** font hasn't been fetched yet, now's a good time to
|
|
Packit |
b099d7 |
** get it - if the caller wants to use the font to, say,
|
|
Packit |
b099d7 |
** compute font metrics for layout (as CSText does), it won't
|
|
Packit |
b099d7 |
** like to get NULL back
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (strcmp(res->resource_name, XmNfont) == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ((_XmRendFont(rendition) == NULL) &&
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
(_XmRendXftFont (rendition) == NULL) &&
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
(_XmRendFontName(rendition) != NULL))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (_XmRendLoadModel(rendition) == XmLOAD_DEFERRED)
|
|
Packit |
b099d7 |
_XmRendLoadModel(rendition) = XmLOAD_IMMEDIATE;
|
|
Packit |
b099d7 |
ValidateAndLoadFont(rendition, _XmRendDisplay(rendition));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (_XmRendFont (rendition) == NULL
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
&& _XmRendXftFont (rendition) == NULL
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
)
|
|
Packit |
b099d7 |
CopyToArg((char*)&as_is, &(arg->value), sizeof(char*));
|
|
Packit |
b099d7 |
else CopyToArg(((char *)GetPtr(rendition) +
|
|
Packit |
b099d7 |
res->resource_offset),
|
|
Packit |
b099d7 |
&(arg->value),
|
|
Packit |
b099d7 |
res->resource_size);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (((strcmp(res->resource_name, XmNfontName) == 0) &&
|
|
Packit |
b099d7 |
(_XmRendFontName(rendition) == NULL)) ||
|
|
Packit |
b099d7 |
((strcmp(res->resource_name, XmNtabList) == 0) &&
|
|
Packit |
b099d7 |
(_XmRendTabs(rendition) == NULL)))
|
|
Packit |
b099d7 |
CopyToArg((char*)&as_is, &(arg->value), sizeof(char*));
|
|
Packit |
b099d7 |
else CopyToArg(((char *)GetPtr(rendition) + res->resource_offset),
|
|
Packit |
b099d7 |
&(arg->value),
|
|
Packit |
b099d7 |
res->resource_size);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Set resources in rendition. */
|
|
Packit |
b099d7 |
/* Renew rendition if necessary, then update resources. */
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmRenditionUpdate(XmRendition rendition,
|
|
Packit |
b099d7 |
ArgList arglist,
|
|
Packit |
b099d7 |
Cardinal argcount)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmStringTag oldtag;
|
|
Packit |
b099d7 |
char *oldname;
|
|
Packit |
b099d7 |
XtPointer oldfont;
|
|
Packit |
b099d7 |
XmTabList oldtabs;
|
|
Packit |
b099d7 |
int i, j;
|
|
Packit |
b099d7 |
XtResource *res;
|
|
Packit |
b099d7 |
Arg *arg;
|
|
Packit |
b099d7 |
Display *display = _XmGetDefaultDisplay();
|
|
Packit |
b099d7 |
Boolean can_free;
|
|
Packit |
b099d7 |
XtAppContext app = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (rendition == NULL) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
if (_XmRendDisplay(rendition))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
app = XtDisplayToApplicationContext(_XmRendDisplay(rendition));
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (_XmRendDisplay(rendition) && (_XmRendDisplay(rendition) !=
|
|
Packit |
b099d7 |
display) )
|
|
Packit |
b099d7 |
display = _XmRendDisplay(rendition);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
/* Save old values to check for dependencies and free memory. */
|
|
Packit |
b099d7 |
oldtag = _XmRendTag(rendition);
|
|
Packit |
b099d7 |
oldname = _XmRendFontName(rendition);
|
|
Packit |
b099d7 |
oldfont = _XmRendFont(rendition);
|
|
Packit |
b099d7 |
oldtabs = _XmRendTabs(rendition);
|
|
Packit |
b099d7 |
can_free = TRUE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* New memory if needed. */
|
|
Packit |
b099d7 |
if (_XmRendRefcount(rendition) > 1)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmRendRefcountDec(rendition);
|
|
Packit |
b099d7 |
RenewRendition(rendition);
|
|
Packit |
b099d7 |
can_free = FALSE;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0; i < argcount; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
arg = &(arglist[i]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (j = 0; j < _XmNumRenditionResources; j++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
res = &(_XmRenditionResources[j]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (strcmp(res->resource_name, arg->name) == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
CopyFromArg((arg->value),
|
|
Packit |
b099d7 |
((char *)GetPtr(rendition) + res->resource_offset),
|
|
Packit |
b099d7 |
res->resource_size);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
CopyInto(rendition, rendition);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/** Validate resources **/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* CR 7890 - handle cases of fontName == NULL and fontName == XmAS_IS */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* If fontName changed but not font, NULL font so it's updated.
|
|
Packit |
b099d7 |
** (first make sure we won't crash on the strcmp) */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (NameIsString(oldname) && NameIsString(_XmRendFontName(rendition))) {
|
|
Packit |
b099d7 |
if (strcmp(oldname, _XmRendFontName(rendition)) != 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (oldfont == _XmRendFont(rendition))
|
|
Packit |
b099d7 |
_XmRendFont(rendition) = NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (can_free) XtFree(oldname);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
/* Also handle the case where we started with a NULL fontName and
|
|
Packit |
b099d7 |
** had a real fontName specified */
|
|
Packit |
b099d7 |
else if ((oldname == NULL) && NameIsString(_XmRendFontName(rendition)))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (oldfont == _XmRendFontName(rendition))
|
|
Packit |
b099d7 |
_XmRendFont(rendition) = NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendFont(rendition) == (XtPointer)XmAS_IS)
|
|
Packit |
b099d7 |
_XmRendFont(rendition) = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((oldtabs != _XmRendTabs(rendition)) && can_free) XmTabListFree(oldtabs);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ValidateTag(rendition, oldtag);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ValidateAndLoadFont(rendition, display);
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
if (app) {
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************************/
|
|
Packit |
b099d7 |
/* XmRenderTableCvtToProp takes a rendertable and converts it to */
|
|
Packit |
b099d7 |
/* an ascii string in the following format: */
|
|
Packit |
b099d7 |
/* tag : char* */
|
|
Packit |
b099d7 |
/* font : either fontid (integer) or [ fontid, fontid ... fontid ] or -1 */
|
|
Packit |
b099d7 |
/* tablist : [ tab1, ... tabn ] or -1 */
|
|
Packit |
b099d7 |
/* background : pixel or -1 */
|
|
Packit |
b099d7 |
/* foreground : pixel or -1 */
|
|
Packit |
b099d7 |
/* underlineType : integer (from enum in Xm.h ) or -1 */
|
|
Packit |
b099d7 |
/* strikethruType : integer (from enum in Xm.h ) or -1 */
|
|
Packit |
b099d7 |
/* */
|
|
Packit |
b099d7 |
/* example: */
|
|
Packit |
b099d7 |
/* "tag, font, tablist, background, foreground, underlineType, */
|
|
Packit |
b099d7 |
/* strikethruType\n */
|
|
Packit |
b099d7 |
/* bold, 10000031, -1, -1, -1, -1, -1\n */
|
|
Packit |
b099d7 |
/* underline, 10000029, -1, -1, -1, -1, -1\n */
|
|
Packit |
b099d7 |
/* default, 10000029, [ 1.234 1 0 0, 2.43 2 0 2], 1, 2, 0, 0\n */
|
|
Packit |
b099d7 |
/* japanese, [10000029, 10000030], -1, -1, -1, -1, -1" */
|
|
Packit |
b099d7 |
/* */
|
|
Packit |
b099d7 |
/* The first line gives a complete list of the attributes by name. */
|
|
Packit |
b099d7 |
/* on the destination side, attributes which are not understood */
|
|
Packit |
b099d7 |
/* or are outdated can be ignored. The conversion of each rendition */
|
|
Packit |
b099d7 |
/* passes a single "line" which contains the fields in order. */
|
|
Packit |
b099d7 |
/*****************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Note that this MUST be in the same order as the output conversion
|
|
Packit |
b099d7 |
below!! */
|
|
Packit |
b099d7 |
static XmConst char *CVTproperties[] = {
|
|
Packit |
b099d7 |
XmNtag,
|
|
Packit |
b099d7 |
XmNfont,
|
|
Packit |
b099d7 |
XmNtabList,
|
|
Packit |
b099d7 |
XmNbackground,
|
|
Packit |
b099d7 |
XmNforeground,
|
|
Packit |
b099d7 |
XmNunderlineType,
|
|
Packit |
b099d7 |
XmNstrikethruType,
|
|
Packit |
b099d7 |
NULL,
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Must be big enough to take all the above strings concatenated with
|
|
Packit |
b099d7 |
commas separating them */
|
|
Packit |
b099d7 |
static char CVTtransfervector[256];
|
|
Packit |
b099d7 |
static int CVTtvinited = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Use this macro to encapsulate the code that extends the output
|
|
Packit |
b099d7 |
buffer as needed */
|
|
Packit |
b099d7 |
#define CVTaddString(dest, src, srcsize)\
|
|
Packit |
b099d7 |
{\
|
|
Packit |
b099d7 |
if ((chars_used + srcsize) > allocated_size) {\
|
|
Packit |
b099d7 |
allocated_size *= 2;\
|
|
Packit |
b099d7 |
buffer = XtRealloc(buffer, allocated_size);\
|
|
Packit |
b099d7 |
}\
|
|
Packit |
b099d7 |
strcat(buffer, src);\
|
|
Packit |
b099d7 |
chars_used += srcsize;\
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
unsigned int
|
|
Packit |
b099d7 |
XmRenderTableCvtToProp(Widget widget, /* unused */
|
|
Packit |
b099d7 |
XmRenderTable table,
|
|
Packit |
b099d7 |
char **prop_return)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
int allocated_size = 256;
|
|
Packit |
b099d7 |
int chars_used = 0, size;
|
|
Packit |
b099d7 |
char *buffer;
|
|
Packit |
b099d7 |
char *str;
|
|
Packit |
b099d7 |
XmRendition rendition;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(widget);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
buffer = XtMalloc(allocated_size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
if (CVTtvinited == 0) {
|
|
Packit |
b099d7 |
CVTtvinited = 1;
|
|
Packit |
b099d7 |
strcpy(CVTtransfervector, "");
|
|
Packit |
b099d7 |
for(i = 0; CVTproperties[i] != NULL; i++) {
|
|
Packit |
b099d7 |
strcat(CVTtransfervector, CVTproperties[i]);
|
|
Packit |
b099d7 |
strcat(CVTtransfervector, ",");
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
strcat(CVTtransfervector, "\n");
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Copy the transfer vector into the output buffer. */
|
|
Packit |
b099d7 |
strcpy(buffer, CVTtransfervector);
|
|
Packit |
b099d7 |
chars_used = strlen(buffer);
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Now iterate over the list of renditions */
|
|
Packit |
b099d7 |
for(i = 0; i < _XmRTCount(table); i++) {
|
|
Packit |
b099d7 |
char temp[2048];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
rendition = _XmRTRenditions(table)[i];
|
|
Packit |
b099d7 |
sprintf(temp, "\"%s\", ", _XmRendTag(rendition));
|
|
Packit |
b099d7 |
size = strlen(temp);
|
|
Packit |
b099d7 |
CVTaddString(buffer, temp, size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendFontType(rendition) == XmAS_IS)
|
|
Packit |
b099d7 |
str = "-1, ";
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
sprintf(temp, "%d \"%s\" %d,", _XmRendFontType(rendition),
|
|
Packit |
b099d7 |
_XmRendFontName(rendition), _XmRendLoadModel(rendition));
|
|
Packit |
b099d7 |
str = temp;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
size = strlen(str);
|
|
Packit |
b099d7 |
CVTaddString(buffer, str, size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((unsigned int)(unsigned long)_XmRendTabs(rendition) == XmAS_IS ||
|
|
Packit |
b099d7 |
_XmRendTabs(rendition) == NULL)
|
|
Packit |
b099d7 |
str = "-1, ";
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
_XmTab tab;
|
|
Packit |
b099d7 |
_XmTabList tlist;
|
|
Packit |
b099d7 |
int number;
|
|
Packit |
b099d7 |
strcpy(temp, "[ ");
|
|
Packit |
b099d7 |
tlist = (_XmTabList) _XmRendTabs(rendition);
|
|
Packit |
b099d7 |
number = tlist -> count;
|
|
Packit |
b099d7 |
tab = (_XmTab) tlist -> start;
|
|
Packit |
b099d7 |
while(number > 0) {
|
|
Packit |
b099d7 |
sprintf(temp, "%s %f %d %d %d, ", temp, tab -> value,
|
|
Packit |
b099d7 |
tab -> units, tab -> alignment, tab -> offsetModel);
|
|
Packit |
b099d7 |
tab = (_XmTab) tab -> next;
|
|
Packit |
b099d7 |
number--;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
strcat(temp, " ], ");
|
|
Packit |
b099d7 |
str = temp;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
size = strlen(str);
|
|
Packit |
b099d7 |
CVTaddString(buffer, str, size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendBG(rendition) == XmAS_IS)
|
|
Packit |
b099d7 |
str = "-1, ";
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
sprintf(temp, "%ld, ", _XmRendBG(rendition));
|
|
Packit |
b099d7 |
str = temp;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
size = strlen(str);
|
|
Packit |
b099d7 |
CVTaddString(buffer, str, size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendFG(rendition) == XmAS_IS)
|
|
Packit |
b099d7 |
str = "-1, ";
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
sprintf(temp, "%ld, ", _XmRendFG(rendition));
|
|
Packit |
b099d7 |
str = temp;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
size = strlen(str);
|
|
Packit |
b099d7 |
CVTaddString(buffer, str, size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendUnderlineType(rendition) == XmAS_IS)
|
|
Packit |
b099d7 |
str = "-1, ";
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
sprintf(temp, "%d, ", _XmRendUnderlineType(rendition));
|
|
Packit |
b099d7 |
str = temp;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
size = strlen(str);
|
|
Packit |
b099d7 |
CVTaddString(buffer, str, size);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendStrikethruType(rendition) == XmAS_IS)
|
|
Packit |
b099d7 |
str = "-1, ";
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
sprintf(temp, "%d, ", _XmRendStrikethruType(rendition));
|
|
Packit |
b099d7 |
str = temp;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
size = strlen(str);
|
|
Packit |
b099d7 |
CVTaddString(buffer, str, size);
|
|
Packit |
b099d7 |
CVTaddString(buffer, "\n", size);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Return the converted rendertable string */
|
|
Packit |
b099d7 |
*prop_return = buffer;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
/* chars_used is always the size - the NULL terminator */
|
|
Packit |
b099d7 |
return(chars_used + 1);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
typedef enum { T_NL, T_INT, T_FLOAT, T_SEP,
|
|
Packit |
b099d7 |
T_OPEN, T_CLOSE, T_STR, T_EOF } TokenType;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
typedef struct _TokenRec {
|
|
Packit |
b099d7 |
TokenType type;
|
|
Packit |
b099d7 |
int integer;
|
|
Packit |
b099d7 |
float real;
|
|
Packit |
b099d7 |
char *string;
|
|
Packit |
b099d7 |
} TokenRec, *Token;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifndef XTHREADS
|
|
Packit |
b099d7 |
static TokenRec reusetoken;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Token
|
|
Packit |
b099d7 |
ReadToken(char *string, int *position)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
TokenRec reusetoken;
|
|
Packit |
b099d7 |
Token new_token = &reusetoken;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Token new_token = &reusetoken;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
int pos = *position;
|
|
Packit |
b099d7 |
int count;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Skip whitespace but not newlines */
|
|
Packit |
b099d7 |
while (isspace(string[pos]) && ! (string[pos] == '\n'))
|
|
Packit |
b099d7 |
pos++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Select token type */
|
|
Packit |
b099d7 |
switch(string[pos]) {
|
|
Packit |
b099d7 |
case '\0':
|
|
Packit |
b099d7 |
new_token -> type = T_EOF;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case '\n':
|
|
Packit |
b099d7 |
new_token -> type = T_NL;
|
|
Packit |
b099d7 |
pos++;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case ',':
|
|
Packit |
b099d7 |
new_token -> type = T_SEP;
|
|
Packit |
b099d7 |
pos++;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case '[':
|
|
Packit |
b099d7 |
new_token -> type = T_OPEN;
|
|
Packit |
b099d7 |
pos++;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case ']':
|
|
Packit |
b099d7 |
new_token -> type = T_CLOSE;
|
|
Packit |
b099d7 |
pos++;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case '"': /* String result */
|
|
Packit |
b099d7 |
count = 1;
|
|
Packit |
b099d7 |
while (string[pos + count] != '"' &&
|
|
Packit |
b099d7 |
string[pos + count] != '\0')
|
|
Packit |
b099d7 |
count++; /* Scan for end of string */
|
|
Packit |
b099d7 |
new_token -> type = T_STR;
|
|
Packit |
b099d7 |
new_token -> string = NULL;
|
|
Packit |
b099d7 |
count -= 1;
|
|
Packit |
b099d7 |
if (count > 0) {
|
|
Packit |
b099d7 |
new_token -> string = (char*) XtMalloc(count + 1);
|
|
Packit |
b099d7 |
strncpy(new_token -> string, &string[pos + 1], count);
|
|
Packit |
b099d7 |
pos += count + 2; /* Move past end quote */
|
|
Packit |
b099d7 |
new_token -> string[count] = 0; /* Null terminate */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
if (isalpha(string[pos])) /* String result */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
char temp[80];
|
|
Packit |
b099d7 |
int count;
|
|
Packit |
b099d7 |
for(count = 0;
|
|
Packit |
b099d7 |
isalpha(string[pos + count]) && count < 79;
|
|
Packit |
b099d7 |
count++) temp[count] = string[pos + count];
|
|
Packit |
b099d7 |
temp[count] = 0;
|
|
Packit |
b099d7 |
pos += count;
|
|
Packit |
b099d7 |
new_token -> type = T_STR;
|
|
Packit |
b099d7 |
new_token -> string = XtNewString(temp);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* start converting a float number. If it is exactly integer
|
|
Packit |
b099d7 |
then we return an int, otherwise return a float */
|
|
Packit |
b099d7 |
double result;
|
|
Packit |
b099d7 |
int intresult;
|
|
Packit |
b099d7 |
char *newpos;
|
|
Packit |
b099d7 |
result=strtod(&(string[pos]), &newpos);
|
|
Packit |
b099d7 |
intresult= (int) result;
|
|
Packit |
b099d7 |
pos = newpos - string;
|
|
Packit |
b099d7 |
if (((double) intresult) == result) /* Integer result */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_token -> type = T_INT;
|
|
Packit |
b099d7 |
new_token -> integer = intresult;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
new_token -> type = T_FLOAT;
|
|
Packit |
b099d7 |
new_token -> real = (float) result;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*position = pos;
|
|
Packit |
b099d7 |
return(new_token);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
static struct _XmXftDrawCacheStruct {
|
|
Packit |
b099d7 |
Display *display;
|
|
Packit |
b099d7 |
Window window;
|
|
Packit |
b099d7 |
XftDraw *draw;
|
|
Packit |
b099d7 |
} *_XmXftDrawCache = NULL;
|
|
Packit |
b099d7 |
static int _XmXftDrawCacheSize = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XErrorHandler oldErrorHandler;
|
|
Packit |
b099d7 |
static int xft_error;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static int
|
|
Packit |
b099d7 |
_XmXftErrorHandler(
|
|
Packit |
b099d7 |
Display *display,
|
|
Packit |
b099d7 |
XErrorEvent *error )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
(void) fprintf(stderr,
|
|
Packit |
b099d7 |
"Ignoring Xlib error: error code %d request code %d\n",
|
|
Packit |
b099d7 |
error->error_code,
|
|
Packit |
b099d7 |
error->request_code) ;
|
|
Packit |
b099d7 |
xft_error = BadWindow;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* No exit! - but keep lint happy */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XftDraw *
|
|
Packit |
b099d7 |
_XmXftDrawCreate(Display *display, Window window)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XftDraw *draw;
|
|
Packit |
b099d7 |
XWindowAttributes wa;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
Status status;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0; i<_XmXftDrawCacheSize; i++) {
|
|
Packit |
b099d7 |
if (_XmXftDrawCache[i].display == display &&
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].window == window) {
|
|
Packit |
b099d7 |
return _XmXftDrawCache[i].draw;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef FIX_1444
|
|
Packit |
b099d7 |
if (!(draw = XftDrawCreate(display, window,
|
|
Packit |
b099d7 |
DefaultVisual(display, DefaultScreen(display)),
|
|
Packit |
b099d7 |
DefaultColormap(display, DefaultScreen(display)))))
|
|
Packit |
b099d7 |
draw = XftDrawCreateBitmap(display, window);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
oldErrorHandler = XSetErrorHandler (_XmXftErrorHandler);
|
|
Packit |
b099d7 |
xft_error = 0;
|
|
Packit |
b099d7 |
XGetWindowAttributes(display, window, &wa;;
|
|
Packit |
b099d7 |
XSetErrorHandler(oldErrorHandler);
|
|
Packit |
b099d7 |
if (xft_error != BadWindow) {
|
|
Packit |
b099d7 |
draw = XftDrawCreate(display, window,
|
|
Packit |
b099d7 |
DefaultVisual(display, DefaultScreen(display)),
|
|
Packit |
b099d7 |
DefaultColormap(display, DefaultScreen(display)));
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
draw = XftDrawCreateBitmap(display, window);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
/* Store it in the cache. Look for an empty slot first */
|
|
Packit |
b099d7 |
for (i=0; i<_XmXftDrawCacheSize; i++)
|
|
Packit |
b099d7 |
if (_XmXftDrawCache[i].display == NULL) {
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].display = display;
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].draw = draw;
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].window = window;
|
|
Packit |
b099d7 |
return draw;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
i = _XmXftDrawCacheSize; /* Next free index */
|
|
Packit |
b099d7 |
_XmXftDrawCacheSize = _XmXftDrawCacheSize * 2 + 8;
|
|
Packit |
b099d7 |
_XmXftDrawCache = (struct _XmXftDrawCacheStruct *)
|
|
Packit |
b099d7 |
XtRealloc((char *)_XmXftDrawCache,
|
|
Packit |
b099d7 |
sizeof(struct _XmXftDrawCacheStruct) * _XmXftDrawCacheSize);
|
|
Packit |
b099d7 |
#ifdef FIX_1449
|
|
Packit |
b099d7 |
memset(_XmXftDrawCache + i, 0, (_XmXftDrawCacheSize - i) * sizeof(*_XmXftDrawCache));
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].display = display;
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].draw = draw;
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].window = window;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return draw;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmXftDrawDestroy(Display *display, Window window, XftDraw *draw)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0; i<_XmXftDrawCacheSize; i++)
|
|
Packit |
b099d7 |
if (_XmXftDrawCache[i].display == display &&
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].window == window) {
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].display = NULL;
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].draw = NULL;
|
|
Packit |
b099d7 |
_XmXftDrawCache[i].window = None;
|
|
Packit |
b099d7 |
XftDrawDestroy(draw);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
XmeWarning(NULL, "_XmXftDrawDestroy() this should not happen\n");
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmXftDrawString2(Display *display, Window window, GC gc, XftFont *font, int bpc,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int x, int y,
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Position x, Position y,
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
char *s, int len)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XftDraw *draw = _XmXftDrawCreate(display, window);
|
|
Packit |
b099d7 |
XGCValues gc_val;
|
|
Packit |
b099d7 |
XColor xcol;
|
|
Packit |
b099d7 |
XftColor xftcol;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XGetGCValues(display, gc, GCForeground, &gc_val);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
xcol.pixel = gc_val.foreground;
|
|
Packit |
b099d7 |
XQueryColor(display, DefaultColormap(display,
|
|
Packit |
b099d7 |
DefaultScreen(display)), &xcol);
|
|
Packit |
b099d7 |
xftcol.color.red = xcol.red;
|
|
Packit |
b099d7 |
xftcol.color.blue = xcol.blue;
|
|
Packit |
b099d7 |
xftcol.color.green = xcol.green;
|
|
Packit |
b099d7 |
xftcol.color.alpha = 0xFFFF;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (bpc)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case 1:
|
|
Packit |
b099d7 |
XftDrawStringUtf8(draw, &xftcol, font,
|
|
Packit |
b099d7 |
x, y, (XftChar8 *)s, len);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case 2:
|
|
Packit |
b099d7 |
XftDrawString16(draw, &xftcol, font,
|
|
Packit |
b099d7 |
x, y, (XftChar16 *)s, len);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case 4:
|
|
Packit |
b099d7 |
XftDrawString32(draw, &xftcol, font,
|
|
Packit |
b099d7 |
x, y, (XftChar32 *)s, len);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
XmeWarning(NULL, "_XmXftDrawString(unsupported bpc)\n");
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmXftDrawString(Display *display, Window window, XmRendition rend, int bpc,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int x, int y,
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Position x, Position y,
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
char *s, int len,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int image
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean image
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XftDraw *draw = _XmXftDrawCreate(display, window);
|
|
Packit |
b099d7 |
XftColor fg_color = _XmRendXftFG(rend);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (image)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XftColor bg_color = _XmRendXftBG(rend);
|
|
Packit |
b099d7 |
XGlyphInfo ext;
|
|
Packit |
b099d7 |
ext.xOff = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (bpc)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case 1:
|
|
Packit |
b099d7 |
XftTextExtentsUtf8(display, _XmRendXftFont(rend),
|
|
Packit |
b099d7 |
(FcChar8*)s, len, &ext;;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case 2:
|
|
Packit |
b099d7 |
XftTextExtents16(display, _XmRendXftFont(rend),
|
|
Packit |
b099d7 |
(FcChar16*)s, len, &ext;;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case 4:
|
|
Packit |
b099d7 |
XftTextExtents32(display, _XmRendXftFont(rend),
|
|
Packit |
b099d7 |
(FcChar32*)s, len, &ext;;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendBG(rend) == XmUNSPECIFIED_PIXEL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XGCValues gc_val;
|
|
Packit |
b099d7 |
XColor xcol;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XGetGCValues(display, _XmRendGC(rend), GCBackground, &gc_val);
|
|
Packit |
b099d7 |
xcol.pixel = gc_val.background;
|
|
Packit |
b099d7 |
XQueryColor(display, DefaultColormapOfScreen(
|
|
Packit |
b099d7 |
DefaultScreenOfDisplay(display)), &xcol);
|
|
Packit |
b099d7 |
bg_color.pixel = xcol.pixel;
|
|
Packit |
b099d7 |
bg_color.color.red = xcol.red;
|
|
Packit |
b099d7 |
bg_color.color.green = xcol.green;
|
|
Packit |
b099d7 |
bg_color.color.blue = xcol.blue;
|
|
Packit |
b099d7 |
bg_color.color.alpha = 0xFFFF;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#ifdef FIX_1451
|
|
Packit |
b099d7 |
XftDrawRect(draw, &bg_color, x, y - _XmRendXftFont(rend)->ascent,
|
|
Packit |
b099d7 |
ext.xOff,
|
|
Packit |
b099d7 |
_XmRendXftFont(rend)->ascent +
|
|
Packit |
b099d7 |
_XmRendXftFont(rend)->descent);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
XftDrawRect(draw, &bg_color, x - 10, y - _XmRendXftFont(rend)->ascent - 10,
|
|
Packit |
b099d7 |
ext.xOff +20,
|
|
Packit |
b099d7 |
_XmRendXftFont(rend)->ascent +
|
|
Packit |
b099d7 |
_XmRendXftFont(rend)->descent + 20);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_XmRendFG(rend) == XmUNSPECIFIED_PIXEL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XGCValues gc_val;
|
|
Packit |
b099d7 |
XColor xcol;
|
|
Packit |
b099d7 |
XGetGCValues(display, _XmRendGC(rend), GCForeground, &gc_val);
|
|
Packit |
b099d7 |
xcol.pixel = gc_val.foreground;
|
|
Packit |
b099d7 |
XQueryColor(display, DefaultColormapOfScreen(
|
|
Packit |
b099d7 |
DefaultScreenOfDisplay(display)), &xcol);
|
|
Packit |
b099d7 |
fg_color.pixel = xcol.pixel;
|
|
Packit |
b099d7 |
fg_color.color.red = xcol.red;
|
|
Packit |
b099d7 |
fg_color.color.green = xcol.green;
|
|
Packit |
b099d7 |
fg_color.color.blue = xcol.blue;
|
|
Packit |
b099d7 |
fg_color.color.alpha = 0xFFFF;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (bpc)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case 1:
|
|
Packit |
b099d7 |
XftDrawStringUtf8(draw, &fg_color, _XmRendXftFont(rend),
|
|
Packit |
b099d7 |
x, y, (XftChar8 *)s, len);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case 2:
|
|
Packit |
b099d7 |
XftDrawString16(draw, &fg_color, _XmRendXftFont(rend),
|
|
Packit |
b099d7 |
x, y, (XftChar16 *)s, len);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case 4:
|
|
Packit |
b099d7 |
XftDrawString32(draw, &fg_color, _XmRendXftFont(rend),
|
|
Packit |
b099d7 |
x, y, (XftChar32 *)s, len);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
XmeWarning(NULL, "_XmXftDrawString(unsupported bpc)\n");
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmXftSetClipRectangles(Display *display, Window window, Position x, Position y, XRectangle *rects, int n)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XftDraw *d = _XmXftDrawCreate(display, window);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XftDrawSetClipRectangles(d, x, y, rects, n);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef FIX_1536
|
|
Packit |
b099d7 |
static XftColor
|
|
Packit |
b099d7 |
GetCachedXftColor(Display *display, Pixel color)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
static XftColor *color_cache = NULL;
|
|
Packit |
b099d7 |
static int colors_count = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XftColor xftcol = {0, {0,0,0,0xFFFF}};
|
|
Packit |
b099d7 |
XColor xcol;
|
|
Packit |
b099d7 |
Boolean color_exist = FALSE;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (color_cache != NULL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
for (i = 0; i < colors_count; ++i)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (color_cache[i].pixel == color)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
xftcol = color_cache[i];
|
|
Packit |
b099d7 |
color_exist = TRUE;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!color_exist)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
xcol.pixel = color;
|
|
Packit |
b099d7 |
XQueryColor(display, DefaultColormap(display,
|
|
Packit |
b099d7 |
DefaultScreen(display)), &xcol);
|
|
Packit |
b099d7 |
xftcol.pixel = color;
|
|
Packit |
b099d7 |
xftcol.color.red = xcol.red;
|
|
Packit |
b099d7 |
xftcol.color.blue = xcol.blue;
|
|
Packit |
b099d7 |
xftcol.color.green = xcol.green;
|
|
Packit |
b099d7 |
xftcol.color.alpha = 0xFFFF;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
color_cache = (XftColor *) XtRealloc((char *) color_cache,
|
|
Packit |
b099d7 |
(Cardinal) (sizeof(XftColor) * (colors_count + 1)));
|
|
Packit |
b099d7 |
if (color_cache != NULL)
|
|
Packit |
b099d7 |
color_cache[colors_count++] = xftcol;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return xftcol;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XftColor
|
|
Packit |
b099d7 |
_XmXftGetXftColor(Display *display, Pixel color)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
#ifdef FIX_1536
|
|
Packit |
b099d7 |
return GetCachedXftColor(display, color);
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
XColor xcol;
|
|
Packit |
b099d7 |
XftColor xftcol;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
xcol.pixel = color;
|
|
Packit |
b099d7 |
XQueryColor(display, DefaultColormap(display,
|
|
Packit |
b099d7 |
DefaultScreen(display)), &xcol);
|
|
Packit |
b099d7 |
xftcol.pixel = color;
|
|
Packit |
b099d7 |
xftcol.color.red = xcol.red;
|
|
Packit |
b099d7 |
xftcol.color.blue = xcol.blue;
|
|
Packit |
b099d7 |
xftcol.color.green = xcol.green;
|
|
Packit |
b099d7 |
xftcol.color.alpha = 0xFFFF;
|
|
Packit |
b099d7 |
return xftcol;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef FIX_1415
|
|
Packit |
b099d7 |
void _XmXftFontAverageWidth(Widget w, XtPointer f, int *width)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XftFont *fp = (XftFont *)f;
|
|
Packit |
b099d7 |
static char *s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
Packit |
b099d7 |
int l = 62; /* strlen(s) */
|
|
Packit |
b099d7 |
XGlyphInfo ext;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XftTextExtents8(XtDisplay(w), fp, (unsigned char *)s, l, &ext;;
|
|
Packit |
b099d7 |
if (width)
|
|
Packit |
b099d7 |
*width = ext.width / l;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
XmRenderTable
|
|
Packit |
b099d7 |
XmRenderTableCvtFromProp(Widget w,
|
|
Packit |
b099d7 |
char *prop,
|
|
Packit |
b099d7 |
unsigned int len) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmRenderTable new_rt;
|
|
Packit |
b099d7 |
XmRendition rendition;
|
|
Packit |
b099d7 |
XmRendition *rarray;
|
|
Packit |
b099d7 |
int rarray_count, rarray_max;
|
|
Packit |
b099d7 |
/* These must both be big enough for the number of passed parameters */
|
|
Packit |
b099d7 |
char *items[20];
|
|
Packit |
b099d7 |
char *name;
|
|
Packit |
b099d7 |
Arg args[20];
|
|
Packit |
b099d7 |
/* This must be big enough to hold all the strings returned by
|
|
Packit |
b099d7 |
readtoken */
|
|
Packit |
b099d7 |
char *freelater[5];
|
|
Packit |
b099d7 |
int scanpointer, j, count, freecount, i;
|
|
Packit |
b099d7 |
Token token;
|
|
Packit |
b099d7 |
_XmWidgetToAppContext(w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
new_rt = NULL;
|
|
Packit |
b099d7 |
scanpointer = 0;
|
|
Packit |
b099d7 |
rarray_max = 10;
|
|
Packit |
b099d7 |
rarray_count = 0;
|
|
Packit |
b099d7 |
rarray = (XmRendition *) XtMalloc(sizeof(XmRendition) * rarray_max);
|
|
Packit |
b099d7 |
name = "";
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for(j = 0; j < 20; j++) items[j] = NULL;
|
|
Packit |
b099d7 |
/* Read the list of items */
|
|
Packit |
b099d7 |
for(j = 0; j < 20; ) {
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
if (token -> type == T_NL) break;
|
|
Packit |
b099d7 |
if (token -> type == T_STR) {
|
|
Packit |
b099d7 |
items[j] = token -> string;
|
|
Packit |
b099d7 |
j++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
j = -1;
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
freecount = 0;
|
|
Packit |
b099d7 |
while(True) {
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
/* We skip the separators */
|
|
Packit |
b099d7 |
while(token -> type == T_SEP &&
|
|
Packit |
b099d7 |
token -> type != T_EOF)
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
if (token -> type == T_EOF) goto finish;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
j++; /* Go to next item in items array */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (items[j] == NULL) {
|
|
Packit |
b099d7 |
/* End of line processing. Scan for NewLine */
|
|
Packit |
b099d7 |
while(token -> type != T_NL &&
|
|
Packit |
b099d7 |
token -> type != T_EOF)
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
/* Store rendition */
|
|
Packit |
b099d7 |
rendition = XmRenditionCreate(w, name, args, count);
|
|
Packit |
b099d7 |
name = "";
|
|
Packit |
b099d7 |
count = 0;
|
|
Packit |
b099d7 |
/* Reset index into namelist */
|
|
Packit |
b099d7 |
j = -1;
|
|
Packit |
b099d7 |
/* Free temp strings returned by ReadToken */
|
|
Packit |
b099d7 |
for(i = 0; i < freecount; i++) XtFree(freelater[i]);
|
|
Packit |
b099d7 |
freecount = 0;
|
|
Packit |
b099d7 |
/* Record rendition in array */
|
|
Packit |
b099d7 |
if (rarray_count >= rarray_max) {
|
|
Packit |
b099d7 |
/* Extend array if necessary */
|
|
Packit |
b099d7 |
rarray_max += 10;
|
|
Packit |
b099d7 |
rarray = (XmRendition *) XtRealloc((char*) rarray,
|
|
Packit |
b099d7 |
sizeof(XmRendition) * rarray_max);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (token -> type == T_EOF) goto finish;
|
|
Packit |
b099d7 |
rarray[rarray_count] = rendition;
|
|
Packit |
b099d7 |
rarray_count++;
|
|
Packit |
b099d7 |
} else if (strcmp(items[j], XmNtag) == 0) {
|
|
Packit |
b099d7 |
/* Next item should be a string with the name of the new
|
|
Packit |
b099d7 |
rendition to create */
|
|
Packit |
b099d7 |
if (token -> type == T_STR) {
|
|
Packit |
b099d7 |
name = token -> string;
|
|
Packit |
b099d7 |
freelater[freecount] = token -> string; freecount++;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
goto error;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else if (strcmp(items[j], XmNfont) == 0) {
|
|
Packit |
b099d7 |
/* If the next item is a number then we have a font
|
|
Packit |
b099d7 |
id, otherwise we are reading in a fontset */
|
|
Packit |
b099d7 |
if (token -> type != T_INT) goto error;
|
|
Packit |
b099d7 |
if (token -> integer != -1) { /* AS IS */
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNfontType, token -> integer); count++;
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
if (token -> type != T_STR) goto error;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNfontName, token -> string); count++;
|
|
Packit |
b099d7 |
freelater[freecount] = token -> string; freecount++;
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
if (token -> type != T_INT) goto error;
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNloadModel, token -> integer); count++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else if (strcmp(items[j], XmNtabList) == 0) {
|
|
Packit |
b099d7 |
/* This starts with an OPEN then a number of
|
|
Packit |
b099d7 |
FLOAT INT INT INT then CLOSE and SEP */
|
|
Packit |
b099d7 |
if (token -> type == T_INT) { /* Should be AS IS */
|
|
Packit |
b099d7 |
if (token -> integer != -1) goto error;
|
|
Packit |
b099d7 |
} else if (token -> type == T_OPEN) {
|
|
Packit |
b099d7 |
float value;
|
|
Packit |
b099d7 |
int units, align;
|
|
Packit |
b099d7 |
XmOffsetModel model;
|
|
Packit |
b099d7 |
XmTabList tablist;
|
|
Packit |
b099d7 |
XmTab tabs[1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
tablist = NULL;
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
while(token -> type != T_CLOSE) {
|
|
Packit |
b099d7 |
if (token -> type != T_FLOAT &&
|
|
Packit |
b099d7 |
token -> type != T_INT) goto error;
|
|
Packit |
b099d7 |
if (token -> type == T_FLOAT)
|
|
Packit |
b099d7 |
value = token -> real;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
value = (float) token -> integer;
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
if (token -> type != T_INT) goto error;
|
|
Packit |
b099d7 |
units = token -> integer;
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
if (token -> type != T_INT) goto error;
|
|
Packit |
b099d7 |
align = token -> integer;
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
if (token -> type != T_INT) goto error;
|
|
Packit |
b099d7 |
model = (XmOffsetModel) token -> integer;
|
|
Packit |
b099d7 |
tabs[0] = XmTabCreate(value, units, model, align, NULL);
|
|
Packit |
b099d7 |
tablist = XmTabListInsertTabs(tablist, tabs, 1, 1000);
|
|
Packit |
b099d7 |
XtFree((char*) tabs[0]);
|
|
Packit |
b099d7 |
/* Go to next separator to skip unknown future values */
|
|
Packit |
b099d7 |
while(token -> type != T_SEP)
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
if (token -> type == T_SEP)
|
|
Packit |
b099d7 |
token = ReadToken(prop, &scanpointer);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNtabList, tablist); count++;
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
goto error;
|
|
Packit |
b099d7 |
} else if (strcmp(items[j], XmNbackground) == 0) {
|
|
Packit |
b099d7 |
if (token -> type != T_INT) goto error;
|
|
Packit |
b099d7 |
if (token -> type != -1) {
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNrenditionBackground, token -> integer); count++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else if (strcmp(items[j], XmNforeground) == 0) {
|
|
Packit |
b099d7 |
if (token -> type != T_INT) goto error;
|
|
Packit |
b099d7 |
if (token -> type != -1) {
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNrenditionForeground, token -> integer); count++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else if (strcmp(items[j], XmNunderlineType) == 0) {
|
|
Packit |
b099d7 |
if (token -> type != T_INT) goto error;
|
|
Packit |
b099d7 |
if (token -> type != -1) {
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNunderlineType, token -> integer); count++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else if (strcmp(items[j], XmNstrikethruType) == 0) {
|
|
Packit |
b099d7 |
if (token -> type != T_INT) goto error;
|
|
Packit |
b099d7 |
if (token -> type != -1) {
|
|
Packit |
b099d7 |
XtSetArg(args[count], XmNstrikethruType, token -> integer); count++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
finish:
|
|
Packit |
b099d7 |
new_rt = XmRenderTableAddRenditions(new_rt, rarray, rarray_count, XmMERGE_REPLACE);
|
|
Packit |
b099d7 |
for (i = 0; i < rarray_count; i++) XmRenditionFree(rarray[i]);
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
return(new_rt);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
error:
|
|
Packit |
b099d7 |
/* Free temp strings returned by ReadToken */
|
|
Packit |
b099d7 |
for(i = 0; i < freecount; i++) XtFree((char*) freelater[i]);
|
|
Packit |
b099d7 |
freecount = 0;
|
|
Packit |
b099d7 |
goto finish;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
XmRenderTableGetDefaultFontExtents(XmRenderTable rendertable,
|
|
Packit |
b099d7 |
int *height,
|
|
Packit |
b099d7 |
int *ascent,
|
|
Packit |
b099d7 |
int *descent)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmStringTag tag = XmFONTLIST_DEFAULT_TAG;
|
|
Packit |
b099d7 |
XmRendition rend;
|
|
Packit |
b099d7 |
Boolean success;
|
|
Packit |
b099d7 |
short indx;
|
|
Packit |
b099d7 |
int h,a,d;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
XtAppContext app=NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ( _XmRTDisplay(rendertable) )
|
|
Packit |
b099d7 |
app = XtDisplayToApplicationContext(_XmRTDisplay(rendertable));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (app)
|
|
Packit |
b099d7 |
_XmAppLock(app);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
a = d = h = 0;
|
|
Packit |
b099d7 |
/* Get default rendition */
|
|
Packit |
b099d7 |
success = _XmRenderTableFindFallback(rendertable, tag, FALSE, &indx, &rend);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* For backward compatibility we must try to return something for */
|
|
Packit |
b099d7 |
/* any non-null charset, not just XmFONTLIST_DEFAULT_TAG. */
|
|
Packit |
b099d7 |
if (rendertable && tag && !success)
|
|
Packit |
b099d7 |
success = _XmRenderTableFindFirstFont(rendertable, &indx, &rend);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (success) {
|
|
Packit |
b099d7 |
/* Find font height */
|
|
Packit |
b099d7 |
switch (_XmRendFontType(rend)) {
|
|
Packit |
b099d7 |
case XmFONT_IS_FONT:
|
|
Packit |
b099d7 |
if (_XmRendFont(rend)) {
|
|
Packit |
b099d7 |
a = ((XFontStruct*)_XmRendFont(rend))->ascent;
|
|
Packit |
b099d7 |
d = ((XFontStruct*)_XmRendFont(rend))->descent;
|
|
Packit |
b099d7 |
h = a + d;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
case XmFONT_IS_FONTSET:
|
|
Packit |
b099d7 |
if (_XmRendFont(rend)) {
|
|
Packit |
b099d7 |
XFontStruct **font_struct_list;
|
|
Packit |
b099d7 |
char **font_name_list;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XFontsOfFontSet((XFontSet)_XmRendFont(rend),
|
|
Packit |
b099d7 |
&font_struct_list, &font_name_list)) {
|
|
Packit |
b099d7 |
a = font_struct_list[0]->ascent;
|
|
Packit |
b099d7 |
d = font_struct_list[0]->descent;
|
|
Packit |
b099d7 |
h = a + d;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
#ifdef USE_XFT
|
|
Packit |
b099d7 |
case XmFONT_IS_XFT:
|
|
Packit |
b099d7 |
if (_XmRendXftFont(rend)) {
|
|
Packit |
b099d7 |
a = _XmRendXftFont(rend)->ascent;
|
|
Packit |
b099d7 |
d = _XmRendXftFont(rend)->descent;
|
|
Packit |
b099d7 |
h = a + d;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef XTHREADS
|
|
Packit |
b099d7 |
if (app)
|
|
Packit |
b099d7 |
_XmAppUnlock(app);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (ascent) *ascent = a;
|
|
Packit |
b099d7 |
if (descent) *descent = d;
|
|
Packit |
b099d7 |
if (height) *height = h;
|
|
Packit |
b099d7 |
}
|