Blame lib/Xm/XmFontList.c

Packit b099d7
/* $XConsortium: XmFontList.c /main/16 1996/11/20 15:15:34 drk $ */
Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <stdio.h>
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
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/AtomMgr.h>
Packit b099d7
#include <Xm/XmosP.h>
Packit b099d7
#include "XmI.h"
Packit b099d7
#include "XmRenderTI.h"
Packit b099d7
#include "XmStringI.h"
Packit b099d7
Packit b099d7
Packit b099d7
#define FIX_1252
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Data structure macros for fontlist access
Packit b099d7
 */
Packit b099d7
Packit b099d7
#define FLContextIndex(context)	(((XmFontListContextRec *)(context))->index)
Packit b099d7
#define FLContextTable(context)	(((XmFontListContextRec *)(context))->table)
Packit b099d7
#define FLContextError(context)	(((XmFontListContextRec *)(context))->error)
Packit b099d7
#define FLDisplay(fl)		((*fl)->display)
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
/* NOTE - this function XmFontListEntryCreate is NOT MT-safe if the
Packit b099d7
   application is using threads with multiple application contexts
Packit b099d7
 
Packit b099d7
   to use Font lists in threaded code with multiple application contexts
Packit b099d7
   it is necessary to use the new API XmFontListEntryCreate_r function
Packit b099d7
   which passes in an additional widget parameter ... this widget
Packit b099d7
   MUST be for the display that font will be used in
Packit b099d7
 
Packit b099d7
    Font should not be shared between displays in an MT environment */
Packit b099d7
 
Packit b099d7
XmFontListEntry
Packit b099d7
XmFontListEntryCreate(
Packit b099d7
        char *tag,
Packit b099d7
        XmFontType type ,
Packit b099d7
        XtPointer font )
