824N/A/*
824N/A * FontSample.c
824N/A *
824N/A * (c) Copyright 1991-1994 Adobe Systems Incorporated.
824N/A * All rights reserved.
824N/A *
824N/A * Permission to use, copy, modify, distribute, and sublicense this software
824N/A * and its documentation for any purpose and without fee is hereby granted,
824N/A * provided that the above copyright notices appear in all copies and that
824N/A * both those copyright notices and this permission notice appear in
824N/A * supporting documentation and that the name of Adobe Systems Incorporated
824N/A * not be used in advertising or publicity pertaining to distribution of the
824N/A * software without specific, written prior permission. No trademark license
824N/A * to use the Adobe trademarks is hereby granted. If the Adobe trademark
824N/A * "Display PostScript"(tm) is used to describe this software, its
824N/A * functionality or for any other purpose, such use shall be limited to a
824N/A * statement that this software works in conjunction with the Display
824N/A * PostScript system. Proper trademark attribution to reflect Adobe's
824N/A * ownership of the trademark shall be given whenever any such reference to
824N/A * the Display PostScript system is made.
824N/A *
824N/A * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
824N/A * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
824N/A * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
824N/A * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
824N/A * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
824N/A * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
824N/A * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
824N/A * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
824N/A * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
824N/A * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
824N/A *
824N/A * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
824N/A * Incorporated which may be registered in certain jurisdictions
824N/A *
824N/A * Author: Adobe Systems Incorporated
824N/A */
824N/A/* $XFree86$ */
824N/A
824N/A#include <ctype.h>
824N/A#include <stdio.h>
824N/A#include <X11/Xos.h>
824N/A#include <stdlib.h>
824N/A#include <math.h>
824N/A#include <X11/IntrinsicP.h>
824N/A#include <X11/StringDefs.h>
824N/A#include <Xm/Xm.h>
824N/A
824N/A/* There are no words to describe how I feel about having to do this */
824N/A
824N/A#if XmVersion > 1001
824N/A#include <Xm/ManagerP.h>
824N/A#else
824N/A#include <Xm/XmP.h>
824N/A#endif
824N/A
824N/A#include <Xm/Form.h>
824N/A#include <Xm/List.h>
824N/A#include <Xm/Label.h>
824N/A#include <Xm/LabelG.h>
824N/A#include <Xm/PushB.h>
824N/A#include <Xm/PanedW.h>
824N/A#include <Xm/PushBG.h>
824N/A#include <Xm/SeparatoG.h>
824N/A#include <Xm/TextF.h>
824N/A#include <Xm/RowColumn.h>
824N/A#include <Xm/DrawingA.h>
824N/A#include <Xm/ScrolledW.h>
824N/A#include <Xm/ToggleBG.h>
824N/A#include <Xm/Frame.h>
824N/A#include <Xm/RowColumn.h>
824N/A#include <DPS/dpsXclient.h>
824N/A#include <DPS/dpsops.h>
824N/A#include <DPS/dpsXcommon.h>
824N/A#include <DPS/dpsXshare.h>
824N/A#include <DPS/FontSBP.h>
824N/A#include "FSBwraps.h"
824N/A#include "FontSBI.h"
824N/A#include <DPS/FontSamplP.h>
824N/A
824N/A#if 0
824N/A/* This is not in Xos.h for some reason */
824N/Achar *strstr();
824N/A#endif
824N/A
824N/A#undef MAX
824N/A#define MAX(x,y) ((x) > (y) ? (x) : (y))
824N/A
824N/A#define UnsharedCS(str) XmStringCreate(str, XmSTRING_DEFAULT_CHARSET)
824N/A
824N/Astatic float defaultSizeList[] = {
824N/A#ifndef SAMPLER_DEFAULT_SIZE_LIST
824N/A 8, 10, 12, 14, 16, 18, 24, 36, 48, 72
824N/A#else
824N/A SAMPLER_DEFAULT_SIZE_LIST
824N/A#endif /* DEFAULT_SIZE_LIST */
824N/A};
824N/A
824N/A#ifndef SAMPLER_DEFAULT_SIZE_LIST_COUNT
824N/A#define SAMPLER_DEFAULT_SIZE_LIST_COUNT 10
824N/A#endif /* DEFAULT_SIZE_LIST_COUNT */
824N/A
824N/A#ifndef SAMPLER_DEFAULT_SIZE
824N/A#define SAMPLER_DEFAULT_SIZE 24.0
824N/A#endif /* SAMPLER_DEFAULT_SIZE */
824N/A
824N/Astatic Boolean DisplayAllWorkProc(XtPointer client_data);
824N/Astatic Boolean DisplaySelectedWorkProc(XtPointer client_data);
824N/Astatic Boolean DisplaySelectedFamilyWorkProc(XtPointer client_data);
824N/Astatic Boolean DisplayFilteredWorkProc(XtPointer client_data);
824N/A
824N/A#define Offset(field) XtOffsetOf(FontSamplerRec, sampler.field)
824N/A
824N/Astatic XtResource resources[] = {
824N/A {XtNsizes, XtCSizes, XtRFloatList, sizeof(float*),
824N/A Offset(sizes), XtRImmediate, (XtPointer) defaultSizeList},
824N/A {XtNsizeCount, XtCSizeCount, XtRInt, sizeof(int),
824N/A Offset(size_count), XtRImmediate,
824N/A (XtPointer) SAMPLER_DEFAULT_SIZE_LIST_COUNT},
824N/A {XtNdismissCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList),
824N/A Offset(dismiss_callback), XtRCallback, (XtPointer) NULL},
824N/A {XtNfontSelectionBox, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(fsb), XtRWidget, (XtPointer) NULL},
824N/A {XtNminimumWidth, XtCMinimumWidth, XtRDimension, sizeof(Dimension),
824N/A Offset(minimum_width), XtRImmediate, (XtPointer) 100},
824N/A {XtNminimumHeight, XtCMinimumHeight, XtRDimension, sizeof(Dimension),
824N/A Offset(minimum_height), XtRImmediate, (XtPointer) 100},
824N/A {XtNnoRoomMessage, XtCMessage, XmRXmString, sizeof(XmString),
824N/A Offset(no_room_message), XtRString,
824N/A "Current size is too large or panel is too small"},
824N/A {XtNnoFontMessage, XtCMessage, XmRXmString, sizeof(XmString),
824N/A Offset(no_font_message), XtRString,
824N/A "There are no fonts!"},
824N/A {XtNnoSelectedFontMessage, XtCMessage, XmRXmString, sizeof(XmString),
824N/A Offset(no_selected_font_message), XtRString,
824N/A "No font is currently selected"},
824N/A {XtNnoSelectedFamilyMessage, XtCMessage, XmRXmString, sizeof(XmString),
824N/A Offset(no_selected_family_message), XtRString,
824N/A "No family is currently selected"},
824N/A {XtNnoFamilyFontMessage, XtCMessage, XmRXmString, sizeof(XmString),
824N/A Offset(no_family_font_message), XtRString,
824N/A "Selected family has no fonts!"},
824N/A {XtNnoMatchMessage, XtCMessage, XmRXmString, sizeof(XmString),
824N/A Offset(no_match_message), XtRString,
824N/A "No fonts match filters"},
824N/A {XtNpanelChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(panel_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNareaChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(area_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNtextChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(text_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNfontLabelChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(font_label_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNscrolledWindowChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(scrolled_window_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNdisplayButtonChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(display_button_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNdismissButtonChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(dismiss_button_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNstopButtonChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(stop_button_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNclearButtonChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(clear_button_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNradioFrameChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(radio_frame_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNradioBoxChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(radio_box_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNallToggleChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(all_toggle_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNselectedToggleChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(selected_toggle_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNselectedFamilyToggleChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(selected_family_toggle_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNfilterToggleChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(filter_toggle_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNfilterTextChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(filter_text_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNfilterBoxChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(filter_box_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNfilterFrameChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(filter_frame_child), XtRImmediate, (XtPointer) NULL},
824N/A {XtNsizeLabelChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(size_label_child), XtRWidget, (XtPointer) NULL},
824N/A {XtNsizeTextFieldChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(size_text_field_child), XtRWidget, (XtPointer) NULL},
824N/A {XtNsizeOptionMenuChild, XtCReadOnly, XtRWidget, sizeof(Widget),
824N/A Offset(size_option_menu_child), XtRWidget, (XtPointer) NULL},
824N/A};
824N/A
824N/A/* Forward declarations */
824N/A
824N/Astatic Boolean SetValues(Widget old, Widget req, Widget new, ArgList args, Cardinal *num_args);
824N/Astatic XtGeometryResult GeometryManager(Widget w, XtWidgetGeometry *desired, XtWidgetGeometry *allowed);
824N/Astatic void Cancel(Widget w);
824N/Astatic void ChangeManaged(Widget w);
824N/Astatic void ClassInitialize(void);
824N/Astatic void ClassPartInitialize(WidgetClass widget_class);
824N/Astatic void ClickAction(Widget widget, XEvent *event, String *params, Cardinal *num_params);
824N/Astatic void Destroy(Widget widget);
824N/Astatic void Initialize(Widget request, Widget new, ArgList args, Cardinal *num_args);
824N/Astatic void Resize(Widget widget);
824N/A
824N/Astatic XtActionsRec actions[] = {
824N/A {"FSBClickAction", ClickAction}
824N/A};
824N/A
824N/AFontSamplerClassRec fontSamplerClassRec = {
824N/A /* Core class part */
824N/A {
824N/A /* superclass */ (WidgetClass) &xmManagerClassRec,
824N/A /* class_name */ "FontSampler",
824N/A /* widget_size */ sizeof(FontSamplerRec),
824N/A /* class_initialize */ ClassInitialize,
824N/A /* class_part_initialize */ ClassPartInitialize,
824N/A /* class_inited */ False,
824N/A /* initialize */ Initialize,
824N/A /* initialize_hook */ NULL,
824N/A /* realize */ XtInheritRealize,
824N/A /* actions */ actions,
824N/A /* num_actions */ XtNumber(actions),
824N/A /* resources */ resources,
824N/A /* num_resources */ XtNumber(resources),
824N/A /* xrm_class */ NULLQUARK,
824N/A /* compress_motion */ True,
824N/A /* compress_exposure */ XtExposeCompressMultiple,
824N/A /* compress_enterleave */ True,
824N/A /* visible_interest */ False,
824N/A /* destroy */ Destroy,
824N/A /* resize */ Resize,
824N/A /* expose */ NULL,
824N/A /* set_values */ SetValues,
824N/A /* set_values_hook */ NULL,
824N/A /* set_values_almost */ XtInheritSetValuesAlmost,
824N/A /* get_values_hook */ NULL,
824N/A /* accept_focus */ NULL,
824N/A /* version */ XtVersion,
824N/A /* callback offsets */ NULL,
824N/A /* tm_table */ NULL,
824N/A /* query_geometry */ XtInheritQueryGeometry,
824N/A /* display_accelerator */ NULL,
824N/A /* extension */ NULL,
824N/A },
824N/A /* Composite class part */
824N/A {
824N/A /* geometry_manager */ GeometryManager,
824N/A /* change_managed */ ChangeManaged,
824N/A /* insert_child */ XtInheritInsertChild,
824N/A /* delete_child */ XtInheritDeleteChild,
824N/A /* extension */ NULL,
824N/A },
824N/A /* Constraint class part */
824N/A {
824N/A /* resources */ NULL,
824N/A /* num_resources */ 0,
824N/A /* constraint_size */ 0,
824N/A /* initialize */ NULL,
824N/A /* destroy */ NULL,
824N/A /* set_values */ NULL,
824N/A /* extension */ NULL,
824N/A },
824N/A /* Manager class part */
824N/A {
824N/A /* translations */ XtInheritTranslations,
824N/A /* syn_resources */ NULL,
824N/A /* num_syn_resources */ 0,
824N/A /* syn_constraint_resources */ NULL,
824N/A /* num_syn_constraint_resources */ 0,
824N/A /* parent_process */ XmInheritParentProcess,
824N/A /* extension */ NULL,
824N/A },
824N/A /* FontSampler class part */
824N/A {
824N/A /* cancel */ Cancel,
824N/A /* extension */ NULL,
824N/A }
824N/A};
824N/A
824N/AWidgetClass fontSamplerWidgetClass =
824N/A (WidgetClass) &fontSamplerClassRec;
824N/A
824N/Astruct _FilterRec;
824N/A
824N/Atypedef Boolean (*MatchProc)(String name, struct _FilterRec *filter);
824N/A
824N/Atypedef struct _FilterRec {
824N/A char *name;
824N/A char *particles[9];
824N/A MatchProc special;
824N/A} FilterRec;
824N/A
824N/Astatic Boolean MatchRoman(String name, FilterRec *filter);
824N/Astatic Boolean MatchMedium(String name, FilterRec *filter);
824N/Astatic Boolean MatchBlack(String name, FilterRec *filter);
824N/A
824N/AFilterRec filters[] = {
824N/A {"roman", {"Roman", NULL}, MatchRoman},
824N/A {"italic", {"Italic", "Kursiv", "Oblique", "Slanted", NULL}},
824N/A {"symbol", {"Pi", "Symbol", "Logo", "Math", "Ornaments",
824N/A "Carta", "Sonata", "Dingbats", NULL}},
824N/A {"display", {"Display", "Titling", NULL}},
824N/A {"alternate", {"Alternate", NULL}},
824N/A {"expert", {"Expert", NULL}},
824N/A {"oldstyle", {"Oldstyle Figures", "Old Style Figures",
824N/A "Expert", NULL}},
824N/A {"smallcaps", {"Small Caps", NULL}},
824N/A {"swash", {"Swash", NULL}},
824N/A {"script", {"Script", NULL}},
824N/A {"separator1", { NULL}},
824N/A {"condensed", {"Condensed", "Compressed", "Narrow", NULL}},
824N/A {"extended", {"Extended", NULL}},
824N/A {"separator2", { NULL}},
824N/A {"light", {"Light", "Thin", NULL}},
824N/A {"book", {"Book", NULL}},
824N/A {"medium", {"Medium", "Normal", "Regular",
824N/A "Roman", NULL}, MatchMedium},
824N/A {"demi", {"Demi", "Semi", "Demibold", "Semibold", NULL}},
824N/A {"bold", {"Bold", NULL}},
824N/A {"black", {"Black", "Heavy", "Poster", "Scal",
824N/A "Ultra", NULL}, MatchBlack},
824N/A {"separator3", { NULL}},
824N/A { NULL, { NULL}}
824N/A};
824N/A
824N/A#define ITALIC_FILTER 1
824N/A#define SYMBOL_FILTER 2
824N/A#define TYPE_FILTERS 0
824N/A#define WIDTH_FILTERS 11
824N/A#define WEIGHT_FILTERS 14
824N/A
824N/Astatic int class_indices[] = {TYPE_FILTERS, WIDTH_FILTERS, WEIGHT_FILTERS, -1};
824N/A
824N/Astatic void ShowLabel(FontSamplerWidget s, XmString string)
824N/A{
824N/A XtVaSetValues(s->sampler.font_label_child, XmNlabelString, string, NULL);
824N/A}
824N/A
824N/Astatic void UnhighlightFont(FontSamplerWidget s)
824N/A{
824N/A DisplayedFontRec *d = s->sampler.highlighted_font;
824N/A
824N/A XCopyArea(XtDisplay(s->sampler.area_child), s->sampler.pixmap,
824N/A XtWindow(s->sampler.area_child),
824N/A s->sampler.gc, d->l-1, d->t-1, d->r - d->l + 2, d->b - d->t + 2,
824N/A d->l-1, d->t-1);
824N/A}
824N/A
824N/Astatic void HighlightFont(FontSamplerWidget s)
824N/A{
824N/A DisplayedFontRec *d = s->sampler.highlighted_font;
824N/A FontRec *f = d->font;
824N/A BlendRec *b = d->blend;
824N/A String fontName;
824N/A int bogusFont;
824N/A
824N/A if (b == NULL) fontName = f->font_name;
824N/A else fontName = b->font_name;
824N/A
824N/A (void) _FSBDownloadFontIfNecessary(d->font, s->sampler.fsb);
824N/A
824N/A XDPSSetContextGState(s->sampler.fsb->fsb.context, s->sampler.gstate);
824N/A DPSsetrgbcolor(s->sampler.fsb->fsb.context, 1.0, 0.0, 0.0);
824N/A _DPSFShowText(s->sampler.fsb->fsb.context, d->text->str,
824N/A fontName, d->text->size, d->x, d->y, &bogusFont);
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void ClickAction(
824N/A Widget widget,
824N/A XEvent *event,
824N/A String *params,
824N/A Cardinal *num_params)
824N/A{
824N/A XButtonEvent *b = (XButtonEvent *) event;
824N/A DisplayedFontRec *f;
824N/A FontSamplerWidget s =
824N/A (FontSamplerWidget) XtParent(XtParent(XtParent(XtParent(widget))));
824N/A XmString CSname;
824N/A char buf[512];
824N/A
824N/A if (event->type != ButtonPress) return;
824N/A
824N/A if (s->sampler.current_display_info == NULL) return;
824N/A
824N/A f = s->sampler.current_display_info->shown_fonts;
824N/A
824N/A while (f != NULL &&
824N/A (b->x < f->l || b->y < f->t || b->x > f->r || b->y > f->b)) {
824N/A f = f->next;
824N/A }
824N/A
824N/A if (f != NULL) {
824N/A if (s->sampler.highlighted_font == f) return;
824N/A if (s->sampler.highlighted_font != NULL) UnhighlightFont(s);
824N/A s->sampler.highlighted_font = f;
824N/A HighlightFont(s);
824N/A if (f->blend == NULL) CSname = UnsharedCS(f->font->full_name);
824N/A else {
824N/A sprintf(buf, "%s %s", f->font->full_name, f->blend->blend_name);
824N/A CSname = UnsharedCS(buf);
824N/A }
824N/A ShowLabel(s, CSname);
824N/A XmStringFree(CSname);
824N/A if (f->blend == NULL) {
824N/A _FSBSetCurrentFont(s->sampler.fsb, f->font->font_name);
824N/A } else {
824N/A _FSBSetCurrentFont(s->sampler.fsb, f->blend->font_name);
824N/A }
824N/A }
824N/A}
824N/A
824N/Astatic void UpdateDisplayedFontRecs(
824N/A DisplayRecord *info,
824N/A Position newHeight,
824N/A Position oldHeight,
824N/A Position newWidth)
824N/A{
824N/A float *m = info->sampler->sampler.invctm;
824N/A float h, w;
824N/A Position oldInfoHeight = info->height;
824N/A DisplayedFontRec *f;
824N/A
824N/A info->window_height = newHeight;
824N/A h = newHeight;
824N/A w = newWidth;
824N/A
824N/A info->width = (int) (m[0] * w - m[2] * h + m[4]);
824N/A info->height = (int) (m[1] * w - m[3] * h + m[5]);
824N/A
824N/A info->y += info->height - oldInfoHeight;
824N/A
824N/A for (f = info->shown_fonts; f != NULL; f = f->next) {
824N/A f->y += info->height - oldInfoHeight;
824N/A }
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void ResizeEventHandler(
824N/A Widget widget,
824N/A XtPointer clientData,
824N/A XEvent *event,
824N/A Boolean *continueToDispatch)
824N/A{
824N/A Dimension clip_width, clip_height, new_width, new_height,
824N/A area_width, area_height;
824N/A int depth;
824N/A FontSamplerWidget s = (FontSamplerWidget) clientData;
824N/A Pixmap p;
824N/A
824N/A if (event->type != ConfigureNotify) return;
824N/A
824N/A XtVaGetValues(s->sampler.clip_widget, XtNwidth, &clip_width,
824N/A XtNheight, &clip_height, NULL);
824N/A XtVaGetValues(s->sampler.area_child, XtNwidth, &area_width,
824N/A XtNheight, &area_height, XtNdepth, &depth, NULL);
824N/A
824N/A /* Trying to make it fit exactly causes looooping... */
824N/A
824N/A new_width = clip_width-2;
824N/A new_height = clip_height-2;
824N/A
824N/A if (clip_width < s->sampler.minimum_width) {
824N/A new_width = s->sampler.minimum_width;
824N/A }
824N/A if (clip_height < s->sampler.minimum_height) {
824N/A new_height = s->sampler.minimum_height;
824N/A }
824N/A
824N/A if (new_height != area_height || new_width != area_width) {
824N/A XtVaSetValues(s->sampler.area_child, XtNwidth, new_width,
824N/A XtNheight, new_height, NULL);
824N/A
824N/A p = XCreatePixmap(XtDisplay(s->sampler.area_child),
824N/A RootWindowOfScreen(XtScreen(s->sampler.area_child)),
824N/A new_width, new_height, depth);
824N/A
824N/A if (s->sampler.gstate != 0) {
824N/A XDPSSetContextGState(s->sampler.fsb->fsb.context,
824N/A s->sampler.gstate);
824N/A XDPSSetContextParameters(s->sampler.fsb->fsb.context,
824N/A XtScreen(s->sampler.area_child), depth,
824N/A XtWindow(s->sampler.area_child),
824N/A new_height,
824N/A (XDPSStandardColormap *) NULL,
824N/A (XDPSStandardColormap *) NULL,
824N/A XDPSContextScreenDepth | XDPSContextDrawable |
824N/A XDPSContextRGBMap | XDPSContextGrayMap);
824N/A _DPSFReclip(s->sampler.fsb->fsb.context);
824N/A _DPSFGetCTM(s->sampler.fsb->fsb.context,
824N/A s->sampler.ctm, s->sampler.invctm);
824N/A XDPSUpdateContextGState(s->sampler.fsb->fsb.context,
824N/A s->sampler.gstate);
824N/A XDPSSetContextGState(s->sampler.fsb->fsb.context,
824N/A s->sampler.pixmap_gstate);
824N/A XDPSSetContextParameters(s->sampler.fsb->fsb.context,
824N/A (Screen *) NULL, 0,
824N/A p, new_height,
824N/A (XDPSStandardColormap *) NULL,
824N/A (XDPSStandardColormap *) NULL,
824N/A XDPSContextDrawable);
824N/A XDPSUpdateContextGState(s->sampler.fsb->fsb.context,
824N/A s->sampler.pixmap_gstate);
824N/A
824N/A _DPSFClearWindow(s->sampler.fsb->fsb.context);
824N/A /* La di dah */
824N/A DPSWaitContext(s->sampler.fsb->fsb.context);
824N/A XCopyArea(XtDisplay(s), s->sampler.pixmap, p,
824N/A s->sampler.gc, 0, 0, new_width, new_height, 0, 0);
824N/A }
824N/A XFreePixmap(XtDisplay(s), s->sampler.pixmap);
824N/A s->sampler.pixmap = p;
824N/A UpdateDisplayedFontRecs(s->sampler.current_display_info,
824N/A new_height, area_height, new_width);
824N/A }
824N/A}
824N/A
824N/Astatic void ClassInitialize(void)
824N/A{
824N/A XtInitializeWidgetClass(fontSelectionBoxWidgetClass);
824N/A}
824N/A
824N/Astatic void ClassPartInitialize(WidgetClass widget_class)
824N/A{
824N/A register FontSamplerWidgetClass wc =
824N/A (FontSamplerWidgetClass) widget_class;
824N/A FontSamplerWidgetClass super =
824N/A (FontSamplerWidgetClass) wc->core_class.superclass;
824N/A
824N/A if (wc->sampler_class.cancel == InheritCancel) {
824N/A wc->sampler_class.cancel = super->sampler_class.cancel;
824N/A }
824N/A}
824N/A
824N/Astatic void FreeDisplayInfo(DisplayRecord *info)
824N/A{
824N/A DisplayedFontRec *f;
824N/A DisplayedTextRec *t;
824N/A
824N/A if (info == NULL) return;
824N/A
824N/A XtVaSetValues(info->sampler->sampler.font_label_child,
824N/A XtVaTypedArg, XmNlabelString, XtRString,
824N/A " ", 2, NULL);
824N/A
824N/A while ((f = info->shown_fonts) != NULL) {
824N/A info->shown_fonts = f->next;
824N/A XtFree((char *) f);
824N/A }
824N/A
824N/A while ((t = info->text_list) != NULL) {
824N/A info->text_list = t->next;
824N/A XtFree((char *) t->str);
824N/A XtFree((char *) t);
824N/A }
824N/A
824N/A XtFree((char *) info);
824N/A}
824N/A
824N/Astatic Boolean IsSet(Widget widget)
824N/A{
824N/A return XmToggleButtonGadgetGetState(widget);
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void DisplayCallback(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A XtAppContext app;
824N/A float h, w;
824N/A DisplayRecord *info;
824N/A FontSamplerWidget s = (FontSamplerWidget) clientData;
824N/A float *m;
824N/A char *value;
824N/A DisplayedTextRec *t;
824N/A
824N/A if (s->sampler.current_display_proc != None) {
824N/A XtRemoveWorkProc(s->sampler.current_display_proc);
824N/A }
824N/A FreeDisplayInfo(s->sampler.current_display_info);
824N/A s->sampler.highlighted_font = NULL;
824N/A
824N/A app = XtDisplayToApplicationContext(XtDisplay(widget));
824N/A
824N/A info = s->sampler.current_display_info =
824N/A (DisplayRecord *) XtNew(DisplayRecord);
824N/A
824N/A XtVaGetValues(s->sampler.area_child,
824N/A XtNwidth, &info->width,
824N/A XtNheight, &info->window_height,
824N/A XtNdepth, &info->depth,
824N/A NULL);
824N/A
824N/A if (s->sampler.gstate == 0) {
824N/A XDPSSetContextParameters(s->sampler.fsb->fsb.context,
824N/A XtScreen(s->sampler.area_child), info->depth,
824N/A XtWindow(s->sampler.area_child),
824N/A info->window_height,
824N/A (XDPSStandardColormap *) NULL,
824N/A (XDPSStandardColormap *) NULL,
824N/A XDPSContextScreenDepth | XDPSContextDrawable |
824N/A XDPSContextRGBMap | XDPSContextGrayMap);
824N/A DPSsetgray(s->sampler.fsb->fsb.context, 0.0);
824N/A XDPSCaptureContextGState(s->sampler.fsb->fsb.context,
824N/A &s->sampler.gstate);
824N/A _DPSFGetCTM(s->sampler.fsb->fsb.context,
824N/A s->sampler.ctm, s->sampler.invctm);
824N/A XDPSSetContextParameters(s->sampler.fsb->fsb.context,
824N/A (Screen *) NULL, 0,
824N/A s->sampler.pixmap, info->window_height,
824N/A (XDPSStandardColormap *) NULL,
824N/A (XDPSStandardColormap *) NULL,
824N/A XDPSContextDrawable);
824N/A DPSsetgray(s->sampler.fsb->fsb.context, 0.0);
824N/A XDPSCaptureContextGState(s->sampler.fsb->fsb.context,
824N/A &s->sampler.pixmap_gstate);
824N/A }
824N/A
824N/A h = info->window_height;
824N/A w = info->width;
824N/A
824N/A m = s->sampler.invctm;
824N/A
824N/A info->width = (int) (m[0] * w - m[2] * h + m[4]);
824N/A info->height = (int) (m[1] * w - m[3] * h + m[5]);
824N/A info->sampler = s;
824N/A info->inited = info->any_shown = False;
824N/A info->column_width = 0;
824N/A info->x = 5;
824N/A info->y = info->height;
824N/A info->shown_fonts = NULL;
824N/A
824N/A t = info->text_list = XtNew(DisplayedTextRec);
824N/A t->next = NULL;
824N/A value = XmTextFieldGetString(s->sampler.text_child);
824N/A t->str = XtNewString(value);
824N/A
824N/A value = XmTextFieldGetString(s->sampler.size_text_field_child);
824N/A
824N/A if (value == NULL || *value == '\0') t->size = SAMPLER_DEFAULT_SIZE;
824N/A else {
824N/A t->size = atof(value);
824N/A if (t->size <= 0) t->size = SAMPLER_DEFAULT_SIZE;
824N/A }
824N/A
824N/A s->sampler.displaying = True;
824N/A
824N/A XDPSSetContextGState(s->sampler.fsb->fsb.context, s->sampler.gstate);
824N/A _DPSFClearWindow(s->sampler.fsb->fsb.context);
824N/A XDPSSetContextGState(s->sampler.fsb->fsb.context,
824N/A s->sampler.pixmap_gstate);
824N/A _DPSFClearWindow(s->sampler.fsb->fsb.context);
824N/A
824N/A XtSetSensitive(s->sampler.stop_button_child, True);
824N/A
824N/A if (IsSet(s->sampler.all_toggle_child)) {
824N/A s->sampler.current_display_proc =
824N/A XtAppAddWorkProc(app, DisplayAllWorkProc,
824N/A (XtPointer) info);
824N/A } else if (IsSet(s->sampler.selected_toggle_child)) {
824N/A s->sampler.current_display_proc =
824N/A XtAppAddWorkProc(app, DisplaySelectedWorkProc,
824N/A (XtPointer) info);
824N/A } else if (IsSet(s->sampler.selected_family_toggle_child)) {
824N/A s->sampler.current_display_proc =
824N/A XtAppAddWorkProc(app, DisplaySelectedFamilyWorkProc,
824N/A (XtPointer) info);
824N/A } else if (IsSet(s->sampler.filter_toggle_child)) {
824N/A s->sampler.current_display_proc =
824N/A XtAppAddWorkProc(app, DisplayFilteredWorkProc,
824N/A (XtPointer) info);
824N/A }
824N/A}
824N/A
824N/Astatic void FinishUpDisplaying(FontSamplerWidget s)
824N/A{
824N/A XtSetSensitive(s->sampler.stop_button_child, False);
824N/A s->sampler.current_display_proc = None;
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void FilterCallback(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A FontSamplerWidget s = (FontSamplerWidget) clientData;
824N/A
824N/A s->sampler.filters_changed = True;
824N/A
824N/A if (IsSet(s->sampler.filter_toggle_child)) return;
824N/A
824N/A XmToggleButtonGadgetSetState(s->sampler.filter_toggle_child, True, True);
824N/A
824N/A XmToggleButtonGadgetSetState(s->sampler.all_toggle_child, False, False);
824N/A XmToggleButtonGadgetSetState(s->sampler.selected_toggle_child,
824N/A False, False);
824N/A XmToggleButtonGadgetSetState(s->sampler.selected_family_toggle_child,
824N/A False, False);
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void TextCallback(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A FontSamplerWidget s = (FontSamplerWidget) clientData;
824N/A DisplayedTextRec *t;
824N/A char *value;
824N/A
824N/A if (!s->sampler.displaying) return;
824N/A
824N/A t = XtNew(DisplayedTextRec);
824N/A
824N/A value = XmTextFieldGetString(s->sampler.text_child);
824N/A t->str = XtNewString(value);
824N/A t->size = s->sampler.current_display_info->text_list->size;
824N/A t->next = s->sampler.current_display_info->text_list;
824N/A s->sampler.current_display_info->text_list = t;
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void StopCallback(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A FontSamplerWidget s = (FontSamplerWidget) clientData;
824N/A
824N/A if (s->sampler.current_display_proc == None) return;
824N/A
824N/A XtRemoveWorkProc(s->sampler.current_display_proc);
824N/A FinishUpDisplaying(s);
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void DismissCallback(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A FontSamplerWidget s = (FontSamplerWidget) clientData;
824N/A
824N/A if (XtIsShell(XtParent(s))) XtPopdown(XtParent(s));
824N/A
824N/A if (s->sampler.current_display_proc != None) {
824N/A XtRemoveWorkProc(s->sampler.current_display_proc);
824N/A }
824N/A FinishUpDisplaying(s);
824N/A
824N/A XtCallCallbackList(widget, s->sampler.dismiss_callback, (XtPointer) NULL);
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void PopdownCallback(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A FontSamplerWidget s =
824N/A (FontSamplerWidget)
824N/A (((CompositeWidget) widget)->composite.children[0]);
824N/A
824N/A if (s->sampler.current_display_proc != None) {
824N/A XtRemoveWorkProc(s->sampler.current_display_proc);
824N/A }
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void ExposeCallback(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A XmDrawingAreaCallbackStruct *da = (XmDrawingAreaCallbackStruct *) callData;
824N/A XExposeEvent *ev = (XExposeEvent *) da->event;
824N/A FontSamplerWidget s = (FontSamplerWidget) clientData;
824N/A
824N/A if (ev->type != Expose || !s->sampler.displaying) return;
824N/A
824N/A XCopyArea(XtDisplay(widget), s->sampler.pixmap, XtWindow(widget),
824N/A s->sampler.gc, ev->x, ev->y, ev->width, ev->height,
824N/A ev->x, ev->y);
824N/A if (s->sampler.highlighted_font != NULL) HighlightFont(s);
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void ClearCallback(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A int j;
824N/A FontSamplerWidget s = (FontSamplerWidget) clientData;
824N/A
824N/A for (j = 0; filters[j].name != NULL; j++) {
824N/A if (filters[j].particles[0] != NULL) {
824N/A XmToggleButtonGadgetSetState(s->sampler.filter_widgets[j],
824N/A False, False);
824N/A }
824N/A }
824N/A
824N/A XmTextFieldSetString(s->sampler.filter_text_child, "");
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void SizeSelect(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A FontSamplerWidget s = (FontSamplerWidget) clientData;
824N/A String value;
824N/A Widget option;
824N/A char *ch;
824N/A DisplayedTextRec *t;
824N/A
824N/A value = XmTextFieldGetString(widget);
824N/A
824N/A if (value == NULL) option = s->sampler.other_size;
824N/A else {
824N/A for (ch = value; *ch != '\0'; ch++) if (*ch == '.') *ch = '-';
824N/A
824N/A option = XtNameToWidget(s->sampler.size_menu, value);
824N/A if (option == NULL) option = s->sampler.other_size;
824N/A }
824N/A
824N/A XtVaSetValues(s->sampler.size_option_menu_child,
824N/A XmNmenuHistory, option, NULL);
824N/A
824N/A if (!s->sampler.displaying) return;
824N/A
824N/A t = XtNew(DisplayedTextRec);
824N/A
824N/A t->str = XtNewString(s->sampler.current_display_info->text_list->str);
824N/A if (value == NULL || *value == '\0') t->size = SAMPLER_DEFAULT_SIZE;
824N/A else {
824N/A t->size = atof(value);
824N/A if (t->size <= 0) t->size = SAMPLER_DEFAULT_SIZE;
824N/A }
824N/A t->next = s->sampler.current_display_info->text_list;
824N/A s->sampler.current_display_info->text_list = t;
824N/A}
824N/A
824N/A/* There's a problem; sometimes the change has already been made in the field,
824N/A and sometimes it hasn't. The times when it has seem to correspond to
824N/A making changes with the size option menu, so we use this disgusting
824N/A global flag to notice when this happens. */
824N/A
824N/Astatic Boolean changingSize = False;
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void TextVerify(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A int i;
824N/A XmTextVerifyPtr v = (XmTextVerifyPtr) callData;
824N/A char ch, *cp;
824N/A int decimalPoints = 0;
824N/A
824N/A if (changingSize) return; /* We know what we're doing; allow it */
824N/A
824N/A /* Should probably look at format field, but seems to contain garbage */
824N/A
824N/A if (v->text->length == 0) return;
824N/A
824N/A for (i = 0; i < v->text->length; i++) {
824N/A ch = v->text->ptr[i];
824N/A if (ch == '.') decimalPoints++;
824N/A else if (!isdigit(ch)) {
824N/A v->doit = False;
824N/A return;
824N/A }
824N/A }
824N/A
824N/A if (decimalPoints > 1) {
824N/A v->doit = False;
824N/A return;
824N/A }
824N/A
824N/A cp = XmTextFieldGetString(widget);
824N/A
824N/A for (/**/; *cp != '\0'; cp++) {
824N/A if (*cp == '.') decimalPoints++;
824N/A }
824N/A
824N/A if (decimalPoints > 1) v->doit = False;
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void SetSize(Widget widget, XtPointer clientData, XtPointer callData)
824N/A{
824N/A char buf[20], *ch;
824N/A FontSamplerWidget s = (FontSamplerWidget) clientData;
824N/A
824N/A strcpy(buf, XtName(widget));
824N/A for (ch = buf; *ch != '\0'; ch++) if (*ch == '-') *ch++ = '.';
824N/A
824N/A changingSize = True;
824N/A XmTextFieldSetString(s->sampler.size_text_field_child, buf);
824N/A changingSize = False;
824N/A}
824N/A
824N/Astatic void CreateSizeMenu(FontSamplerWidget s, Boolean destroyOldChildren)
824N/A{
824N/A Arg args[20];
824N/A int i, j;
824N/A Widget *sizes;
824N/A char buf[20];
824N/A Widget *children;
824N/A Cardinal num_children;
824N/A XmString csName;
824N/A char *ch;
824N/A
824N/A if (destroyOldChildren) {
824N/A XtVaGetValues(s->sampler.size_menu, XtNchildren, &children,
824N/A XtNnumChildren, &num_children, NULL);
824N/A
824N/A /* Don't destroy first child ("other") */
824N/A for (j = 1; (Cardinal)j < num_children; j++) XtDestroyWidget(children[j]);
824N/A
824N/A sizes = (Widget *) XtMalloc((s->sampler.size_count+1) *
824N/A sizeof(Widget));
824N/A sizes[0] = children[0];
824N/A } else {
824N/A i = 0;
824N/A sizes = (Widget *) XtMalloc((s->sampler.size_count+1) *
824N/A sizeof(Widget));
824N/A s->sampler.other_size = sizes[0] =
824N/A XtCreateManagedWidget("other", xmPushButtonGadgetClass,
824N/A s->sampler.size_menu, args, i);
824N/A }
824N/A
824N/A for (j = 0; j < s->sampler.size_count; j++) {
824N/A (void) sprintf(buf, "%g", s->sampler.sizes[j]);
824N/A csName = UnsharedCS(buf);
824N/A for (ch = buf; *ch != '\0'; ch++) if (*ch == '.') *ch = '-';
824N/A i = 0;
824N/A XtSetArg(args[i], XmNlabelString, csName); i++;
824N/A sizes[j+1] =
824N/A XmCreatePushButtonGadget(s->sampler.size_menu, buf, args, i);
824N/A XmStringFree(csName);
824N/A XtAddCallback(sizes[j+1], XmNactivateCallback, SetSize, (XtPointer) s);
824N/A }
824N/A XtManageChildren(sizes, j+1);
824N/A XtFree((char *) sizes);
824N/A}
824N/A
824N/Astatic void CreateFilters(FontSamplerWidget s)
824N/A{
824N/A FilterRec *f;
824N/A int i;
824N/A
824N/A s->sampler.filter_widgets =
824N/A (Widget *) XtCalloc(XtNumber(filters)-1, sizeof(Widget));
824N/A
824N/A s->sampler.filter_flags =
824N/A (Boolean *) XtCalloc(XtNumber(filters)-1, sizeof(Boolean));
824N/A
824N/A for (i = 0; filters[i].name != NULL; i++) {
824N/A f = filters+i;
824N/A if (f->particles[0] == NULL) {
824N/A s->sampler.filter_widgets[i] =
824N/A XtCreateManagedWidget(f->name, xmSeparatorGadgetClass,
824N/A s->sampler.filter_box_child,
824N/A (ArgList) NULL, 0);
824N/A } else {
824N/A s->sampler.filter_widgets[i] =
824N/A XtCreateManagedWidget(f->name, xmToggleButtonGadgetClass,
824N/A s->sampler.filter_box_child,
824N/A (ArgList) NULL, 0);
824N/A XtAddCallback(s->sampler.filter_widgets[i],
824N/A XmNvalueChangedCallback,
824N/A FilterCallback, (XtPointer) s);
824N/A }
824N/A }
824N/A}
824N/A
824N/Astatic void CreateChildren(FontSamplerWidget s)
824N/A{
824N/A Arg args[20];
824N/A int i;
824N/A Widget form;
824N/A Dimension area_width, area_height;
824N/A int depth;
824N/A Widget w, rowcol;
824N/A
824N/A form = s->sampler.panel_child =
824N/A XtCreateManagedWidget("panel", xmFormWidgetClass,
824N/A (Widget) s, (ArgList) NULL, 0);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
824N/A XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
824N/A s->sampler.display_button_child =
824N/A XtCreateManagedWidget("displayButton", xmPushButtonWidgetClass,
824N/A form, args, i);
824N/A XtAddCallback(s->sampler.display_button_child, XmNactivateCallback,
824N/A DisplayCallback, (XtPointer) s);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
824N/A XtSetArg(args[i], XmNleftWidget, s->sampler.display_button_child); i++;
824N/A XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
824N/A XtSetArg(args[i], XtNsensitive, False); i++;
824N/A s->sampler.stop_button_child =
824N/A XtCreateManagedWidget("stopButton", xmPushButtonWidgetClass,
824N/A form, args, i);
824N/A XtAddCallback(s->sampler.stop_button_child, XmNactivateCallback,
824N/A StopCallback, (XtPointer) s);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
824N/A XtSetArg(args[i], XmNleftWidget, s->sampler.stop_button_child); i++;
824N/A XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
824N/A s->sampler.dismiss_button_child =
824N/A XtCreateManagedWidget("dismissButton", xmPushButtonWidgetClass,
824N/A form, args, i);
824N/A XtAddCallback(s->sampler.dismiss_button_child, XmNactivateCallback,
824N/A DismissCallback, (XtPointer) s);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
824N/A XtSetArg(args[i], XmNleftWidget, s->sampler.dismiss_button_child); i++;
824N/A XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
824N/A s->sampler.size_label_child =
824N/A XtCreateManagedWidget("sizeLabel", xmLabelWidgetClass,
824N/A form, args, i);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
824N/A XtSetArg(args[i], XmNleftWidget, s->sampler.size_label_child); i++;
824N/A XtSetArg(args[i], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
824N/A XtSetArg(args[i], XmNbottomWidget, s->sampler.size_label_child); i++;
824N/A s->sampler.size_text_field_child =
824N/A XtCreateManagedWidget("sizeTextField",
824N/A xmTextFieldWidgetClass,
824N/A form, args, i);
824N/A XtAddCallback(s->sampler.size_text_field_child, XmNvalueChangedCallback,
824N/A SizeSelect, (XtPointer) s);
824N/A XtAddCallback(s->sampler.size_text_field_child, XmNmodifyVerifyCallback,
824N/A TextVerify, (XtPointer) NULL);
824N/A
824N/A i = 0;
824N/A s->sampler.size_menu = XmCreatePulldownMenu(form, "sizeMenu", args, i);
824N/A
824N/A CreateSizeMenu(s, False);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
824N/A XtSetArg(args[i], XmNleftWidget, s->sampler.size_text_field_child); i++;
824N/A XtSetArg(args[i], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
824N/A XtSetArg(args[i], XmNbottomWidget, s->sampler.size_label_child); i++;
824N/A XtSetArg(args[i], XmNsubMenuId, s->sampler.size_menu); i++;
824N/A s->sampler.size_option_menu_child =
824N/A XmCreateOptionMenu(form, "sizeOptionMenu", args, i);
824N/A XtManageChild(s->sampler.size_option_menu_child);
824N/A
824N/A SizeSelect(s->sampler.size_text_field_child, (XtPointer) s,
824N/A (XtPointer) NULL);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
824N/A XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
824N/A rowcol = XtCreateManagedWidget("rowColumn", xmRowColumnWidgetClass,
824N/A form, args, i);
824N/A
824N/A i = 0;
824N/A s->sampler.radio_frame_child =
824N/A XtCreateManagedWidget("radioFrame", xmFrameWidgetClass,
824N/A rowcol, args, i);
824N/A
824N/A i = 0;
824N/A s->sampler.radio_box_child = XmCreateRadioBox(s->sampler.radio_frame_child,
824N/A "radioBox", args, i);
824N/A XtManageChild(s->sampler.radio_box_child);
824N/A
824N/A i = 0;
824N/A s->sampler.all_toggle_child =
824N/A XtCreateManagedWidget("allToggle", xmToggleButtonGadgetClass,
824N/A s->sampler.radio_box_child, args, i);
824N/A
824N/A i = 0;
824N/A s->sampler.selected_toggle_child =
824N/A XtCreateManagedWidget("selectedToggle", xmToggleButtonGadgetClass,
824N/A s->sampler.radio_box_child, args, i);
824N/A
824N/A i = 0;
824N/A s->sampler.selected_family_toggle_child =
824N/A XtCreateManagedWidget("selectedFamilyToggle",
824N/A xmToggleButtonGadgetClass,
824N/A s->sampler.radio_box_child, args, i);
824N/A
824N/A i = 0;
824N/A s->sampler.filter_toggle_child =
824N/A XtCreateManagedWidget("filterToggle",
824N/A xmToggleButtonGadgetClass,
824N/A s->sampler.radio_box_child, args, i);
824N/A
824N/A i = 0;
824N/A s->sampler.filter_frame_child =
824N/A XtCreateManagedWidget("filterFrame", xmFrameWidgetClass,
824N/A rowcol, args, i);
824N/A
824N/A i = 0;
824N/A s->sampler.filter_box_child =
824N/A XtCreateManagedWidget("filterBox", xmRowColumnWidgetClass,
824N/A s->sampler.filter_frame_child, args, i);
824N/A
824N/A CreateFilters(s);
824N/A
824N/A i = 0;
824N/A s->sampler.filter_text_child =
824N/A XtCreateManagedWidget("filterText", xmTextFieldWidgetClass,
824N/A s->sampler.filter_box_child, args, i);
824N/A XtAddCallback(s->sampler.filter_text_child,
824N/A XmNvalueChangedCallback,
824N/A FilterCallback, (XtPointer) s);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
824N/A XtSetArg(args[i], XmNleftWidget, rowcol); i++;
824N/A XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
824N/A XtSetArg(args[i], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
824N/A XtSetArg(args[i], XmNrightWidget, rowcol); i++;
824N/A s->sampler.clear_button_child =
824N/A XtCreateManagedWidget("clearButton", xmPushButtonWidgetClass,
824N/A form, args, i);
824N/A XtAddCallback(s->sampler.clear_button_child, XmNactivateCallback,
824N/A ClearCallback, (XtPointer) s);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
824N/A XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
824N/A XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
824N/A XtSetArg(args[i], XmNrightWidget, rowcol); i++;
824N/A s->sampler.text_child =
824N/A XtCreateManagedWidget("text", xmTextFieldWidgetClass,
824N/A form, args, i);
824N/A XtAddCallback(s->sampler.text_child,
824N/A XmNvalueChangedCallback,
824N/A TextCallback, (XtPointer) s);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
824N/A XtSetArg(args[i], XmNtopWidget, s->sampler.text_child); i++;
824N/A XtSetArg(args[i], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
824N/A XtSetArg(args[i], XmNleftWidget, s->sampler.text_child); i++;
824N/A XtSetArg(args[i], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); i++;
824N/A XtSetArg(args[i], XmNrightWidget, s->sampler.text_child); i++;
824N/A s->sampler.font_label_child =
824N/A XtCreateManagedWidget("fontLabel", xmLabelGadgetClass,
824N/A form, args, i);
824N/A
824N/A i = 0;
824N/A XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
824N/A XtSetArg(args[i], XmNtopWidget, s->sampler.font_label_child); i++;
824N/A XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
824N/A XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
824N/A XtSetArg(args[i], XmNrightWidget, rowcol); i++;
824N/A XtSetArg(args[i], XmNbottomAttachment, XmATTACH_WIDGET); i++;
824N/A XtSetArg(args[i], XmNbottomWidget, s->sampler.display_button_child);i++;
824N/A XtSetArg(args[i], XmNscrollingPolicy, XmAUTOMATIC); i++;
824N/A s->sampler.scrolled_window_child =
824N/A XtCreateManagedWidget("scrolledWindow",
824N/A xmScrolledWindowWidgetClass,
824N/A form, args, i);
824N/A i = 0;
824N/A s->sampler.area_child =
824N/A XtCreateManagedWidget("area", xmDrawingAreaWidgetClass,
824N/A s->sampler.scrolled_window_child, args, i);
824N/A XtAddCallback(s->sampler.area_child, XmNexposeCallback,
824N/A ExposeCallback, (XtPointer) s);
824N/A
824N/A XtVaGetValues(s->sampler.scrolled_window_child,
824N/A XmNclipWindow, &s->sampler.clip_widget,
824N/A NULL);
824N/A
824N/A /* I would like to use translations for this, but Motif overwrites the
824N/A clip window's translation. Grr... */
824N/A
824N/A XtAddEventHandler(s->sampler.clip_widget, StructureNotifyMask, False,
824N/A ResizeEventHandler, (XtPointer) s);
824N/A
824N/A XtVaSetValues(s->sampler.scrolled_window_child,
824N/A XmNworkWindow, s->sampler.area_child, NULL);
824N/A
824N/A XtVaGetValues(s->sampler.area_child,
824N/A XtNheight, &area_height,
824N/A XtNwidth, &area_width,
824N/A XtNdepth, &depth,
824N/A NULL);
824N/A
824N/A if (area_height < s->sampler.minimum_height ||
824N/A area_width < s->sampler.minimum_width) {
824N/A area_height = MAX(area_height, s->sampler.minimum_height);
824N/A area_width = MAX(area_width, s->sampler.minimum_width);
824N/A
824N/A XtVaSetValues(s->sampler.area_child, XtNwidth, area_width,
824N/A XtNheight, area_height, NULL);
824N/A }
824N/A
824N/A s->sampler.pixmap =
824N/A XCreatePixmap(XtDisplay(s->sampler.area_child),
824N/A RootWindowOfScreen(XtScreen(s->sampler.area_child)),
824N/A area_width, area_height, depth);
824N/A
824N/A XtVaSetValues(form, XmNdefaultButton, s->sampler.display_button_child,
824N/A NULL);
824N/A
824N/A s->sampler.gc = XtGetGC(s->sampler.area_child, 0, (XGCValues *) NULL);
824N/A
824N/A for (w = XtParent(s); !XtIsShell(w); w = XtParent(w)) {}
824N/A XtAddCallback(w, XtNpopdownCallback, PopdownCallback, (XtPointer) NULL);
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic void Initialize(
824N/A Widget request, Widget new,
824N/A ArgList args,
824N/A Cardinal *num_args)
824N/A{
824N/A FontSamplerWidget sampler = (FontSamplerWidget) new;
824N/A
824N/A /* Must have a fsb */
824N/A
824N/A if (sampler->sampler.fsb == NULL) {
824N/A XtAppErrorMsg(XtWidgetToApplicationContext(new),
824N/A "initializeFontSampler", "noFontSelectionBox",
824N/A "FontSelectionBoxError",
824N/A "No font selection box given to font sampler",
824N/A (String *) NULL, (Cardinal *) NULL);
824N/A }
824N/A
824N/A /* Verify size list */
824N/A
824N/A if (sampler->sampler.size_count > 0 && sampler->sampler.sizes == NULL) {
824N/A XtAppWarningMsg(XtWidgetToApplicationContext(new),
824N/A "initializeFontSampler", "sizeMismatch",
824N/A "FontSelectionBoxError",
824N/A "Size count specified but no sizes present",
824N/A (String *) NULL, (Cardinal *) NULL);
824N/A sampler->sampler.size_count = 0;
824N/A }
824N/A
824N/A if (sampler->sampler.size_count < 0) {
824N/A XtAppWarningMsg(XtWidgetToApplicationContext(new),
824N/A "initializeFontSampler", "negativeSize",
824N/A "FontSelectionBoxError",
824N/A "Size count should not be negative",
824N/A (String *) NULL, (Cardinal *) NULL);
824N/A sampler->sampler.size_count = 0;
824N/A }
824N/A
824N/A /* Initialize non-resource fields */
824N/A
824N/A sampler->sampler.displaying = False;
824N/A sampler->sampler.current_display_proc = None;
824N/A sampler->sampler.current_display_info = NULL;
824N/A sampler->sampler.gstate = sampler->sampler.pixmap_gstate = 0;
824N/A
824N/A CreateChildren(sampler);
824N/A}
824N/A
824N/Astatic void AdvanceInfoToNextFont(DisplayRecord *info)
824N/A{
824N/A if (info->current_font->blend_data != NULL) {
824N/A if (info->current_blend == NULL) {
824N/A info->current_blend = info->current_font->blend_data->blends;
824N/A } else info->current_blend = info->current_blend->next;
824N/A if (info->current_blend == NULL) {
824N/A info->current_font = info->current_font->next;
824N/A }
824N/A } else info->current_font = info->current_font->next;
824N/A
824N/A if (info->current_font == NULL) {
824N/A info->current_family = info->current_family->next;
824N/A if (info->current_family != NULL) {
824N/A info->current_font = info->current_family->fonts;
824N/A }
824N/A }
824N/A}
824N/A
824N/Astatic Boolean ShowFont(DisplayRecord *info)
824N/A{
824N/A float width, left, right, top, bottom;
824N/A FontRec *f = info->current_font;
824N/A BlendRec *b = info->current_blend;
824N/A DisplayedFontRec *d;
824N/A FontSamplerWidget s = info->sampler;
824N/A float *m;
824N/A DisplayedTextRec *t = info->text_list;
824N/A String fontName;
824N/A int bogusFont;
824N/A int oldx, oldy;
824N/A
824N/A if (f == NULL) return True;
824N/A
824N/A oldx = info->x;
824N/A oldy = info->y;
824N/A
824N/A info->y -= t->size * 5 / 4;
824N/A
824N/A if (info->y < 0) {
824N/A if (info->column_width == 0) return False;
824N/A info->y = info->height - (t->size * 5 / 4);
824N/A info->x += info->column_width + (t->size / 4);
824N/A if (info->x > (int) info->width) return False;
824N/A info->column_width = 0;
824N/A }
824N/A
824N/A if (!_FSBDownloadFontIfNecessary(f, s->sampler.fsb)) {
824N/A AdvanceInfoToNextFont(info);
824N/A return True;
824N/A }
824N/A
824N/A if (b == NULL) fontName = f->font_name;
824N/A else fontName = b->font_name;
824N/A
824N/A /* Do ...AndGetDimensions on the pixmap to make sure that it's synced.
824N/A That way we can reliably do an XCopyArea without first doing a
824N/A WaitContext. */
824N/A
824N/A XDPSSetContextGState(s->sampler.fsb->fsb.context, s->sampler.gstate);
824N/A _DPSFShowText(s->sampler.fsb->fsb.context, t->str, fontName,
824N/A t->size, info->x, info->y, &bogusFont);
824N/A
824N/A AdvanceInfoToNextFont(info);
824N/A
824N/A if (bogusFont) {
824N/A info->x = oldx;
824N/A info->y = oldy;
824N/A
824N/A XCopyArea(XtDisplay(s), s->sampler.pixmap,
824N/A XtWindow(s->sampler.area_child),
824N/A s->sampler.gc, 0, 0, info->width, info->height, 0, 0);
824N/A
824N/A if (info->current_font == f) {
824N/A /* Must be the same font, different blend */
824N/A info->current_font = info->current_font->next;
824N/A
824N/A if (info->current_font == NULL) {
824N/A info->current_family = info->current_family->next;
824N/A if (info->current_family != NULL) {
824N/A info->current_font = info->current_family->fonts;
824N/A }
824N/A }
824N/A }
824N/A
824N/A _FSBFlushFont(s->sampler.fsb, f);
824N/A return True;
824N/A }
824N/A
824N/A XDPSSetContextGState(s->sampler.fsb->fsb.context,
824N/A s->sampler.pixmap_gstate);
824N/A _DPSFShowTextAndGetDimensions(s->sampler.fsb->fsb.context,
824N/A t->str, fontName,
824N/A t->size, info->x, info->y,
824N/A &width, &left, &right, &top, &bottom);
824N/A
824N/A width = ceil(width);
824N/A
824N/A if (width > (int) info->column_width) info->column_width = (int) width;
824N/A
824N/A d = XtNew(DisplayedFontRec);
824N/A
824N/A m = s->sampler.ctm;
824N/A
824N/A d->l = (int) (m[0] * left + m[2] * top + m[4]);
824N/A d->r = (int) ceil(m[0] * right + m[2] * bottom + m[4]);
824N/A d->t = (int) ceil(m[1] * left + m[3] * top + m[5] + info->window_height);
824N/A d->b = (int) (m[1] * right + m[3] * bottom + m[5] + info->window_height);
824N/A d->x = info->x;
824N/A d->y = info->y;
824N/A d->font = f;
824N/A d->blend = b;
824N/A d->text = info->text_list;
824N/A d->next = info->shown_fonts;
824N/A info->shown_fonts = d;
824N/A
824N/A return True;
824N/A}
824N/A
824N/Astatic Boolean DisplayAllWorkProc(XtPointer client_data)
824N/A{
824N/A DisplayRecord *info = (DisplayRecord *) client_data;
824N/A FontSamplerWidget s = info->sampler;
824N/A
824N/A if (!info->inited) {
824N/A info->inited = True;
824N/A info->current_family = s->sampler.fsb->fsb.known_families;
824N/A info->current_font = info->current_family->fonts;
824N/A info->current_blend = NULL;
824N/A }
824N/A
824N/A if (!ShowFont(info)) {
824N/A if (!info->any_shown) ShowLabel(s, s->sampler.no_room_message);
824N/A FinishUpDisplaying(s);
824N/A return True;
824N/A }
824N/A
824N/A info->any_shown = True;
824N/A if (info->current_family == NULL) {
824N/A if (!info->any_shown) ShowLabel(s, s->sampler.no_font_message);
824N/A FinishUpDisplaying(s);
824N/A return True;
824N/A }
824N/A return False;
824N/A}
824N/A
824N/Astatic Boolean DisplaySelectedWorkProc(XtPointer client_data)
824N/A{
824N/A DisplayRecord *info = (DisplayRecord *) client_data;
824N/A FontSamplerWidget s = info->sampler;
824N/A
824N/A info->current_family = s->sampler.fsb->fsb.currently_selected_family;
824N/A info->current_font = s->sampler.fsb->fsb.currently_selected_face;
824N/A info->current_blend = s->sampler.fsb->fsb.currently_selected_blend;
824N/A
824N/A if (info->current_font != NULL) {
824N/A if (!ShowFont(info)) ShowLabel(s, s->sampler.no_room_message);
824N/A } else ShowLabel(s, s->sampler.no_selected_font_message);
824N/A
824N/A FinishUpDisplaying(s);
824N/A return True;
824N/A}
824N/A
824N/Astatic Boolean DisplaySelectedFamilyWorkProc(XtPointer client_data)
824N/A{
824N/A DisplayRecord *info = (DisplayRecord *) client_data;
824N/A FontSamplerWidget s = info->sampler;
824N/A FontFamilyRec *currentFamily;
824N/A
824N/A if (!info->inited) {
824N/A info->inited = True;
824N/A info->current_family = s->sampler.fsb->fsb.currently_selected_family;
824N/A if (info->current_family != NULL) {
824N/A info->current_font = info->current_family->fonts;
824N/A info->current_blend = NULL;
824N/A } else {
824N/A ShowLabel(s, s->sampler.no_selected_family_message);
824N/A FinishUpDisplaying(s);
824N/A return True;
824N/A }
824N/A }
824N/A
824N/A currentFamily = info->current_family;
824N/A
824N/A if (!ShowFont(info)) {
824N/A if (!info->any_shown) ShowLabel(s, s->sampler.no_room_message);
824N/A FinishUpDisplaying(s);
824N/A return True;
824N/A }
824N/A
824N/A info->any_shown = True;
824N/A if (info->current_family != currentFamily) {
824N/A if (!info->any_shown) ShowLabel(s, s->sampler.no_family_font_message);
824N/A FinishUpDisplaying(s);
824N/A return True;
824N/A }
824N/A return False;
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic Boolean MatchRoman(String name, FilterRec *filter)
824N/A{
824N/A FilterRec *f;
824N/A char *ch, **search, *start;
824N/A int len;
824N/A
824N/A /* Roman means not italic and not symbol */
824N/A
824N/A for (f = filters + ITALIC_FILTER; f <= filters + SYMBOL_FILTER; f++) {
824N/A for (search = f->particles; *search != NULL; search++) {
824N/A start = name;
824N/A do {
824N/A ch = strstr(start, *search);
824N/A if (ch != NULL) {
824N/A len = strlen(*search);
824N/A if (ch[len] == ' ' || ch[len] == '\0') return False;
824N/A else start = ch+1;
824N/A }
824N/A } while (ch != NULL);
824N/A }
824N/A }
824N/A return True;
824N/A}
824N/A
824N/Astatic Boolean MatchMedium(String name, FilterRec *filter)
824N/A{
824N/A FilterRec *f;
824N/A char *ch, **search, *start;
824N/A int len;
824N/A
824N/A for (search = filter->particles; *search != NULL; search++) {
824N/A start = name;
824N/A do {
824N/A ch = strstr(start, *search);
824N/A if (ch != NULL) {
824N/A len = strlen(*search);
824N/A if (ch[len] == ' ' || ch[len] == '\0') return True;
824N/A else start = ch+1;
824N/A }
824N/A } while (ch != NULL);
824N/A }
824N/A
824N/A /* Also match anything that has none of the other weight particles */
824N/A
824N/A for (f = filters + WEIGHT_FILTERS; f->name != NULL; f++) {
824N/A if (f == filter) continue;
824N/A for (search = f->particles; *search != NULL; search++) {
824N/A start = name;
824N/A do {
824N/A ch = strstr(start, *search);
824N/A if (ch != NULL) {
824N/A len = strlen(*search);
824N/A if (ch[len] == ' ' || ch[len] == '\0') return False;
824N/A else start = ch+1;
824N/A }
824N/A } while (ch != NULL);
824N/A }
824N/A }
824N/A return True;
824N/A}
824N/A
824N/Astatic Boolean MatchBlack(String name, FilterRec *filter)
824N/A{
824N/A char *ch, **search, *start;
824N/A int len;
824N/A Boolean ultra;
824N/A
824N/A for (search = filter->particles; *search != NULL; search++) {
824N/A ultra = (strcmp(*search, "Ultra") == 0);
824N/A start = name;
824N/A do {
824N/A ch = strstr(start, *search);
824N/A if (ch != NULL) {
824N/A len = strlen(*search);
824N/A if (ch[len] == '\0') return True;
824N/A if (ch[len] == ' ') {
824N/A if (!ultra) return True;
824N/A /* Only match "Ultra" if not followed by "Compressed" or
824N/A "Light". We'd also like to add "Condensed" to this
824N/A list, but some fonts use "Ultra Condensed" to mean
824N/A "Ultra & Condensed" while others use it to mean "Very
824N/A much Condensed". Sigh... */
824N/A start = ch+len+1;
824N/A if (strncmp(start, "Compressed", 10) != 0 &&
824N/A strncmp(start, "Light", 5) != 0) return True;
824N/A else start = ch+1;
824N/A }
824N/A else start = ch+1;
824N/A }
824N/A } while (ch != NULL);
824N/A }
824N/A return False;
824N/A}
824N/A
824N/Astatic void UpdateFilters(FontSamplerWidget s)
824N/A{
824N/A int i;
824N/A
824N/A for (i = 0; filters[i].name != NULL; i++) {
824N/A if (filters[i].particles[0] != NULL) {
824N/A s->sampler.filter_flags[i] = IsSet(s->sampler.filter_widgets[i]);
824N/A }
824N/A }
824N/A
824N/A s->sampler.filter_text =
824N/A XmTextFieldGetString(s->sampler.filter_text_child);
824N/A}
824N/A
824N/Astatic Boolean FontMatchesFilters(
824N/A FontRec *font,
824N/A BlendRec *blend,
824N/A FontSamplerWidget s)
824N/A{
824N/A int *cl, i;
824N/A FilterRec *f;
824N/A char *ch, **search, *start;
824N/A int len;
824N/A Boolean anyset, foundone, allmatch;
824N/A char *name;
824N/A char buf[512];
824N/A
824N/A if (blend != NULL) {
824N/A sprintf(buf, "%s %s", font->full_name, blend->blend_name);
824N/A name = buf;
824N/A } else name = font->full_name;
824N/A
824N/A allmatch = False;
824N/A if (s->sampler.filters_changed) UpdateFilters(s);
824N/A
824N/A for (cl = class_indices; *cl != -1; cl++) {
824N/A anyset = foundone = False;
824N/A for (i = *cl;
824N/A filters[i].particles[0] != NULL && filters[i].name != NULL; i++) {
824N/A
824N/A f = filters+i;
824N/A
824N/A if (!s->sampler.filter_flags[i]) continue;
824N/A anyset = True;
824N/A
824N/A if (f->special != NULL) {
824N/A if ((*f->special)(name, f)) {
824N/A foundone = True;
824N/A goto NEXT_CLASS;
824N/A }
824N/A continue;
824N/A }
824N/A
824N/A for (search = f->particles; *search != NULL; search++) {
824N/A start = name;
824N/A do {
824N/A ch = strstr(start, *search);
824N/A if (ch != NULL) {
824N/A len = strlen(*search);
824N/A if (ch[len] == ' ' || ch[len] == '\0') {
824N/A foundone = True;
824N/A goto NEXT_CLASS;
824N/A }
824N/A else start = ch+1;
824N/A }
824N/A } while (ch != NULL);
824N/A }
824N/A }
824N/ANEXT_CLASS: ;
824N/A /* If there were any filters set in this class, but we didn't match,
824N/A return False */
824N/A if (anyset && !foundone) return False;
824N/A if (anyset && foundone) allmatch = True;
824N/A }
824N/A
824N/A /* Now check against the text field */
824N/A
824N/A if (s->sampler.filter_text == NULL || s->sampler.filter_text[0] == '\0') {
824N/A return allmatch;
824N/A }
824N/A
824N/A ch = strstr(name, s->sampler.filter_text);
824N/A
824N/A return (ch != NULL);
824N/A}
824N/A
824N/Astatic Boolean DisplayFilteredWorkProc(XtPointer client_data)
824N/A{
824N/A DisplayRecord *info = (DisplayRecord *) client_data;
824N/A FontSamplerWidget s = info->sampler;
824N/A
824N/A if (!info->inited) {
824N/A info->inited = True;
824N/A info->current_family = s->sampler.fsb->fsb.known_families;
824N/A info->current_font = info->current_family->fonts;
824N/A info->current_blend = NULL;
824N/A s->sampler.filters_changed = True;
824N/A }
824N/A
824N/A if (FontMatchesFilters(info->current_font, info->current_blend, s)) {
824N/A if (!ShowFont(info)) {
824N/A if (!info->any_shown) ShowLabel(s, s->sampler.no_room_message);
824N/A FinishUpDisplaying(s);
824N/A return True;
824N/A }
824N/A info->any_shown = True;
824N/A } else AdvanceInfoToNextFont(info);
824N/A
824N/A if (info->current_font == NULL) {
824N/A if (!info->any_shown) ShowLabel(s, s->sampler.no_match_message);
824N/A FinishUpDisplaying(s);
824N/A return True;
824N/A }
824N/A return False;
824N/A}
824N/A
824N/Astatic void Destroy(Widget widget)
824N/A{
824N/A FontSamplerWidget s = (FontSamplerWidget) widget;
824N/A
824N/A if (s->sampler.gstate != 0) {
824N/A XDPSFreeContextGState(s->sampler.fsb->fsb.context,
824N/A s->sampler.pixmap_gstate);
824N/A XDPSFreeContextGState(s->sampler.fsb->fsb.context, s->sampler.gstate);
824N/A }
824N/A XtReleaseGC(widget, s->sampler.gc);
824N/A XFreePixmap(XtDisplay(widget), s->sampler.pixmap);
824N/A if (s->sampler.current_display_proc != None) {
824N/A XtRemoveWorkProc(s->sampler.current_display_proc);
824N/A }
824N/A if (s->sampler.current_display_info != NULL) {
824N/A FreeDisplayInfo(s->sampler.current_display_info);
824N/A }
824N/A XtFree((char *) s->sampler.filter_widgets);
824N/A XtFree((char *) s->sampler.filter_flags);
824N/A}
824N/A
824N/Astatic void Resize(Widget widget)
824N/A{
824N/A FontSamplerWidget s = (FontSamplerWidget) widget;
824N/A
824N/A XtResizeWidget(s->sampler.panel_child, s->core.width, s->core.height, 0);
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic XtGeometryResult GeometryManager(
824N/A Widget w,
824N/A XtWidgetGeometry *desired, XtWidgetGeometry *allowed)
824N/A{
824N/A#define WANTS(flag) (desired->request_mode & flag)
824N/A
824N/A if (WANTS(XtCWQueryOnly)) return XtGeometryYes;
824N/A
824N/A if (WANTS(CWWidth)) w->core.width = desired->width;
824N/A if (WANTS(CWHeight)) w->core.height = desired->height;
824N/A if (WANTS(CWX)) w->core.x = desired->x;
824N/A if (WANTS(CWY)) w->core.y = desired->y;
824N/A if (WANTS(CWBorderWidth)) {
824N/A w->core.border_width = desired->border_width;
824N/A }
824N/A
824N/A return XtGeometryYes;
824N/A#undef WANTS
824N/A}
824N/A
824N/Astatic void ChangeManaged(Widget w)
824N/A{
824N/A FontSamplerWidget s = (FontSamplerWidget) w;
824N/A
824N/A w->core.width = s->composite.children[0]->core.width;
824N/A w->core.height = s->composite.children[0]->core.height;
824N/A}
824N/A
824N/A/* ARGSUSED */
824N/A
824N/Astatic Boolean SetValues(
824N/A Widget old, Widget req, Widget new,
824N/A ArgList args,
824N/A Cardinal *num_args)
824N/A{
824N/A FontSamplerWidget olds = (FontSamplerWidget) old;
824N/A FontSamplerWidget news = (FontSamplerWidget) new;
824N/A
824N/A#define NE(field) news->sampler.field != olds->sampler.field
824N/A#define DONT_CHANGE(field) \
824N/A if (NE(field)) news->sampler.field = olds->sampler.field;
824N/A
824N/A DONT_CHANGE(panel_child);
824N/A DONT_CHANGE(area_child);
824N/A DONT_CHANGE(text_child);
824N/A DONT_CHANGE(font_label_child);
824N/A DONT_CHANGE(scrolled_window_child);
824N/A DONT_CHANGE(display_button_child);
824N/A DONT_CHANGE(dismiss_button_child);
824N/A DONT_CHANGE(stop_button_child);
824N/A DONT_CHANGE(clear_button_child);
824N/A DONT_CHANGE(radio_frame_child);
824N/A DONT_CHANGE(radio_box_child);
824N/A DONT_CHANGE(all_toggle_child);
824N/A DONT_CHANGE(selected_toggle_child);
824N/A DONT_CHANGE(selected_family_toggle_child);
824N/A DONT_CHANGE(filter_toggle_child);
824N/A DONT_CHANGE(filter_box_child);
824N/A DONT_CHANGE(filter_frame_child);
824N/A DONT_CHANGE(size_option_menu_child);
824N/A DONT_CHANGE(size_text_field_child);
824N/A DONT_CHANGE(size_label_child);
824N/A DONT_CHANGE(fsb);
824N/A#undef DONT_CHANGE
824N/A
824N/A if (news->sampler.size_count > 0 && news->sampler.sizes == NULL) {
824N/A XtAppWarningMsg(XtWidgetToApplicationContext(new),
824N/A "setValuesFontSampler", "sizeMismatch",
824N/A "FontSelectionBoxError",
824N/A "Size count specified but no sizes present",
824N/A (String *) NULL, (Cardinal *) NULL);
824N/A news->sampler.size_count = 0;
824N/A }
824N/A
824N/A if (news->sampler.size_count < 0) {
824N/A XtAppWarningMsg(XtWidgetToApplicationContext(new),
824N/A "setValuesFontSampler", "negativeSize",
824N/A "FontSelectionBoxError",
824N/A "Size count should not be negative",
824N/A (String *) NULL, (Cardinal *) NULL);
824N/A news->sampler.size_count = 0;
824N/A }
824N/A
824N/A if (NE(sizes)) CreateSizeMenu(news, True);
824N/A
824N/A return False;
824N/A#undef NE
824N/A}
824N/A
824N/Astatic void Cancel(Widget w)
824N/A{
824N/A FontSamplerWidget s = (FontSamplerWidget) w;
824N/A
824N/A if (s->sampler.current_display_proc != None) {
824N/A XtRemoveWorkProc(s->sampler.current_display_proc);
824N/A }
824N/A}
824N/A
824N/Avoid FSBCancelSampler(Widget w)
824N/A{
824N/A XtCheckSubclass(w, fontSamplerWidgetClass, NULL);
824N/A
824N/A (*((FontSamplerWidgetClass) XtClass(w))->sampler_class.cancel) (w);
824N/A}
824N/A
824N/A#ifdef NO_STRSTR_AVAILABLE
824N/AString strstr(String s1, String s2)
824N/A{
824N/A register int len1, len2;
824N/A
824N/A len1 = strlen(s1);
824N/A len2 = strlen(s2);
824N/A
824N/A while (len1 >= len2) {
824N/A if (*s1 == *s2) {
824N/A if (strncmp(s1+1, s2+1, len2-1) == 0) return s1;
824N/A }
824N/A len1--;
824N/A s1++;
824N/A }
824N/A}
824N/A#endif /* NO_STRSTR_AVAILABLE */