|
|
DataMuseum.dkPresents historical artifacts from the history of: Regnecentalen RC-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Regnecentalen RC-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T U m
Length: 17162 (0x430a)
Types: TextFile
Notes: UNIX file
Names: »mre_font.c«
└─⟦a85bd4a7c⟧ Bits:30004636/disk2.imd INTERACTIVE Motif Environment Development System
└─⟦a85bd4a7c⟧ UNIX Filesystem
└─⟦this⟧ »xt/new/usr/lib/X11/examples/mre/mre_font.c«
#ifdef REV_INFO
#ifndef lint
static char SCCSID[] = "OSF/Motif: @(#)mre_font.c 1.1 - 89/08/30 - 12:00:57";
#endif /* lint */
#endif /* REV_INFO */
/*
** mre_font.c - Motif Resource Editor Font Handling
** Copyright (c) 1989, Open Software Foundation, Inc.
** ALL RIGHTS RESERVED.
**
**
** Revision history:
** created July 1989 Mitch Trachtenberg
**
**
*/
#include "mre.h"
#define FONT_VENDOR 0
#define FONT_FOUNDRY 1
#define FONT_FAMILY 2
#define FONT_WEIGHT 3
#define FONT_SLANT 4
#define FONT_POINTSIZE 7
#define MAX_FONT_STRING_SIZE 150
#define F_C_SIZE 30
#define F_C_COUNT 9
static Widget global_font_selection_box_id;
static Widget global_font_spec_mask;
static char font_string_fragments[F_C_COUNT][F_C_SIZE] =
{"*","*","Times","*","*","*","*","12","*"};
static char font_string[MAX_FONT_STRING_SIZE];
static void initialize_font();
static void font_add_to_paned();
static char *get_font_spec_string();
static char *set_font_component();
static char *get_font_component();
static void set_radio_box_item();
char *get_selected_font_string();
void display_one_font();
void select_font();
static void initialize_font();
extern void fetch();
/* retrieved from uil */
char **spec_components;
void select_font( text, value, item_to_adjust )
char *text;
char *value;
caddr_t item_to_adjust;
{
static Widget fetched;
Arg arg[1];
MrmCode return_type;
initialize_coords();
fetched = 0;
fetch("font_dialog",&fetched);
XtSetArg(arg[0],XmNuserData,item_to_adjust);
XtSetValues(fetched,arg,1);
XtUnmanageChild(
XmSelectionBoxGetChild(XtNameToWidget(fetched,"font_selection_box"),
XmDIALOG_APPLY_BUTTON)
);
global_font_spec_mask = XtNameToWidget(fetched,"font_spec_mask");
if(MrmFetchLiteral(s_MrmHierarchy,
"spec_components",
dpy,
&spec_components,
&return_type) != MrmSUCCESS)
fetch_message_printf("fail_cant_find_radiobox");
initialize_font(fetched,value);
XtManageChild(fetched);
}
static void initialize_font ( font_dialog_box,valuestring )
Widget font_dialog_box;
char *valuestring;
{
char **names_ret;
int num_names_ret;
XmString *items;
int item_count;
Arg arg[2];
Widget list;
Widget text;
int max_ret = 50;
text = XmSelectionBoxGetChild(global_font_selection_box_id,XmDIALOG_TEXT);
XmTextSetString(text,valuestring);
/* set the radio boxes to match the current resource value */
/* by extracting components from the spec, if possible */
if(*valuestring=='-'){ /* presume to be in proper format */
char buf[F_C_SIZE];
char *component;
int n;
/* copy components into local, NULL terminated buffer */
component = get_font_component(FONT_SLANT,valuestring);
for(n=0;n<F_C_SIZE && component[n]!='-';n++)
buf[n]=component[n];
buf[n]='\0';
set_font_component(FONT_SLANT,buf);
set_radio_box_item(font_dialog_box,FONT_SLANT,buf);
component = get_font_component(FONT_WEIGHT,valuestring);
for(n=0;n<F_C_SIZE && component[n]!='-';n++)
buf[n]=component[n];
buf[n]='\0';
set_font_component(FONT_WEIGHT,buf);
set_radio_box_item(font_dialog_box,FONT_WEIGHT,buf);
component = get_font_component(FONT_FAMILY,valuestring);
for(n=0;n<F_C_SIZE && component[n]!='-';n++)
buf[n]=component[n];
buf[n]='\0';
set_font_component(FONT_FAMILY,buf);
set_radio_box_item(font_dialog_box,FONT_FAMILY,buf);
component = get_font_component(FONT_POINTSIZE,valuestring);
for(n=0;n<F_C_SIZE && component[n]!='-';n++)
buf[n]=component[n];
buf[n]='\0';
set_font_component(FONT_POINTSIZE,buf);
set_radio_box_item(font_dialog_box,FONT_POINTSIZE,buf);
}
/* set font spec to current resource value */
if(global_font_spec_mask)
XmTextSetString(global_font_spec_mask,get_font_spec_string());
/* filter to match the extracted components only */
names_ret = XListFonts(dpy,get_font_spec_string(),max_ret,&num_names_ret);
list = XmSelectionBoxGetChild(global_font_selection_box_id,XmDIALOG_LIST);
item_count = num_names_ret;
items = (XmString *)calloc(num_names_ret,sizeof(XmString));
while(num_names_ret--){
items[num_names_ret]=XmStringDefCreate(names_ret[num_names_ret]);
}
XtSetArg(arg[0],XmNitems,items);
XtSetArg(arg[1],XmNitemCount,item_count);
XtSetValues(list,arg,2);
while(item_count--)
XmStringFree(items[item_count]);
/* the fragment below bombs when listbox hasn't been managed */
/* but may be more appropriate when the bug is fixed */
#ifdef NOTDEF
while(num_names_ret--){
XmString xms;
puts(names_ret[num_names_ret]);
/* Unselected failed; this should have 3 arguments but is happier w/2 */
XmListAddItem(list,xms =XmStringDefCreate(names_ret[num_names_ret]),0);
XmStringFree(xms);
}
#endif
/* free list */
XFreeFontNames(names_ret);
}
void font_selection_box_map( widget, tag, callback_data )
Widget widget;
char *tag;
XmAnyCallbackStruct *callback_data;
{
Widget child;
int n;
Widget list;
char buf[80];
char *ptr;
MrmCode return_type;
#ifdef DEBUG_CALLBACKS
printf("In font sel box create routine; called by %s.\n",XtName(widget));
#endif
global_font_selection_box_id = widget;
/* we need to add a callback to the selection box's listbox child */
/* so that selections from the listbox update the current displayed font */
list = XmSelectionBoxGetChild(widget,XmDIALOG_LIST);
XtAddCallback(list,XmNbrowseSelectionCallback,
display_one_font,NULL);
XtAddCallback(list,XmNdefaultActionCallback,
display_one_font,NULL);
/* We need to register the radio boxes and pushbuttons as tab groups. */
/* To simplify hierarchy changes, we retrieve the hierarchy template */
/* from the UIL file itself; provide a warning there. */
if(MrmFetchLiteral(s_MrmHierarchy,
"path_to_radiobox",
dpy,
&ptr,
&return_type) != MrmSUCCESS)
fetch_message_printf("fail_cant_find_radiobox");
/* allow for up to 8 radio boxes; the first failure breaks the loop */
for(n=1;n<9;n++){
sprintf(buf,ptr,n,n);
child = XtNameToWidget(XtParent(widget),buf);
if(child)XmAddTabGroup(child);
else break;
}
child = XtNameToWidget(XtParent(widget),"font_spec_mask");
if(child)XmAddTabGroup(child);
child = XtNameToWidget(XtParent(widget),"font_filter_button");
if(child)XmAddTabGroup(child);
child = XtNameToWidget(XtParent(widget),"font_display_button");
if(child)XmAddTabGroup(child);
child = XtNameToWidget(XtParent(widget),"font_display_one_button");
if(child)XmAddTabGroup(child);
}
static char *get_font_spec_string()
{
return(font_string);
}
char *get_selected_font_string(widget)
Widget *widget;
{
Widget text_widget;
text_widget = XmSelectionBoxGetChild(widget,XmDIALOG_TEXT);
return(XmTextGetString(text_widget));
}
static char *set_font_component(num,str)
int num;
char *str;
{
int n;
strcpy(font_string_fragments[num],str);
font_string[0]='\0';
for(n=0;n<F_C_COUNT;n++){
strcat(font_string,font_string_fragments[n]);
strcat(font_string,"-");
}
strcat(font_string,"*");
return(font_string);
}
static char *get_font_component(num,str)
int num;
char *str;
{
int n;
for(n=0;n<num;n++){
while(*str && *str!='-')str++;
if(!*str)
return(NULL);
str++;
}
return(str);
}
static void restrict_using_string ( widget, which_comp, tag, callback_data )
Widget widget;
int which_comp;
char *tag;
XmToggleButtonCallbackStruct *callback_data;
{
if(!(callback_data->reason == XmCR_VALUE_CHANGED))return;
if(!(callback_data->set))return;
if(global_font_spec_mask)
XmTextSetString(global_font_spec_mask,set_font_component(which_comp,tag));
}
void restrict_family ( widget, tag, callback_data )
Widget widget;
char *tag;
XmRowColumnCallbackStruct *callback_data;
{
restrict_using_string(widget,FONT_FAMILY,tag,callback_data);
}
void restrict_weight ( widget, tag, callback_data )
Widget widget;
char *tag;
XmRowColumnCallbackStruct *callback_data;
{
restrict_using_string(widget,FONT_WEIGHT,tag,callback_data);
}
void restrict_slant ( widget, tag, callback_data )
Widget widget;
char *tag;
XmRowColumnCallbackStruct *callback_data;
{
restrict_using_string(widget,FONT_SLANT,tag,callback_data);
}
void restrict_point_size ( widget, tag, callback_data )
Widget widget;
char *tag;
XmRowColumnCallbackStruct *callback_data;
{
restrict_using_string(widget,FONT_POINTSIZE,tag,callback_data);
}
/* this function creates labels for all fonts named in a list widget */
void display_fonts_from_list(widget,tag,callback_data)
Widget widget;
char *tag;
XmAnyCallbackStruct *callback_data;
{
Widget fetched=NULL;
Arg arg[2];
Arg pos_args[4];
Position x,y;
Dimension width;
int item_count;
Widget list;
XmString *item_table;
char *primitive_string;
fetch("multiple_fonts_shell",&fetched);
font_paned_window = XtNameToWidget(fetched,"mf_paned_window");
/* place to the right of the font selection dialog */
XtSetArg(pos_args[0],XmNx,&x);
XtSetArg(pos_args[1],XmNy,&y);
XtSetArg(pos_args[2],XmNwidth,&width);
if(global_font_selection_box_id)
XtGetValues(XtParent(XtParent(global_font_selection_box_id)),pos_args,3);
XtSetArg(pos_args[0],XmNx,x+width);
XtSetArg(pos_args[1],XmNy,y+100);
XtSetValues(fetched,pos_args,2);
XtSetArg(arg[0],XmNitemCount,&item_count);
XtSetArg(arg[1],XmNitems,&item_table);
list = XmSelectionBoxGetChild(global_font_selection_box_id,XmDIALOG_LIST);
XtGetValues(list,arg,2);
while(item_count--){
primitive_string = extract_first_xms_segment(item_table[item_count]);
font_add_to_paned(primitive_string);
}
XtManageChild(fetched);
}
void font_refilter(widget,tag,callback_data)
Widget widget;
char *tag;
XmAnyCallbackStruct *callback_data;
{
Arg arg[2];
char **names_ret;
int num_names_ret;
XmString *items;
Widget list;
Widget text;
int max_ret = 8;
int item_count;
char *fontspec;
if(global_font_spec_mask)
fontspec = XmTextGetString(global_font_spec_mask);
names_ret = XListFonts(dpy,fontspec,max_ret,&num_names_ret);
#ifdef DEBUG_CALLBACKS
printf("Selecting matches for: %s\n",fontspec);
#endif
list = XmSelectionBoxGetChild(global_font_selection_box_id,XmDIALOG_LIST);
text = XmSelectionBoxGetChild(global_font_selection_box_id,XmDIALOG_TEXT);
XtSetArg(arg[0],XmNitemCount,&item_count);
XtGetValues(list,arg,1);
item_count = num_names_ret;
items = (XmString *)calloc(num_names_ret,sizeof(XmString));
while(num_names_ret--){
items[num_names_ret]=XmStringDefCreate(names_ret[num_names_ret]);
}
XtSetArg(arg[0],XmNitems,items);
XtSetArg(arg[1],XmNitemCount,item_count);
XtSetValues(list,arg,2);
XmListSelectPos(list,1,0);
XmTextSetString(text,names_ret[0]);
while(item_count--)
XmStringFree(items[item_count]);
#ifdef NOTDEF
while(item_count--)
XmListDeletePos(list,0);
while(num_names_ret--){
XmString xms;
XmListAddItem(list,xms=XmStringDefCreate(names_ret[num_names_ret]),0);
XmStringFree(xms);
}
#endif
XFreeFontNames(names_ret);
}
static void font_add_to_paned(fontname)
char *fontname;
{
Arg arg[5];
Widget form,text,label,button;
char *alphabet = data.font_text;
MrmType class;
if(!font_paned_window){
fetch_message_printf("fail_paned_window");
return;
}
/* for each font, create a form and fill it with label and editable text */
button = label = text = form = NULL;
if(MrmFetchWidget(s_MrmHierarchy,"form_template",font_paned_window,
&form,&class)!=MrmSUCCESS)
fetch_message_printf("fail_form");
if(MrmFetchWidget(s_MrmHierarchy,"button_template",form,
&button,&class)!=MrmSUCCESS)
fetch_message_printf("fail_button");
XtSetArg(arg[0],XmNlabelString,XmStringDefCreate(fontname));
XtSetArg(arg[1],XmNleftAttachment,XmATTACH_WIDGET);
XtSetArg(arg[2],XmNleftWidget,button);
if(MrmFetchWidgetOverride(s_MrmHierarchy,"name_template",form,NULL,arg,3,
&label,&class)!=MrmSUCCESS)
fetch_message_printf("fail_label");
XtSetArg(
arg[0],
XmNfontList,
XmFontListCreate(XLoadQueryFont(dpy,fontname),XmSTRING_DEFAULT_CHARSET)
/* should this font list be freed after assignment to widget ? */
);
XtSetArg(arg[1],XmNtopAttachment,XmATTACH_WIDGET);
XtSetArg(arg[2],XmNtopWidget,button);
XtSetArg(arg[3],XmNeditMode,XmMULTI_LINE_EDIT);
if(MrmFetchWidgetOverride(s_MrmHierarchy,"text_template",form,NULL,arg,4,
&text,&class)!=MrmSUCCESS)
fetch_message_printf("fail_text");
XmTextSetString(text,data.font_text);
XtManageChild(label);
XtManageChild(button);
XtManageChild(text);
XtManageChild(form);
}
void font_select_button( widget, tag, callback_data )
Widget widget;
char *tag;
XmAnyCallbackStruct *callback_data;
{
Widget label_widget,text_widget;
Arg arg[1];
XmString xms;
char *ps;
/* get the label string from the brother label, extract the char * */
label_widget = XtNameToWidget(XtParent(widget),"name_template");
XtSetArg(arg[0],XmNlabelString,&xms);
XtGetValues(label_widget,arg,1);
ps = extract_first_xms_segment(xms);
/* set the selected font text string */
text_widget =
XmSelectionBoxGetChild(global_font_selection_box_id,XmDIALOG_TEXT);
XmTextSetString(text_widget,ps);
/* and trigger the one font select button callback */
display_one_font( widget, tag, callback_data);
}
void kill_global( widget, tag, callback_data )
Widget widget;
char *tag;
XmAnyCallbackStruct *callback_data;
{
if(!strcmp(tag,"mf_paned_window"))font_paned_window = (Widget) NULL;
else if(!strcmp(tag,"one_font_shell"))global_one_font = (Widget) NULL;
}
void display_one_font( widget, tag, callback_data )
Widget widget;
char *tag;
XmAnyCallbackStruct *callback_data;
{
static Widget fetched,disp_text;
Widget text;
Arg arg[1];
MrmType class;
char *fontname; /* retrieved from the text of the selection box */
char *ptr;
XFontStruct *fs;
int num_names_ret;
char **names_ret;
MrmCode return_type;
text = XmSelectionBoxGetChild(global_font_selection_box_id,XmDIALOG_TEXT);
/* cast may be removed when XmTextGetString header is corrected */
fontname = (char *)XmTextGetString(text);
/* empty font string cannot work */
if(!strlen(fontname)){
fetch_message_printf("fail_empty_font_name");
return;
}
names_ret = XListFonts(dpy,fontname,1,&num_names_ret);
if(!num_names_ret){
fetch_message_printf("fail_font_no_match",fontname);
return;
}
XFreeFontNames(names_ret);
fs = XLoadQueryFont(dpy,fontname);
if(fs==NULL){
fetch_message_printf("fail_font_load",fontname);
return;
}
if(!global_one_font){
Arg pos_args[4];
Position x,y;
Dimension width;
fetch("one_font_shell",&fetched);
/* place to the right of the font selection dialog */
XtSetArg(pos_args[0],XmNx,&x);
XtSetArg(pos_args[1],XmNy,&y);
XtSetArg(pos_args[2],XmNwidth,&width);
if(global_font_selection_box_id)
XtGetValues(XtParent(XtParent(global_font_selection_box_id)),pos_args,3);
XtSetArg(pos_args[0],XmNx,x+width);
XtSetArg(pos_args[1],XmNy,y);
XtSetValues(fetched,pos_args,2);
global_one_font = fetched;
disp_text = XtNameToWidget(global_one_font,
"one_font_stextSW.one_font_stext");
if(MrmFetchLiteral(s_MrmHierarchy,
"one_font_string",
dpy,
&ptr,
&return_type) != MrmSUCCESS)
ptr = "This is the selected font.";
XmTextSetString(disp_text,ptr);
}
arg[0].name = XmNfontList;
arg[0].value = (XtArgVal)XmFontListCreate(fs,XmSTRING_DEFAULT_CHARSET);
XtSetValues(disp_text,arg,1);
XtManageChild(fetched);
}
#include <X11/IntrinsicP.h>
#define XtName(widget) XrmQuarkToString (((Object)(widget))->object.xrm_name)
static void set_radio_box_item(widget,num,buf)
Widget widget;
int num;
char *buf;
{
int n;
int user_data;
char *user_charp;
CompositeWidget tb,rc,rb;
Widget w;
Boolean found;
Arg arg[1];
char rbtext[9];
char *rcname;
tb = (CompositeWidget)XtNameToWidget(widget,"font_toggle_box");
found=0;
for(n=0;n<tb->composite.num_children;n++){
XtSetArg(arg[0],XmNuserData,&user_data);
XtGetValues(rc=(CompositeWidget)tb->composite.children[n],arg,1);
if(user_data == num){
rcname = XtName(rc);
found=1;
break;
}
}
if(!found)return;
/* locate the radio box child of rc */
strcpy(rbtext,"font_rb?");
rbtext[8]='\0';
rbtext[7]=rcname[2];
rb = (CompositeWidget)XtNameToWidget(rc,rbtext);
/* locate the correct child of rb */
for(n=0;n<rb->composite.num_children;n++){
XtSetArg(arg[0],XmNuserData,&user_data);
XtGetValues(w=rb->composite.children[n],arg,1);
if(!stricmp(buf,spec_components[user_data])){
XmToggleButtonSetState(w,1,1);
break;
}
}
}