Blame lib/Xm/FontS.c

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
#define dbg() fprintf(stderr, "file: %s - XtWidgetToApplicationContext() on line: %d\n", __FILE__, __LINE__);
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <ctype.h>
Packit b099d7
#include <stdlib.h>
Packit b099d7
#include <string.h>		/* May have to be strings.h on some systems. */
Packit b099d7
Packit b099d7
#include <Xm/Xm.h>
Packit b099d7
#include <Xm/FontSP.h>
Packit b099d7
#include <Xm/Label.h>
Packit b099d7
#include <Xm/PushB.h>
Packit b099d7
#include <Xm/RowColumn.h>
Packit b099d7
#include <Xm/TextF.h>
Packit b099d7
#include <Xm/Text.h>
Packit b099d7
#include <Xm/ToggleB.h>
Packit b099d7
#include <Xm/MenuShell.h>
Packit b099d7
#include <Xm/DropDown.h>
Packit b099d7
#include <Xm/ButtonBox.h>
Packit b099d7
#include <Xm/ExtP.h>
Packit b099d7
#include "Xm/XmI.h"
Packit b099d7
Packit b099d7
#define NUM_XLFD_DASHES 14
Packit b099d7
/* max number of fonts that can be returned (CARD16) */
Packit b099d7
#define TRY_FONTS 	(unsigned int) 65535
Packit b099d7
Packit b099d7
#define NUM_BUTTONS	30	/* The MAX number of encoding buttons. */
Packit b099d7
Packit b099d7
#define ANY_FAMILY	0	/* Don't change this, without fixing */
Packit b099d7
				/* ProcessXldfFontData */
Packit b099d7
Packit b099d7
#define GET_FONT_SIZE BUFSIZ
Packit b099d7
Packit b099d7
#define ALLOC_INC 		100
Packit b099d7
#define FAMILY_INC 		10
Packit b099d7
#define WIDGET_LIST_INC 	10
Packit b099d7
Packit b099d7
#define POINT_DIVIDE		10
Packit b099d7
Packit b099d7
#define DEFAULT_WEIGHT  	("medium")
Packit b099d7
#define BOLD_WEIGHT     	("bold")
Packit b099d7
#define DEFAULT_SLANT   	("r")
Packit b099d7
#define ITALIC_SLANT    	("i")
Packit b099d7
#define DEFAULT_FIXED_SPACING   ("c")
Packit b099d7
#define OTHER_FIXED_SPACING 	("m")
Packit b099d7
#define PROPORTIONAL_SPACING  	("p")
Packit b099d7
Packit b099d7
#define STAR_STRING	("*")
Packit b099d7
#define ANY_ENCODING	("*-*")
Packit b099d7
Packit b099d7
#define FAMILY_COLUMNS    20
Packit b099d7
#define VISIBILE_FAMILIES  11
Packit b099d7
Packit b099d7
static short GValidSizes[] = {
Packit b099d7
    2, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,22,23,24,26,28,36,48,72
Packit b099d7
};
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * A font may only be scaled in one resolution, not all resolutions. 
Packit b099d7
 */
Packit b099d7
Packit b099d7
#define IsScaled(fsw, fam) (XmFontS_use_scaling((fsw)) &&                     \
Packit b099d7
			    ((CheckFlag(XmFontS_user_state((fsw)), DPI_75) && \
Packit b099d7
			      CheckFlag((fam)->state, SCALED_75))          || \
Packit b099d7
			     (CheckFlag(XmFontS_user_state((fsw)), DPI_100)&& \
Packit b099d7
			      CheckFlag((fam)->state, SCALED_100))))
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *       GLOBAL DECLARATIONS
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *     Private functions - for creating children widgets.
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
static void CreateChildren(XmFontSelectorWidget, ArgList, Cardinal);
Packit b099d7
static void CreateTopWidgets(XmFontSelectorWidget, Widget, ArgList, Cardinal);
Packit b099d7
static void CreateMiddleArea(XmFontSelectorWidget, ArgList, Cardinal);
Packit b099d7
static void CreateSpacingBox(XmFontSelectorWidget, Widget, ArgList, Cardinal);
Packit b099d7
static void CreateFontChoiceBox(XmFontSelectorWidget, Widget,ArgList,Cardinal);
Packit b099d7
static void CreateResolutionBox(XmFontSelectorWidget, Widget,ArgList,Cardinal);
Packit b099d7
static void CreateFamilyBox(XmFontSelectorWidget, Widget, ArgList, Cardinal);
Packit b099d7
static void CreateSizesBox(XmFontSelectorWidget, Widget, ArgList, Cardinal);
Packit b099d7
static void CreateBoldItalicBox(XmFontSelectorWidget,Widget,ArgList, Cardinal);
Packit b099d7
static void CreateOtherChoiceBox(XmFontSelectorWidget,
Packit b099d7
				 Widget, ArgList, Cardinal);
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *     Private functions. 
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
static void LoadFontData(Widget, FontData **, int *, String **, int *);
Packit b099d7
static void ProcessXlfdFontData(XmFontSelectorWidget, 
Packit b099d7
				FontInfo *, FontData *, int);
Packit b099d7
static void SortOtherFontData(FontInfo *, String *, int);
Packit b099d7
static void AddToOtherList(char *, String **, int *, int *);
Packit b099d7
static void SetNonStringData(FontData *), SetFlag(Flag *, Flag, Boolean);
Packit b099d7
static void StoreString(register String, register String, register int);
Packit b099d7
static void SetLongFlag(LongFlag *, LongFlag, Boolean);
Packit b099d7
static void UpdateExistingFamily(FamilyInfo *, FontData *);
Packit b099d7
static void FillNewFamily(FamilyInfo *, FontData *);
Packit b099d7
static void SetResolution(XmFontSelectorWidget, FontData *);
Packit b099d7
static void DisplayCurrentFont(XmFontSelectorWidget, String);
Packit b099d7
static void UpdateBoldItalic(XmFontSelectorWidget);
Packit b099d7
static void UpdateFixedProportional(XmFontSelectorWidget);
Packit b099d7
static void UpdateFamilies(XmFontSelectorWidget);
Packit b099d7
static void UpdateSizes(XmFontSelectorWidget);
Packit b099d7
static void SetComboValue(Widget, String), UnsetSiblings(Widget);
Packit b099d7
static void DisplayUserError(XmFontSelectorWidget, String);
Packit b099d7
static void SetDisplayedFont(XmFontSelectorWidget, String);
Packit b099d7
static void AddToXlfdOnlyList(XmFontSelectorWidget, Widget);
Packit b099d7
static void AddToXlfdSensitiveList(XmFontSelectorWidget, Widget);
Packit b099d7
static void ChangeMode(XmFontSelectorWidget, Boolean, Boolean);
Packit b099d7
static void SetOtherList(XmFontSelectorWidget, Boolean);
Packit b099d7
static void AddToXlfdList(XmFontSelectorWidget, 
Packit b099d7
			  char *, FontData **, int *, int *);
Packit b099d7
Packit b099d7
static Widget CreateEncodingMenu(XmFontSelectorWidget, 
Packit b099d7
				 Widget, ArgList, Cardinal);
Packit b099d7
Packit b099d7
static FontInfo * LoadFontInfo(XmFontSelectorWidget);
Packit b099d7
Packit b099d7
static int FindResolution(Widget), CmpStrings(const void *, const void *);
Packit b099d7
Packit b099d7
static Boolean CheckFlag(Flag, Flag), CheckLongFlag(LongFlag, LongFlag);
Packit b099d7
static Boolean FillData(XmFontSelectorWidget, FontData *, char *);
Packit b099d7
static Boolean IsXlfdFont(register char *);
Packit b099d7
static Boolean CheckEncoding(XmFontSelectorWidget, FamilyInfo *);
Packit b099d7
Packit b099d7
static FamilyInfo *FindFamily(register XrmQuark, FamilyInfo *, int);
Packit b099d7
Packit b099d7
static String BuildFontString(XmFontSelectorWidget, FontData *, String, int);
Packit b099d7
Packit b099d7
static LongFlag SizeMapping(short);
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *  Callbacks
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
static void ToggleMiddlePane(Widget, XtPointer, XtPointer);
Packit b099d7
static void ToggleNameWindow(Widget, XtPointer, XtPointer);
Packit b099d7
static void FamilyChanged(Widget, XtPointer, XtPointer);
Packit b099d7
static void SizeChanged(Widget, XtPointer, XtPointer);
Packit b099d7
static void ChangeEncoding(Widget, XtPointer, XtPointer);
Packit b099d7
static void ToggleScaling(Widget, XtPointer, XtPointer);
Packit b099d7
static void ToggleBold(Widget, XtPointer, XtPointer);
Packit b099d7
static void ToggleItalic(Widget, XtPointer, XtPointer);
Packit b099d7
static void Toggle75DPI(Widget, XtPointer, XtPointer);
Packit b099d7
static void Toggle100DPI(Widget, XtPointer, XtPointer);
Packit b099d7
static void ToggleBothDPI(Widget, XtPointer, XtPointer);
Packit b099d7
static void ToggleProportional(Widget, XtPointer, XtPointer);
Packit b099d7
static void ToggleFixed(Widget, XtPointer, XtPointer);
Packit b099d7
static void ToggleBothSpacing(Widget, XtPointer, XtPointer);
Packit b099d7
static void XlfdMode(Widget, XtPointer, XtPointer);
Packit b099d7
static void OtherMode(Widget, XtPointer, XtPointer);
Packit b099d7
static void RemoveUserError(Widget, XtPointer, XtPointer);
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *  Semi-Public functions
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *);
Packit b099d7
static void GetValuesHook(Widget, ArgList, Cardinal *);
Packit b099d7
Packit b099d7
static void Destroy(Widget);
Packit b099d7
static void Initialize(Widget, Widget, ArgList, Cardinal*);
Packit b099d7
static void ClassPartInitialize(WidgetClass w_class);
Packit b099d7
static void ClassInitialize();
Packit b099d7
Packit b099d7
/*  Resource definitions for Subclasses of Primitive */
Packit b099d7
Packit b099d7
#define SAMPLE \
Packit b099d7
("abcdefghijklmonpqrstuvwxyz\n\
Packit b099d7
ABCDEFGHIJKLMONPQRSTUVWXYZ\n\
Packit b099d7
1234567890\n!@#$%^&*()")
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *       STATIC DECLARATIONS
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * This table is the list of resolutions of fonts that are supported.
Packit b099d7
 * most machines have only 75 and 100 dpi fonts, so we only find which
Packit b099d7
 * of those we are closest to with FindResolution().
Packit b099d7
 */
Packit b099d7
Packit b099d7
static int resolutions[] = { 75, 100 };
Packit b099d7
Packit b099d7
static XtResource resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNspacing, XmCSpacing, XmRVerticalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedRec, paned.internal_bw),
Packit b099d7
    XmRImmediate, (XtPointer) 2
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNseparatorOn, XmCSeparatorOn, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmPanedRec, paned.separator_on),
Packit b099d7
    XmRImmediate, (XtPointer) True
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmarginHeight, XmCMargin, XmRVerticalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedRec, paned.margin_height),
Packit b099d7
    XmRImmediate, (XtPointer) 0
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNcurrentFont, XmCString, XmRString,
Packit b099d7
    sizeof(String), XtOffsetOf(XmFontSelectorRec, fs.current_font),
Packit b099d7
    XmRImmediate, (XtPointer)NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNshowFontName, XmCBoolean, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmFontSelectorRec, fs.show_font_name),
Packit b099d7
    XmRImmediate, (XtPointer) False
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNuseScaling, XmCBoolean, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmFontSelectorRec, fs.use_scaling),
Packit b099d7
    XmRImmediate, (XtPointer) True
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNtextRows, XmCTextRows, XmRDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmFontSelectorRec, fs.text_rows),
Packit b099d7
    XmRImmediate, (XtPointer) 8
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNvalueChangedCallback, XmCCallback, XmRCallback,
Packit b099d7
    sizeof(XtCallbackList), XtOffsetOf(XmFontSelectorRec, fs.font_changed_callback),
Packit b099d7
    XmRImmediate, (XtPointer) NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsampleText, XmCSampleText, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.sample_text),
Packit b099d7
    XmRString, (XtPointer) SAMPLE
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNanyString, XmCAnyString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.any),
Packit b099d7
    XmRString, (XtPointer) "Any"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNanyLowerString, XmCAnyLowerString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.lower_any),
Packit b099d7
    XmRString, (XtPointer) "any"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNfamilyString, XmCFamilyString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.family),
Packit b099d7
    XmRString, (XtPointer) "Family"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsizeString, XmCSizeString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.size),
Packit b099d7
    XmRString, (XtPointer) "Size"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNboldString, XmCBoldString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.bold),
Packit b099d7
    XmRString, (XtPointer) "Bold"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNitalicString, XmCItalicString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.italic),
Packit b099d7
    XmRString, (XtPointer) "Italic"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
      XmNoptionString, XmCOptionString, XmRXmString,
Packit b099d7
      sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.option),
Packit b099d7
      XmRString, (XtPointer) "Options..."
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNbothString, XmCBothString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.both),
Packit b099d7
    XmRString, (XtPointer) "Both"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmonoSpaceString, XmCMonoSpaceString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.mono_space),
Packit b099d7
    XmRString, (XtPointer) "Fixed Width Fonts"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNpropSpaceString, XmCPropSpaceString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.prop_space),
Packit b099d7
    XmRString, (XtPointer) "Proportional Fonts"
Packit b099d7
  },
Packit b099d7
  
Packit b099d7
  {
Packit b099d7
    XmNotherString, XmCOtherString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.other_font),
Packit b099d7
    XmRString, (XtPointer) "Other Fonts"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNxlfdString, XmCXlfdSpaceString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.xlfd),
Packit b099d7
    XmRString, (XtPointer) "Xlfd Fonts"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmN75DPIstring, XmC75DPIString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.dpi_75),
Packit b099d7
    XmRString, (XtPointer) "75 dpi"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmN100DPIstring, XmC100DPIString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.dpi_100),
Packit b099d7
    XmRString, (XtPointer) "100 dpi"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNscalingString, XmCScalingString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.scaling),
Packit b099d7
    XmRString, (XtPointer) "Use Font Scaling"
Packit b099d7
    },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNshowNameString, XmCShowNameString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.show_name),
Packit b099d7
    XmRString, (XtPointer) "Show Font Name"
Packit b099d7
  },
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Stuff to set the valid charset/encoding pairs.
Packit b099d7
     */
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNencodingString, XmCEncodingString, XmRXmString,
Packit b099d7
    sizeof(XmString), XtOffsetOf(XmFontSelectorRec, fs.strings.encoding_only),
Packit b099d7
    XmRString, (XtPointer) "Encoding"
Packit b099d7
  },
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * NOTE: This resource value must end in a comma because the resource
Packit b099d7
     *       converter is broken in Motif1.1.4.
Packit b099d7
     */
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNencodingList, XmCEncodingList, XmRStringTable,
Packit b099d7
    sizeof(String *), XtOffsetOf(XmFontSelectorRec, fs.strings.encoding_list),
Packit b099d7
    XmRString, (XtPointer) "iso8859-1,"
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNdefaultEncodingString, XmCDefaultEncodingString, XmRString,
Packit b099d7
    sizeof(String), XtOffsetOf(XmFontSelectorRec, fs.encoding), 
Packit b099d7
    XmRString, (XtPointer) "iso8859-1"
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XmSyntheticResource syn_resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNspacing, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedRec, paned.internal_bw),
Packit b099d7
    _XmFromPanedPixels, (XmImportProc) _XmToPanedPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmarginHeight, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedRec, paned.margin_height),
