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