Packit b099d7
{
Packit b099d7
    char	*derived_tag;
Packit b099d7
    Cardinal	n;
Packit b099d7
    Arg		args[4];
Packit b099d7
    XmFontListEntry ret_val;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if ((font == NULL) || (tag == NULL) ||
Packit b099d7
        ((type != XmFONT_IS_FONTSET) && (type != XmFONT_IS_FONT))) {
Packit b099d7
	 _XmProcessUnlock();
Packit b099d7
         return (NULL);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
    if ((tag != XmFONTLIST_DEFAULT_TAG) &&
Packit b099d7
	(strcmp(tag, XmSTRING_DEFAULT_CHARSET) == 0))
Packit b099d7
      derived_tag = _XmStringGetCurrentCharset();
Packit b099d7
    else derived_tag = tag;
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNfontType, type); n++;
Packit b099d7
    XtSetArg(args[n], XmNloadModel, XmLOAD_IMMEDIATE); n++; 
Packit b099d7
    XtSetArg(args[n], XmNfont, font); n++;
Packit b099d7
  
Packit b099d7
    ret_val =
Packit b099d7
      XmRenditionCreate(NULL,
Packit b099d7
		_XmStringCacheTag(derived_tag, XmSTRING_TAG_STRLEN),
Packit b099d7
			args, n);
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    return ret_val;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * MT safe version of XmFontList - requires widget parameter
Packit b099d7
 *
Packit b099d7
 *  A display variable is necessary to create a render table in an
Packit b099d7
 *  MT safe environment
Packit b099d7
 * 
Packit b099d7
 *  the widget passed in DOES NOT need to be the widget which uses the
Packit b099d7
 *  font however it MUST be on the same display
Packit b099d7
 *
Packit b099d7
 *  Fonts can not be shared among displays in an MT environment
Packit b099d7
 */
Packit b099d7
 
Packit b099d7
XmFontListEntry
Packit b099d7
XmFontListEntryCreate_r(char *tag,
Packit b099d7
			XmFontType type,
Packit b099d7
			XtPointer font,
Packit b099d7
			Widget wid )
Packit b099d7
{
Packit b099d7
  char        *derived_tag;
Packit b099d7
  Cardinal    n;
Packit b099d7
  Arg         args[4];
Packit b099d7
  XmFontListEntry ret_val;
Packit b099d7
 
Packit b099d7
  _XmWidgetToAppContext(wid);
Packit b099d7
  _XmAppLock(app);
Packit b099d7
  if ((font == NULL) || (tag == NULL) ||
Packit b099d7
      ((type != XmFONT_IS_FONTSET) && (type != XmFONT_IS_FONT)))
Packit b099d7
    {
Packit b099d7
      _XmAppUnlock(app);
Packit b099d7
      return (NULL);
Packit b099d7
    }
Packit b099d7
 
Packit b099d7
  if ((tag != XmFONTLIST_DEFAULT_TAG) &&
Packit b099d7
      (strcmp(tag, XmSTRING_DEFAULT_CHARSET) == 0))
Packit b099d7
    derived_tag = _XmStringGetCurrentCharset();
Packit b099d7
  else 
Packit b099d7
    derived_tag = tag;
Packit b099d7
 
Packit b099d7
  n = 0;
Packit b099d7
  XtSetArg(args[n], XmNfontType, type); n++;
Packit b099d7
  XtSetArg(args[n], XmNloadModel, XmLOAD_IMMEDIATE); n++;
Packit b099d7
  XtSetArg(args[n], XmNfont, font); n++;
Packit b099d7
 
Packit b099d7
  ret_val = 
Packit b099d7
      XmRenditionCreate(wid,
Packit b099d7
			_XmStringCacheTag(derived_tag, XmSTRING_TAG_STRLEN),
Packit b099d7
			args, n);
Packit b099d7
  _XmAppUnlock(app);
Packit b099d7
  return ret_val;
Packit b099d7
}
Packit b099d7
Packit b099d7
void
Packit b099d7
XmFontListEntryFree(
Packit b099d7
        XmFontListEntry  *entry )
Packit b099d7
{
Packit b099d7
  if (entry != NULL) XmRenditionFree(*entry);
Packit b099d7
}
Packit b099d7
Packit b099d7
XtPointer
Packit b099d7
XmFontListEntryGetFont(
Packit b099d7
        XmFontListEntry entry ,
Packit b099d7
        XmFontType *typeReturn )
Packit b099d7
{
Packit b099d7
  XtPointer 	ret_val;
Packit b099d7
#ifdef USE_XFT
Packit b099d7
  XtPointer     ret_val2;
Packit b099d7
#endif
Packit b099d7
  Arg		args[3];
Packit b099d7
  Cardinal	n;
Packit b099d7
  XtAppContext  app=NULL;
Packit b099d7
Packit b099d7
  if (entry == NULL) 
Packit b099d7
      return (NULL);
Packit b099d7
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if ( _XmRendDisplay((XmRendition)entry) )
Packit b099d7
    app = XtDisplayToApplicationContext(_XmRendDisplay((XmRendition)entry));
Packit b099d7
Packit b099d7
  if (app)
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  else
Packit b099d7
    _XmProcessLock();
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  n = 0;
Packit b099d7
  XtSetArg(args[n], XmNfontType, typeReturn); n++;
Packit b099d7
  XtSetArg(args[n], XmNfont, &ret_val); n++; 
Packit b099d7
#ifdef USE_XFT
Packit b099d7
  XtSetArg(args[n], XmNxftFont, &ret_val2); n++; 
Packit b099d7
#endif
Packit b099d7
  XmRenditionRetrieve(entry, args, n);
Packit b099d7
Packit b099d7
#ifdef USE_XFT
Packit b099d7
  if (*typeReturn == XmFONT_IS_XFT) 
Packit b099d7
      ret_val = ret_val2;
Packit b099d7
#endif
Packit b099d7
  
Packit b099d7
  if (*typeReturn == XmAS_IS) 
Packit b099d7
      *typeReturn = XmFONT_IS_FONT;
Packit b099d7
Packit b099d7
  if (ret_val == (char *)XmAS_IS)
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
      return(NULL);
Packit b099d7
    }
Packit b099d7
  else
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
      return(ret_val);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
char *
Packit b099d7
XmFontListEntryGetTag(
Packit b099d7
        XmFontListEntry entry )
Packit b099d7
{
Packit b099d7
  Cardinal	n;
Packit b099d7
  Arg		args[1]; 
Packit b099d7
  char		*tag;
Packit b099d7
  char		*ret_val;
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  XtAppContext  app=NULL;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  if (entry == NULL)
Packit b099d7
	return (NULL);
Packit b099d7
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if ( _XmRendDisplay((XmRendition)entry) )
Packit b099d7
    app = XtDisplayToApplicationContext(_XmRendDisplay((XmRendition)entry));
Packit b099d7
Packit b099d7
  if (app)
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  else
Packit b099d7
    _XmProcessLock();
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  n = 0;
Packit b099d7
  XtSetArg(args[n], XmNtag, &tag;; n++;
Packit b099d7
  XmRenditionRetrieve(entry, args, n);
Packit b099d7
  
Packit b099d7
  ret_val = XtNewString(tag);
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
  return ret_val;
Packit b099d7
}
Packit b099d7
Packit b099d7
XmFontList 
Packit b099d7
XmFontListAppendEntry(
Packit b099d7
        XmFontList old ,
Packit b099d7
        XmFontListEntry entry )
Packit b099d7
{
Packit b099d7
  XmRendition	rends[1];
Packit b099d7
  XmFontList ret_val;
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  XtAppContext app=NULL;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  if (!entry) {
Packit b099d7
     return (old);
Packit b099d7
  }
Packit b099d7
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if (_XmRendDisplay((XmRendition)entry))
Packit b099d7
      app = XtDisplayToApplicationContext(_XmRendDisplay((XmRendition)entry));
Packit b099d7
Packit b099d7
  if (app)
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  else
Packit b099d7
    _XmProcessLock();
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  rends[0] = entry;
Packit b099d7
  ret_val = XmRenderTableAddRenditions(old, rends, 1, XmDUPLICATE);
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
  return ret_val;
Packit b099d7
}
Packit b099d7
Packit b099d7
XmFontListEntry
Packit b099d7
XmFontListNextEntry(
Packit b099d7
        XmFontContext context )
Packit b099d7
{
Packit b099d7
    XmRendition	entry;
Packit b099d7
Packit b099d7
    _XmProcessLock();
Packit b099d7
    if ((context == NULL) || (FLContextError(context))) {
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
        return (NULL);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (FLContextIndex(context) >=
Packit b099d7
	_XmRTCount(FLContextTable(context)))
Packit b099d7
      {
Packit b099d7
	FLContextError(context) = TRUE;
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	return (NULL);
Packit b099d7
      }
Packit b099d7
Packit b099d7
    entry =
Packit b099d7
      _XmRTRenditions(FLContextTable(context))[FLContextIndex(context)];
Packit b099d7
    FLContextIndex(context)++;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    return((XmFontListEntry)entry);
Packit b099d7
}
Packit b099d7
Packit b099d7
XmFontList 
Packit b099d7
XmFontListRemoveEntry(
Packit b099d7
        XmFontList old ,
Packit b099d7
        XmFontListEntry entry )
Packit b099d7
{
Packit b099d7
  Cardinal	n;
Packit b099d7
  Arg		args[3];
Packit b099d7
  XmStringTag	tags[1];
Packit b099d7
  XmFontType	type1;
Packit b099d7
  XtPointer	font1;
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  XtAppContext  app=NULL;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  if ((old == NULL) || (entry == NULL))
Packit b099d7
      return (old);
Packit b099d7
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if ( _XmRendDisplay((XmRendition)entry) )
Packit b099d7
    app = XtDisplayToApplicationContext(_XmRendDisplay((XmRendition)entry));
Packit b099d7
Packit b099d7
  if (app)
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  else
Packit b099d7
    _XmProcessLock();
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  n = 0;
Packit b099d7
  XtSetArg(args[n], XmNtag, &tags[0]); n++;
Packit b099d7
  XtSetArg(args[n], XmNfontType, &type1); n++;
Packit b099d7
  XtSetArg(args[n], XmNfont, &font1); n++; 
Packit b099d7
  XmRenditionRetrieve(entry, args, n);
Packit b099d7
Packit b099d7
  old = _XmRenderTableRemoveRenditions(old, tags, 1, TRUE, type1, font1);
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
  return(old);
Packit b099d7
}
Packit b099d7
Packit b099d7
XmFontListEntry
Packit b099d7
XmFontListEntryLoad(
Packit b099d7
        Display *display ,
Packit b099d7
        char *fontName ,
Packit b099d7
        XmFontType type ,
Packit b099d7
        char *tag )
Packit b099d7
{
Packit b099d7
  Cardinal	n;
Packit b099d7
  Arg		args[4];
Packit b099d7
  XmFontListEntry ret_val;
Packit b099d7
  _XmDisplayToAppContext(display);
Packit b099d7
  
Packit b099d7
  _XmAppLock(app);
Packit b099d7
  n = 0; 
Packit b099d7
  XtSetArg(args[n], XmNfontName, fontName); n++;
Packit b099d7
  XtSetArg(args[n], XmNfontType, type); n++;
Packit b099d7
  XtSetArg(args[n], XmNloadModel, XmLOAD_IMMEDIATE); n++;
Packit b099d7
  
Packit b099d7
  ret_val = _XmRenditionCreate(display, NULL, XmS, XmCFontList,
Packit b099d7
		    _XmStringCacheTag(tag, XmSTRING_TAG_STRLEN),
Packit b099d7
			    args, n, NULL);
Packit b099d7
  _XmAppUnlock(app);
Packit b099d7
  return ret_val;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* NOTE - this function XmFontListCreate is NOT MT-safe if the
Packit b099d7
   application is using threads with multiple application contexts
Packit b099d7
 
Packit b099d7
   to use Font lists in threaded code with multiple application contexts
Packit b099d7
   it is necessary to use the new API XmFontListCreate_r function
Packit b099d7
   which passes in an additional widget parameter ... this widget
Packit b099d7
   MUST be for the display that font will be used in
Packit b099d7
 
Packit b099d7
    Font should not be shared between displays in an MT environment */
Packit b099d7
Packit b099d7
XmFontList 
Packit b099d7
XmFontListCreate(
Packit b099d7
        XFontStruct *font,
Packit b099d7
        XmStringCharSet charset )
Packit b099d7
{
Packit b099d7
  Cardinal		n;
Packit b099d7
  Arg			args[4];
Packit b099d7
  XmRendition		rends[1];
Packit b099d7
  XmStringCharSet	curcharset;
Packit b099d7
  XmRenderTable		ret_val;
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  if ((font == NULL) || (charset == NULL)) {
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	return (NULL);
Packit b099d7
  }
Packit b099d7
Packit b099d7
  if ((charset != XmFONTLIST_DEFAULT_TAG) &&
Packit b099d7
      (strcmp(charset, XmSTRING_DEFAULT_CHARSET) == 0))
Packit b099d7
    curcharset = _XmStringGetCurrentCharset();
Packit b099d7
  else curcharset = charset;
Packit b099d7
    
Packit b099d7
  n = 0; 
Packit b099d7
  XtSetArg(args[n], XmNfontType, XmFONT_IS_FONT); n++;
Packit b099d7
  XtSetArg(args[n], XmNfont, (XtPointer)font); n++; 
Packit b099d7
  XtSetArg(args[n], XmNloadModel, XmLOAD_IMMEDIATE); n++;
Packit b099d7
Packit b099d7
  rends[0] =
Packit b099d7
    XmRenditionCreate(NULL,
Packit b099d7
		      _XmStringCacheTag(curcharset, XmSTRING_TAG_STRLEN),
Packit b099d7
		      args, n);
Packit b099d7
  
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
  ret_val = XmRenderTableAddRenditions(NULL, rends, 1, XmDUPLICATE);
Packit b099d7
Packit b099d7
  XmRenditionFree(rends[0]);
Packit b099d7
Packit b099d7
  return(ret_val);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* MT safe version of XmFontListCreate - requires widget parameter
Packit b099d7
 
Packit b099d7
   A display variable is necessary to create a render table in an
Packit b099d7
   MT safe environment
Packit b099d7
 
Packit b099d7
   the widget passed in DOES NOT need to be the widget which uses the
Packit b099d7
   font however it MUST be on the same display
Packit b099d7
 
Packit b099d7
   Fonts can not be shared among displays in an MT environment
Packit b099d7
*/
Packit b099d7
 
Packit b099d7
XmFontList
Packit b099d7
XmFontListCreate_r(
Packit b099d7
        XFontStruct *font,
Packit b099d7
        XmStringCharSet charset,
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
  Cardinal              n;
Packit b099d7
  Arg                   args[4];
Packit b099d7
  XmRendition           rends[1];
Packit b099d7
  XmStringCharSet       curcharset;
Packit b099d7
  XmRenderTable         ret_val;
Packit b099d7
 
Packit b099d7
 
Packit b099d7
  _XmWidgetToAppContext(wid);
Packit b099d7
  _XmAppLock(app);
Packit b099d7
  if ((font == NULL) || (charset == NULL)) {
Packit b099d7
        _XmAppUnlock(app);
Packit b099d7
        return (NULL);
Packit b099d7
  }
Packit b099d7
 
Packit b099d7
  if ((charset != XmFONTLIST_DEFAULT_TAG) &&
Packit b099d7
      (strcmp(charset, XmSTRING_DEFAULT_CHARSET) == 0))
Packit b099d7
    curcharset = _XmStringGetCurrentCharset();
Packit b099d7
  else curcharset = charset;
Packit b099d7
 
Packit b099d7
  n = 0;
Packit b099d7
  XtSetArg(args[n], XmNfontType, XmFONT_IS_FONT); n++;
Packit b099d7
  XtSetArg(args[n], XmNfont, (XtPointer)font); n++;
Packit b099d7
  XtSetArg(args[n], XmNloadModel, XmLOAD_IMMEDIATE); n++;
Packit b099d7
 
Packit b099d7
  rends[0] =
Packit b099d7
    XmRenditionCreate(wid,
Packit b099d7
                      _XmStringCacheTag(curcharset, XmSTRING_TAG_STRLEN),
Packit b099d7
                      args, n);
Packit b099d7
 
Packit b099d7
  ret_val = XmRenderTableAddRenditions(NULL, rends, 1, XmDUPLICATE);
Packit b099d7
 
Packit b099d7
  XmRenditionFree(rends[0]);
Packit b099d7
 
Packit b099d7
  _XmAppUnlock(app);
Packit b099d7
  return(ret_val);
Packit b099d7
}
Packit b099d7
Packit b099d7
/* NOTE - this function XmStringCreateFontList is NOT MT-safe if the
Packit b099d7
   application is using threads with multiple application contexts
Packit b099d7
 
Packit b099d7
   to use Font lists in threaded code with multiple application contexts
Packit b099d7
   it is necessary to use the new API XmFontListCreate_r function
Packit b099d7
   which passes in an additional widget parameter ... this widget
Packit b099d7
   MUST be for the display that font will be used in
Packit b099d7
 
Packit b099d7
    Font should not be shared between displays in an MT environment */
Packit b099d7
 
Packit b099d7
XmFontList 
Packit b099d7
XmStringCreateFontList(
Packit b099d7
        XFontStruct *font,
Packit b099d7
        XmStringCharSet charset )
Packit b099d7
{
Packit b099d7
    return (XmFontListCreate(font,charset));
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/* MT safe version of XmStringCreateFontList - requires widget parameter
Packit b099d7
 
Packit b099d7
   A display variable is necessary to create a render table in an
Packit b099d7
   MT safe environment
Packit b099d7
 
Packit b099d7
   the widget passed in DOES NOT need to be the widget which uses the
Packit b099d7
   font however it MUST be on the same display
Packit b099d7
 
Packit b099d7
   Fonts can not be shared among displays in an MT environment
Packit b099d7
*/
Packit b099d7
XmFontList
Packit b099d7
XmStringCreateFontList_r(
Packit b099d7
        XFontStruct *font,
Packit b099d7
        XmStringCharSet charset,
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
        /* we dont need to lock since this is just a wrapper */
Packit b099d7
    return (XmFontListCreate_r(font,charset, wid));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * dump a font list
Packit b099d7
 */
Packit b099d7
void 
Packit b099d7
XmFontListFree (
Packit b099d7
    XmFontList      fontlist)
Packit b099d7
{
Packit b099d7
  XmRenderTableFree(fontlist);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * extent a font list by one element, the old font list is gone
Packit b099d7
 */
Packit b099d7
XmFontList 
Packit b099d7
XmFontListAdd(
Packit b099d7
        XmFontList old,
Packit b099d7
        XFontStruct *font,
Packit b099d7
        XmStringCharSet charset )
Packit b099d7
{
Packit b099d7
  XmStringCharSet	curcharset; 
Packit b099d7
  Cardinal		n;
Packit b099d7
  Arg			args[4];
Packit b099d7
  XmRendition		rends[1];
Packit b099d7
  XmFontList		ret_val;
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  XtAppContext		app=NULL;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  if (!old)
Packit b099d7
    return((XmFontList) NULL);
Packit b099d7
  if (!charset || !font)
Packit b099d7
    return ((XmFontList) old);
Packit b099d7
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  if ( _XmRTDisplay((XmRenderTable)old) )
Packit b099d7
    app = XtDisplayToApplicationContext(_XmRTDisplay((XmRenderTable)old));
Packit b099d7
Packit b099d7
  if (app)
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  else
Packit b099d7
    _XmProcessLock();
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  if ((charset != XmFONTLIST_DEFAULT_TAG) &&
Packit b099d7
      (strcmp(charset, XmSTRING_DEFAULT_CHARSET) == 0))
Packit b099d7
    curcharset = _XmStringGetCurrentCharset();
Packit b099d7
  else 
Packit b099d7
    curcharset = charset;
Packit b099d7
    
Packit b099d7
  n = 0; 
Packit b099d7
  XtSetArg(args[n], XmNfontType, XmFONT_IS_FONT); n++;
Packit b099d7
  XtSetArg(args[n], XmNfont, (XtPointer)font); n++; 
Packit b099d7
  XtSetArg(args[n], XmNloadModel, XmLOAD_IMMEDIATE); n++;
Packit b099d7
Packit b099d7
  rends[0] =
Packit b099d7
    XmRenditionCreate(NULL,
Packit b099d7
		      _XmStringCacheTag(curcharset, XmSTRING_TAG_STRLEN),
Packit b099d7
		      args, n);
Packit b099d7
  
Packit b099d7
  ret_val = XmRenderTableAddRenditions(old, rends, 1, XmDUPLICATE);
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
  return ret_val;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * replicate a font list
Packit b099d7
 */
Packit b099d7
XmFontList 
Packit b099d7
XmFontListCopy(
Packit b099d7
        XmFontList fontlist )
Packit b099d7
{
Packit b099d7
  return(XmRenderTableCopy(fontlist, NULL, 0));
Packit b099d7
}
Packit b099d7
Packit b099d7
XFontStruct *
Packit b099d7
_XmGetFirstFont(
Packit b099d7
	XmFontListEntry  entry)
Packit b099d7
{
Packit b099d7
  XFontStruct	*font_struct;
Packit b099d7
  Cardinal	n;
Packit b099d7
  Arg		args[2]; 
Packit b099d7
  XmFontType	type;
Packit b099d7
  XtPointer	font;
Packit b099d7
  
Packit b099d7
  n = 0; 
Packit b099d7
  XtSetArg(args[n], XmNfontType, &type); n++;
Packit b099d7
  XtSetArg(args[n], XmNfont, &font); n++;
Packit b099d7
  XmRenditionRetrieve(entry, args, n);
Packit b099d7
Packit b099d7
  if (font == (XtPointer)XmAS_IS)
Packit b099d7
    {
Packit b099d7
      font_struct = NULL;
Packit b099d7
    }
Packit b099d7
  else if (type == XmFONT_IS_FONTSET)
Packit b099d7
    {
Packit b099d7
      XFontStruct **font_struct_list;
Packit b099d7
      char **font_name_list;
Packit b099d7
Packit b099d7
#ifdef FIX_1252
Packit b099d7
      if (XFontsOfFontSet((XFontSet)font,
Packit b099d7
			  &font_struct_list, &font_name_list)
Packit b099d7
	  && font_struct_list[0]->fid != 0)
Packit b099d7
#else
Packit b099d7
      if (XFontsOfFontSet((XFontSet)font,
Packit b099d7
			  &font_struct_list, &font_name_list))
Packit b099d7
#endif
Packit b099d7
	font_struct = font_struct_list[0];
Packit b099d7
      else
Packit b099d7
	font_struct = NULL;
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    font_struct = (XFontStruct *)font;
Packit b099d7
Packit b099d7
  return (font_struct);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Find an entry in the fontlist which matches the current charset or
Packit b099d7
 * return the first font if none match.
Packit b099d7
 */
Packit b099d7
Boolean 
Packit b099d7
XmeRenderTableGetDefaultFont(
Packit b099d7
        XmFontList fontlist,
Packit b099d7
        XFontStruct **font_struct )
Packit b099d7
{
Packit b099d7
  XmStringTag	       tag = XmFONTLIST_DEFAULT_TAG;
Packit b099d7
  short		       indx = -1;
Packit b099d7
  Boolean	       retval;
Packit b099d7
#ifdef XTHREADS
Packit b099d7
  XtAppContext	       app=NULL;
Packit b099d7
Packit b099d7
  if ( _XmRTDisplay((XmRenderTable)fontlist) )
Packit b099d7
    app = XtDisplayToApplicationContext(_XmRTDisplay((XmRenderTable)fontlist));
Packit b099d7
Packit b099d7
  if (app)
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  else
Packit b099d7
    _XmProcessLock();
Packit b099d7
#endif
Packit b099d7
Packit b099d7
  retval = _XmFontListSearch (fontlist, tag, &indx, font_struct);
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
  return(retval);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * find an entry in the font list which matches, return index (or -1) and
Packit b099d7
 * font stuct ptr (or first in list).
Packit b099d7
 */
Packit b099d7
Boolean 
Packit b099d7
_XmFontListSearch(
Packit b099d7
        XmFontList fontlist,
Packit b099d7
        XmStringCharSet charset,
Packit b099d7
        short *indx,
Packit b099d7
        XFontStruct **font_struct )
Packit b099d7
{
Packit b099d7
    XmFontListEntry    entry;
Packit b099d7
    Boolean            success;
Packit b099d7
  
Packit b099d7
    success = _XmRenderTableFindFallback(fontlist, charset, 
Packit b099d7
					 FALSE, indx, &entry);
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 (fontlist && charset && !success)
Packit b099d7
      success = _XmRenderTableFindFirstFont(fontlist, indx, &entry);
Packit b099d7
Packit b099d7
    if (success)
Packit b099d7
      *font_struct = _XmGetFirstFont(entry);
Packit b099d7
    else
Packit b099d7
      *font_struct = NULL;
Packit b099d7
Packit b099d7
    return success && (*font_struct != NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Fontlist access routines
Packit b099d7
 */
Packit b099d7
Boolean 
Packit b099d7
XmFontListInitFontContext(
Packit b099d7
        XmFontContext *context,
Packit b099d7
        XmFontList fontlist )
Packit b099d7
{
Packit b099d7
  XmFontContext p;
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  if ((!fontlist) || (!context)) {
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	return(FALSE);
Packit b099d7
  }
Packit b099d7
Packit b099d7
  p = (XmFontContext) XtMalloc (sizeof (XmFontListContextRec));
Packit b099d7
Packit b099d7
  FLContextIndex(p) = 0;
Packit b099d7
  FLContextTable(p) = fontlist;
Packit b099d7
  FLContextError(p) = FALSE;
Packit b099d7
  *context = p;
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
  return (TRUE);
Packit b099d7
}
Packit b099d7
Packit b099d7
Boolean 
Packit b099d7
XmFontListGetNextFont(
Packit b099d7
        XmFontContext context,
Packit b099d7
        XmStringCharSet *charset,
Packit b099d7
        XFontStruct **font )
Packit b099d7
{
Packit b099d7
  XmRenderTable	table;
Packit b099d7
  XmRendition	rend;
Packit b099d7
  Cardinal	n;
Packit b099d7
  Arg		args[1];
Packit b099d7
  XmStringTag	tag;
Packit b099d7
Packit b099d7
  _XmProcessLock();
Packit b099d7
  if ((context == NULL) || FLContextError(context) ||
Packit b099d7
      (charset == NULL) || (font == NULL)) {
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
	return (FALSE);
Packit b099d7
  }
Packit b099d7
Packit b099d7
  table = FLContextTable(context);
Packit b099d7
Packit b099d7
  if (FLContextIndex(context) >= _XmRTCount(table))
Packit b099d7
    {
Packit b099d7
      FLContextError(context) = TRUE;
Packit b099d7
      _XmProcessUnlock();
Packit b099d7
      return(FALSE);
Packit b099d7
    }
Packit b099d7
Packit b099d7
  rend = _XmRTRenditions(table)[FLContextIndex(context)];
Packit b099d7
  
Packit b099d7
  *font = _XmGetFirstFont(rend);
Packit b099d7
  
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
  n = 0; 
Packit b099d7
  XtSetArg(args[n], XmNtag, &tag;; n++;
Packit b099d7
  XmRenditionRetrieve(rend, args, n);
Packit b099d7
Packit b099d7
  *charset = XtNewString(tag);
Packit b099d7
  
Packit b099d7
  FLContextIndex(context)++;
Packit b099d7
  return (TRUE);
Packit b099d7
}
Packit b099d7
Packit b099d7
void
Packit b099d7
XmFontListFreeFontContext(
Packit b099d7
        XmFontContext context )
Packit b099d7
{
Packit b099d7
  _XmProcessLock();
Packit b099d7
  if (context != NULL) XtFree((char *)context);
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
#ifdef _XmDEBUG_XMSTRING
Packit b099d7
Packit b099d7
void 
Packit b099d7
_Xm_dump_fontlist(
Packit b099d7
        XmFontList f )
Packit b099d7
{
Packit b099d7
    int i = 0;
Packit b099d7
Packit b099d7
    for ( ; FontListFont(f) != NULL; f++, i++)
Packit b099d7
    {
Packit b099d7
   	printf ("fontlist[%3d] of 0x%p\n", i, f);
Packit b099d7
	printf ("\ttype = %d\n", FontListType(f));
Packit b099d7
	printf ("\tfont = %p\n", FontListFont(f));
Packit b099d7
	printf ("\ttag = <%s>\n", FontListTag(f));
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
_Xm_dump_fontlist_cache( void )
Packit b099d7
{
Packit b099d7
    FontlistEntry *cache;
Packit b099d7
Packit b099d7
    if (_fontlist_cache == NULL)
Packit b099d7
    {
Packit b099d7
        printf("fontlist cache is empty\n");
Packit b099d7
        return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    for (cache = _fontlist_cache; cache; cache = FontCacheNext(cache))
Packit b099d7
    {
Packit b099d7
        printf("cache pointer:   %p\n", cache);
Packit b099d7
        _Xm_dump_fontlist(FontCacheFontList(cache));
Packit b099d7
        printf("refcount:      %d\n", FontCacheRefCount(cache));
Packit b099d7
        printf("next:          %p\n\n", FontCacheNext(cache));
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
#endif /* _XmDEBUG_XMSTRING */