Packit b099d7
    XmeFromVerticalPixels, (XmImportProc) XmeToVerticalPixels
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XtResource subresources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNshowSash, XmCShowSash, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmPanedConstraintsRec, paned.show_sash),
Packit b099d7
    XmRImmediate, (XtPointer) False
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
#define SuperClass ((ConstraintWidgetClass) &xmPanedClassRec)
Packit b099d7
Packit b099d7
XmFontSelectorClassRec xmFontSelectorClassRec = {
Packit b099d7
   {
Packit b099d7
/* core class fields */
Packit b099d7
    /* superclass         */   (WidgetClass) SuperClass,
Packit b099d7
    /* class name         */   "XmFontSelector",
Packit b099d7
    /* size               */   sizeof(XmFontSelectorRec),
Packit b099d7
    /* class_initialize   */   ClassInitialize,
Packit b099d7
    /* class_part init    */   ClassPartInitialize,
Packit b099d7
    /* class_inited       */   FALSE,
Packit b099d7
    /* initialize         */   Initialize,
Packit b099d7
    /* initialize_hook    */   NULL,
Packit b099d7
    /* realize            */   XtInheritRealize,
Packit b099d7
    /* actions            */   NULL,
Packit b099d7
    /* num_actions        */   0,
Packit b099d7
    /* resources          */   (XtResourceList)resources,
Packit b099d7
    /* resource_count     */   XtNumber(resources),
Packit b099d7
    /* xrm_class          */   NULLQUARK,
Packit b099d7
    /* compress_motion    */   TRUE,
Packit b099d7
    /* compress_exposure  */   TRUE,
Packit b099d7
    /* compress_enterleave*/   TRUE,
Packit b099d7
    /* visible_interest   */   FALSE,
Packit b099d7
    /* destroy            */   Destroy,
Packit b099d7
    /* resize             */   XtInheritResize,
Packit b099d7
    /* expose             */   NULL,
Packit b099d7
    /* set_values         */   SetValues,
Packit b099d7
    /* set_values_hook    */   NULL,
Packit b099d7
    /* set_values_almost  */   XtInheritSetValuesAlmost,
Packit b099d7
    /* get_values_hook    */   GetValuesHook, 
Packit b099d7
    /* accept_focus       */   NULL,
Packit b099d7
    /* version            */   XtVersion,
Packit b099d7
    /* callback_private   */   NULL,
Packit b099d7
    /* tm_table           */   XtInheritTranslations,
Packit b099d7
    /* query_geometry	  */   XtInheritQueryGeometry,
Packit b099d7
    /* display_accelerator*/   XtInheritDisplayAccelerator,
Packit b099d7
    /* extension          */   NULL
Packit b099d7
   }, {
Packit b099d7
/* composite class fields */
Packit b099d7
    /* geometry_manager   */   XtInheritGeometryManager,
Packit b099d7
    /* change_managed     */   XtInheritChangeManaged,
Packit b099d7
    /* insert_child       */   XtInheritInsertChild,
Packit b099d7
    /* delete_child       */   XtInheritDeleteChild,
Packit b099d7
    /* extension          */   NULL
Packit b099d7
   }, {
Packit b099d7
/* constraint class fields */
Packit b099d7
    /* subresources       */   subresources,
Packit b099d7
    /* subresource_count  */   XtNumber(subresources),
Packit b099d7
    /* constraint_size    */   sizeof(XmFontSelectorConstraintsRec),
Packit b099d7
    /* initialize         */   NULL,
Packit b099d7
    /* destroy            */   NULL,
Packit b099d7
    /* set_values         */   NULL,
Packit b099d7
    /* extension          */   NULL
Packit b099d7
   }, {
Packit b099d7
/* manager_class fields   */
Packit b099d7
      XtInheritTranslations,                    /* translations           */
Packit b099d7
      syn_resources,	                        /* get resources          */
Packit b099d7
      XtNumber(syn_resources),    		/* num get_resources      */
Packit b099d7
      NULL,                			/* get_cont_resources     */
Packit b099d7
      0,				        /* num_get_cont_resources */
Packit b099d7
      XmInheritParentProcess,                   /* parent_process         */
Packit b099d7
      NULL,                                     /* extension              */
Packit b099d7
  }, {
Packit b099d7
      /* paned_class fields */
Packit b099d7
      NULL,                                     /* extension                 */
Packit b099d7
  }, {
Packit b099d7
      /* font selector class fields */
Packit b099d7
      NULL,                                     /* extension                 */
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
WidgetClass xmFontSelectorWidgetClass = (WidgetClass) &xmFontSelectorClassRec;
Packit b099d7
Packit b099d7
/***********************************************************
Packit b099d7
 *
Packit b099d7
 * Private Functions.
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*	Function Name: LoadFontInfo
Packit b099d7
 *	Description: Loads the font information from the current screen.
Packit b099d7
 *	Arguments: fsw - the font selector widget.
Packit b099d7
 *	Returns: the font information.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static FontInfo *
Packit b099d7
LoadFontInfo(XmFontSelectorWidget fsw)
Packit b099d7
{
Packit b099d7
    FontInfo *font_info = (FontInfo *) XtMalloc(sizeof(FontInfo));
Packit b099d7
    FontData *xlfd_font_data;
Packit b099d7
    String *other_fonts;
Packit b099d7
    int xlfd_num_fonts, other_num_fonts;
Packit b099d7
Packit b099d7
    font_info->resolution = FindResolution((Widget) fsw);
Packit b099d7
    LoadFontData((Widget) fsw, &xlfd_font_data, &xlfd_num_fonts,
Packit b099d7
		 &other_fonts, &other_num_fonts);
Packit b099d7
Packit b099d7
    ProcessXlfdFontData(fsw, font_info, xlfd_font_data, xlfd_num_fonts);
Packit b099d7
    SortOtherFontData(font_info, other_fonts, other_num_fonts);
Packit b099d7
Packit b099d7
    return(font_info);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: LoadFontData
Packit b099d7
 *	Description: Loads the font data from the X Server, sorts it into
Packit b099d7
 *                   xlfd and non xlfd fonts, and sorts out the xlfd info.
Packit b099d7
 *	Arguments: w - any widget on the screen.
Packit b099d7
 * RETURNED        xlfd_data, num_xlfd - The xlfd font data.
Packit b099d7
 * RETURNED        other_fonts, num_other - The list of non xlfd fonts.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
LoadFontData(Widget w, FontData **xlfd_data, int *num_xlfd,
Packit b099d7
	     String **other_fonts, int *num_other)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) w;
Packit b099d7
    char ** fonts, **ptr;
Packit b099d7
    int i, num, xlfd_alloc, other_alloc;
Packit b099d7
Packit b099d7
    *xlfd_data = NULL;
Packit b099d7
    *other_fonts = NULL;
Packit b099d7
    *num_xlfd = *num_other = xlfd_alloc = other_alloc = 0;
Packit b099d7
Packit b099d7
    fonts = XListFonts(XtDisplay(w), "*", TRY_FONTS, &num);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Loop the all the fonts and add each one to the proper list.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (fonts != NULL)  {
Packit b099d7
	for (ptr = fonts, i = 0; i < num; i++, ptr++) {
Packit b099d7
	    if (IsXlfdFont(*ptr)) 
Packit b099d7
		AddToXlfdList(fsw, *ptr, xlfd_data, num_xlfd, &xlfd_alloc);
Packit b099d7
	    else 
Packit b099d7
		AddToOtherList(*ptr, other_fonts, num_other, &other_alloc);
Packit b099d7
	}
Packit b099d7
	XFreeFontNames(fonts);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ProcessXlfdFontData
Packit b099d7
 *	Description: Processes the Xlfd data, to come up with lists
Packit b099d7
 *                   of various attributes.
Packit b099d7
 *	Arguments: fsw - The Font Selector Widget.
Packit b099d7
 *                 font_info - the font information structure.
Packit b099d7
 *                 data, num - the xlfd data.
Packit b099d7
 *	Returns: none.
Packit b099d7
 *
Packit b099d7
 * This takes the raw XLFD data and builds lists of families and
Packit b099d7
 * sizes, and stores all the information in the font_info structure.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ProcessXlfdFontData(XmFontSelectorWidget fsw,
Packit b099d7
		    FontInfo *font_info, FontData *data, int num_data)
Packit b099d7
{
Packit b099d7
    int num, alloc, i;
Packit b099d7
    FamilyInfo *any_fam, *fam = NULL;
Packit b099d7
    FontData *top = data;
Packit b099d7
    String temp;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Leave space for the any family, filled in at the end of the function.
Packit b099d7
     * 
Packit b099d7
     * NOTE:  This assumes that (ANY_FAMILY == 0)
Packit b099d7
     */
Packit b099d7
Packit b099d7
    num = 1;		
Packit b099d7
    alloc = FAMILY_INC;
Packit b099d7
    fam = (FamilyInfo *) XtMalloc(sizeof(FamilyInfo) * alloc);
Packit b099d7
    fam->nameq = NULLQUARK;	/* Don't use this family yet. */
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set up the "Any" family.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    for (i = 0; i < num_data; i++, data++) {
Packit b099d7
	register FamilyInfo *cur_family = FindFamily(data->familyq, fam, num);
Packit b099d7
	
Packit b099d7
	if (cur_family == NULL) {
Packit b099d7
	    if ( num >= alloc ) {
Packit b099d7
		alloc += FAMILY_INC;
Packit b099d7
		fam = (FamilyInfo *) XtRealloc((XtPointer) fam,
Packit b099d7
					       sizeof(FamilyInfo) * alloc);
Packit b099d7
	    }
Packit b099d7
	    
Packit b099d7
	    FillNewFamily(fam + num, data);
Packit b099d7
	    num++;
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    UpdateExistingFamily(cur_family, data);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    font_info->family_info = fam;
Packit b099d7
    font_info->num_families = num;
Packit b099d7
Packit b099d7
    any_fam = fam + ANY_FAMILY;
Packit b099d7
    temp = _XmGetMBStringFromXmString(ANY_STRING(fsw));
Packit b099d7
    any_fam->nameq = XrmStringToQuark(temp);
Packit b099d7
    XtFree(temp);
Packit b099d7
    any_fam->bold_nameq = XrmStringToQuark(BOLD_WEIGHT);
Packit b099d7
    any_fam->medium_nameq = XrmStringToQuark(DEFAULT_WEIGHT);
Packit b099d7
    any_fam->upright_nameq = XrmStringToQuark(DEFAULT_SLANT);
Packit b099d7
    any_fam->italic_nameq = XrmStringToQuark(ITALIC_SLANT);
Packit b099d7
    strcpy(any_fam->fixed_spacing, DEFAULT_FIXED_SPACING);
Packit b099d7
Packit b099d7
    any_fam->state = (Flag) 0;
Packit b099d7
    any_fam->sizes_75 = any_fam->sizes_100 = (LongFlag) 0;
Packit b099d7
    for (i = 1, fam++; i < num; i++, fam++) { 
Packit b099d7
	any_fam->sizes_75 |= fam->sizes_75;
Packit b099d7
	any_fam->sizes_100 |= fam->sizes_100;
Packit b099d7
	any_fam->state |= fam->state;
Packit b099d7
    }
Packit b099d7
    any_fam->encodings = NULL;
Packit b099d7
    any_fam->encoding_alloc = 0;
Packit b099d7
Packit b099d7
    XtFree((XtPointer) top);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: SortOtherFonts
Packit b099d7
 *	Description: Sorts the list of other fonts alphabetically
Packit b099d7
 *                   and stuffs them into the font data structure.
Packit b099d7
 *	Arguments: font_info - the font information.
Packit b099d7
 *                 list, num - the list of fonts.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
SortOtherFontData(FontInfo *font_info, String *list, int num)
Packit b099d7
{
Packit b099d7
    register int i = 0;
Packit b099d7
Packit b099d7
    qsort((void *) list, num, sizeof(String), CmpStrings);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Remove duplicates.
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    while (i < (num - 1)) {
Packit b099d7
	if (streq(list[i], list[i+1])) {
Packit b099d7
	    register int j;
Packit b099d7
	    register String *ptr;
Packit b099d7
	    
Packit b099d7
	    XtFree((char*)list[i]);
Packit b099d7
	    ptr = list + i;
Packit b099d7
	    j = i;
Packit b099d7
	    
Packit b099d7
	    while ( ++j < num) {
Packit b099d7
		ptr[0] = ptr[1];
Packit b099d7
		ptr++;
Packit b099d7
	    }
Packit b099d7
	    
Packit b099d7
	    num--;	/*Something has been removed, decrement count*/
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	    i++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    font_info->others = list;
Packit b099d7
    font_info->num_others = num;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CmpStrings
Packit b099d7
 *	Description: Compares two strings.
Packit b099d7
 *	Arguments: p1, p2 - two string pointers.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static int
Packit b099d7
CmpStrings(const void * p1, const void *p2)
Packit b099d7
{
Packit b099d7
    String *s1 = (String *) p1;
Packit b099d7
    String *s2 = (String *) p2;
Packit b099d7
Packit b099d7
    return(strcmp(*s1, *s2));
Packit b099d7
}
Packit b099d7
 
Packit b099d7
/*	Function Name: FindResolution
Packit b099d7
 *	Description: Finds the closest resolution
Packit b099d7
 *	Arguments: w - any widget on the proper screen.
Packit b099d7
 *	Returns: the closest allowable resolution to the real resolution.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static int
Packit b099d7
FindResolution(Widget w)
Packit b099d7
{
Packit b099d7
    Screen *screen = XtScreen(w);
Packit b099d7
    register int i, xres, yres, min, pref;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * there are 2.54 centimeters to an inch; so there are 25.4 millimeters.
Packit b099d7
     *
Packit b099d7
     *     dpi = N pixels / (M millimeters / (25.4 millimeters / 1 inch))
Packit b099d7
     *         = N pixels / (M inch / 25.4)
Packit b099d7
     *         = N * 25.4 pixels / M inch
Packit b099d7
     *
Packit b099d7
     *         Or in integer arithmitic
Packit b099d7
     *
Packit b099d7
     *         = (254 * N pixels / M inch + 5) / 10
Packit b099d7
     */
Packit b099d7
Packit b099d7
    /* This will get us the true pixels / inch.  That is probably
Packit b099d7
       not what we want */
Packit b099d7
Packit b099d7
    xres = (254 * WidthOfScreen(screen) / WidthMMOfScreen(screen) + 5) / 10;
Packit b099d7
    yres = (254 * HeightOfScreen(screen) / HeightMMOfScreen(screen) + 5) / 10;
Packit b099d7
Packit b099d7
    xres *= xres;
Packit b099d7
    yres *= yres;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Find the closest resolution by using a difference of squares.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    min = 32000;
Packit b099d7
    pref = resolutions[0];	/* We have to have some default. */
Packit b099d7
Packit b099d7
    for (i = 0; i < XtNumber(resolutions); i++) {
Packit b099d7
	int diffx = (xres - resolutions[i] * resolutions[i]);
Packit b099d7
	int diffy = (yres - resolutions[i] * resolutions[i]);
Packit b099d7
	int tdiff;		/* the total difference. */
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Square 'em.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	tdiff = (diffx * diffx) + (diffy * diffy);
Packit b099d7
	if (min > tdiff) {
Packit b099d7
	    pref = resolutions[i];
Packit b099d7
	    min = tdiff;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return(pref);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: IsXlfdFont
Packit b099d7
 *	Description: Returns True if this is an LXFD font.
Packit b099d7
 *	Arguments: str - the font name to check.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
IsXlfdFont(register char * str)
Packit b099d7
{
Packit b099d7
    register int num_dashes = 0;
Packit b099d7
    register char c;
Packit b099d7
    
Packit b099d7
    for ( ; (c = *str) != '\0'; str++) {
Packit b099d7
	if (c == '-')
Packit b099d7
	    num_dashes++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return(num_dashes == NUM_XLFD_DASHES);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: AddToXlfdList
Packit b099d7
 *	Description: Adds a font to the list of xlfd fonts.
Packit b099d7
 *	Arguments: name - name of the font.
Packit b099d7
 *                 list, num - the list of xlfd fonts to add it to.
Packit b099d7
 *                 alloc - the number of allocated slots.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
AddToXlfdList(XmFontSelectorWidget fsw,
Packit b099d7
	      char *name, FontData **list, int *num, int *alloc)
Packit b099d7
{
Packit b099d7
    FontData *current;
Packit b099d7
    if (*num >= *alloc) {
Packit b099d7
	*alloc += ALLOC_INC;
Packit b099d7
	*list = (FontData *) XtRealloc((XtPointer) *list, 
Packit b099d7
				       sizeof(FontData) * *alloc);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    current = (*list) + *num;
Packit b099d7
Packit b099d7
    /* 
Packit b099d7
     * If filling the data succeeded, then accept this name, otherwise
Packit b099d7
     * just ignore it. 
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (FillData(fsw, current, name)) 
Packit b099d7
	(*num)++;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: AddToOtherList
Packit b099d7
 *	Description: Adds a font to the list of other fonts.
Packit b099d7
 *	Arguments: name - name of the font.
Packit b099d7
 *                 list, num - the list of other fonts to add it to.
Packit b099d7
 *                 alloc - the number of allocated slots.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
AddToOtherList(char *name, String **list, int *num, int *alloc)
Packit b099d7
{
Packit b099d7
    if (*num >= *alloc) {
Packit b099d7
	*alloc += ALLOC_INC;
Packit b099d7
	*list = (String *) XtRealloc((XtPointer) *list, 
Packit b099d7
				     sizeof(String) * *alloc);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    (*list)[(*num)++] = XtNewString(name);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: FillData(fsw, current, name); 
Packit b099d7
 *	Description: Fills the current font data from an xlfd name.
Packit b099d7
 *	Arguments: fsw - The font selector widget.
Packit b099d7
 *                 current - the font data structure to fill.
Packit b099d7
 *                 name - an xlfd name of a font.
Packit b099d7
 *	Returns: False on failure.
Packit b099d7
 * 
Packit b099d7
 * This name may have NOT *'s in it.
Packit b099d7
 */
Packit b099d7
Packit b099d7
#define GET_NEXT_FIELD(ptr)                             \
Packit b099d7
     if (((ptr) = (char *) strchr((ptr), '-')) == NULL) \
Packit b099d7
	 return(False);                                 \
Packit b099d7
     (ptr)++	/* skip hyphen */                       \
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
FillData(XmFontSelectorWidget fsw, FontData *current, char *name)
Packit b099d7
{
Packit b099d7
    char *ptr = name;
Packit b099d7
    char temp[BUFSIZ];
Packit b099d7
Packit b099d7
    current->state = 0;		/* Initialize value. */
Packit b099d7
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Foundry */
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Family */
Packit b099d7
    StoreString(ptr, temp, BUFSIZ - 1);
Packit b099d7
Packit b099d7
    if (streq(temp, STAR_STRING)) { 
Packit b099d7
	String str = _XmGetMBStringFromXmString(ANY_STRING(fsw));
Packit b099d7
	strcpy(temp, str);
Packit b099d7
	XtFree((XtPointer) str);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    current->familyq = XrmStringToQuark(temp);
Packit b099d7
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Weight */
Packit b099d7
    StoreString(ptr, temp, BUFSIZ - 1);
Packit b099d7
    current->weightq = XrmStringToQuark(temp);
Packit b099d7
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Slant */
Packit b099d7
    StoreString(ptr, current->slant, SLANT_LEN);
Packit b099d7
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == SetWidth_Name */
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Add_Style_Name */
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Pixel Size */
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Point Size */
Packit b099d7
    StoreString(ptr, temp, BUFSIZ - 1);
Packit b099d7
    /*
Packit b099d7
     * the string '*' will default to 0 which is exactly what I want.
Packit b099d7
     */
Packit b099d7
    current->point_size = (short) atoi(temp);
Packit b099d7
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Resolution X */
Packit b099d7
    StoreString(ptr, temp, BUFSIZ - 1);
Packit b099d7
    /*
Packit b099d7
     * the string '*' will default to 0 which is exactly what I want.
Packit b099d7
     */
Packit b099d7
    current->resolution_x = (short) atoi(temp);
Packit b099d7
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Resolution Y */
Packit b099d7
    StoreString(ptr, temp, BUFSIZ - 1);
Packit b099d7
    /*
Packit b099d7
     * the string '*' will default to 0 which is exactly what I want.
Packit b099d7
     */
Packit b099d7
    current->resolution_y = (short) atoi(temp);
Packit b099d7
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Spacing */
Packit b099d7
    StoreString(ptr, current->spacing, SPACING_LEN);
Packit b099d7
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Average Width */
Packit b099d7
    GET_NEXT_FIELD(ptr);	/* ptr == Registry and Encoding */
Packit b099d7
Packit b099d7
    current->encoding = XrmStringToQuark(ptr);
Packit b099d7
Packit b099d7
    SetNonStringData(current);
Packit b099d7
    return(True);		/* success! */
Packit b099d7
}
Packit b099d7
Packit b099d7
#undef GET_NEXT_FIELD
Packit b099d7
Packit b099d7
/*	Function Name: SetNonStringData
Packit b099d7
 *	Description: Sets the non string part of the Font Data.
Packit b099d7
 *	Arguments: current - the font data we are working with.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
SetNonStringData(FontData *current)
Packit b099d7
{
Packit b099d7
    char lower[BUFSIZ];
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now fill in the non string fields.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If the weight_name field contains the words "bold" or "demi"
Packit b099d7
     * then this is a bold font.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    XmCopyISOLatin1Lowered(lower, XrmQuarkToString(current->weightq));
Packit b099d7
    if ((strstr(lower, "bold") != NULL) || (strstr(lower, "demi") != NULL))
Packit b099d7
    	SetFlag(&(current->state), BOLD, True);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If the spacing is "p" then proportional, otherwize monospaced.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    XmCopyISOLatin1Lowered(lower, current->spacing);
Packit b099d7
    if (strstr(lower, PROPORTIONAL_SPACING) != NULL)
Packit b099d7
    	SetFlag(&(current->state), PROPORTIONAL, True);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If the slant it "i" or "o" then this is an italic font.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    XmCopyISOLatin1Lowered(lower, current->slant);
Packit b099d7
    if ((strchr(lower, 'i') != NULL) || (strchr(lower, 'o') != NULL))
Packit b099d7
    	SetFlag(&(current->state), ITALIC, True);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If the point_size is 0 then this is a scalable font.
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    if (current->point_size == 0) {
Packit b099d7
	if ((current->resolution_x == 75) && (current->resolution_x == 75))
Packit b099d7
	    SetFlag(&(current->state), SCALED_75, True);
Packit b099d7
	else if((current->resolution_x == 100)&&(current->resolution_x == 100))
Packit b099d7
	    SetFlag(&(current->state), SCALED_100, True);
Packit b099d7
	else if ((current->resolution_x == 0)&& (current->resolution_x == 0)) {
Packit b099d7
	    /*
Packit b099d7
	     * Sun sets all scaled fonts to have a resolution of 0x0
Packit b099d7
	     */
Packit b099d7
	    SetFlag(&(current->state), SCALED_75 | SCALED_100, True);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    /*
Packit b099d7
     * Check to see if resolution matches 75 or 100 dpi.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((current->resolution_x == 75) && (current->resolution_x == 75))
Packit b099d7
	SetFlag(&(current->state), DPI_75, True);
Packit b099d7
    else if ((current->resolution_x == 100) && (current->resolution_x == 100))
Packit b099d7
	SetFlag(&(current->state), DPI_100, True);
Packit b099d7
    else if ((current->resolution_x == 0) && (current->resolution_x == 0)) {
Packit b099d7
	/*
Packit b099d7
	 * Sun sets all scaled fonts to have a resolution of 0x0
Packit b099d7
	 */
Packit b099d7
	SetFlag(&(current->state), DPI_75 | DPI_100, True);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: StoreString
Packit b099d7
 *	Description: Stores a portion of an xlfd name into the 
Packit b099d7
 *                   string varaible passed.
Packit b099d7
 *	Arguments: str - the portion of the string to store.
Packit b099d7
 *                 store - the string to store it in.
Packit b099d7
 *                 max_len - maximum length of the value.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
StoreString(register String str, register String store, register int max_len)
Packit b099d7
{
Packit b099d7
    register int i;
Packit b099d7
    register int c;
Packit b099d7
Packit b099d7
    for (i = 0; i < max_len; i++, str++, store++) {
Packit b099d7
	if (((c = *str) == '-') || (c == '\0'))
Packit b099d7
	    break;
Packit b099d7
	*store = c;
Packit b099d7
    }
Packit b099d7
    *store = '\0';
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CheckFlag
Packit b099d7
 *	Description: Checks to see if a flag value is set
Packit b099d7
 *	Arguments: state - the state variable containing the flag.
Packit b099d7
 *                 flag - the location of the flag.
Packit b099d7
 *	Returns: True if flag set, False otherwise
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
CheckFlag(Flag state, Flag flag)
Packit b099d7
{
Packit b099d7
    return((state & flag) == flag);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CheckLongFlag
Packit b099d7
 *	Description: Checks to see if a long flag value is set
Packit b099d7
 *	Arguments: state - the state variable containing the flag.
Packit b099d7
 *                 flag - the location of the flag.
Packit b099d7
 *	Returns: True if flag set, False otherwise
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
CheckLongFlag(LongFlag state, LongFlag flag)
Packit b099d7
{
Packit b099d7
    return((state & flag) == flag);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: SetFlag
Packit b099d7
 *	Description: Sets a flag value
Packit b099d7
 *	Arguments: state - the state variable containing the flag.
Packit b099d7
 *                 flag - the location of the flag.
Packit b099d7
 *                 value - the value of the flag.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
SetFlag(Flag *state, Flag flag, Boolean value)
Packit b099d7
{
Packit b099d7
    if (value) 
Packit b099d7
	*state |= flag;
Packit b099d7
    else 
Packit b099d7
	*state &= ~flag;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: SetLongFlag
Packit b099d7
 *	Description: Sets a flag value that is stored in a long
Packit b099d7
 *	Arguments: state - the state variable containing the flag.
Packit b099d7
 *                 flag - the location of the flag.
Packit b099d7
 *                 value - the value of the flag.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
SetLongFlag(LongFlag *state, LongFlag flag, Boolean value)
Packit b099d7
{
Packit b099d7
    if (value) 
Packit b099d7
	*state |= flag;
Packit b099d7
    else 
Packit b099d7
	*state &= ~flag;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: FindFamily
Packit b099d7
 *	Description: Finds family associated with the font passed.
Packit b099d7
 *	Arguments: font - the font data.
Packit b099d7
 *                 list - the list of all families
Packit b099d7
 *                 num - the number of families.
Packit b099d7
 *	Returns: a pointer to the family this font is in or NULL.
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
static FamilyInfo *
Packit b099d7
FindFamily(register XrmQuark nameq, FamilyInfo *list, int num)
Packit b099d7
{
Packit b099d7
    register int i;
Packit b099d7
Packit b099d7
    for (i = 0; i < num; i++, list++) {
Packit b099d7
	if (list->nameq == nameq)
Packit b099d7
	    return(list);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return(NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: UpdateExistingFamily
Packit b099d7
 *	Description: Updates data, by adding another font to an
Packit b099d7
 *                   existion family.
Packit b099d7
 *	Arguments: fam - the family to update.
Packit b099d7
 *                 font - the font to add.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
UpdateExistingFamily(FamilyInfo *fam, FontData *font)
Packit b099d7
{
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    if (CheckFlag(font->state, BOLD)) 
Packit b099d7
	fam->bold_nameq = font->weightq;
Packit b099d7
    else 
Packit b099d7
	fam->medium_nameq = font->weightq;
Packit b099d7
Packit b099d7
    if (CheckFlag(font->state, ITALIC)) 
Packit b099d7
	fam->italic_nameq = XrmStringToQuark(font->slant);
Packit b099d7
    else 
Packit b099d7
	fam->upright_nameq = XrmStringToQuark(font->slant);
Packit b099d7
Packit b099d7
    if (!streq(font->spacing, PROPORTIONAL_SPACING))
Packit b099d7
	strcpy(fam->fixed_spacing, font->spacing);
Packit b099d7
Packit b099d7
    if (font->point_size != 0) {
Packit b099d7
	if ((font->resolution_x == 75) && (font->resolution_x == 75))
Packit b099d7
	    SetLongFlag(&(fam->sizes_75), SizeMapping(font->point_size), True);
Packit b099d7
	else if ((font->resolution_x == 100) && (font->resolution_x == 100))
Packit b099d7
	    SetLongFlag(&(fam->sizes_100),SizeMapping(font->point_size), True);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    fam->state |= font->state;	/* or in all bits. */
Packit b099d7
Packit b099d7
    for (i = 0; TRUE; i++)
Packit b099d7
    {
Packit b099d7
	if (i == fam->encoding_alloc)
Packit b099d7
	{
Packit b099d7
	    fam->encoding_alloc += NUM_BUTTONS;
Packit b099d7
	    fam->encodings = 
Packit b099d7
		(XrmQuark *) XtRealloc((char *) fam->encodings, 
Packit b099d7
				       sizeof(XrmQuark) * fam->encoding_alloc);
Packit b099d7
	    memset((char *) (fam->encodings + i), 0, 
Packit b099d7
		   sizeof(XrmQuark) * NUM_BUTTONS);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (fam->encodings[i] == font->encoding)
Packit b099d7
	    return;
Packit b099d7
Packit b099d7
	if (fam->encodings[i] == 0)
Packit b099d7
	{
Packit b099d7
	    fam->encodings[i] = font->encoding;
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
	
Packit b099d7
/*	Function Name: FillNewFamily
Packit b099d7
 *	Description: Fills in the information for a new font family.
Packit b099d7
 *	Arguments: fam -  the family data.
Packit b099d7
 *                 font - the first font we found.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
FillNewFamily(FamilyInfo *fam, FontData *font)
Packit b099d7
{
Packit b099d7
    fam->nameq = font->familyq;
Packit b099d7
    
Packit b099d7
    if (CheckFlag(font->state, BOLD)) {
Packit b099d7
	fam->bold_nameq = font->weightq;
Packit b099d7
    	fam->medium_nameq = NULLQUARK;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
    	fam->bold_nameq = NULLQUARK;
Packit b099d7
	fam->medium_nameq = font->weightq;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (streq(font->spacing, PROPORTIONAL_SPACING))
Packit b099d7
	strcpy(fam->fixed_spacing, DEFAULT_FIXED_SPACING);
Packit b099d7
    else
Packit b099d7
	strcpy(fam->fixed_spacing, font->spacing);
Packit b099d7
    
Packit b099d7
    if (CheckFlag(font->state, ITALIC)) {
Packit b099d7
	fam->italic_nameq = XrmStringToQuark(font->slant);
Packit b099d7
    	fam->upright_nameq = NULLQUARK;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
    	fam->italic_nameq = NULLQUARK;
Packit b099d7
	fam->upright_nameq = XrmStringToQuark(font->slant);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    fam->sizes_75 = fam->sizes_100 = 0;
Packit b099d7
    fam->state = font->state;
Packit b099d7
Packit b099d7
    if (font->point_size != 0) {
Packit b099d7
	if ((font->resolution_x == 75) && (font->resolution_x == 75))
Packit b099d7
	    SetLongFlag(&(fam->sizes_75), SizeMapping(font->point_size), True);
Packit b099d7
	else if ((font->resolution_x == 100) && (font->resolution_x == 100))
Packit b099d7
	    SetLongFlag(&(fam->sizes_100),SizeMapping(font->point_size), True);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    fam->encoding_alloc = NUM_BUTTONS;
Packit b099d7
    fam->encodings = (XrmQuark *) XtCalloc(fam->encoding_alloc,
Packit b099d7
					   sizeof(XrmQuark));
Packit b099d7
    fam->encodings[0] = fam->encoding_alloc;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: SizeMapping
Packit b099d7
 *	Description: Maps the actual size to the sizes bit field
Packit b099d7
 *	Arguments: size - the point size to map.
Packit b099d7
 *	Returns: 0 if the size does not map, otherwise the bit it maps to.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static LongFlag
Packit b099d7
SizeMapping(short size)
Packit b099d7
{
Packit b099d7
    register int count;
Packit b099d7
Packit b099d7
    size /= POINT_DIVIDE;
Packit b099d7
Packit b099d7
    for (count = 0; count < XtNumber(GValidSizes); count++) {
Packit b099d7
	if (GValidSizes[count] == size)
Packit b099d7
	    return (((LongFlag) 1) << count);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return((LongFlag) 0);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: DisplayCurrentFont
Packit b099d7
 *	Description: Displays the current font to the user.
Packit b099d7
 *	Arguments: fsw - the font selector widget.
Packit b099d7
 *                 font - the current font name.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
DisplayCurrentFont(XmFontSelectorWidget fsw, String font)
Packit b099d7
{
Packit b099d7
    Arg largs[10];
Packit b099d7
    Cardinal num_largs;
Packit b099d7
    XmFontList fl;
Packit b099d7
    XFontStruct *fontdata;
Packit b099d7
    char buf[BUFSIZ * 2];
Packit b099d7
    Boolean	err = False;
Packit b099d7
Packit b099d7
    if ((fontdata = XLoadQueryFont(XtDisplay((Widget) fsw), font)) == NULL)
Packit b099d7
    {
Packit b099d7
	sprintf(buf, "Font '%s'\nis not availiable on this machine", font);
Packit b099d7
	DisplayUserError(fsw, buf);
Packit b099d7
	err = True;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Always clear out old errors
Packit b099d7
	 */
Packit b099d7
	RemoveUserError(NULL, (XtPointer)fsw, (XtPointer)0);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * This is a hack to work around problems with Sun scaled fonts 
Packit b099d7
     * and the Motif Text widget.  It turns out that some sun fonts
Packit b099d7
     * when a size of * is specified will return a font of height 0
Packit b099d7
     * this causes the ascent + descent to be zero and really confuses
Packit b099d7
     * the XmTextField widget.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((fontdata->ascent + fontdata->descent) == 0) {
Packit b099d7
	if (IsXlfdFont(font)) {
Packit b099d7
	    char *ptr, left_buf[BUFSIZ], right_buf[BUFSIZ], fbuf[BUFSIZ];
Packit b099d7
	    register int i, count;
Packit b099d7
Packit b099d7
	    /*
Packit b099d7
	     * This is a poorly formatted Sun Scaled font, 
Packit b099d7
	     *
Packit b099d7
	     * Find where the size is and change it from a * to 140.
Packit b099d7
 	     */
Packit b099d7
	 
Packit b099d7
	    for (ptr = font, i = count = 0; *ptr != 0; i++, ptr++) {
Packit b099d7
		if (*ptr != '-') 
Packit b099d7
		    continue;
Packit b099d7
Packit b099d7
		count++;
Packit b099d7
		if (count == 8) 
Packit b099d7
		    break;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    ptr = (char *) strchr(ptr + 1, '-');
Packit b099d7
	    strcpy(right_buf, ptr);
Packit b099d7
	    strcpy(left_buf, font);
Packit b099d7
	    left_buf[i] = '\0';
Packit b099d7
	    sprintf(fbuf, "%s-140%s", left_buf, right_buf);
Packit b099d7
Packit b099d7
	    if ((fontdata = XLoadQueryFont(XtDisplay((Widget) fsw), 
Packit b099d7
					   fbuf)) == NULL) 
Packit b099d7
	    {
Packit b099d7
		sprintf(buf,
Packit b099d7
			    "Font '%s'\nis not availiable on this machine",
Packit b099d7
			    font);
Packit b099d7
		DisplayUserError(fsw, buf);
Packit b099d7
		    err = True;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
		sprintf(buf,
Packit b099d7
			"Font '%s'\n%s",
Packit b099d7
			font, 
Packit b099d7
		    "is is zero pixels high and cannot be displayed.");
Packit b099d7
	    DisplayUserError(fsw, buf);
Packit b099d7
		err = True;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (!err) {
Packit b099d7
	fl = XmFontListCreate(fontdata, XmFONTLIST_DEFAULT_TAG);
Packit b099d7
	
Packit b099d7
	num_largs = 0;
Packit b099d7
	XtSetArg(largs[num_largs], XmNfontList, fl); num_largs++;	
Packit b099d7
	XtSetValues(XmFontS_text(fsw), largs, num_largs);
Packit b099d7
	
Packit b099d7
	if (XmFontS_old_fontdata(fsw) != NULL)
Packit b099d7
	{
Packit b099d7
	    XFreeFont(XtDisplay((Widget) fsw), XmFontS_old_fontdata(fsw));
Packit b099d7
	    XmFontListFree(XmFontS_old_fontlist(fsw));
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XmFontS_old_fontdata(fsw) = fontdata;
Packit b099d7
	XmFontS_old_fontlist(fsw) = fl;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (XtIsManaged(XmFontS_name_label(fsw)))
Packit b099d7
    {
Packit b099d7
	XmString xmstr = XmStringCreateLocalized(font);
Packit b099d7
	num_largs = 0;
Packit b099d7
	XtSetArg(largs[num_largs], XmNlabelString, xmstr); num_largs++;	
Packit b099d7
	XtSetValues(XmFontS_name_label(fsw), largs, num_largs);
Packit b099d7
	XmStringFree(xmstr);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Fire off the callback for the user.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    {
Packit b099d7
	FontData	*cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
	String 	str_ptr;
Packit b099d7
Packit b099d7
	if (XmFontS_xlfd_mode(fsw)) {
Packit b099d7
	    BuildFontString(fsw, cf, XmFontS_get_font(fsw), GET_FONT_SIZE);
Packit b099d7
	    str_ptr = XmFontS_get_font(fsw); 
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	    str_ptr = XrmQuarkToString(cf->familyq);
Packit b099d7
Packit b099d7
	XtCallCallbackList((Widget) fsw,
Packit b099d7
			   XmFontS_font_changed_callback(fsw), (XtPointer)str_ptr);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: BuildFontString
Packit b099d7
 *	Description: Builds a font string from the current font.
Packit b099d7
 *	Arguments:   fsw - the font selector widget.
Packit b099d7
 *                   cf - the font data to use.
Packit b099d7
 *                   buf - where to stuff the font name.
Packit b099d7
 *                   size - the size not to exceed.
Packit b099d7
 *	Returns: the font string (same as buf).
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static String
Packit b099d7
BuildFontString(XmFontSelectorWidget fsw, FontData *cf, String buf, int size)
Packit b099d7
{
Packit b099d7
    static XrmQuark anyquark2, anyquark = NULLQUARK;
Packit b099d7
    String family, encoding;
Packit b099d7
    char res_x[BUFSIZ], res_y[BUFSIZ], point_size[BUFSIZ];
Packit b099d7
Packit b099d7
    if (anyquark == NULLQUARK) {
Packit b099d7
	String temp1 = _XmGetMBStringFromXmString(ANY_STRING(fsw));
Packit b099d7
	String temp2 = _XmGetMBStringFromXmString(LOWER_ANY_STRING(fsw));
Packit b099d7
Packit b099d7
	anyquark = XrmStringToQuark(temp1);
Packit b099d7
	anyquark2 = XrmStringToQuark(temp2);
Packit b099d7
Packit b099d7
	XtFree(temp1);
Packit b099d7
	XtFree(temp2);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((anyquark == cf->familyq) || (anyquark2 == cf->familyq))
Packit b099d7
	family = STAR_STRING;
Packit b099d7
    else
Packit b099d7
	family = XrmQuarkToString(cf->familyq);
Packit b099d7
Packit b099d7
    if (cf->point_size == 0)
Packit b099d7
	strcpy(point_size, STAR_STRING);
Packit b099d7
    else
Packit b099d7
	sprintf(point_size, "%d", cf->point_size);
Packit b099d7
Packit b099d7
    if (cf->resolution_x == 0)
Packit b099d7
	strcpy(res_x, STAR_STRING);
Packit b099d7
    else 
Packit b099d7
	sprintf(res_x, "%d", (int) cf->resolution_x);
Packit b099d7
Packit b099d7
    if (cf->resolution_y == 0)
Packit b099d7
	strcpy(res_y, STAR_STRING);
Packit b099d7
    else 
Packit b099d7
	sprintf(res_y, "%d", (int) cf->resolution_y);
Packit b099d7
Packit b099d7
    encoding = ENCODING_STRING(fsw);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * I should really check to see that the string fits, but
Packit b099d7
     * What would I do it I failed?
Packit b099d7
     */
Packit b099d7
Packit b099d7
    sprintf(buf, "-*-%s-%s-%s-*-*-*-%s-%s-%s-%s-*-%s",
Packit b099d7
	    family, XrmQuarkToString(cf->weightq), cf->slant, point_size,
Packit b099d7
	    res_x, res_y, cf->spacing, encoding);
Packit b099d7
Packit b099d7
    return(buf);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: UpdateBoldItalic
Packit b099d7
 *	Description: Updates the bold and italic buttons
Packit b099d7
 *	Arguments: fsw - the font selector widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
UpdateBoldItalic(XmFontSelectorWidget fsw)
Packit b099d7
{
Packit b099d7
    Boolean set;
Packit b099d7
    FontData *cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    FamilyInfo *fam;
Packit b099d7
Packit b099d7
    if ((fam = FindFamily(cf->familyq, XmFontS_font_info(fsw)->family_info,
Packit b099d7
			  XmFontS_font_info(fsw)->num_families)) == NULL)
Packit b099d7
    {
Packit b099d7
	String params[1];
Packit b099d7
	Cardinal num = 1;
Packit b099d7
Packit b099d7
	params[0] = XrmQuarkToString(cf->familyq);
Packit b099d7
	dbg(); _XmWarningMsg((Widget) fsw, XmNcouldNotFindFamilyData,
Packit b099d7
			XmNcouldNotFindFamilyDataMsg, params, num);
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((fam->medium_nameq == NULLQUARK) || (fam->bold_nameq == NULLQUARK)) {
Packit b099d7
	set = (fam->medium_nameq == NULLQUARK);
Packit b099d7
	XmToggleButtonSetState(XmFontS_bold_toggle(fsw), set, False);
Packit b099d7
	SetFlag(&(XmFontS_user_state(fsw)), BOLD, set);
Packit b099d7
	XtSetSensitive(XmFontS_bold_toggle(fsw), False);
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	XtSetSensitive(XmFontS_bold_toggle(fsw), True);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    if (CheckFlag(XmFontS_user_state(fsw), BOLD))
Packit b099d7
	cf->weightq = fam->bold_nameq;
Packit b099d7
    else
Packit b099d7
	cf->weightq = fam->medium_nameq;
Packit b099d7
Packit b099d7
    if ((fam->upright_nameq == NULLQUARK)|| (fam->italic_nameq == NULLQUARK)) {
Packit b099d7
	set = (fam->upright_nameq == NULLQUARK);
Packit b099d7
	XmToggleButtonSetState(XmFontS_italic_toggle(fsw), set, False);
Packit b099d7
	SetFlag(&(XmFontS_user_state(fsw)), ITALIC, set);
Packit b099d7
	XtSetSensitive(XmFontS_italic_toggle(fsw), False);
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	XtSetSensitive(XmFontS_italic_toggle(fsw), True);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (CheckFlag(XmFontS_user_state(fsw), ITALIC))
Packit b099d7
	strcpy(cf->slant, XrmQuarkToString(fam->italic_nameq));
Packit b099d7
    else
Packit b099d7
	strcpy(cf->slant, XrmQuarkToString(fam->upright_nameq));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name:  UpdateFixedProportional
Packit b099d7
 *	Description: Updates the string stored in the fixed/proportional 
Packit b099d7
 *                   part of the current font data.
Packit b099d7
 *	Arguments: fsw - the font selector widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
UpdateFixedProportional(XmFontSelectorWidget fsw)
Packit b099d7
{
Packit b099d7
    FontData 	*cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    FamilyInfo 	*fam;
Packit b099d7
    Boolean	setMono, setProp, setAny;
Packit b099d7
    
Packit b099d7
    if ((fam = FindFamily(cf->familyq, XmFontS_font_info(fsw)->family_info,
Packit b099d7
			  XmFontS_font_info(fsw)->num_families)) == NULL)
Packit b099d7
    {
Packit b099d7
	String params[1];
Packit b099d7
	Cardinal num = 1;
Packit b099d7
Packit b099d7
	params[0] = XrmQuarkToString(cf->familyq);
Packit b099d7
	dbg(); _XmWarningMsg((Widget) fsw, XmNcouldNotFindFamilyData,
Packit b099d7
		XmNcouldNotFindFamilyDataMsg, params, num);
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (CheckFlag(XmFontS_user_state(fsw), USER_PROPORTIONAL)) {
Packit b099d7
	if (CheckFlag(XmFontS_user_state(fsw), USER_FIXED))
Packit b099d7
	{
Packit b099d7
	    strcpy(cf->spacing, STAR_STRING);
Packit b099d7
	    setMono = False; setProp = False; setAny = True;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    strcpy(cf->spacing, PROPORTIONAL_SPACING);
Packit b099d7
	    setMono = False; setProp = True; setAny = False;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else if (CheckFlag(XmFontS_user_state(fsw), USER_FIXED))
Packit b099d7
    {
Packit b099d7
	strcpy(cf->spacing, fam->fixed_spacing);
Packit b099d7
	setMono = True; setProp = False; setAny = False;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	strcpy(cf->spacing, STAR_STRING);
Packit b099d7
	setMono = False; setProp = False; setAny = True;
Packit b099d7
    }
Packit b099d7
    if ( XmFontS_monospace(fsw) != NULL )
Packit b099d7
	XmToggleButtonSetState(XmFontS_monospace(fsw), setMono, False);
Packit b099d7
    if ( XmFontS_proportional(fsw) != NULL )
Packit b099d7
	XmToggleButtonSetState(XmFontS_proportional(fsw), setProp, False);
Packit b099d7
    if ( XmFontS_any_spacing(fsw) != NULL )
Packit b099d7
	XmToggleButtonSetState(XmFontS_any_spacing(fsw), setAny, False);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: UpdateFamilies
Packit b099d7
 *	Description: Updates the displayed families.
Packit b099d7
 *	Arguments: fsw - the file selector widget.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
UpdateFamilies(XmFontSelectorWidget fsw)
Packit b099d7
{
Packit b099d7
    Arg largs[10];
Packit b099d7
    Cardinal num_largs;
Packit b099d7
    register int count;
Packit b099d7
    register int i, num;
Packit b099d7
    XmString *strs;
Packit b099d7
    LongFlag size_flag;
Packit b099d7
    FamilyInfo *fam = XmFontS_font_info(fsw)->family_info;
Packit b099d7
    FontData *cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    Boolean str_match = False;
Packit b099d7
    String temp;
Packit b099d7
Packit b099d7
    num = XmFontS_font_info(fsw)->num_families;
Packit b099d7
Packit b099d7
    strs = (XmString *) XtMalloc(sizeof(XmString) * num);
Packit b099d7
    size_flag = SizeMapping(cf->point_size);
Packit b099d7
    for (i = count = 0; i < num; i++, fam++) {
Packit b099d7
	Boolean ok_75, ok_100, spacing_match, resolution_ok, has_sizes;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Only add this family if:
Packit b099d7
	 *
Packit b099d7
	 * The size is 0 (ANY SIZE) and there is a font of the current 
Packit b099d7
	 * right DPI, or 
Packit b099d7
	 * This is a scaled font and scaling is turned on, or
Packit b099d7
	 * This font has current point size in 75 dpi and 75 or any selectd, or
Packit b099d7
	 * This font has current point size in 100 dpi and 100 or any selectd.
Packit b099d7
	 * 
Packit b099d7
	 * And
Packit b099d7
	 * The Charset/Encodings match or any is selected.
Packit b099d7
	 * The type of spacing matches.
Packit b099d7
	 * This is a scaled font or there are some valid sizes  
Packit b099d7
	 * in the current point size.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	ok_75 = ((size_flag != 0) &&
Packit b099d7
		 CheckFlag(XmFontS_user_state(fsw), DPI_75) &&
Packit b099d7
		 CheckLongFlag(fam->sizes_75, size_flag));
Packit b099d7
	
Packit b099d7
	ok_100 = ((size_flag != 0) && 
Packit b099d7
		  CheckFlag(XmFontS_user_state(fsw), DPI_100) &&
Packit b099d7
		  CheckLongFlag(fam->sizes_100, size_flag));
Packit b099d7
Packit b099d7
	resolution_ok = (cf->resolution_x == 0) && (cf->resolution_y == 0);
Packit b099d7
Packit b099d7
	resolution_ok |= (CheckFlag(XmFontS_user_state(fsw), DPI_75) &&
Packit b099d7
			  CheckFlag(fam->state, DPI_75));
Packit b099d7
Packit b099d7
	resolution_ok |= (CheckFlag(XmFontS_user_state(fsw), DPI_100) &&
Packit b099d7
			  CheckFlag(fam->state, DPI_100));
Packit b099d7
Packit b099d7
	if (!(has_sizes = IsScaled(fsw, fam))) {
Packit b099d7
	    has_sizes |= ((fam->sizes_75 != 0) && 
Packit b099d7
			  CheckFlag(XmFontS_user_state(fsw), DPI_75));
Packit b099d7
	    
Packit b099d7
	    has_sizes |= ((fam->sizes_100 != 0) && 
Packit b099d7
			  CheckFlag(XmFontS_user_state(fsw), DPI_100));
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * The Any Family will match all spacings.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	spacing_match = (i == ANY_FAMILY);
Packit b099d7
Packit b099d7
	spacing_match |= (CheckFlag(XmFontS_user_state(fsw), USER_PROPORTIONAL) &&
Packit b099d7
			  CheckFlag(fam->state, PROPORTIONAL));
Packit b099d7
Packit b099d7
	spacing_match |= (CheckFlag(XmFontS_user_state(fsw), USER_FIXED) &&
Packit b099d7
			  !CheckFlag(fam->state, PROPORTIONAL));
Packit b099d7
Packit b099d7
	if (((cf->point_size == 0) || IsScaled(fsw, fam) || ok_75 || ok_100) &&
Packit b099d7
	    CheckEncoding(fsw, fam) && spacing_match &&
Packit b099d7
	    resolution_ok && has_sizes)
Packit b099d7
	{
Packit b099d7
	    strs[count++] = XmStringCreateLocalized(XrmQuarkToString(fam->nameq));
Packit b099d7
	    str_match |= (fam->nameq == cf->familyq);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * This font is no longer in the list, reset the list to ANY_STRING
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (!str_match) {
Packit b099d7
	temp = _XmGetMBStringFromXmString(ANY_STRING(fsw));
Packit b099d7
	
Packit b099d7
	XtSetArg(largs[num_largs], XmNvalue, temp); num_largs++;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
	temp = NULL;
Packit b099d7
Packit b099d7
    XtSetArg(largs[num_largs], XmNitems, strs); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNitemCount, count); num_largs++;
Packit b099d7
    XtSetValues(XmFontS_family_box(fsw), largs, num_largs);
Packit b099d7
Packit b099d7
    if (!str_match) 
Packit b099d7
	FamilyChanged(XmFontS_family_box(fsw), (XtPointer) fsw, NULL);
Packit b099d7
Packit b099d7
    for (count--; count >= 0; count--) 
Packit b099d7
	XmStringFree(strs[count]);
Packit b099d7
    XtFree((XtPointer) strs);
Packit b099d7
    XtFree((XtPointer) temp);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: UpdateSizes
Packit b099d7
 *	Description: Updates the list of sizes.
Packit b099d7
 *	Arguments: fsw - the font selector widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
UpdateSizes(XmFontSelectorWidget fsw)
Packit b099d7
{
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    Arg largs[10];
Packit b099d7
    Cardinal num_largs = 0;
Packit b099d7
    register int count = 0;
Packit b099d7
    register int i, size;
Packit b099d7
    XmString *strs;
Packit b099d7
    LongFlag size_flag;
Packit b099d7
    FamilyInfo *family;
Packit b099d7
    Boolean editable, match = False;
Packit b099d7
    String temp = NULL;
Packit b099d7
Packit b099d7
    if ((family = FindFamily(XmFontS_font_info(fsw)->current_font->familyq,
Packit b099d7
			     XmFontS_font_info(fsw)->family_info,
Packit b099d7
			     XmFontS_font_info(fsw)->num_families)) == NULL) 
Packit b099d7
    {	
Packit b099d7
	String params[1];
Packit b099d7
	Cardinal num = 1;
Packit b099d7
Packit b099d7
	params[0] = XrmQuarkToString(cf->familyq);
Packit b099d7
	dbg(); _XmWarningMsg((Widget) fsw, XmNcouldNotFindFamilyData,
Packit b099d7
		XmNcouldNotFindFamilyDataMsg, params, num);
Packit b099d7
	return;
Packit b099d7
    }    
Packit b099d7
    
Packit b099d7
    if (IsScaled(fsw, family)) {
Packit b099d7
	family = XmFontS_font_info(fsw)->family_info + ANY_FAMILY;
Packit b099d7
	editable = True;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	editable = False;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    size_flag = 0;
Packit b099d7
    if (CheckFlag(XmFontS_user_state(fsw), DPI_75)) 
Packit b099d7
	size_flag |= family->sizes_75;
Packit b099d7
    if (CheckFlag(XmFontS_user_state(fsw), DPI_100)) 
Packit b099d7
	size_flag |= family->sizes_100;
Packit b099d7
Packit b099d7
    size = sizeof(LongFlag) * 8; /* There are 8 bits in a BYTE */
Packit b099d7
    strs = (XmString *) XtMalloc(sizeof(XmString) * (size + 1));
Packit b099d7
    /*
Packit b099d7
     * DMS - fix to work around apparent Motif 1.2.4 bug concerning
Packit b099d7
     *       XmStrings containing as the empty string
Packit b099d7
     */
Packit b099d7
    if (XmStringEmpty(ANY_STRING(fsw)))
Packit b099d7
        strs[count++] = XmStringCreateLocalized(" ");
Packit b099d7
    else
Packit b099d7
        strs[count++] = XmStringCopy(ANY_STRING(fsw));
Packit b099d7
Packit b099d7
    for (i = 0; i < XtNumber(GValidSizes); i++) {
Packit b099d7
	char buf[10];
Packit b099d7
	LongFlag flag = ((LongFlag) 1) << i;
Packit b099d7
Packit b099d7
	if (!CheckLongFlag(size_flag, flag) && !IsScaled(fsw, family))
Packit b099d7
	    continue;
Packit b099d7
Packit b099d7
	sprintf(buf, "%d", GValidSizes[i]);
Packit b099d7
	strs[count++] = XmStringCreateLocalized(buf);
Packit b099d7
	
Packit b099d7
	match |= (SizeMapping(cf->point_size) == flag);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (!match) {
Packit b099d7
	temp = _XmGetMBStringFromXmString(ANY_STRING(fsw));
Packit b099d7
Packit b099d7
	XtSetArg(largs[num_largs], XmNvalue, temp); num_largs++;  
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XtSetArg(largs[num_largs], XmNitems, strs); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNitemCount, count); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNeditable, editable); num_largs++;
Packit b099d7
    XtSetValues(XmFontS_size_box(fsw), largs, num_largs);
Packit b099d7
Packit b099d7
Packit b099d7
    if (!match) 
Packit b099d7
	SizeChanged(XmFontS_size_box(fsw), (XtPointer) fsw, NULL);
Packit b099d7
Packit b099d7
    for (count--; count >= 0; count--) 
Packit b099d7
	XmStringFree(strs[count]);
Packit b099d7
    XtFree((XtPointer) strs);
Packit b099d7
    XtFree((XtPointer) temp);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: SetComboValue
Packit b099d7
 *	Description: Sets the value field of a Combination box.
Packit b099d7
 *	Arguments: box - the combo box. 
Packit b099d7
 *                 value - the value to set.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
SetComboValue(Widget box, String value)
Packit b099d7
{
Packit b099d7
    Arg largs[10];
Packit b099d7
    Cardinal num_largs = 0;
Packit b099d7
Packit b099d7
    XtSetArg(largs[num_largs], XmNvalue, value); num_largs++;
Packit b099d7
    XtSetValues(box, largs, num_largs);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: UnsetSiblings
Packit b099d7
 *	Description: Unsets all sibling toggles of this toggle.
Packit b099d7
 *	Arguments: w - the toggle who's siblings we are unsetting.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
UnsetSiblings(Widget w)
Packit b099d7
{
Packit b099d7
    WidgetList children;
Packit b099d7
    Cardinal num_children;
Packit b099d7
    Arg largs[10];
Packit b099d7
    Cardinal i, num_largs = 0;
Packit b099d7
Packit b099d7
    XtSetArg(largs[num_largs], XmNchildren, &children); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNnumChildren, &num_children); num_largs++;
Packit b099d7
    XtGetValues(XtParent(w), largs, num_largs);
Packit b099d7
Packit b099d7
    for (i = 0; i < num_children; i++) 
Packit b099d7
	XmToggleButtonSetState(children[i], (children[i] == w), False);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: DisplayUserError
Packit b099d7
 *	Description: Displays an error message to the user.
Packit b099d7
 *	Arguments: fsw - the font selector widget.
Packit b099d7
 *                 msg - the message to display.
Packit b099d7
 *	Returns: none
Packit b099d7
 *
Packit b099d7
 * NOTE: If (msg == NULL) then the value of current_text will be placed
Packit b099d7
 *       in the text widget.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
DisplayUserError(XmFontSelectorWidget fsw, String msg)
Packit b099d7
{
Packit b099d7
    String temp;
Packit b099d7
    if (msg != NULL) {
Packit b099d7
	/*
Packit b099d7
	 * If the real text is already in current_text then do not
Packit b099d7
	 * attempt to get it out of the widget, just use what we have
Packit b099d7
	 * saved already, this hackery is necessary because of the 
Packit b099d7
	 * wierd state machine that is in this code. 
Packit b099d7
	 *
Packit b099d7
	 * The problem being solved is that this should work if we call
Packit b099d7
	 * DisplayUserError if a user error is already being displayed.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (XmFontS_current_text(fsw) != NULL) {
Packit b099d7
	    temp = XmFontS_current_text(fsw);
Packit b099d7
	    XmFontS_current_text(fsw) = NULL;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	    temp = XmTextGetString(XmFontS_text(fsw));
Packit b099d7
Packit b099d7
	XmTextSetString(XmFontS_text(fsw), msg);
Packit b099d7
	XmFontS_current_text(fsw) = temp;
Packit b099d7
Packit b099d7
	XmProcessTraversal(XmFontS_text(fsw), XmTRAVERSE_CURRENT);
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	if (XmFontS_current_text(fsw) == NULL)
Packit b099d7
	    return;		/* noting to do. */
Packit b099d7
Packit b099d7
	temp = XmFontS_current_text(fsw);
Packit b099d7
	XmFontS_current_text(fsw) = NULL;
Packit b099d7
Packit b099d7
	XmTextSetString(XmFontS_text(fsw), temp);
Packit b099d7
	XtFree((XtPointer) temp);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: SetResolution
Packit b099d7
 *	Description: Sets the DPI toggles based on the FontData passed.
Packit b099d7
 *	Arguments: fsw - the font selector widget.
Packit b099d7
 *                 cf - the font data to use.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
SetResolution(XmFontSelectorWidget fsw, FontData *cf)
Packit b099d7
{
Packit b099d7
    Boolean	set75, set100, setAny;
Packit b099d7
    
Packit b099d7
    if ( cf->resolution_x != cf->resolution_y )
Packit b099d7
    {
Packit b099d7
	set75 = False;
Packit b099d7
	set100 = False;
Packit b099d7
	setAny = True;
Packit b099d7
    }
Packit b099d7
    else if ( XmFontS_font_info(fsw)->current_font->resolution_x == 75 )
Packit b099d7
    {
Packit b099d7
	set75 = True;
Packit b099d7
	set100 = False;
Packit b099d7
	setAny = False;
Packit b099d7
    }
Packit b099d7
    else if ( XmFontS_font_info(fsw)->current_font->resolution_x == 100 )
Packit b099d7
    {
Packit b099d7
	set75 = False;
Packit b099d7
	set100 = True;
Packit b099d7
	setAny = False;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	set75 = False;
Packit b099d7
	set100 = False;
Packit b099d7
	setAny = True;
Packit b099d7
    }
Packit b099d7
    XmToggleButtonSetState(XmFontS_dpi75(fsw), set75, False);
Packit b099d7
    XmToggleButtonSetState(XmFontS_dpi100(fsw), set100, False);
Packit b099d7
    XmToggleButtonSetState(XmFontS_dpiAny(fsw), setAny, False);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: SetDisplayedFont
Packit b099d7
 *	Description: Sets the font to be displayed.
Packit b099d7
 *	Arguments: fsw - the font selector widget.
Packit b099d7
 *                 font - the font to be displayed.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
SetDisplayedFont(XmFontSelectorWidget fsw, String new_font)
Packit b099d7
{
Packit b099d7
    Boolean 	set;
Packit b099d7
    Arg 	largs[10];
Packit b099d7
    Cardinal 	num_largs;
Packit b099d7
    FontData 	*cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    char 	buf[BUFSIZ];
Packit b099d7
Packit b099d7
    sprintf(buf, "--%s-%s-%s----0-%d-%d-*--%s",
Packit b099d7
	    STAR_STRING, DEFAULT_WEIGHT, DEFAULT_SLANT, 
Packit b099d7
	    XmFontS_font_info(fsw)->resolution,
Packit b099d7
	    XmFontS_font_info(fsw)->resolution, ENCODING_STRING(fsw));
Packit b099d7
	
Packit b099d7
    FillData(fsw, cf, buf);		/* Put in default data. */
Packit b099d7
Packit b099d7
    if (new_font != NULL) {
Packit b099d7
	if (IsXlfdFont(new_font)) 
Packit b099d7
	    FillData(fsw, cf, new_font);
Packit b099d7
	else {
Packit b099d7
	    if (strchr(new_font, '-')) {
Packit b099d7
		String params[1];
Packit b099d7
		Cardinal num = 1;
Packit b099d7
		
Packit b099d7
		params[1] = new_font;
Packit b099d7
		dbg(); _XmWarningMsg((Widget) fsw, XmNbadXlfdFont,
Packit b099d7
			XmNbadXlfdFontMsg, params, num);
Packit b099d7
	    }
Packit b099d7
	    else {
Packit b099d7
		ChangeMode(fsw, False, False);
Packit b099d7
		SetComboValue(XmFontS_family_box(fsw), new_font);
Packit b099d7
		
Packit b099d7
		/*
Packit b099d7
		 * For optomization of FamilyChanged Only. 
Packit b099d7
		 */
Packit b099d7
Packit b099d7
		cf->familyq = XrmStringToQuark(new_font); 
Packit b099d7
		return;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    set = CheckFlag(cf->state, ITALIC);
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), ITALIC, set);
Packit b099d7
    XtSetArg(largs[num_largs], XmNset, set); num_largs++;
Packit b099d7
    XtSetValues(XmFontS_italic_toggle(fsw), largs, num_largs);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    set = CheckFlag(cf->state, BOLD);
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), BOLD, set);
Packit b099d7
    XtSetArg(largs[num_largs], XmNset, set); num_largs++;
Packit b099d7
    XtSetValues(XmFontS_bold_toggle(fsw), largs, num_largs);
Packit b099d7
Packit b099d7
    SetComboValue(XmFontS_family_box(fsw), XrmQuarkToString(cf->familyq));
Packit b099d7
    sprintf(buf, "%d", cf->point_size / POINT_DIVIDE);
Packit b099d7
    SetComboValue(XmFontS_size_box(fsw), buf);
Packit b099d7
Packit b099d7
    SetResolution(fsw, cf);
Packit b099d7
    
Packit b099d7
    XmCopyISOLatin1Lowered(buf, cf->spacing);
Packit b099d7
    if ( strstr(buf, STAR_STRING) != NULL )
Packit b099d7
    {
Packit b099d7
	SetFlag(&(XmFontS_user_state(fsw)), USER_PROPORTIONAL | USER_FIXED, True);
Packit b099d7
    }
Packit b099d7
    else if ( strstr(buf, DEFAULT_FIXED_SPACING) != NULL ||
Packit b099d7
	      strstr(buf, OTHER_FIXED_SPACING)	!= NULL )
Packit b099d7
    {
Packit b099d7
	SetFlag(&(XmFontS_user_state(fsw)), USER_FIXED, True);
Packit b099d7
	SetFlag(&(XmFontS_user_state(fsw)), USER_PROPORTIONAL, False);
Packit b099d7
    }
Packit b099d7
    else if ( strstr(buf, PROPORTIONAL_SPACING) != NULL )
Packit b099d7
    {
Packit b099d7
    	SetFlag(&(XmFontS_user_state(fsw)), USER_PROPORTIONAL, True);
Packit b099d7
	SetFlag(&(XmFontS_user_state(fsw)), USER_FIXED, False);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	SetFlag(&(XmFontS_user_state(fsw)), USER_PROPORTIONAL | USER_FIXED, True);
Packit b099d7
    }
Packit b099d7
	
Packit b099d7
    UpdateFixedProportional(fsw);
Packit b099d7
    
Packit b099d7
    cf->familyq = NULLQUARK;	/* work around FamilyChanged Optomization. */
Packit b099d7
Packit b099d7
    FamilyChanged(XmFontS_family_box(fsw), (XtPointer) fsw, NULL);
Packit b099d7
    UpdateFamilies(fsw);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 *  Routines for handling when the change from other <--> xlfd mode
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*	Function Name: AddToXlfdOnlyList
Packit b099d7
 *	Description: Adds a widget to the xlfd only list.
Packit b099d7
 *	Arguments: fsw - the font selector.
Packit b099d7
 *                 w - the widget to add.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
AddToXlfdOnlyList(XmFontSelectorWidget fsw, Widget w)
Packit b099d7
{
Packit b099d7
    int num = (int) XmFontS_num_xlfd_only(fsw);
Packit b099d7
    int alloc = (int) XmFontS_alloc_xlfd_only(fsw);
Packit b099d7
Packit b099d7
    if (num >= alloc) {
Packit b099d7
	alloc += WIDGET_LIST_INC;
Packit b099d7
	XmFontS_xlfd_only(fsw) = (WidgetList) XtRealloc((XtPointer) 
Packit b099d7
						   XmFontS_xlfd_only(fsw),
Packit b099d7
						   sizeof(Widget) * alloc);
Packit b099d7
	XmFontS_alloc_xlfd_only(fsw) = alloc;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XmFontS_xlfd_only(fsw)[num] = w;
Packit b099d7
    (XmFontS_num_xlfd_only(fsw))++;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: AddToXlfdSensitiveList
Packit b099d7
 *	Description: Adds a widget to the xlfd sensitive list.
Packit b099d7
 *	Arguments: fsw - the font selector.
Packit b099d7
 *                 w - the widget to add.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
AddToXlfdSensitiveList(XmFontSelectorWidget fsw, Widget w)
Packit b099d7
{
Packit b099d7
    int num = (int) XmFontS_num_xlfd_sensitive(fsw);
Packit b099d7
    int alloc = (int) XmFontS_alloc_xlfd_sensitive(fsw);
Packit b099d7
Packit b099d7
    if (num >= alloc) {
Packit b099d7
	alloc += WIDGET_LIST_INC;
Packit b099d7
	XmFontS_xlfd_sensitive(fsw) = (WidgetList) XtRealloc((XtPointer) 
Packit b099d7
							XmFontS_xlfd_sensitive(fsw),
Packit b099d7
							sizeof(Widget)* alloc);
Packit b099d7
	XmFontS_alloc_xlfd_sensitive(fsw) = alloc;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    XmFontS_xlfd_sensitive(fsw)[num] = w;
Packit b099d7
    (XmFontS_num_xlfd_sensitive(fsw))++;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ChangeMode
Packit b099d7
 *	Description: Changes the mode of the font selector.
Packit b099d7
 *	Arguments: fsw - the file selector widget.
Packit b099d7
 *                 xlfd_mode - If True then change to xlfd mode, 
Packit b099d7
 *                             otherwize change to other mode.
Packit b099d7
 *		   force - For other mode - True if we're changing modes
Packit b099d7
 *				false if we're displaying a font
Packit b099d7
 *
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ChangeMode(XmFontSelectorWidget fsw, Boolean xlfd_mode, Boolean force)
Packit b099d7
{
Packit b099d7
    Arg largs[10];
Packit b099d7
    Cardinal num_largs;
Packit b099d7
    register WidgetList widgets;
Packit b099d7
    register int i, num;
Packit b099d7
    XmString family_label;
Packit b099d7
Packit b099d7
    XmFontS_xlfd_mode(fsw) = xlfd_mode; /* remember our current mode. */
Packit b099d7
Packit b099d7
    num = (int) XmFontS_num_xlfd_sensitive(fsw);
Packit b099d7
    widgets = XmFontS_xlfd_sensitive(fsw);
Packit b099d7
Packit b099d7
    for (i = 0; i < num; i++, widgets++)
Packit b099d7
	XtSetSensitive(*widgets, xlfd_mode);
Packit b099d7
Packit b099d7
    num = (int) XmFontS_num_xlfd_only(fsw);
Packit b099d7
    widgets = XmFontS_xlfd_only(fsw);
Packit b099d7
Packit b099d7
    for (i = 0; i < num; i++, widgets++) {
Packit b099d7
	if (xlfd_mode)
Packit b099d7
	    XtManageChild(*widgets);
Packit b099d7
	else
Packit b099d7
	    XtUnmanageChild(*widgets);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (xlfd_mode) {
Packit b099d7
	char buf[BUFSIZ];
Packit b099d7
	FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
	String temp = _XmGetMBStringFromXmString(ANY_STRING(fsw));
Packit b099d7
Packit b099d7
	family_label = FAMILY_STRING(fsw);
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Reset the values in the family and size boxes to "any"
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	SetComboValue(XmFontS_family_box(fsw), temp);
Packit b099d7
	SetComboValue(XmFontS_size_box(fsw), temp);
Packit b099d7
Packit b099d7
	cf->familyq = XrmStringToQuark(temp);
Packit b099d7
	cf->point_size = 0;
Packit b099d7
Packit b099d7
	UpdateFamilies(fsw);
Packit b099d7
	UpdateSizes(fsw);
Packit b099d7
	UpdateBoldItalic(fsw);
Packit b099d7
	UpdateFixedProportional(fsw);
Packit b099d7
Packit b099d7
	DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
Packit b099d7
	XtFree((XtPointer) temp);
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	family_label = OTHER_FONT_STRING(fsw);
Packit b099d7
Packit b099d7
	SetOtherList(fsw, force);
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set the proper toggle buttons.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    UnsetSiblings((xlfd_mode) ? XmFontS_xlfd_toggle(fsw) : XmFontS_other_toggle(fsw));
Packit b099d7
		    
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNlabelString, family_label); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNeditable, !xlfd_mode); num_largs++;
Packit b099d7
    XtSetValues(XmFontS_family_box(fsw), largs, num_largs);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: SetOtherList
Packit b099d7
 *	Description: Fills the other list with a complete list of
Packit b099d7
 *                   all other fonts.
Packit b099d7
 *	Arguments: fsw - the font selector widget.
Packit b099d7
 *			force - True if toggled by user, False if user
Packit b099d7
 *				is setting the current font
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
SetOtherList(XmFontSelectorWidget fsw, Boolean force)
Packit b099d7
{
Packit b099d7
    Arg largs[10];
Packit b099d7
    Cardinal num_largs = 0;
Packit b099d7
    register int count;
Packit b099d7
    XmString *strs;
Packit b099d7
    String *others = XmFontS_font_info(fsw)->others;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    register int i, num = XmFontS_font_info(fsw)->num_others;
Packit b099d7
    String	curFont = XmFontS_current_font(fsw);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set the current font to the first one on the list.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (num > 0) {
Packit b099d7
Packit b099d7
	if (force)
Packit b099d7
	{
Packit b099d7
	XtSetArg(largs[num_largs], XmNvalue, *others); num_largs++;
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 * This only to allow FamilyChanged to be more efficient.
Packit b099d7
	 */
Packit b099d7
	cf->familyq = XrmStringToQuark(*others); 
Packit b099d7
	DisplayCurrentFont(fsw, *others);
Packit b099d7
    }
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    XtSetArg(largs[num_largs], XmNvalue, curFont); num_largs++;
Packit b099d7
	    cf->familyq = XrmStringToQuark(curFont);
Packit b099d7
	    DisplayCurrentFont(fsw, curFont);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	XtSetArg(largs[num_largs], XmNvalue, " "); num_largs++;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    strs = (XmString *) XtMalloc(sizeof(XmString) * num);
Packit b099d7
    for (i = count = 0; i < num; i++, others++) 
Packit b099d7
	strs[count++] = XmStringCreateLocalized(*others);
Packit b099d7
Packit b099d7
    XtSetArg(largs[num_largs], XmNitems, strs); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNitemCount, count); num_largs++;
Packit b099d7
    XtSetValues(XmFontS_family_box(fsw), largs, num_largs);
Packit b099d7
Packit b099d7
    for (count--; count >= 0; count--) 
Packit b099d7
	XmStringFree(strs[count]);
Packit b099d7
    XtFree((XtPointer) strs);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 *  These routines actually create the children of the font
Packit b099d7
 *  selector.
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*	Function Name: CreateChildren
Packit b099d7
 *	Description: Creates all children of the font selector.
Packit b099d7
 *	Arguments: fsw - the font selector.
Packit b099d7
 *                 args, num_args - the argument list.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateChildren(XmFontSelectorWidget fsw, ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Arg *margs, largs[10];
Packit b099d7
    Cardinal num_largs;
Packit b099d7
    Widget temp, box;
Packit b099d7
    String temp_txt;
Packit b099d7
Packit b099d7
    CreateTopWidgets(fsw, (Widget) fsw, args, num_args);
Packit b099d7
    CreateMiddleArea(fsw, args, num_args);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNfillOption, XmFillAll); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNmarginHeight, 2); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    box = XtCreateManagedWidget("box", xmButtonBoxWidgetClass, 
Packit b099d7
				(Widget) fsw, margs, num_args + num_largs);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    temp_txt = _XmGetMBStringFromXmString(SAMPLE_TEXT(fsw));
Packit b099d7
    XtSetArg(largs[num_largs], XmNvalue, temp_txt); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNeditMode, XmMULTI_LINE_EDIT); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNwordWrap, True); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNscrollHorizontal, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNrows, XmFontS_text_rows(fsw)); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    temp = XmCreateScrolledText(box, "text", margs, num_args + num_largs);
Packit b099d7
    XtManageChild(XmFontS_text(fsw) = temp);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
    XtFree((XtPointer) temp_txt);
Packit b099d7
Packit b099d7
    XtAddCallback(temp, XmNlosingFocusCallback,
Packit b099d7
		  RemoveUserError, (XtPointer) fsw);
Packit b099d7
Packit b099d7
    XtAddCallback(temp, XmNmodifyVerifyCallback,
Packit b099d7
		  RemoveUserError, (XtPointer) fsw);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNskipAdjust, True); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    temp = XtCreateWidget("nameLabel", xmLabelWidgetClass, 
Packit b099d7
			  (Widget) fsw, margs, num_args + num_largs);
Packit b099d7
Packit b099d7
    if (XmFontS_show_font_name(fsw))
Packit b099d7
	XtManageChild(temp);
Packit b099d7
Packit b099d7
    XmFontS_name_label(fsw) = temp;
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateTopWidgets
Packit b099d7
 *	Description: Creates the children in the middle area where
Packit b099d7
 *                   fonts are selected.
Packit b099d7
 *	Arguments: fsw - the font selector.
Packit b099d7
 *                 parent - the parent of the created widgets.
Packit b099d7
 *                 args, num_args - the argument list.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateTopWidgets(XmFontSelectorWidget fsw, Widget parent,
Packit b099d7
		 ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Arg *margs, largs[10];
Packit b099d7
    Cardinal num_largs;
Packit b099d7
    Widget pane, button;
Packit b099d7
    
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNorientation, XmHORIZONTAL); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNspacing, 2); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNmarginWidth, 0); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNmarginHeight, 0); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    pane = XtCreateManagedWidget("topPane", xmPanedWidgetClass, 
Packit b099d7
				 parent, margs, num_args + num_largs);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
    
Packit b099d7
    CreateFamilyBox(fsw, pane, args, num_args);
Packit b099d7
    CreateSizesBox(fsw, pane, args, num_args);
Packit b099d7
    CreateBoldItalicBox(fsw, pane, args, num_args);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNlabelString, OPTION_STRING(fsw));num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNshadowThickness, 2); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNindicatorOn, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNskipAdjust, True); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    button = XtCreateManagedWidget("optionButton", xmToggleButtonWidgetClass, 
Packit b099d7
				   pane, margs, num_args + num_largs);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback,
Packit b099d7
		  ToggleMiddlePane, (XtPointer) fsw);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateMiddleArea
Packit b099d7
 *	Description: Creates the widgets in the top left area.
Packit b099d7
 *                   These are the family, size, bold/italic and proportional
Packit b099d7
 *                   boxes.
Packit b099d7
 *	Arguments: fsw - the file selection widget.
Packit b099d7
 *                 args, num_args - arguments to the font selector (filtered).
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateMiddleArea(XmFontSelectorWidget fsw, ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Arg *margs, largs[10];
Packit b099d7
    Cardinal num_largs;
Packit b099d7
    Widget pane, top_pane;
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNorientation, XmVERTICAL); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNspacing, 2); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNmarginWidth, 0); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNmarginHeight, 0); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    pane = XtCreateWidget("middlePane", xmPanedWidgetClass, 
Packit b099d7
			  (Widget) fsw, margs, num_args + num_largs);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
    XmFontS_middle_pane(fsw) = pane;
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNorientation, XmHORIZONTAL); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNspacing, 2); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNmarginWidth, 0); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNmarginHeight, 0); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNshowSash, False); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    top_pane = XtCreateManagedWidget("leftPane", xmPanedWidgetClass, 
Packit b099d7
				      pane, margs, num_args + num_largs);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    CreateFontChoiceBox(fsw, top_pane, args, num_args);
Packit b099d7
    CreateResolutionBox(fsw, top_pane, args, num_args);
Packit b099d7
Packit b099d7
    CreateSpacingBox(fsw, pane, args, num_args);
Packit b099d7
    CreateOtherChoiceBox(fsw, pane, args, num_args);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateFamilyBox
Packit b099d7
 *	Description: Creates the family Family box.
Packit b099d7
 *	Arguments: fsw - the file selection widget.
Packit b099d7
 *                 parent - the parent of this area.
Packit b099d7
 *                 args, num_args - arguments to the font selector (filtered).
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateFamilyBox(XmFontSelectorWidget fsw, Widget parent, 
Packit b099d7
		ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Widget c_box;
Packit b099d7
    Cardinal num_largs;
Packit b099d7
    Arg *margs, largs[15];
Packit b099d7
    String temp = _XmGetMBStringFromXmString(ANY_STRING(fsw));
Packit b099d7
	
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNlabelString,FAMILY_STRING(fsw)); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNshowSash, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNcolumns, FAMILY_COLUMNS); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNpopupOffset, 0); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNverticalMargin, 0); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNhorizontalMargin, 0); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNverify, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNeditable, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNvisibleItemCount, VISIBILE_FAMILIES);
Packit b099d7
    num_largs++;
Packit b099d7
    /*
Packit b099d7
     * This may cause a problem in Motif I18N applications with 1.2 
Packit b099d7
     */
Packit b099d7
Packit b099d7
    XtSetArg(largs[num_largs], XmNvalue, temp); num_largs++;
Packit b099d7
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    c_box = XtCreateManagedWidget("families", xmDropDownWidgetClass,
Packit b099d7
				  parent, margs, num_args + num_largs);
Packit b099d7
Packit b099d7
    XtAddCallback(c_box, XmNverifyTextCallback, FamilyChanged, (XtPointer)fsw);
Packit b099d7
    XtAddCallback(c_box, XmNupdateTextCallback, FamilyChanged, (XtPointer)fsw);
Packit b099d7
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
    XtFree((XtPointer) temp);
Packit b099d7
    XmFontS_family_box(fsw) = c_box;	
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateSizesBox
Packit b099d7
 *	Description: Creates the box for the sizes
Packit b099d7
 *	Arguments: fsw - the file selection widget.
Packit b099d7
 *                 parent - the parent of this area.
Packit b099d7
 *                 args, num_args - arguments to the font selector (filtered).
Packit b099d7
 *	Returns: none.
Packit b099d7
 *
Packit b099d7
 * NOTE: List is constructed later in UpdateSizes.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateSizesBox(XmFontSelectorWidget fsw, Widget parent, 
Packit b099d7
	       ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Widget c_box;
Packit b099d7
    Cardinal num_largs;
Packit b099d7
    Arg *margs, largs[15];
Packit b099d7
    String temp;
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNlabelString, SIZE_STRING(fsw)); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNshowSash, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNcolumns, 4); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNmaxLength, 3); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNpopupOffset, 0); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNverticalMargin, 0); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNhorizontalMargin, 0); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNverify, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNskipAdjust, True); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNvisibleItemCount, VISIBILE_FAMILIES);
Packit b099d7
    num_largs++;
Packit b099d7
Packit b099d7
    temp = _XmGetMBStringFromXmString(ANY_STRING(fsw));
Packit b099d7
    XtSetArg(largs[num_largs], XmNvalue, temp); num_largs++;
Packit b099d7
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    c_box = XtCreateManagedWidget("sizes", xmDropDownWidgetClass, 
Packit b099d7
				  parent, margs, num_args + num_largs);
Packit b099d7
    XtFree(temp);
Packit b099d7
    AddToXlfdOnlyList(fsw, c_box);
Packit b099d7
Packit b099d7
    XtAddCallback(c_box, XmNverifyTextCallback, SizeChanged, (XtPointer)fsw);
Packit b099d7
    XtAddCallback(c_box, XmNupdateTextCallback, SizeChanged, (XtPointer)fsw);
Packit b099d7
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
    XmFontS_size_box(fsw) = c_box;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateBoldItalicBox
Packit b099d7
 *	Description: Creates the bold and italic choice box.
Packit b099d7
 *	Arguments: fsw - the file selection widget.
Packit b099d7
 *                 parent - the parent of this area.
Packit b099d7
 *                 args, num_args - arguments to the font selector (filtered).
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateBoldItalicBox(XmFontSelectorWidget fsw, Widget parent, 
Packit b099d7
		    ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Widget box, button;
Packit b099d7
    Cardinal num_largs, num_str;
Packit b099d7
    Arg *margs, largs[10];
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNorientation, XmHORIZONTAL); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNshowSash, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNskipAdjust, True); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    box = XtCreateManagedWidget("boldItalicBox", xmButtonBoxWidgetClass, 
Packit b099d7
				parent, margs, num_args + num_largs);
Packit b099d7
    AddToXlfdOnlyList(fsw, box);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNlabelString, BOLD_STRING(fsw));
Packit b099d7
    num_str = num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNindicatorType, XmN_OF_MANY); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNalignment, XmALIGNMENT_BEGINNING);
Packit b099d7
    num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    button = XtCreateManagedWidget("boldButton", xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XmFontS_bold_toggle(fsw) = button;
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback, ToggleBold, (XtPointer)fsw);
Packit b099d7
Packit b099d7
    margs[num_str].value = (XtArgVal) ITALIC_STRING(fsw);
Packit b099d7
    button = XtCreateManagedWidget("italicButton", xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XmFontS_italic_toggle(fsw) = button;
Packit b099d7
    XtAddCallback(button, 
Packit b099d7
		  XmNvalueChangedCallback, ToggleItalic, (XtPointer) fsw);
Packit b099d7
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateSpacingBox
Packit b099d7
 *	Description: Creates the spacing choice box.
Packit b099d7
 *	Arguments: fsw - the file selection widget.
Packit b099d7
 *                 parent - the parent of this area.
Packit b099d7
 *                 args, num_args - arguments to the font selector (filtered).
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateSpacingBox(XmFontSelectorWidget fsw, Widget parent, 
Packit b099d7
		 ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Widget box, button;
Packit b099d7
    Cardinal num_largs, num_str, num_set;
Packit b099d7
    Arg *margs, largs[10];
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNorientation, XmHORIZONTAL); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNshowSash, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNfillOption, XmFillMajor); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNequalSize, True); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    box = XtCreateManagedWidget("spacingBox", xmButtonBoxWidgetClass, 
Packit b099d7
				parent, margs, num_args + num_largs);
Packit b099d7
    AddToXlfdSensitiveList(fsw, box);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNset, False); num_set = num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNlabelString, PROPORTIONAL_STRING(fsw));
Packit b099d7
    num_str = num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNindicatorType, XmONE_OF_MANY); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNalignment, XmALIGNMENT_BEGINNING);
Packit b099d7
    num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    button = XtCreateManagedWidget("proportionalButton",
Packit b099d7
				   xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback, ToggleProportional,
Packit b099d7
		  (XtPointer) fsw);
Packit b099d7
    XmFontS_proportional(fsw) = button;
Packit b099d7
    
Packit b099d7
    margs[num_str].value = (XtArgVal) MONO_SPACE_STRING(fsw);
Packit b099d7
    button = XtCreateManagedWidget("monoButton", xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback, ToggleFixed,
Packit b099d7
		  (XtPointer) fsw);
Packit b099d7
    XmFontS_monospace(fsw) = button;
Packit b099d7
    
Packit b099d7
    margs[num_str].value = (XtArgVal) BOTH_STRING(fsw);
Packit b099d7
    margs[num_set].value = (XtArgVal) True;
Packit b099d7
    button = XtCreateManagedWidget("bothButton", xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback, ToggleBothSpacing,
Packit b099d7
		  (XtPointer) fsw);
Packit b099d7
    XmFontS_any_spacing(fsw) = button;
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), USER_FIXED | USER_PROPORTIONAL, True);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateFontChoiceBox
Packit b099d7
 *	Description: Create a box to choose between xlfd fonts and others.
Packit b099d7
 *	Arguments: fsw - the file selection widget.
Packit b099d7
 *                 parent - the parent of this area.
Packit b099d7
 *                 args, num_args - arguments to the font selector (filtered).
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateFontChoiceBox(XmFontSelectorWidget fsw, Widget parent, 
Packit b099d7
		    ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Widget box, button;
Packit b099d7
    Cardinal num_largs, num_str, num_set;
Packit b099d7
    Arg *margs, largs[10];
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNorientation, XmHORIZONTAL); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNshowSash, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNfillOption, XmFillMajor); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNequalSize, True); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    box = XtCreateManagedWidget("choiceBox", xmButtonBoxWidgetClass, 
Packit b099d7
				parent, margs, num_args + num_largs);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNlabelString, XLFD_STRING(fsw));
Packit b099d7
    num_str = num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNset, True); num_set = num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNindicatorType, XmONE_OF_MANY); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNalignment, XmALIGNMENT_BEGINNING);
Packit b099d7
    num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    button = XtCreateManagedWidget("xlfdButton",
Packit b099d7
				   xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XmFontS_xlfd_toggle(fsw) = button;
Packit b099d7
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback, XlfdMode, (XtPointer) fsw);
Packit b099d7
Packit b099d7
    margs[num_str].value = (XtArgVal) OTHER_FONT_STRING(fsw);
Packit b099d7
    margs[num_set].value = (XtArgVal) False;
Packit b099d7
    button = XtCreateManagedWidget("otherButton", xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback, OtherMode, (XtPointer) fsw);
Packit b099d7
    XmFontS_other_toggle(fsw) = button;
Packit b099d7
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateResolution Box
Packit b099d7
 *	Description: Create the box to allow resolution choice(s).
Packit b099d7
 *	Arguments: fsw - the file selection widget.
Packit b099d7
 *                 parent - the parent of this area.
Packit b099d7
 *                 args, num_args - arguments to the font selector (filtered).
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateResolutionBox(XmFontSelectorWidget fsw, Widget parent, 
Packit b099d7
		    ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Widget box, button;
Packit b099d7
    Cardinal num_largs, num_str, num_set;
Packit b099d7
    Arg *margs, largs[10];
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNorientation, XmHORIZONTAL); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNshowSash, False); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNfillOption, XmFillMajor); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNequalSize, True); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    box = XtCreateManagedWidget("resolutionBox", xmButtonBoxWidgetClass, 
Packit b099d7
				parent, margs, num_args + num_largs);
Packit b099d7
    AddToXlfdSensitiveList(fsw, box);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNset, False); num_set = num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNlabelString, DPI75_STRING(fsw));
Packit b099d7
    num_str = num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNindicatorType, XmONE_OF_MANY); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNalignment, XmALIGNMENT_BEGINNING);
Packit b099d7
    num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
Packit b099d7
    margs[num_set].value = (XtArgVal) (XmFontS_font_info(fsw)->resolution == 75);
Packit b099d7
    button = XtCreateManagedWidget("dpi75Button", xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback, Toggle75DPI, fsw);
Packit b099d7
    XmFontS_dpi75(fsw) = button;
Packit b099d7
    
Packit b099d7
    margs[num_str].value = (XtArgVal) DPI100_STRING(fsw);
Packit b099d7
    margs[num_set].value = (XtArgVal) (XmFontS_font_info(fsw)->resolution == 100);
Packit b099d7
    button = XtCreateManagedWidget("dpi100Button", xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback, Toggle100DPI, fsw);
Packit b099d7
    XmFontS_dpi100(fsw) = button;
Packit b099d7
    
Packit b099d7
    margs[num_str].value = (XtArgVal) BOTH_STRING(fsw);
Packit b099d7
    margs[num_set].value = (XtArgVal) False;
Packit b099d7
    button = XtCreateManagedWidget("anyButton", xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback, ToggleBothDPI, fsw);
Packit b099d7
    XmFontS_dpiAny(fsw) = button;
Packit b099d7
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateOtherChoiceBox
Packit b099d7
 *	Description: Creates the box to allow other choices to be made.
Packit b099d7
 *	Arguments: fsw - the file selection widget.
Packit b099d7
 *                 parent - the parent of this area.
Packit b099d7
 *                 args, num_args - arguments to the font selector (filtered).
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateOtherChoiceBox(XmFontSelectorWidget fsw, Widget parent, 
Packit b099d7
		     ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Widget box, button;
Packit b099d7
    Cardinal num_largs, num_str, num_set;
Packit b099d7
    Arg *margs, largs[10];
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNorientation, XmHORIZONTAL); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNfillOption, XmFillMajor); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNequalSize, True); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNshowSash, False); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    box = XtCreateManagedWidget("otherChoiceBox", xmButtonBoxWidgetClass, 
Packit b099d7
				parent, margs, num_args + num_largs);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNset, False); num_set = num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNlabelString, SCALING_STRING(fsw));
Packit b099d7
    num_str = num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNindicatorType, XmN_OF_MANY); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNalignment, XmALIGNMENT_BEGINNING);
