#include <stdio.h>
#include <ctype.h>
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#include <X11/ShellP.h>
#include <Xm/Xm.h>
#if XmVersion > 1001
#include <Xm/ManagerP.h>
#else
#include <Xm/XmP.h>
#endif
#include <Xm/Form.h>
#include <Xm/LabelG.h>
#include <Xm/PushBG.h>
#include <Xm/DrawingA.h>
#include <Xm/Scale.h>
#include <Xm/MessageB.h>
#include <Xm/TextF.h>
#include <Xm/PanedW.h>
#include <Xm/List.h>
#include <Xm/SeparatoG.h>
#include <Xm/ToggleBG.h>
#include <Xm/RowColumn.h>
#include <DPS/dpsXclient.h>
#include <DPS/dpsXshare.h>
#include <DPS/FontSBP.h>
#include <DPS/FontCreatP.h>
#include <stdlib.h>
#include <math.h>
#include "FontSBI.h"
#include "FSBwraps.h"
#define UnsharedCS(str) XmStringCreate(str, XmSTRING_DEFAULT_CHARSET)
#define CS(str, w) _FSBCreateSharedCS(str, w)
static XmString CSempty;
static char *opticalSize = NULL;
#define Canonical(str) XrmQuarkToString(XrmStringToQuark(str))
static float defaultSizeList[] = {
#ifndef CREATOR_DEFAULT_SIZE_LIST
8, 10, 12, 14, 16, 18, 24, 36, 48, 72
#else
CREATOR_DEFAULT_SIZE_LIST
#endif
};
#ifndef CREATOR_DEFAULT_SIZE_LIST_COUNT
#define CREATOR_DEFAULT_SIZE_LIST_COUNT 10
#endif
#define Offset(field) XtOffsetOf(FontCreatorRec, creator.field)
static XtResource resources[] = {
{XtNsizes, XtCSizes, XtRFloatList, sizeof(float*),
Offset(sizes), XtRImmediate, (XtPointer) defaultSizeList},
{XtNsizeCount, XtCSizeCount, XtRInt, sizeof(int),
Offset(size_count), XtRImmediate,
(XtPointer) CREATOR_DEFAULT_SIZE_LIST_COUNT},
{XtNdismissCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
Offset(dismiss_callback), XtRCallback, (XtPointer) NULL},
{XtNfontSelectionBox, XtCReadOnly, XtRWidget, sizeof(Widget),
Offset(fsb), XtRWidget, (XtPointer) NULL},
};
static Boolean SetValues(Widget old, Widget req, Widget new, ArgList args, Cardinal *num_args);
static XtGeometryResult GeometryManager(Widget w, XtWidgetGeometry *desired, XtWidgetGeometry *allowed);
static void ChangeManaged(Widget w);
static void ClassInitialize(void);
static void Destroy(Widget widget);
static void Initialize(Widget request, Widget new, ArgList args, Cardinal *num_args);
static void Resize(Widget widget);
FontCreatorClassRec fontCreatorClassRec = {
{
(WidgetClass) &xmManagerClassRec,
"FontCreator",
sizeof(FontCreatorRec),
ClassInitialize,
NULL,
FALSE,
Initialize,
NULL,
XtInheritRealize,
NULL,
0,
resources,
XtNumber(resources),
NULLQUARK,
TRUE,
XtExposeCompressMultiple,
TRUE,
FALSE,
Destroy,
Resize,
NULL,
SetValues,
NULL,
XtInheritSetValuesAlmost,
NULL,
NULL,
XtVersion,
NULL,
NULL,
XtInheritQueryGeometry,
NULL,
NULL,
},
{
GeometryManager,
ChangeManaged,
XtInheritInsertChild,
XtInheritDeleteChild,
NULL,
},
{
NULL,
0,
0,
NULL,
NULL,
NULL,
NULL,
},
{
XtInheritTranslations,
NULL,
0,
NULL,
0,
XmInheritParentProcess,
NULL,
},
{
NULL,
}
};
WidgetClass fontCreatorWidgetClass =
(WidgetClass) &fontCreatorClassRec;
static void ClassInitialize(void)
{
XtInitializeWidgetClass(fontSelectionBoxWidgetClass);
CSempty = UnsharedCS("");
opticalSize = Canonical("OpticalSize");
}
static void ResizePreview(
Widget widget,
XtPointer clientData, XtPointer callData)
{
Dimension height;
Cardinal depth;
FontCreatorWidget fc = (FontCreatorWidget) clientData;
if (!XtIsRealized(widget) || fc->creator.gstate == 0) return;
XtVaGetValues(widget, XmNheight, &height,
XmNdepth, &depth, NULL);
XDPSSetContextGState(fc->creator.fsb->fsb.context, fc->creator.gstate);
XDPSSetContextParameters(fc->creator.fsb->fsb.context, XtScreen(widget),
depth, XtWindow(widget), height,
(XDPSStandardColormap *) NULL,
(XDPSStandardColormap *) NULL,
XDPSContextScreenDepth | XDPSContextDrawable);
_DPSFReclip(fc->creator.fsb->fsb.context);
XDPSUpdateContextGState(fc->creator.fsb->fsb.context, fc->creator.gstate);
}
static void DrawMM(FontCreatorWidget fc)
{
int i, j;
String str;
float p[MAX_AXES];
float b[MAX_BLENDS];
int val;
float size;
char *chSize;
DPSContext context;
Dimension hgt;
BlendDataRec *bd = fc->creator.font->blend_data;
float total;
int bogusFont;
str = XmTextFieldGetString(fc->creator.display_text_child);
for (i = 0; i < bd->num_axes; i++) {
XtVaGetValues(fc->creator.axis_scale_child[i], XmNvalue, &val, NULL);
p[i] = _FSBNormalize(val, bd, i);
}
XtVaGetValues(fc->creator.preview_child, XtNheight, &hgt, NULL);
context = fc->creator.fsb->fsb.context;
if (fc->creator.gstate == 0) {
XDPSSetContextDrawable(context,
XtWindow(fc->creator.preview_child), hgt);
XDPSCaptureContextGState(context, &fc->creator.gstate);
} else XDPSSetContextGState(context, fc->creator.gstate);
total = 0.0;
for (i = 1; i < bd->num_designs; i++) {
b[i] = 1.0;
for (j = 0; j < bd->num_axes; j++) {
if (bd->design_positions[i*bd->num_axes + j] == 1.0) b[i] *= p[j];
else b[i] *= 1.0 - p[j];
}
total += b[i];
}
b[0] = 1.0 - total;
XtVaGetValues(fc->creator.size_text_field_child,
XmNvalue, &chSize, NULL);
if (chSize == NULL || *chSize == '\0') return;
size = atof(chSize);
_DPSFSetUpMM(context, fc->creator.font->font_name,
str, size, hgt, b, bd->num_designs, &bogusFont);
DPSWaitContext(context);
XClearWindow(XtDisplay(fc->creator.preview_child),
XtWindow(fc->creator.preview_child));
_DPSFDrawMM(context, str, hgt);
}
static void DrawMMCallback(
Widget widget,
XtPointer clientData, XtPointer callData)
{
FontCreatorWidget fc = (FontCreatorWidget) clientData;
DrawMM(fc);
}
static void ExposeCallback(
Widget widget,
XtPointer clientData, XtPointer callData)
{
FontCreatorWidget fc = (FontCreatorWidget) clientData;
XmDrawingAreaCallbackStruct *dac =
(XmDrawingAreaCallbackStruct *) callData;
if (!fc->creator.preview_fixed) {
XSetWindowAttributes att;
att.bit_gravity = ForgetGravity;
XChangeWindowAttributes(XtDisplay(fc),
XtWindow(fc->creator.preview_child),
CWBitGravity, &att);
fc->creator.preview_fixed = TRUE;
}
if (dac != NULL && dac->event->type == Expose &&
dac->event->xexpose.count != 0) return;
DrawMM(fc);
}
static void SetUpBlendList(FontCreatorWidget fc)
{
XmString *CSblends;
int count, i;
BlendRec *b;
char buf[256];
FontRec *f = fc->creator.font;
sprintf(buf, "%s Blends", f->face_name);
XtVaSetValues(fc->creator.blend_label_child,
XtVaTypedArg, XmNlabelString, XtRString,
buf, strlen(buf)+1,
NULL);
if (f->blend_count == 0) {
count = 1;
CSblends = &CSempty;
} else {
count = f->blend_count;
CSblends = (XmString *) XtCalloc(count, sizeof(XmString));
for (i = 0, b = f->blend_data->blends; i < f->blend_count;
i++, b = b->next) {
CSblends[i] = b->CS_blend_name;
}
}
XtVaSetValues(fc->creator.blend_scrolled_list_child, XmNitemCount, count,
XmNitems, CSblends, NULL);
if (f->blend_count != 0) XtFree((XtPointer) CSblends);
}
static void CalcCarryValues(FontCreatorWidget fc, FontRec *oldf, int *carry_values)
{
FontRec *f = fc->creator.font;
BlendDataRec *bd = f->blend_data, *oldbd = oldf->blend_data;
int i, j;
for (i = 0; i < bd->num_axes; i++) {
carry_values[i] = -1;
for (j = 0; j < oldbd->num_axes; j++) {
if (bd->name[i] == oldbd->name[j]) {
XmScaleGetValue(fc->creator.axis_scale_child[j],
carry_values+i);
break;
}
}
}
}
static void SetUpAxisLabels(FontCreatorWidget fc, FontRec *oldf, int *carry_values)
{
int i;
char buf[20];
XmString cs;
BlendDataRec *bd = fc->creator.font->blend_data, *oldbd = 0;
char *value;
if (oldf != NULL) oldbd = oldf->blend_data;
for (i = 0; i < bd->num_axes; i++) {
if (oldf == NULL || i >= oldbd->num_axes ||
oldbd->name[i] != bd->name[i]) {
cs = UnsharedCS(bd->name[i]);
XtVaSetValues(fc->creator.axis_label_child[i],
XmNlabelString, cs, NULL);
XmStringFree(cs);
}
if (oldf == NULL || i >= oldbd->num_axes ||
oldbd->min[i] != bd->min[i]) {
sprintf(buf, "%d", bd->min[i]);
cs = UnsharedCS(buf);
XtVaSetValues(fc->creator.axis_min_label_child[i],
XmNlabelString, cs, NULL);
XmStringFree(cs);
}
if (oldf == NULL || i >= oldbd->num_axes ||
oldbd->max[i] != bd->max[i]) {
sprintf(buf, "%d", bd->max[i]);
cs = UnsharedCS(buf);
XtVaSetValues(fc->creator.axis_max_label_child[i],
XmNlabelString, cs, NULL);
XmStringFree(cs);
}
if (oldf == NULL || carry_values[i] == -1) {
if (bd->name[i] == opticalSize &&
XmToggleButtonGadgetGetState(
fc->creator.follow_size_toggle_child)) {
XtVaGetValues(fc->creator.fsb->fsb.size_text_field_child,
XmNvalue, &value, NULL);
if (value == NULL || *value == '\0') {
carry_values[i] = bd->min[i];
} else carry_values[i] = atof(value) + 0.5;
} else carry_values[i] = bd->min[i];
}
if (carry_values[i] < bd->min[i]) carry_values[i] = bd->min[i];
else if (carry_values[i] > bd->max[i]) carry_values[i] = bd->max[i];
XtVaSetValues(fc->creator.axis_scale_child[i],
XmNminimum, bd->min[i], XmNmaximum, bd->max[i],
XmNvalue, carry_values[i], NULL);
}
}
static void ManageAxes(FontCreatorWidget fc)
{
Widget w[5*MAX_AXES];
int i, j;
int diff;
diff = fc->creator.managed_axes - fc->creator.font->blend_data->num_axes;
if (diff == 0) return;
if (diff < 0) {
for (i = fc->creator.managed_axes, j=0; j < -diff * 5; i++, j+=5) {
w[j] = fc->creator.axis_label_child[i];
w[j+1] = fc->creator.axis_scale_child[i];
w[j+2] = fc->creator.axis_value_text_child[i];
w[j+3] = fc->creator.axis_min_label_child[i];
w[j+4] = fc->creator.axis_max_label_child[i];
}
XtManageChildren(w, -diff * 5);
} else {
for (i = fc->creator.font->blend_data->num_axes, j=0; j < diff * 5;
i++, j+=5) {
w[j] = fc->creator.axis_label_child[i];
w[j+1] = fc->creator.axis_scale_child[i];
w[j+2] = fc->creator.axis_value_text_child[i];
w[j+3] = fc->creator.axis_min_label_child[i];
w[j+4] = fc->creator.axis_max_label_child[i];
}
XtUnmanageChildren(w, diff * 5);
}
fc->creator.managed_axes = fc->creator.font->blend_data->num_axes;
}
static void SetScaleValues(FontCreatorWidget fc)
{
int val;
char buf[32];
int i, axes;
axes = fc->creator.font->blend_data->num_axes;
for (i = 0; i < axes; i++) {
XmScaleGetValue(fc->creator.axis_scale_child[i], &val);
sprintf(buf, "%d", val);
XmTextFieldSetString(fc->creator.axis_value_text_child[i], buf);
}
}
static void SetUpAxes(FontCreatorWidget fc, FontRec *oldf)
{
int carry_values[MAX_AXES];
if (oldf != NULL) CalcCarryValues(fc, oldf, carry_values);
SetUpAxisLabels(fc, oldf, carry_values);
SetScaleValues(fc);
ManageAxes(fc);
}
static void FaceSelect(
Widget widget,
XtPointer clientData, XtPointer callData)
{
XmListCallbackStruct *listCB = (XmListCallbackStruct *) callData;
FontCreatorWidget fc = (FontCreatorWidget) clientData;
FontRec *f, *oldf = fc->creator.font;
int i;
i = 0;
f = fc->creator.family->fonts;
while (f != NULL) {
if (f->blend_data != NULL) i++;
if (i == listCB->item_position) break;
f = f->next;
}
if (f == NULL) return;
if (!_FSBDownloadFontIfNecessary(f, fc->creator.fsb)) {
_FSBFlushFont(fc->creator.fsb, f);
return;
}
if (fc->creator.font != NULL) fc->creator.font->in_font_creator = False;
fc->creator.font = f;
f->in_font_creator = True;
SetUpBlendList(fc);
SetUpAxes(fc, oldf);
DrawMM(fc);
}
static void HandleSelectedBlend(FontCreatorWidget fc, int n)
{
BlendDataRec *bd = fc->creator.font->blend_data;
BlendRec *b;
int i;
int value;
char buf[32];
b = bd->blends;
for (i = 1; i < n; i++) b = b->next;
XmTextFieldSetString(fc->creator.name_text_child, b->blend_name);
for (i = 0; i < bd->num_axes; i++) {
value = _FSBUnnormalize(b->data[i], bd, i);
XmScaleSetValue(fc->creator.axis_scale_child[i], value);
sprintf(buf, "%d", value);
XmTextFieldSetString(fc->creator.axis_value_text_child[i], buf);
}
}
static void BlendSelect(
Widget widget,
XtPointer clientData, XtPointer callData)
{
XmListCallbackStruct *listCB = (XmListCallbackStruct *) callData;
FontCreatorWidget fc = (FontCreatorWidget) clientData;
if (fc->creator.font->blend_count == 0) return;
HandleSelectedBlend(fc, listCB->item_position);
DrawMM(fc);
}
static void SetValue(
Widget widget,
XtPointer clientData, XtPointer callData)
{
XmScaleCallbackStruct *scaleData = (XmScaleCallbackStruct *) callData;
Widget text = (Widget) clientData;
char buf[32];
sprintf(buf, "%d", scaleData->value);
XmTextFieldSetString(text, buf);
}
static void SetScale(
Widget widget,
XtPointer clientData, XtPointer callData)
{
Widget scale = (Widget) clientData;
char *value;
int val, min, max;
char buf[32];
value = XmTextFieldGetString(widget);
val = atoi(value);
XtVaGetValues(scale, XmNminimum, &min, XmNmaximum, &max, NULL);
if (val < min) val = min;
if (val > max) val = max;
XmScaleSetValue(scale, val);
sprintf(buf, "%d", val);
XmTextFieldSetString(widget, buf);
}
static void DeleteMessage(
Widget widget,
XtPointer clientData, XtPointer callData)
{
XtDestroyWidget(widget);
}
static void PutUpDialog(FontCreatorWidget fc, char *name)
{
Widget message, w;
message = XmCreateInformationDialog((Widget) fc, name, (ArgList) NULL, 0);
w = XmMessageBoxGetChild(message, XmDIALOG_CANCEL_BUTTON);
XtUnmanageChild(w);
w = XmMessageBoxGetChild(message, XmDIALOG_HELP_BUTTON);
XtUnmanageChild(w);
XtAddCallback(message, XmNokCallback, DeleteMessage, (XtPointer) NULL);
XtManageChild(message);
}
static void NoName(FontCreatorWidget fc)
{
PutUpDialog(fc, "noNameMessage");
}
static void UsedName(FontCreatorWidget fc)
{
PutUpDialog(fc, "usedNameMessage");
}
static void SomeUsedName(FontCreatorWidget fc)
{
PutUpDialog(fc, "someUsedNameMessage");
}
static void NoSuchName(FontCreatorWidget fc)
{
PutUpDialog(fc, "noSuchNameMessage");
}
static Boolean DoAdd(FontCreatorWidget fc, FontRec *f, String name)
{
char *spaceName;
BlendRec *b, *newb, **last;
BlendDataRec *bd = f->blend_data;
int val[MAX_AXES], i;
for (b = bd->blends; b != NULL; b = b->next) {
if (strcmp(name, b->blend_name) == 0) return True;
}
newb = (BlendRec *) XtMalloc(sizeof(BlendRec));
newb->blend_name = Canonical(name);
newb->CS_blend_name = CS(newb->blend_name, (Widget) fc);
spaceName = (char *) XtMalloc(strlen(name) + 4);
spaceName[0] = spaceName[1] = spaceName[2] = ' ';
strcpy(spaceName+3, name);
newb->CS_space_blend_name = CS(spaceName, (Widget) fc);
XtFree((XtPointer) spaceName);
for (i = 0; i < bd->num_axes; i++) {
XtVaGetValues(fc->creator.axis_scale_child[i],
XmNvalue, val+i, NULL);
newb->data[i] = _FSBNormalize(val[i], bd, i);
}
for (; i < MAX_AXES; i++) newb->data[i] = 0.0;
newb->font_name = _FSBGenFontName(f->font_name, val, bd);
f->blend_count++;
fc->creator.family->blend_count++;
last = &bd->blends;
for (b = bd->blends; b != NULL; b = b->next) {
if (strcmp(name, b->blend_name) < 0) break;
last = &b->next;
}
newb->next = b;
*last = newb;
SetUpBlendList(fc);
_FSBSetUpFaceList(fc->creator.fsb, False);
return False;
}
static void AddCallback(
Widget widget,
XtPointer clientData, XtPointer callData)
{
FontCreatorWidget fc = (FontCreatorWidget) clientData;
char *value;
FontRec *f;
Boolean failures = False;
BlendDataRec *bd = fc->creator.font->blend_data;
int i;
value = XmTextFieldGetString(fc->creator.name_text_child);
if (value == NULL || *value == '\0') {
NoName(fc);
return;
}
if (XmToggleButtonGadgetGetState(fc->creator.do_all_toggle_child)) {
for (f = fc->creator.family->fonts; f != NULL; f = f->next) {
if (f->blend_data != NULL &&
f->blend_data->num_axes == bd->num_axes) {
for (i = 0; i < bd->num_axes; i++) {
if (f->blend_data->name[i] != bd->name[i]) break;
}
if (i == bd->num_axes) failures |= DoAdd(fc, f, value);
}
}
if (failures) SomeUsedName(fc);
} else if (DoAdd(fc, fc->creator.font, value)) UsedName(fc);
}
static Boolean DoReplace(FontCreatorWidget fc, FontRec *f, String name)
{
BlendDataRec *bd = f->blend_data;
BlendRec *b;
int val[MAX_AXES], i;
name = Canonical(name);
for (b = bd->blends; b != NULL; b = b->next) {
if (name == b->blend_name) {
for (i = 0; i < bd->num_axes; i++) {
XtVaGetValues(fc->creator.axis_scale_child[i],
XmNvalue, val+i, NULL);
b->data[i] = _FSBNormalize(val[i], bd, i);
}
b->font_name = _FSBGenFontName(f->font_name, val, bd);
if (fc->creator.fsb->fsb.currently_selected_blend == b) {
_FSBSetUpFaceList(fc->creator.fsb, True);
}
return False;
}
}
return True;
}
static void ReplaceCallback(
Widget widget,
XtPointer clientData, XtPointer callData)
{
FontCreatorWidget fc = (FontCreatorWidget) clientData;
char *value;
FontRec *f;
Boolean failures = True;
BlendDataRec *bd = fc->creator.font->blend_data;
int i;
value = XmTextFieldGetString(fc->creator.name_text_child);
if (value == NULL || *value == '\0') {
NoName(fc);
return;
}
if (XmToggleButtonGadgetGetState(fc->creator.do_all_toggle_child)) {
for (f = fc->creator.family->fonts; f != NULL; f = f->next) {
if (f->blend_data != NULL &&
f->blend_data->num_axes == bd->num_axes) {
for (i = 0; i < bd->num_axes; i++) {
if (f->blend_data->name[i] != bd->name[i]) break;
}
if (i == bd->num_axes) failures &= DoReplace(fc, f, value);
}
}
if (failures) NoSuchName(fc);
} else if (DoReplace(fc, fc->creator.font, value)) NoSuchName(fc);
}
static Boolean DoDelete(FontCreatorWidget fc, FontRec *f, String name)
{
BlendDataRec *bd = f->blend_data;
BlendRec *b, *oldb;
Boolean current = FALSE;
name = Canonical(name);
for (b = bd->blends, oldb = NULL; b != NULL; oldb = b, b = b->next) {
if (name == b->blend_name) {
if (oldb == NULL) bd->blends = b->next;
else oldb->next = b->next;
if (fc->creator.fsb->fsb.currently_selected_blend == b) {
fc->creator.fsb->fsb.currently_selected_blend = NULL;
current = TRUE;
}
XtFree((XtPointer) b);
f->blend_count--;
fc->creator.family->blend_count--;
SetUpBlendList(fc);
_FSBSetUpFaceList(fc->creator.fsb, current);
return False;
}
}
return True;
}
static void DeleteCallback(
Widget widget,
XtPointer clientData, XtPointer callData)
{
FontCreatorWidget fc = (FontCreatorWidget) clientData;
char *value;
FontRec *f;
Boolean failures = True;
value = XmTextFieldGetString(fc->creator.name_text_child);
if (value == NULL || *value == '\0') {
NoName(fc);
return;
}
if (XmToggleButtonGadgetGetState(fc->creator.do_all_toggle_child)) {
for (f = fc->creator.family->fonts; f != NULL; f = f->next) {
if (f->blend_data != NULL) {
failures &= DoDelete(fc, f, value);
}
}
if (failures) NoSuchName(fc);
} else if (DoDelete(fc, fc->creator.font, value)) NoSuchName(fc);
}
static void UnmanageOptions(
Widget widget,
XtPointer clientData, XtPointer callData)
{
FontCreatorWidget fc = (FontCreatorWidget) clientData;
XtUnmanageChild(fc->creator.option_box);
}
static void ShowOptions(
Widget widget,
XtPointer clientData, XtPointer callData)
{
FontCreatorWidget fc = (FontCreatorWidget) clientData;
XtManageChild(fc->creator.option_box);
}
static void GenerateCallback(
Widget widget,
XtPointer clientData, XtPointer callData)
{
FontCreatorWidget fc = (FontCreatorWidget) clientData;
BlendDataRec *bd = fc->creator.font->blend_data;
int i, val[MAX_AXES];
char nameBuf[256];
char *ch;
for (i = 0; i < bd->num_axes; i++) {
XtVaGetValues(fc->creator.axis_scale_child[i],
XmNvalue, val+i, NULL);
}
ch = nameBuf;
for (i = 0; i < bd->num_axes - 1; i++) {
sprintf(ch, "%d ", val[i]);
ch = ch + strlen(ch);
}
sprintf(ch, "%d", val[bd->num_axes - 1]);
XmTextFieldSetString(fc->creator.name_text_child, nameBuf);
}
static void DismissCallback(
Widget widget,
XtPointer clientData, XtPointer callData)
{
FontCreatorWidget fc = (FontCreatorWidget) clientData;
if (XtIsShell(XtParent(fc))) XtPopdown(XtParent(fc));
XtCallCallbackList(widget, fc->creator.dismiss_callback, (XtPointer) NULL);
}
static void SizeChanged(
Widget widget,
XtPointer clientData, XtPointer callData)
{
String value;
FontCreatorWidget fc = (FontCreatorWidget) clientData;
int size;
FontRec *f = fc->creator.font;
BlendDataRec *bd;
int i;
char buf[32];
if (f == NULL || f->blend_data == NULL) return;
bd = f->blend_data;
for (i = 0; i < bd->num_axes; i++) {
if (bd->name[i] == opticalSize) break;
}
if (i == bd->num_axes) return;
if (!XmToggleButtonGadgetGetState(fc->creator.follow_size_toggle_child)) {
return;
}
XtVaGetValues(widget, XmNvalue, &value, NULL);
if (value == NULL || *value == '\0') return;
size = atof(value) + 0.5;
sprintf(buf, "%d", size);
XmTextFieldSetString(fc->creator.axis_value_text_child[i], buf);
SetScale(fc->creator.axis_value_text_child[i],
(XtPointer) fc->creator.axis_scale_child[i], (XtPointer) NULL);
DrawMM(fc);
}
static Boolean changingSize = False;
static void SizeSelect(
Widget widget,
XtPointer clientData, XtPointer callData)
{
String value;
Widget option;
FontCreatorWidget fc = (FontCreatorWidget) clientData;
char *ch;
XtVaGetValues(widget, XmNvalue, &value, NULL);
if (value == NULL) option = fc->creator.other_size;
else {
for (ch = value; *ch != '\0'; ch++) if (*ch == '.') *ch = '-';
option = XtNameToWidget(fc->creator.size_menu, value);
if (option == NULL) option = fc->creator.other_size;
}
XtVaSetValues(fc->creator.size_option_menu_child,
XmNmenuHistory, option, NULL);
}
static void TextVerify(
Widget widget,
XtPointer clientData, XtPointer callData)
{
XmTextVerifyPtr v = (XmTextVerifyPtr) callData;
char ch, *cp;
int decimalPoints = 0;
int i;
if (changingSize) return;
if (v->text->length == 0) return;
for (i = 0; i < v->text->length; i++) {
ch = v->text->ptr[i];
if (ch == '.') decimalPoints++;
else if (!isdigit(ch)) {
v->doit = False;
return;
}
}
if (decimalPoints > 1) {
v->doit = False;
return;
}
XtVaGetValues(widget, XmNvalue, &cp, NULL);
for (; *cp != '\0'; cp++) {
if (*cp == '.') decimalPoints++;
}
if (decimalPoints > 1) v->doit = False;
}
static void SetSize(
Widget widget,
XtPointer clientData, XtPointer callData)
{
char buf[20];
char *ch;
FontCreatorWidget fc = (FontCreatorWidget) clientData;
strcpy(buf, XtName(widget));
for (ch = buf; *ch != '\0'; ch++) if (*ch == '-') *ch++ = '.';
changingSize = True;
XtVaSetValues(fc->creator.size_text_field_child, XmNvalue, buf, NULL);
changingSize = False;
}
static void ListSelectPos(Widget w, int pos, Boolean notify)
{
int topPos, items, visible;
XmListSelectPos(w, pos, notify);
XtVaGetValues(w, XmNtopItemPosition, &topPos,
XmNvisibleItemCount, &visible,
XmNitemCount, &items, NULL);
if (pos >= topPos && pos < topPos + visible) return;
topPos = pos - (visible-1)/2;
if (topPos + visible > items) topPos = items - visible + 1;
if (topPos < 1) topPos = 1;
XtVaSetValues(w, XmNtopItemPosition, topPos, NULL);
}
static void CreateSizeMenu(
FontCreatorWidget fc,
Boolean destroyOldChildren)
{
Arg args[20];
int i, j;
Widget *sizes;
char buf[20];
Widget *children;
Cardinal num_children;
XmString csName;
char *ch;
if (destroyOldChildren) {
XtVaGetValues(fc->creator.size_menu, XtNchildren, &children,
XtNnumChildren, &num_children, NULL);
for (j = 1; (Cardinal)j < num_children; j++) XtDestroyWidget(children[j]);
sizes = (Widget *) XtMalloc((fc->creator.size_count+1) *
sizeof(Widget));
sizes[0] = children[0];
} else {
sizes = (Widget *) XtMalloc((fc->creator.size_count+1) *
sizeof(Widget));
i = 0;
fc->creator.other_size = sizes[0] =
XtCreateManagedWidget("other", xmPushButtonGadgetClass,
fc->creator.size_menu, args, i);
}
for (j = 0; j < fc->creator.size_count; j++) {
(void) sprintf(buf, "%g", fc->creator.sizes[j]);
csName = UnsharedCS(buf);
for (ch = buf; *ch != '\0'; ch++) if (*ch == '.') *ch = '-';
i = 0;
XtSetArg(args[i], XmNlabelString, csName); i++;
sizes[j+1] =
XmCreatePushButtonGadget(fc->creator.size_menu, buf, args, i);
XmStringFree(csName);
XtAddCallback(sizes[j+1], XmNactivateCallback,
SetSize, (XtPointer) fc);
XtAddCallback(sizes[j+1], XmNactivateCallback,
DrawMMCallback, (XtPointer) fc);
}
XtManageChildren(sizes, j+1);
XtFree((char *) sizes);
}
static void CreateChildren(FontCreatorWidget fc)
{
Arg args[20];
int i, j;
Widget form, prev, w, label, sep, button;
char buf[20];
i = 0;
fc->creator.pane_child =
XtCreateManagedWidget("pane", xmPanedWindowWidgetClass,
(Widget) fc, args, i);
i = 0;
fc->creator.preview_child =
XtCreateManagedWidget("preview", xmDrawingAreaWidgetClass,
fc->creator.pane_child, args, i);
XtAddCallback(fc->creator.preview_child, XmNexposeCallback,
ExposeCallback, (XtPointer) fc);
XtAddCallback(fc->creator.preview_child, XmNresizeCallback,
ResizePreview, (XtPointer) fc);
i = 0;
form = XtCreateManagedWidget("panel", xmFormWidgetClass,
fc->creator.pane_child, args, i);
i = 0;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
button = XtCreateManagedWidget("deleteButton", xmPushButtonGadgetClass,
form, args, i);
XtAddCallback(button, XmNactivateCallback, DeleteCallback, (XtPointer) fc);
i = 0;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNrightWidget, button); i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
button = XtCreateManagedWidget("replaceButton", xmPushButtonGadgetClass,
form, args, i);
XtAddCallback(button, XmNactivateCallback,
ReplaceCallback, (XtPointer) fc);
i = 0;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNrightWidget, button); i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
button = XtCreateManagedWidget("addButton", xmPushButtonGadgetClass,
form, args, i);
XtAddCallback(button, XmNactivateCallback, AddCallback, (XtPointer) fc);
i = 0;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNrightWidget, button); i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
fc->creator.generate_button_child =
XtCreateManagedWidget("generateButton", xmPushButtonGadgetClass,
form, args, i);
XtAddCallback(fc->creator.generate_button_child, XmNactivateCallback,
GenerateCallback, (XtPointer) fc);
i = 0;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNrightWidget, fc->creator.generate_button_child);i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
button = XtCreateManagedWidget("optionsButton", xmPushButtonGadgetClass,
form, args, i);
XtAddCallback(button, XmNactivateCallback, ShowOptions, (XtPointer) fc);
i = 0;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
button = XtCreateManagedWidget("dismissButton", xmPushButtonGadgetClass,
form, args, i);
XtAddCallback(button, XmNactivateCallback,
DismissCallback, (XtPointer) fc);
i = 0;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNbottomWidget, button); i++;
sep = XtCreateManagedWidget("separator", xmSeparatorGadgetClass,
form, args, i);
i = 0;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_POSITION); i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNbottomWidget, sep); i++;
label = XtCreateManagedWidget("sizeLabel", xmLabelGadgetClass,
form, args, i);
i = 0;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_POSITION); i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(args[i], XmNbottomWidget, label); i++;
fc->creator.size_text_field_child =
XtCreateManagedWidget("sizeTextField", xmTextFieldWidgetClass,
form, args, i);
XtAddCallback(fc->creator.size_text_field_child, XmNvalueChangedCallback,
SizeSelect, (XtPointer) fc);
XtAddCallback(fc->creator.size_text_field_child, XmNmodifyVerifyCallback,
TextVerify, (XtPointer) fc);
XtAddCallback(fc->creator.size_text_field_child, XmNactivateCallback,
DrawMMCallback, (XtPointer) fc);
i = 0;
fc->creator.size_menu = XmCreatePulldownMenu(form, "sizeMenu", args, i);
CreateSizeMenu(fc, FALSE);
i = 0;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNleftWidget, fc->creator.size_text_field_child);i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(args[i], XmNbottomWidget, label); i++;
XtSetArg(args[i], XmNsubMenuId, fc->creator.size_menu); i++;
fc->creator.size_option_menu_child =
XmCreateOptionMenu(form, "sizeOptionMenu", args, i);
XtManageChild(fc->creator.size_option_menu_child);
SizeSelect(fc->creator.size_text_field_child, (XtPointer) fc,
(XtPointer) NULL);
i = 0;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNbottomWidget, sep); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_POSITION); i++;
fc->creator.name_text_child =
XtCreateManagedWidget("nameText", xmTextFieldWidgetClass,
form, args, i);
XtAddCallback(fc->creator.name_text_child, XmNactivateCallback,
AddCallback, (XtPointer) fc);
i = 0;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(args[i], XmNbottomWidget, fc->creator.name_text_child); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_POSITION); i++;
label = XtCreateManagedWidget("nameLabel", xmLabelGadgetClass,
form, args, i);
i = 0;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_POSITION); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
label = XtCreateManagedWidget("faceLabel",xmLabelGadgetClass,
form, args, i);
i = 0;
XtSetArg(args[i], XmNitemCount, 1); i++;
XtSetArg(args[i], XmNitems, &CSempty); i++;
fc->creator.face_scrolled_list_child =
XmCreateScrolledList(form, "faceList", args, i);
XtAddCallback(fc->creator.face_scrolled_list_child,
XmNbrowseSelectionCallback, FaceSelect, (XtPointer) fc);
i = 0;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNtopWidget, label); i++;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_POSITION); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_POSITION); i++;
XtSetValues(XtParent(fc->creator.face_scrolled_list_child), args, i);
XtManageChild(fc->creator.face_scrolled_list_child);
i = 0;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_POSITION); i++;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_POSITION); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
fc->creator.blend_label_child =
XtCreateManagedWidget("blendLabel",xmLabelGadgetClass,
form, args, i);
i = 0;
XtSetArg(args[i], XmNitemCount, 1); i++;
XtSetArg(args[i], XmNitems, &CSempty); i++;
fc->creator.blend_scrolled_list_child =
XmCreateScrolledList(form, "blendList", args, i);
XtAddCallback(fc->creator.blend_scrolled_list_child,
XmNbrowseSelectionCallback, BlendSelect, (XtPointer) fc);
i = 0;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNtopWidget, fc->creator.blend_label_child); i++;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_POSITION); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
XtSetArg(args[i], XmNbottomAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNbottomWidget, fc->creator.name_text_child); i++;
XtSetValues(XtParent(fc->creator.blend_scrolled_list_child), args, i);
XtManageChild(fc->creator.blend_scrolled_list_child);
i = 0;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_POSITION); i++;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(args[i], XmNtopWidget,
XtParent(fc->creator.face_scrolled_list_child)); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_POSITION); i++;
fc->creator.display_text_child =
XtCreateManagedWidget("displayText", xmTextFieldWidgetClass,
form, args, i);
XtAddCallback(fc->creator.display_text_child, XmNactivateCallback,
DrawMMCallback, (XtPointer) fc);
i = 0;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(args[i], XmNtopWidget, fc->creator.display_text_child); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_POSITION); i++;
label = XtCreateManagedWidget("displayTextLabel", xmLabelGadgetClass,
form, args, i);
prev = fc->creator.display_text_child;
for (j = 0; j < 4; j++) {
i = 0;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_POSITION); i++;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNtopWidget, prev); i++;
sprintf(buf, "axisValue%d", j+1);
fc->creator.axis_value_text_child[j] =
XtCreateWidget(buf, xmTextFieldWidgetClass, form, args, i);
i = 0;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_POSITION); i++;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(args[i], XmNtopWidget,
fc->creator.axis_value_text_child[j]); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNrightWidget,
fc->creator.axis_value_text_child[j]); i++;
sprintf(buf, "axisScale%d", j+1);
fc->creator.axis_scale_child[j] =
XtCreateWidget(buf, xmScaleWidgetClass, form, args, i);
XtAddCallback(fc->creator.axis_scale_child[j],
XmNvalueChangedCallback, DrawMMCallback, (XtPointer) fc);
XtAddCallback(fc->creator.axis_scale_child[j],
XmNdragCallback, DrawMMCallback, (XtPointer) fc);
XtAddCallback(fc->creator.axis_scale_child[j],
XmNvalueChangedCallback, SetValue,
(XtPointer) fc->creator.axis_value_text_child[j]);
XtAddCallback(fc->creator.axis_scale_child[j],
XmNdragCallback, SetValue,
(XtPointer) fc->creator.axis_value_text_child[j]);
XtAddCallback(fc->creator.axis_value_text_child[j],
XmNactivateCallback, SetScale,
(XtPointer) fc->creator.axis_scale_child[j]);
i = 0;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNtopWidget,
fc->creator.axis_scale_child[j]); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET);i++;
XtSetArg(args[i], XmNrightWidget,
fc->creator.axis_scale_child[j]); i++;
sprintf(buf, "axisMax%d", j+1);
fc->creator.axis_max_label_child[j] =
XtCreateWidget(buf, xmLabelGadgetClass, form, args, i);
i = 0;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
XtSetArg(args[i], XmNtopWidget,
fc->creator.axis_scale_child[j]); i++;
XtSetArg(args[i], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(args[i], XmNleftWidget,
fc->creator.axis_scale_child[j]); i++;
sprintf(buf, "axisMin%d", j+1);
fc->creator.axis_min_label_child[j] =
XtCreateWidget(buf, xmLabelGadgetClass, form, args, i);
i = 0;
XtSetArg(args[i], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
XtSetArg(args[i], XmNtopWidget,
fc->creator.axis_value_text_child[j]); i++;
XtSetArg(args[i], XmNrightAttachment, XmATTACH_POSITION); i++;
sprintf(buf, "axisLabel%d", j+1);
fc->creator.axis_label_child[j] =
XtCreateWidget(buf, xmLabelGadgetClass, form, args, i);
prev = fc->creator.axis_value_text_child[j];
}
fc->creator.option_box = XmCreateFormDialog((Widget) fc, "optionBox",
(Arg *) NULL, 0);
w = XtCreateManagedWidget("filterBox", xmRowColumnWidgetClass,
fc->creator.option_box, (Arg *) NULL, 0);
fc->creator.do_all_toggle_child =
XtCreateManagedWidget("doAllToggle", xmToggleButtonGadgetClass,
w, (Arg *) NULL, 0);
fc->creator.follow_size_toggle_child =
XtCreateManagedWidget("followSizeToggle",
xmToggleButtonGadgetClass,
w, (Arg *) NULL, 0);
button = XtCreateManagedWidget("dismissOptionButton",
xmPushButtonGadgetClass,
w, (Arg *) NULL, 0);
XtAddCallback(button, XmNactivateCallback,
UnmanageOptions, (XtPointer) fc);
}
static void Initialize(
Widget request, Widget new,
ArgList args,
Cardinal *num_args)
{
FontCreatorWidget fc = (FontCreatorWidget) new;
if (fc->creator.fsb == NULL) {
XtAppErrorMsg(XtWidgetToApplicationContext(new),
"initializeFontCreator", "noFontSelectionBox",
"FontSelectionBoxError",
"No font selection box given to font creator",
(String *) NULL, (Cardinal *) NULL);
}
if (fc->creator.size_count > 0 && fc->creator.sizes == NULL) {
XtAppWarningMsg(XtWidgetToApplicationContext(new),
"initializeFontCreator", "sizeMismatch",
"FontSelectionBoxError",
"Size count specified but no sizes present",
(String *) NULL, (Cardinal *) NULL);
fc->creator.size_count = 0;
}
if (fc->creator.size_count < 0) {
XtAppWarningMsg(XtWidgetToApplicationContext(new),
"initializeFontCreator", "negativeSize",
"FontSelectionBoxError",
"Size count should not be negative",
(String *) NULL, (Cardinal *) NULL);
fc->creator.size_count = 0;
}
fc->creator.gstate = 0;
fc->creator.family = NULL;
fc->creator.font = NULL;
fc->creator.managed_axes = 0;
fc->creator.preview_fixed = False;
fc->creator.option_box = NULL;
CreateChildren(fc);
XtAddCallback(fc->creator.fsb->fsb.size_text_field_child,
XmNvalueChangedCallback, SizeChanged, (XtPointer) fc);
}
static void SelectBlend(FontCreatorWidget fc, BlendRec *cur_b)
{
int i, cur = 0;
BlendRec *b;
int *selectList, selectCount;
if (cur_b == NULL) {
if (!XmListGetSelectedPos(fc->creator.blend_scrolled_list_child,
&selectList, &selectCount)) return;
if (selectCount == 0 || *selectList < 1) return;
cur = *selectList;
XtFree((XtPointer) selectList);
} else {
for (i = 0, b = fc->creator.font->blend_data->blends;
i < fc->creator.font->blend_count; i++, b = b->next) {
if (b == cur_b) {
cur = i+1;
break;
}
}
}
ListSelectPos(fc->creator.blend_scrolled_list_child, cur, FALSE);
HandleSelectedBlend(fc, cur);
}
void _FSBSetCreatorFamily(Widget w, FontFamilyRec *ff)
{
FontCreatorWidget fc = (FontCreatorWidget) w;
int i, count = 0, cur = 1;
FontRec *newf = NULL, *f, *oldf = fc->creator.font;
XmString *CSfaces;
if (ff != fc->creator.family) {
fc->creator.family = ff;
CSfaces = (XmString *) XtCalloc(ff->font_count, sizeof(XmString));
for (i = 0, f = ff->fonts; i < ff->font_count; i++, f = f->next) {
if (f->blend_data == NULL) continue;
if (newf == NULL) newf = f;
CSfaces[count] = f->CS_face_name;
count++;
if (f == fc->creator.fsb->fsb.currently_selected_face) {
cur = count;
newf = f;
}
}
XtVaSetValues(fc->creator.face_scrolled_list_child,
XmNitemCount, count, XmNitems, CSfaces, NULL);
XtFree((XtPointer) CSfaces);
} else {
for (i = 0, f = ff->fonts; i < ff->font_count; i++, f = f->next) {
if (f->blend_data == NULL) continue;
count++;
if (newf == NULL) newf = f;
if (f == fc->creator.fsb->fsb.currently_selected_face) {
cur = count;
newf = f;
break;
}
}
}
if (fc->creator.font != NULL) fc->creator.font->in_font_creator = False;
fc->creator.font = newf;
newf->in_font_creator = True;
ListSelectPos(fc->creator.face_scrolled_list_child, cur, FALSE);
SetUpBlendList(fc);
SetUpAxes(fc, oldf);
if (fc->creator.fsb->fsb.currently_selected_blend != 0) {
SelectBlend(fc, fc->creator.fsb->fsb.currently_selected_blend);
} else {
SelectBlend(fc, NULL);
}
SetScaleValues(fc);
XmTextFieldSetString(fc->creator.display_text_child, ff->family_name);
DrawMM(fc);
}
static void Destroy(Widget widget)
{
FontCreatorWidget fc = (FontCreatorWidget) widget;
if (fc->creator.gstate != 0) {
XDPSFreeContextGState(fc->creator.fsb->fsb.context,
fc->creator.gstate);
}
}
static void Resize(Widget widget)
{
FontCreatorWidget fc = (FontCreatorWidget) widget;
XtResizeWidget(fc->creator.pane_child, fc->core.width, fc->core.height, 0);
}
static Boolean SetValues(
Widget old, Widget req, Widget new,
ArgList args,
Cardinal *num_args)
{
FontCreatorWidget oldfc = (FontCreatorWidget) old;
FontCreatorWidget newfc = (FontCreatorWidget) new;
#define NE(field) newfc->creator.field != oldfc->creator.field
if (NE(fsb)) newfc->creator.fsb = oldfc->creator.fsb;
if (newfc->creator.size_count > 0 && newfc->creator.sizes == NULL) {
XtAppWarningMsg(XtWidgetToApplicationContext(new),
"setValuesFontCreator", "sizeMismatch",
"FontSelectionBoxError",
"Size count specified but no sizes present",
(String *) NULL, (Cardinal *) NULL);
newfc->creator.size_count = 0;
}
if (newfc->creator.size_count < 0) {
XtAppWarningMsg(XtWidgetToApplicationContext(new),
"setValuesFontCreator", "negativeSize",
"FontSelectionBoxError",
"Size count should not be negative",
(String *) NULL, (Cardinal *) NULL);
newfc->creator.size_count = 0;
}
if (NE(sizes)) CreateSizeMenu(newfc, TRUE);
#undef NE
return False;
}
static XtGeometryResult GeometryManager(
Widget w,
XtWidgetGeometry *desired, XtWidgetGeometry *allowed)
{
#define WANTS(flag) (desired->request_mode & flag)
if (WANTS(XtCWQueryOnly)) return XtGeometryYes;
if (WANTS(CWWidth)) w->core.width = desired->width;
if (WANTS(CWHeight)) w->core.height = desired->height;
if (WANTS(CWX)) w->core.x = desired->x;
if (WANTS(CWY)) w->core.y = desired->y;
if (WANTS(CWBorderWidth)) {
w->core.border_width = desired->border_width;
}
return XtGeometryYes;
#undef WANTS
}
static void ChangeManaged(Widget w)
{
FontCreatorWidget fc = (FontCreatorWidget) w;
w->core.width = fc->composite.children[0]->core.width;
w->core.height = fc->composite.children[0]->core.height;
}