Packit b099d7
    num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
Packit b099d7
    margs[num_set].value = (XtArgVal) XmFontS_use_scaling(fsw);
Packit b099d7
    button = XtCreateManagedWidget("scalingButton", xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XmFontS_use_scaling_toggle(fsw) = button;
Packit b099d7
    AddToXlfdSensitiveList(fsw, button);
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback,
Packit b099d7
		  ToggleScaling, (XtPointer) fsw);
Packit b099d7
Packit b099d7
    margs[num_str].value = (XtArgVal) SHOW_NAME_STRING(fsw);
Packit b099d7
    margs[num_set].value = (XtArgVal) XmFontS_show_font_name(fsw);
Packit b099d7
    button = XtCreateManagedWidget("showNameButton",
Packit b099d7
				   xmToggleButtonWidgetClass, 
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XmFontS_show_font_toggle(fsw) = button;
Packit b099d7
Packit b099d7
    XtAddCallback(button, XmNvalueChangedCallback,
Packit b099d7
		  ToggleNameWindow, (XtPointer) fsw);
Packit b099d7
Packit b099d7
    XmFontS_option_menu(fsw) = CreateEncodingMenu(fsw, box, args, num_args);
Packit b099d7
    AddToXlfdSensitiveList(fsw, XmFontS_option_menu(fsw));
Packit b099d7
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateEncodingMenu
Packit b099d7
 *	Description: Creates the encoding option menu.
Packit b099d7
 *	Arguments: fsw - The font selector widget. 
Packit b099d7
 *                 parent - The parent of the option menu.
Packit b099d7
 *                 args - Args used to create the font selector.
Packit b099d7
 *	Returns: The Id of the menu created.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Widget
Packit b099d7
CreateEncodingMenu(XmFontSelectorWidget fsw,
Packit b099d7
		   Widget box, ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    Widget   omenu, history = NULL, pulldownMenu, button, menuShell,
Packit b099d7
             destroy_old_menu;
Packit b099d7
    Cardinal num_largs, button_label;
Packit b099d7
    int      current, i;
Packit b099d7
    Arg      *margs, largs[10];
Packit b099d7
    String   *encodings;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Create the option menu only the first time through, otherwise
Packit b099d7
     * simply blow away the encoding_menu_shell and recreate that.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    destroy_old_menu = XmFontS_encoding_menu_shell(fsw);
Packit b099d7
Packit b099d7
    if (destroy_old_menu == NULL)
Packit b099d7
    {
Packit b099d7
	num_largs = 0;
Packit b099d7
	XtSetArg(largs[num_largs],
Packit b099d7
		 XmNrowColumnType, XmMENU_OPTION); num_largs++;
Packit b099d7
	XtSetArg(largs[num_largs], 
Packit b099d7
		 XmNlabelString, ENCODING_ONLY_STRING(fsw)); num_largs++;
Packit b099d7
	XtSetArg(largs[num_largs], 
Packit b099d7
		 XmNoptionLabel, ENCODING_ONLY_STRING(fsw)); num_largs++;
Packit b099d7
	margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
	omenu = XtCreateWidget("encodingOptionMenu", xmRowColumnWidgetClass,
Packit b099d7
			       box, margs, num_args + num_largs);
Packit b099d7
	XtFree((XtPointer) margs);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	omenu = XmFontS_option_menu(fsw);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNwidth, 1); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNheight, 1); num_largs++;
Packit b099d7
    XtSetArg(largs[num_largs], XmNancestorSensitive, True); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
Packit b099d7
    menuShell = XtCreatePopupShell("menuShell", xmMenuShellWidgetClass,
Packit b099d7
				   box, margs, num_args + num_largs);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    XmFontS_encoding_menu_shell(fsw) = menuShell;
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNrowColumnType, XmMENU_PULLDOWN); num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
    pulldownMenu = XtCreateWidget("pulldownMenu",
Packit b099d7
				  xmRowColumnWidgetClass,
Packit b099d7
				  menuShell, margs, num_args + num_largs);
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNlabelString, ANY_STRING(fsw)); 
Packit b099d7
    button_label = num_largs++;
Packit b099d7
    margs = XtMergeArgLists(largs, num_largs, args, num_args);
Packit b099d7
Packit b099d7
    button = XtCreateManagedWidget("button_0", xmPushButtonWidgetClass,
Packit b099d7
				   pulldownMenu, margs,
Packit b099d7
				   num_args + num_largs);
Packit b099d7
    
Packit b099d7
    XtAddCallback(button,
Packit b099d7
		  XmNactivateCallback, ChangeEncoding, (XtPointer) 0);
Packit b099d7
Packit b099d7
    current = 0;
Packit b099d7
    for (i = 1, encodings = ENCODING_LIST(fsw) ;
Packit b099d7
	 *encodings != NULL; i++, encodings++) 
Packit b099d7
    { 
Packit b099d7
	char name[BUFSIZ];
Packit b099d7
	XmString label = XmStringCreateLocalized(*encodings);
Packit b099d7
Packit b099d7
	margs[button_label].value = (XtArgVal) label;
Packit b099d7
	sprintf(name, "button_%d", i);
Packit b099d7
	button = XtCreateManagedWidget(name, xmPushButtonWidgetClass,
Packit b099d7
				       pulldownMenu, margs,
Packit b099d7
				       num_args + num_largs);
Packit b099d7
	XmStringFree(label);
Packit b099d7
Packit b099d7
	XtAddCallback(button,
Packit b099d7
		      XmNactivateCallback, ChangeEncoding, (XtPointer) i);
Packit b099d7
Packit b099d7
	if (streq(*encodings, ENCODING_STRING(fsw)))
Packit b099d7
	{
Packit b099d7
	    current = i;
Packit b099d7
	    history = button;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XtFree((XtPointer) margs);
Packit b099d7
Packit b099d7
    num_largs = 0;
Packit b099d7
    XtSetArg(largs[num_largs], XmNsubMenuId, pulldownMenu); num_largs++;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * DMS - Fix 2/27/96
Packit b099d7
     */
Packit b099d7
    if (history)
Packit b099d7
    {
Packit b099d7
        XtSetArg(largs[num_largs], XmNmenuHistory, history); num_largs++;
Packit b099d7
    }
Packit b099d7
    XtSetValues(omenu, largs, num_largs);
Packit b099d7
Packit b099d7
    if (destroy_old_menu != NULL)
Packit b099d7
    {
Packit b099d7
	XtDestroyWidget(destroy_old_menu);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XtManageChild(omenu);
Packit b099d7
Packit b099d7
    XtFree(ENCODING_STRING(fsw));
Packit b099d7
    if (current == 0)
Packit b099d7
	ENCODING_STRING(fsw) = XtNewString(ANY_ENCODING);
Packit b099d7
    else
Packit b099d7
	ENCODING_STRING(fsw) = XtNewString(ENCODING_LIST(fsw)[current - 1]);
Packit b099d7
Packit b099d7
    return(omenu);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CheckEncoding
Packit b099d7
 *	Description: Checks the encoding of a font to see if it matches
Packit b099d7
 *                   the currently selected one, and returns true on a match.
Packit b099d7
 *	Arguments: fsw - The font selector widget.
Packit b099d7
 *                 fam - The family that we are checking.
Packit b099d7
 *	Returns: True if the encodings matchd, or any is selected.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
CheckEncoding(XmFontSelectorWidget fsw, FamilyInfo *fam)
Packit b099d7
{
Packit b099d7
    int i;
Packit b099d7
    XrmQuark curr;
Packit b099d7
Packit b099d7
    if (streq(ENCODING_STRING(fsw), ANY_ENCODING) || fam->encodings == NULL)
Packit b099d7
	return(TRUE);
Packit b099d7
Packit b099d7
    curr = XrmStringToQuark(ENCODING_STRING(fsw));
Packit b099d7
    for (i = 0; TRUE; i++)
Packit b099d7
    {
Packit b099d7
	if (fam->encodings[i] == curr)
Packit b099d7
	    return(True);
Packit b099d7
Packit b099d7
	if (fam->encodings[i] == 0 || i == fam->encoding_alloc)
Packit b099d7
	    return(False);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 *  Callbacks.
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*	Function Name: FamilyChanged
Packit b099d7
 *	Description: Called when the user changes the family
Packit b099d7
 *	Arguments: w - *** UNUSED ***.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 junk - *** UNUSED ***.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
FamilyChanged(Widget w, XtPointer fsw_ptr, XtPointer junk)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    String str = XmDropDownGetValue(w);
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
    XrmQuark familyq = XrmStringToQuark(str);
Packit b099d7
Packit b099d7
    if (cf->familyq == familyq)
Packit b099d7
	return;			/* no change. */
Packit b099d7
Packit b099d7
    cf->familyq = familyq;
Packit b099d7
Packit b099d7
    if (XmFontS_xlfd_mode(fsw)) {
Packit b099d7
	UpdateBoldItalic(fsw);
Packit b099d7
	UpdateFixedProportional(fsw);
Packit b099d7
	UpdateSizes(fsw);
Packit b099d7
	
Packit b099d7
	DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	DisplayCurrentFont(fsw, str);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XtFree((XtPointer) str);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: SizeChanged
Packit b099d7
 *	Description: Called when the user changes the Size
Packit b099d7
 *	Arguments: w - *** UNUSED ***.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 junk - *** UNUSED ***.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
SizeChanged(Widget w, XtPointer fsw_ptr, XtPointer junk)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    String str = XmDropDownGetValue(w);
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
    short size;
Packit b099d7
Packit b099d7
    if (cf->point_size == (size = atoi(str) * 10))
Packit b099d7
	{
Packit b099d7
	XtFree((char*)str);
Packit b099d7
	return;			/* no change. */
Packit b099d7
	}
Packit b099d7
Packit b099d7
    cf->point_size = size;
Packit b099d7
Packit b099d7
    UpdateFamilies(fsw);
Packit b099d7
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
    XtFree((XtPointer) str);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ChangeEncoding
Packit b099d7
 *	Description: Called when the user changes the encoding.
Packit b099d7
 *	Arguments: w - a widget child of the font sel.
Packit b099d7
 *                 data - pointer to index of the option button.
Packit b099d7
 *                 junk - ***unused
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
ChangeEncoding(Widget w, XtPointer data, XtPointer junk)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw;
Packit b099d7
    FontData *cf;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    for ( ; !XtIsSubclass(w, xmFontSelectorWidgetClass); w = XtParent(w)) {}
Packit b099d7
    fsw = (XmFontSelectorWidget) w;
Packit b099d7
    cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
Packit b099d7
    if ((int) data == 0)
Packit b099d7
	{
Packit b099d7
	XtFree(ENCODING_STRING(fsw));
Packit b099d7
	ENCODING_STRING(fsw) = XtNewString(ANY_ENCODING);
Packit b099d7
	}
Packit b099d7
    else
Packit b099d7
	{
Packit b099d7
	XtFree(ENCODING_STRING(fsw));
Packit b099d7
	ENCODING_STRING(fsw) = XtNewString(ENCODING_LIST(fsw)[(int) data - 1]);
Packit b099d7
	}
Packit b099d7
Packit b099d7
    UpdateFamilies(fsw);
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToggleScaling
Packit b099d7
 *	Description: Called when the user toggles the Font Scaling button.
Packit b099d7
 *	Arguments: w - *** UNUSED ***.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
ToggleScaling(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    FamilyInfo *family;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
    LongFlag map;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    if ((family = FindFamily(cf->familyq, XmFontS_font_info(fsw)->family_info,
Packit b099d7
			     XmFontS_font_info(fsw)->num_families)) == NULL) 
Packit b099d7
    {
Packit b099d7
	String params[1];
Packit b099d7
	Cardinal num = 1;
Packit b099d7
Packit b099d7
	params[0] = XrmQuarkToString(cf->familyq);
Packit b099d7
	dbg(); _XmWarningMsg((Widget) fsw, XmNcouldNotFindFamilyData,
Packit b099d7
		XmNcouldNotFindFamilyDataMsg, params, num);
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XmFontS_use_scaling(fsw) = info->set;
Packit b099d7
    if (!info->set) {
Packit b099d7
	Boolean map_bad = (map = SizeMapping(cf->point_size)) == 0;
Packit b099d7
	Boolean bad_75 = (CheckFlag(XmFontS_user_state(fsw), DPI_75) && 
Packit b099d7
			  !CheckLongFlag(family->sizes_75, map));
Packit b099d7
	Boolean bad_100 = (CheckFlag(XmFontS_user_state(fsw), DPI_100) && 
Packit b099d7
			   !CheckLongFlag(family->sizes_100, map));
Packit b099d7
Packit b099d7
	if (map_bad || bad_75 || (bad_100 && (cf->point_size != 0))) {
Packit b099d7
	    String temp = _XmGetMBStringFromXmString(ANY_STRING(fsw));
Packit b099d7
Packit b099d7
	    cf->point_size = 0;	/* Reset to Any. */
Packit b099d7
	    SetComboValue(XmFontS_size_box(fsw), temp);
Packit b099d7
	    XtFree((XtPointer) temp);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    UpdateSizes(fsw);
Packit b099d7
    UpdateFamilies(fsw);
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToggleBold
Packit b099d7
 *	Description: Called when the user toggles the bold button.
Packit b099d7
 *	Arguments: w - *** UNUSED ***.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
ToggleBold(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    FamilyInfo *family;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    if ((family = FindFamily(cf->familyq, XmFontS_font_info(fsw)->family_info,
Packit b099d7
			     XmFontS_font_info(fsw)->num_families)) == NULL) 
Packit b099d7
    {
Packit b099d7
	String params[1];
Packit b099d7
	Cardinal num = 1;
Packit b099d7
Packit b099d7
	params[0] = XrmQuarkToString(cf->familyq);
Packit b099d7
	dbg(); _XmWarningMsg((Widget) fsw, XmNcouldNotFindFamilyData,
Packit b099d7
		XmNcouldNotFindFamilyDataMsg, params, num);
Packit b099d7
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (info->set) 
Packit b099d7
	cf->weightq = family->bold_nameq;
Packit b099d7
    else
Packit b099d7
	cf->weightq = family->medium_nameq;
Packit b099d7
Packit b099d7
    SetFlag(&(cf->state), BOLD, info->set);
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), BOLD, info->set);
Packit b099d7
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToggleItalic
Packit b099d7
 *	Description: Called when the user toggles the italic button.
Packit b099d7
 *	Arguments: w - *** UNUSED ***.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
ToggleItalic(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    FamilyInfo *family;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    if ((family = FindFamily(cf->familyq, XmFontS_font_info(fsw)->family_info,
Packit b099d7
			     XmFontS_font_info(fsw)->num_families)) == NULL) 
Packit b099d7
    {
Packit b099d7
	String params[1];
Packit b099d7
	Cardinal num = 1;
Packit b099d7
Packit b099d7
	params[0] = XrmQuarkToString(cf->familyq);
Packit b099d7
	dbg(); _XmWarningMsg((Widget) fsw, XmNcouldNotFindFamilyData,
Packit b099d7
		XmNcouldNotFindFamilyDataMsg, params, num);
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (info->set) 
Packit b099d7
	strcpy(cf->slant, XrmQuarkToString(family->italic_nameq));
Packit b099d7
    else
Packit b099d7
	strcpy(cf->slant, XrmQuarkToString(family->upright_nameq));
Packit b099d7
Packit b099d7
    SetFlag(&(cf->state), ITALIC, info->set);
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), ITALIC, info->set);
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToggleMiddlePane
Packit b099d7
 *	Description: toggles whether or not the middle pane is shown
Packit b099d7
 *	Arguments: w - *** UNUSED ***.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
ToggleMiddlePane(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
Packit b099d7
    if (info->set) 
Packit b099d7
	XtManageChild(XmFontS_middle_pane(fsw));
Packit b099d7
    else
Packit b099d7
	XtUnmanageChild(XmFontS_middle_pane(fsw));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToggleNameWindow
Packit b099d7
 *	Description: toggles whether or not the middle pane is shown
Packit b099d7
 *	Arguments: w - *** UNUSED ***.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
ToggleNameWindow(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
Packit b099d7
    XmFontS_show_font_name(fsw) = info->set;
Packit b099d7
    if (info->set) {
Packit b099d7
	XtManageChild(XmFontS_name_label(fsw));
Packit b099d7
	
Packit b099d7
	if (XmFontS_xlfd_mode(fsw)) {
Packit b099d7
	    DisplayCurrentFont(fsw,
Packit b099d7
			       BuildFontString(fsw,
Packit b099d7
					       XmFontS_font_info(fsw)->current_font,
Packit b099d7
					       buf, BUFSIZ));
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    String str = XmDropDownGetValue(XmFontS_family_box(fsw));
Packit b099d7
	    DisplayCurrentFont(fsw, str);
Packit b099d7
	    XtFree((XtPointer) str);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
	XtUnmanageChild(XmFontS_name_label(fsw));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: Toggle75DPI
Packit b099d7
 *	Description: Activated when the 75DPI button is toggled.
Packit b099d7
 *                 w - the toggle button widget selected.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
Toggle75DPI(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    
Packit b099d7
    UnsetSiblings(w);
Packit b099d7
Packit b099d7
    if (!info->set) 
Packit b099d7
	return;			/* Do nothing on an unset. */
Packit b099d7
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), DPI_75, True);
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), DPI_100, False);
Packit b099d7
    cf->resolution_x = cf->resolution_y = 75;
Packit b099d7
Packit b099d7
    UpdateFamilies(fsw);
Packit b099d7
    UpdateSizes(fsw);
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: Toggle100DPI
Packit b099d7
 *	Description: Activated when the 100DPI button is toggled.
Packit b099d7
 *                 w - the toggle button widget selected.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
Toggle100DPI(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    
Packit b099d7
    UnsetSiblings(w);
Packit b099d7
Packit b099d7
    if (!info->set) 
Packit b099d7
	return;			/* Do nothing on an unset. */
Packit b099d7
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), DPI_75, False);
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), DPI_100, True);
Packit b099d7
Packit b099d7
    cf->resolution_x = cf->resolution_y = 100;
Packit b099d7
    
Packit b099d7
    UpdateFamilies(fsw);
Packit b099d7
    UpdateSizes(fsw);
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToggleBothDPI
Packit b099d7
 *	Description: Activated when the Both DPI button is toggled.
Packit b099d7
 *                 w - the toggle button widget selected.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ToggleBothDPI(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    
Packit b099d7
    UnsetSiblings(w);
Packit b099d7
Packit b099d7
    if (!info->set) 
Packit b099d7
	return;			/* Do nothing on an unset. */
Packit b099d7
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), DPI_75 | DPI_100, True);
Packit b099d7
    cf->resolution_x = cf->resolution_y = 0; /* 0 means any */
Packit b099d7
Packit b099d7
    UpdateFamilies(fsw);
Packit b099d7
    UpdateSizes(fsw);
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToggleProportional
Packit b099d7
 *	Description: Activated when the Proportional button is toggled.
Packit b099d7
 *                 w - the toggle button widget selected.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ToggleProportional(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    
Packit b099d7
    UnsetSiblings(w);
Packit b099d7
Packit b099d7
    if (!info->set) 
Packit b099d7
	return;			/* Do nothing on an unset. */
Packit b099d7
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), USER_PROPORTIONAL, True);
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), USER_FIXED, False);
Packit b099d7
Packit b099d7
    UpdateFixedProportional(fsw);
Packit b099d7
Packit b099d7
    UpdateFamilies(fsw);
Packit b099d7
    UpdateSizes(fsw);
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToggleFixed
Packit b099d7
 *	Description: Activated when the Fixed button is toggled.
Packit b099d7
 *                 w - the toggle button widget selected.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ToggleFixed(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    
Packit b099d7
    UnsetSiblings(w);
Packit b099d7
Packit b099d7
    if (!info->set) 
Packit b099d7
	return;			/* Do nothing on an unset. */
Packit b099d7
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), USER_FIXED, True);
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), USER_PROPORTIONAL, False);
Packit b099d7
Packit b099d7
    UpdateFixedProportional(fsw);
Packit b099d7
    UpdateFamilies(fsw);
Packit b099d7
    UpdateSizes(fsw);
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToggleBothSpacing
Packit b099d7
 *	Description: Activated when the Both (any) Spacing button is toggled.
Packit b099d7
 *                 w - the toggle button widget selected.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ToggleBothSpacing(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    FontData * cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
    char buf[BUFSIZ];
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    
Packit b099d7
    UnsetSiblings(w);
Packit b099d7
Packit b099d7
    if (!info->set) 
Packit b099d7
	return;			/* Do nothing on an unset. */
Packit b099d7
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), USER_FIXED | USER_PROPORTIONAL, True);
Packit b099d7
Packit b099d7
    UpdateFixedProportional(fsw);
Packit b099d7
    UpdateFamilies(fsw);
Packit b099d7
    UpdateSizes(fsw);
Packit b099d7
    DisplayCurrentFont(fsw, BuildFontString(fsw, cf, buf, BUFSIZ));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: XlfdMode
Packit b099d7
 *	Description: Called when the Xlfd Toggle is selected.
Packit b099d7
 *                 w - the toggle button widget selected.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
XlfdMode(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    
Packit b099d7
    UnsetSiblings(w);
Packit b099d7
Packit b099d7
    if (!info->set) 
Packit b099d7
	return;			/* Do nothing on an unset. */
Packit b099d7
Packit b099d7
    ChangeMode(fsw, True, True);	/* Set to Xlfd Mode. */
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: OtherMode
Packit b099d7
 *	Description: Called when the Other Toggle is selected.
Packit b099d7
 *                 w - the toggle button widget selected.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - the toggle button data.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
OtherMode(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
    XmToggleButtonCallbackStruct *info;
Packit b099d7
Packit b099d7
    info = (XmToggleButtonCallbackStruct *) data;
Packit b099d7
    
Packit b099d7
    UnsetSiblings(w);
Packit b099d7
Packit b099d7
    if (!info->set) 
Packit b099d7
	return;			/* Do nothing on an unset. */
Packit b099d7
Packit b099d7
    ChangeMode(fsw, False, True);	/* Set to other Mode */
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: RemoveUserError
Packit b099d7
 *	Description: Removes a user error from the text widget.
Packit b099d7
 *                 w - the text widget.
Packit b099d7
 *                 fsw_ptr - pointer to the font selector widget.
Packit b099d7
 *                 data - *** UNUSED ***.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
RemoveUserError(Widget w, XtPointer fsw_ptr, XtPointer data)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) fsw_ptr;
Packit b099d7
Packit b099d7
    if (XmFontS_current_text(fsw) == NULL)
Packit b099d7
	return;
Packit b099d7
Packit b099d7
    DisplayUserError(fsw, NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 * Semi-public routines. 
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*      Function Name: Class Initlialize
Packit b099d7
 *      Description:   Initializes class-specific data (offsets)
Packit b099d7
 *      Arguments:     none
Packit b099d7
 *      Returns:       nothing
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
ClassInitialize()
Packit b099d7
{
Packit b099d7
  /* do nothing */
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * ClassPartInitialize sets up the fast subclassing for the widget.
Packit b099d7
 */
Packit b099d7
static void 
Packit b099d7
#ifdef _NO_PROTO
Packit b099d7
ClassPartInitialize(w_class)
Packit b099d7
        WidgetClass w_class ;
Packit b099d7
#else
Packit b099d7
ClassPartInitialize(WidgetClass w_class)
Packit b099d7
#endif /* _NO_PROTO */
Packit b099d7
{
Packit b099d7
    _XmFastSubclassInit (w_class, XmFONTSELECTOR_BIT);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*	Function Name: Initialize
Packit b099d7
 *	Description:   Called to initialize information specific
Packit b099d7
 *                     to this widget.
Packit b099d7
 *	Arguments:     req - what was originally requested.
Packit b099d7
 *                     set - what will be created (our superclassed have
Packit b099d7
 *                           already mucked with this)
Packit b099d7
 *                     args, num_args - The arguments passed to 
Packit b099d7
 *                                      the creation call.
Packit b099d7
 *	Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
Initialize(Widget request, Widget set, ArgList args, Cardinal * num_args)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget)set;
Packit b099d7
    ArgList f_args;
Packit b099d7
    Cardinal f_num_args;
Packit b099d7
Packit b099d7
    XmFontS_user_state(fsw) = 0;	/* Initialize user state to 0. */
Packit b099d7
    XmFontS_xlfd_mode(fsw) = True;	/* We start in Xlfd Mode. */
Packit b099d7
    XmFontS_font_info(fsw) = LoadFontInfo(fsw);
Packit b099d7
    XmFontS_current_text(fsw) = NULL;
Packit b099d7
    XmFontS_old_fontdata(fsw) = NULL;
Packit b099d7
    XmFontS_old_fontlist(fsw) = NULL;
Packit b099d7
    XmFontS_encoding_menu_shell(fsw) = NULL;
Packit b099d7
Packit b099d7
    XmFontS_xlfd_only(fsw) = XmFontS_xlfd_sensitive(fsw) = NULL;
Packit b099d7
    XmFontS_num_xlfd_only(fsw) = XmFontS_alloc_xlfd_only(fsw) = 0;
Packit b099d7
    XmFontS_num_xlfd_sensitive(fsw) = XmFontS_alloc_xlfd_sensitive(fsw) = 0;
Packit b099d7
Packit b099d7
    XmFontS_get_font(fsw) = (String) XtMalloc(sizeof(char) * GET_FONT_SIZE);
Packit b099d7
Packit b099d7
    /* duplicate strings so that user can query them later */
Packit b099d7
    ANY_STRING(fsw)		= XmStringCopy(ANY_STRING(fsw)); 
Packit b099d7
    BOLD_STRING(fsw)		= XmStringCopy(BOLD_STRING(fsw)); 
Packit b099d7
    BOTH_STRING(fsw)		= XmStringCopy(BOTH_STRING(fsw)); 
Packit b099d7
    DPI100_STRING(fsw)		= XmStringCopy(DPI100_STRING(fsw)); 
Packit b099d7
    DPI75_STRING(fsw)		= XmStringCopy(DPI75_STRING(fsw)); 
Packit b099d7
    ENCODING_ONLY_STRING(fsw)	= XmStringCopy(ENCODING_ONLY_STRING(fsw)); 
Packit b099d7
    FAMILY_STRING(fsw)		= XmStringCopy(FAMILY_STRING(fsw)); 
Packit b099d7
    ITALIC_STRING(fsw)		= XmStringCopy(ITALIC_STRING(fsw)); 
Packit b099d7
    LOWER_ANY_STRING(fsw)	= XmStringCopy(LOWER_ANY_STRING(fsw)); 
Packit b099d7
    MONO_SPACE_STRING(fsw)	= XmStringCopy(MONO_SPACE_STRING(fsw)); 
Packit b099d7
    OPTION_STRING(fsw)		= XmStringCopy(OPTION_STRING(fsw)); 
Packit b099d7
    OTHER_FONT_STRING(fsw)	= XmStringCopy(OTHER_FONT_STRING(fsw)); 
Packit b099d7
    PROPORTIONAL_STRING(fsw)	= XmStringCopy(PROPORTIONAL_STRING(fsw)); 
Packit b099d7
    SAMPLE_TEXT(fsw)		= XmStringCopy(SAMPLE_TEXT(fsw)); 
Packit b099d7
    SCALING_STRING(fsw)		= XmStringCopy(SCALING_STRING(fsw)); 
Packit b099d7
    SHOW_NAME_STRING(fsw)	= XmStringCopy(SHOW_NAME_STRING(fsw)); 
Packit b099d7
    SIZE_STRING(fsw)		= XmStringCopy(SIZE_STRING(fsw)); 
Packit b099d7
    XLFD_STRING(fsw)		= XmStringCopy(XLFD_STRING(fsw)); 
Packit b099d7
Packit b099d7
    ENCODING_STRING(fsw)	= XtNewString(ENCODING_STRING(fsw)); 
Packit b099d7
    /* XmFontS_current_font(fsw) handled internally */
Packit b099d7
Packit b099d7
    {
Packit b099d7
	int i;
Packit b099d7
	String *encodings = ENCODING_LIST(fsw);
Packit b099d7
	String *newList;
Packit b099d7
	for (i=0, encodings = ENCODING_LIST(fsw); *encodings != NULL; i++, encodings++) 
Packit b099d7
		i++;
Packit b099d7
	i++;
Packit b099d7
	newList = (String*)XtMalloc(sizeof(String) * i);
Packit b099d7
	for (i=0, encodings = ENCODING_LIST(fsw); *encodings != NULL; i++, encodings++) 
Packit b099d7
		newList[i] = XtNewString(*encodings);
Packit b099d7
	newList[i] = NULL;
Packit b099d7
	ENCODING_LIST(fsw) = newList;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    _XmFilterArgs(args, *num_args,
Packit b099d7
		  xm_std_constraint_filter, &f_args, &f_num_args);
Packit b099d7
    CreateChildren(fsw, f_args, f_num_args);
Packit b099d7
    XtFree((XtPointer) f_args);
Packit b099d7
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), DPI_75,
Packit b099d7
	    (XmFontS_font_info(fsw)->resolution == 75));
Packit b099d7
Packit b099d7
    SetFlag(&(XmFontS_user_state(fsw)), DPI_100,
Packit b099d7
	    (XmFontS_font_info(fsw)->resolution == 100));
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Load default information into the current font.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    XmFontS_font_info(fsw)->current_font = (FontData *) XtMalloc(sizeof(FontData));
Packit b099d7
    SetDisplayedFont(fsw, XmFontS_current_font(fsw));
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: Destroy
Packit b099d7
 *	Description: Called when the widget is destroyed, cleans up.
Packit b099d7
 *	Arguments: w - the widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
Destroy(Widget w)
Packit b099d7
{
Packit b099d7
    register int i, num;
Packit b099d7
    register String *ptr;
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget)w;
Packit b099d7
Packit b099d7
    if (XmFontS_old_fontdata(fsw) != NULL) {
Packit b099d7
	XFreeFont(XtDisplay(w), XmFontS_old_fontdata(fsw));
Packit b099d7
	XmFontListFree(XmFontS_old_fontlist(fsw));
Packit b099d7
    }
Packit b099d7
Packit b099d7
    num = XmFontS_font_info(fsw)->num_others;
Packit b099d7
    ptr = XmFontS_font_info(fsw)->others;
Packit b099d7
    for (i = 0; i < num; i++, ptr++) 
Packit b099d7
	XtFree(*ptr);
Packit b099d7
Packit b099d7
    for (i = 0; i < XmFontS_font_info(fsw)->num_families; i++) 
Packit b099d7
	XtFree((char*)XmFontS_font_info(fsw)->family_info[i].encodings);
Packit b099d7
    
Packit b099d7
    XtFree((XtPointer) XmFontS_get_font(fsw));
Packit b099d7
    XtFree((XtPointer) XmFontS_xlfd_only(fsw));
Packit b099d7
    XtFree((XtPointer) XmFontS_xlfd_sensitive(fsw));
Packit b099d7
    XtFree((XtPointer) XmFontS_font_info(fsw)->others);
Packit b099d7
    XtFree((XtPointer) XmFontS_font_info(fsw)->family_info);
Packit b099d7
    XtFree((XtPointer) XmFontS_font_info(fsw)->current_font);
Packit b099d7
    XtFree((XtPointer) XmFontS_font_info(fsw));
Packit b099d7
Packit b099d7
Packit b099d7
    XmStringFree(ANY_STRING(fsw));
Packit b099d7
    XmStringFree(BOLD_STRING(fsw));
Packit b099d7
    XmStringFree(BOTH_STRING(fsw));
Packit b099d7
    XmStringFree(DPI100_STRING(fsw));
Packit b099d7
    XmStringFree(DPI75_STRING(fsw));
Packit b099d7
    XmStringFree(ENCODING_ONLY_STRING(fsw));
Packit b099d7
    XmStringFree(FAMILY_STRING(fsw));
Packit b099d7
    XmStringFree(ITALIC_STRING(fsw));
Packit b099d7
    XmStringFree(LOWER_ANY_STRING(fsw));
Packit b099d7
    XmStringFree(MONO_SPACE_STRING(fsw));
Packit b099d7
    XmStringFree(OPTION_STRING(fsw));
Packit b099d7
    XmStringFree(OTHER_FONT_STRING(fsw));
Packit b099d7
    XmStringFree(PROPORTIONAL_STRING(fsw));
Packit b099d7
    XmStringFree(SAMPLE_TEXT(fsw));
Packit b099d7
    XmStringFree(SCALING_STRING(fsw));
Packit b099d7
    XmStringFree(SHOW_NAME_STRING(fsw));
Packit b099d7
    XmStringFree(SIZE_STRING(fsw));
Packit b099d7
    XmStringFree(XLFD_STRING(fsw));
Packit b099d7
Packit b099d7
    XtFree(ENCODING_STRING(fsw));
Packit b099d7
    /* current font handled internally */
Packit b099d7
Packit b099d7
    {
Packit b099d7
	String *encodings;
Packit b099d7
	for (encodings = ENCODING_LIST(fsw); *encodings != NULL; i++, encodings++) 
Packit b099d7
		XtFree(*encodings);
Packit b099d7
	XtFree((char*)ENCODING_LIST(fsw));
Packit b099d7
    }
Packit b099d7
}    
Packit b099d7
Packit b099d7
/*	Function Name: SetValues
Packit b099d7
 *	Description:   Called when some widget data needs to be modified on-
Packit b099d7
 *                     the-fly.
Packit b099d7
 *	Arguments:     old - the current (old) widget values.
Packit b099d7
 *                     request - before superclassed have changed things.
Packit b099d7
 *                     set - what will acutally be the new values. 
Packit b099d7
 *                     args, num_args - The arguments passed to the set
Packit b099d7
 *                                      values call.
Packit b099d7
 *	Returns:       none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean 
Packit b099d7
SetValues(Widget old, Widget request, Widget set,
Packit b099d7
	  ArgList args, Cardinal * num_args)
Packit b099d7
{
Packit b099d7
    Arg largs[10];
Packit b099d7
    Cardinal num_largs, i;
Packit b099d7
    XmFontSelectorWidget old_fsw = (XmFontSelectorWidget) old;
Packit b099d7
    XmFontSelectorWidget set_fsw = (XmFontSelectorWidget) set;
Packit b099d7
    Boolean new_encoding_list = False;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Pass argument list through to all children.
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    {
Packit b099d7
	ArgList f_args;
Packit b099d7
	Cardinal f_num_args;
Packit b099d7
Packit b099d7
	_XmFilterArgs(args, *num_args, 
Packit b099d7
		      xm_std_constraint_filter, &f_args, &f_num_args);
Packit b099d7
	_XmSetValuesOnChildren(set, f_args, f_num_args);
Packit b099d7
	XtFree((XtPointer) f_args);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    for (i = 0; i < *num_args; i++)
Packit b099d7
    {
Packit b099d7
	if (streq(args[i].name, XmNencodingList))
Packit b099d7
	    new_encoding_list = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * ||| Protect against any of the strings being changed.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (XmFontS_current_font(old_fsw) != XmFontS_current_font(set_fsw)) {
Packit b099d7
	SetDisplayedFont(set_fsw, XmFontS_current_font(set_fsw));
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (XmFontS_show_font_name(old_fsw) != XmFontS_show_font_name(set_fsw)) {
Packit b099d7
	XmToggleButtonSetState(XmFontS_show_font_toggle(set_fsw), 
Packit b099d7
			       XmFontS_show_font_name(set_fsw), True);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (XmFontS_use_scaling(old_fsw) != XmFontS_use_scaling(set_fsw)) {
Packit b099d7
	XmToggleButtonSetState(XmFontS_use_scaling_toggle(set_fsw), 
Packit b099d7
			       XmFontS_use_scaling(set_fsw), True);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (new_encoding_list)
Packit b099d7
    {
Packit b099d7
	Widget parent = XtParent(XmFontS_option_menu(set_fsw));
Packit b099d7
	XmFontS_option_menu(set_fsw) = CreateEncodingMenu(set_fsw, 
Packit b099d7
						     parent, NULL, 0);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* if new_encoding_list is true, then CreateEncodingMenu has already
Packit b099d7
    ** freed and recreated the ENCODING_STRING, so avoid redoing it
Packit b099d7
    */
Packit b099d7
    if (new_encoding_list ||
Packit b099d7
	(((ENCODING_STRING(old_fsw) != NULL) && (ENCODING_STRING(set_fsw) != NULL))
Packit b099d7
	&& !streq(ENCODING_STRING(old_fsw), ENCODING_STRING(set_fsw)))
Packit b099d7
	)
Packit b099d7
    {
Packit b099d7
	char buf[BUFSIZ];
Packit b099d7
	int current, i;
Packit b099d7
	String *encodings = ENCODING_LIST(set_fsw);
Packit b099d7
	Widget button;
Packit b099d7
Packit b099d7
	if (!new_encoding_list)
Packit b099d7
	{
Packit b099d7
		XtFree(ENCODING_STRING(old_fsw));
Packit b099d7
		ENCODING_STRING(set_fsw) = XtNewString(ENCODING_STRING(set_fsw));
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/* some of this code is probably a duplicate of CreateEncodingMenu */
Packit b099d7
	for (current = 0, i = 1 ; *encodings != NULL; i++, encodings++) 
Packit b099d7
	{ 
Packit b099d7
	    /*
Packit b099d7
	     * If the default encoding matches this one then make this
Packit b099d7
	     * the current item in the option menu.
Packit b099d7
	     */
Packit b099d7
	    if (strcmp(*encodings, ENCODING_STRING(set_fsw)) == 0)
Packit b099d7
		current = i;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	sprintf(buf, "*button_%d", current);
Packit b099d7
	if ((button = 
Packit b099d7
	     XtNameToWidget(XtParent(XmFontS_option_menu(set_fsw)), buf)) != NULL)
Packit b099d7
	{
Packit b099d7
	    num_largs = 0;
Packit b099d7
	    XtSetArg(largs[num_largs], XmNmenuHistory, button); num_largs++;
Packit b099d7
	    XtSetValues(XmFontS_option_menu(set_fsw), largs, num_largs);
Packit b099d7
	    ChangeEncoding((Widget) set_fsw, (XtPointer) current, NULL);
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /* ||| ERROR. */
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (XmFontS_text_rows(old_fsw) != XmFontS_text_rows(set_fsw)) {
Packit b099d7
	num_largs = 0;
Packit b099d7
	XtSetArg(largs[num_largs], XmNrows, XmFontS_text_rows(set_fsw));num_largs++;
Packit b099d7
	XtSetValues(XmFontS_text(set_fsw), largs, num_largs);
Packit b099d7
    }
Packit b099d7
Packit b099d7
	{
Packit b099d7
	Boolean reset = False;
Packit b099d7
#define DoCheck(old_one,new_one)	{ reset = False; if (old_one != new_one) { XmStringFree(old_one); new_one = XmStringCopy(new_one); reset = True; } }
Packit b099d7
Packit b099d7
	DoCheck( ANY_STRING(old_fsw), ANY_STRING(set_fsw)); /* PUNT! or else we need to check if on-screen right now */
Packit b099d7
	DoCheck( BOLD_STRING(old_fsw), BOLD_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_bold_toggle(set_fsw), XmNlabelString, BOLD_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( BOTH_STRING(old_fsw), BOTH_STRING(set_fsw)); if (reset) { XtVaSetValues( XmFontS_dpiAny(set_fsw), XmNlabelString, BOTH_STRING(set_fsw), NULL); XtVaSetValues( XmFontS_any_spacing(set_fsw), XmNlabelString, BOTH_STRING(set_fsw), NULL); }
Packit b099d7
	DoCheck( DPI100_STRING(old_fsw), DPI100_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_dpi100(set_fsw), XmNlabelString, DPI100_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( DPI75_STRING(old_fsw), DPI75_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_dpi75(set_fsw), XmNlabelString, DPI75_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( ENCODING_ONLY_STRING(old_fsw), ENCODING_ONLY_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_option_menu(set_fsw), XmNlabelString, ENCODING_ONLY_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( FAMILY_STRING(old_fsw), FAMILY_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_family_box(set_fsw), XmNlabelString, FAMILY_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( ITALIC_STRING(old_fsw), ITALIC_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_italic_toggle(set_fsw), XmNlabelString, ITALIC_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( LOWER_ANY_STRING(old_fsw), LOWER_ANY_STRING(set_fsw));		/* PUNT! or else we need to check if on-screen right now */
Packit b099d7
	DoCheck( MONO_SPACE_STRING(old_fsw), MONO_SPACE_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_monospace(set_fsw), XmNlabelString, MONO_SPACE_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( OPTION_STRING(old_fsw), OPTION_STRING(set_fsw)); if (reset) XtVaSetValues( XtNameToWidget((Widget)set_fsw, "*optionButton"), XmNlabelString, OPTION_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( OTHER_FONT_STRING(old_fsw), OTHER_FONT_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_other_toggle(set_fsw), XmNlabelString, OTHER_FONT_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( PROPORTIONAL_STRING(old_fsw), PROPORTIONAL_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_proportional(set_fsw), XmNlabelString, PROPORTIONAL_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( SAMPLE_TEXT(old_fsw), SAMPLE_TEXT(set_fsw)); 
Packit b099d7
		if (reset) 
Packit b099d7
		{
Packit b099d7
		char * temp_txt = _XmGetMBStringFromXmString(SAMPLE_TEXT(set_fsw));
Packit b099d7
		XtVaSetValues( XmFontS_text(set_fsw), XmNlabelString, temp_txt, NULL);
Packit b099d7
		XtFree(temp_txt);
Packit b099d7
		}
Packit b099d7
	DoCheck( SCALING_STRING(old_fsw), SCALING_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_use_scaling_toggle(set_fsw), XmNlabelString, SCALING_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( SHOW_NAME_STRING(old_fsw), SHOW_NAME_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_show_font_toggle(set_fsw), XmNlabelString, SHOW_NAME_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( SIZE_STRING(old_fsw), SIZE_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_size_box(set_fsw), XmNlabelString, SIZE_STRING(set_fsw), NULL);
Packit b099d7
	DoCheck( XLFD_STRING(old_fsw), XLFD_STRING(set_fsw)); if (reset) XtVaSetValues( XmFontS_xlfd_toggle(set_fsw), XmNlabelString, XLFD_STRING(set_fsw), NULL);
Packit b099d7
         
Packit b099d7
#undef DoCheck
Packit b099d7
	}
Packit b099d7
Packit b099d7
    return (False);
Packit b099d7
} /* SetValues */
Packit b099d7
Packit b099d7
/*	Function Name: GetValuesHook
Packit b099d7
 *	Description:   Packages up the value of the current font.
Packit b099d7
 *	Arguments:     w - The widget.
Packit b099d7
 *                     args, num_args - The arguments passed to the get
Packit b099d7
 *                                      values call.
Packit b099d7
 *	Returns:       none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
GetValuesHook(Widget w, ArgList args, Cardinal * num_args)
Packit b099d7
{
Packit b099d7
    XmFontSelectorWidget fsw = (XmFontSelectorWidget) w;
Packit b099d7
    FontData * cf;
Packit b099d7
    String *str_ptr;
Packit b099d7
    register int i;
Packit b099d7
Packit b099d7
    for (i = 0; i < *num_args; i++) {
Packit b099d7
	if (streq(args[i].name, XmNcurrentFont))
Packit b099d7
	{
Packit b099d7
		cf = XmFontS_font_info(fsw)->current_font;
Packit b099d7
Packit b099d7
		str_ptr = (String *) args[i].value;
Packit b099d7
		if (XmFontS_xlfd_mode(fsw)) {
Packit b099d7
		    BuildFontString(fsw, cf, XmFontS_get_font(fsw), GET_FONT_SIZE);
Packit b099d7
		    *str_ptr = XmFontS_get_font(fsw); 
Packit b099d7
		}
Packit b099d7
		else {
Packit b099d7
		    *str_ptr = XrmQuarkToString(cf->familyq);
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
	else if (streq(args[i].name, XmNanyString))		*(XmString*)args[i].value = XmStringCopy(ANY_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNbothString))		*(XmString*)args[i].value = XmStringCopy(BOLD_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNboldString))		*(XmString*)args[i].value = XmStringCopy(BOTH_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmN100DPIstring))		*(XmString*)args[i].value = XmStringCopy(DPI100_STRING(fsw)); 
Packit b099d7
	else if (streq(args[i].name, XmN75DPIstring))		*(XmString*)args[i].value = XmStringCopy(DPI75_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNencodingString))	*(XmString*)args[i].value = XmStringCopy(ENCODING_ONLY_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNfamilyString))		*(XmString*)args[i].value = XmStringCopy(FAMILY_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNitalicString))		*(XmString*)args[i].value = XmStringCopy(ITALIC_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNanyLowerString))	*(XmString*)args[i].value = XmStringCopy(LOWER_ANY_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNmonoSpaceString))	*(XmString*)args[i].value = XmStringCopy(MONO_SPACE_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNoptionString))		*(XmString*)args[i].value = XmStringCopy(OPTION_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNotherString))		*(XmString*)args[i].value = XmStringCopy(OTHER_FONT_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNpropSpaceString))	*(XmString*)args[i].value = XmStringCopy(PROPORTIONAL_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNsampleText))		*(XmString*)args[i].value = XmStringCopy(SAMPLE_TEXT(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNscalingString))		*(XmString*)args[i].value = XmStringCopy(SCALING_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNshowNameString))	*(XmString*)args[i].value = XmStringCopy(SHOW_NAME_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNsizeString))		*(XmString*)args[i].value = XmStringCopy(SIZE_STRING(fsw));
Packit b099d7
	else if (streq(args[i].name, XmNxlfdString))		*(XmString*)args[i].value = XmStringCopy(XLFD_STRING(fsw));
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 * Public routines. 
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*	Function Name: XmCreateFontSelector
Packit b099d7
 *	Description: Creation Routine for UIL and ADA.
Packit b099d7
 *	Arguments: parent - the parent widget.
Packit b099d7
 *                 name - the name of the widget.
Packit b099d7
 *                 args, num_args - the number and list of args.
Packit b099d7
 *	Returns: The created widget.
Packit b099d7
 */
Packit b099d7
Packit b099d7
Widget
Packit b099d7
XmCreateFontSelector(Widget parent, String name,
Packit b099d7
		     ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    return(XtCreateWidget(name, xmFontSelectorWidgetClass,
Packit b099d7
			  parent, args, num_args));
Packit b099d7
}