fltkhs-0.1.0.0: c-examples/fonts.c
#include "Fl_C.h"
#include "Fl_TileC.h"
#include "Fl_Double_WindowC.h"
#include "Fl_Hold_BrowserC.h"
#include "Fl_DrawC.h"
#include "Fl_BoxC.h"
#include "Fl_WidgetC.h"
#include "Fl_GroupC.h"
#include <FL/fl_utf8.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
fl_Double_Window form;
fl_Tile tile;
typedef struct instance_data {
int font;
int size;
} instance_data;
void draw(fl_Widget w){
Fl_Widget_draw_box(w);
instance_data* d = Fl_Widget_other_data(w);
flc_set_font((Fl_Font)d->font, d->size);
flc_set_color(FL_BLACK);
flc_draw_with_align(Fl_Widget_label(w), Fl_Widget_x(w)+3, Fl_Widget_y(w)+3, Fl_Widget_w(w)-6, Fl_Widget_h(w)-6, Fl_Widget_align(w));
}
fl_Widget textobj;
fl_Hold_Browser fontobj;
fl_Hold_Browser sizeobj;
int **sizes;
int *numsizes;
int pickedsize = 14;
void font_cb(fl_Widget w, void* user_data) {
int fn = Fl_Hold_Browser_value(fontobj);
if (!fn) return;
fn--;
instance_data* d = Fl_Widget_other_data(textobj);
d->font = fn;
Fl_Widget_set_other_data(textobj,d);
Fl_Hold_Browser_clear(sizeobj);
int n = numsizes[fn];
int *s = sizes[fn];
if (!n) {
// no sizes
} else if (s[0] == 0) {
// many sizes;
int j = 1;
int i = 1;
for (; i<64 || i<s[n-1]; i++) {
char buf[20];
if (j < n && i==s[j]) {sprintf(buf,"@b%d",i); j++;}
else sprintf(buf,"%d",i);
Fl_Hold_Browser_add(sizeobj,buf);
}
Fl_Hold_Browser_set_value(sizeobj,pickedsize);
} else {
// some sizes
int w = 0;
int i = 0;
for (; i < n; i++) {
if (s[i]<=pickedsize) w = i;
char buf[20];
sprintf(buf,"@b%d",s[i]);
Fl_Hold_Browser_add(sizeobj,buf);
}
Fl_Hold_Browser_set_value(sizeobj,w+1);
}
Fl_Hold_Browser_redraw(textobj);
}
void size_cb(fl_Widget w, void* user_data) {
int i = Fl_Hold_Browser_value(sizeobj);
if (!i) return;
const char *c = Fl_Hold_Browser_text(sizeobj,i);
while (*c < '0' || *c > '9') c++;
pickedsize = atoi(c);
instance_data* d = Fl_Widget_other_data(textobj);
d->size = pickedsize;
Fl_Widget_set_other_data(textobj,d);
Fl_Hold_Browser_redraw(textobj);
}
char label[0x1000];
fl_Widget make_FontDisplay(Fl_Boxtype B, int X, int Y, int W, int H, const char* L){
fl_Widget_Virtual_Funcs* funcs = Fl_Widget_default_virtual_funcs();
funcs->draw = &draw;
instance_data* d = (instance_data*) malloc (sizeof(instance_data));
d->font = 0;
d->size = 14;
fl_Widget fontDisplay = Fl_OverriddenWidget_New_WithLabel(X,Y,W,H,L,funcs);
Fl_Widget_set_box(fontDisplay, B);
Fl_Widget_set_other_data(fontDisplay, (void*)d);
return fontDisplay;
}
void create_the_forms() {
// create the sample string
int n = 0;
strcpy(label, "Hello, world!\n");
int i = strlen(label);
ulong c = ' ' + 1;
for (; c < 127; c++) {
if (!(c&0x1f)) label[i++]='\n';
if (c=='@') label[i++]=c;
label[i++]=c;
}
label[i++] = '\n';
c = 0xA1;
for (; c < 0x600; c += 9) {
if (!(++n&(0x1f))) label[i++]='\n';
i += fl_utf8encode((unsigned int)c, label + i);
}
label[i] = 0;
// create the basic layout
form = Fl_Double_Window_New(550,370);
tile = Fl_Tile_New(0, 0, 550, 370);
fl_Group textgroup = (fl_Group)Fl_Group_New(0, 0, 550, 185);
Fl_Group_set_box(textgroup,FL_FLAT_BOX);
textobj = make_FontDisplay(FL_FRAME_BOX,10,10,530,170,label);
Fl_Widget_set_align(textobj,FL_ALIGN_TOP|FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP);
Fl_Widget_set_color_with_bg_sel(textobj,9,47);
Fl_Group_set_resizable(textgroup,textobj);
Fl_Group_end(textgroup);
fl_Group fontgroup = (fl_Group)Fl_Group_New(0, 185, 550, 185);
Fl_Group_set_box(fontgroup,FL_FLAT_BOX);
fontobj = Fl_Hold_Browser_New(10, 190, 390, 170);
Fl_Hold_Browser_set_box(fontobj,FL_FRAME_BOX);
Fl_Hold_Browser_set_color_with_bg_sel(fontobj,53,3);
Fl_Hold_Browser_set_callback(fontobj,&font_cb);
sizeobj = Fl_Hold_Browser_New(410, 190, 130, 170);
Fl_Hold_Browser_set_box(sizeobj,FL_FRAME_BOX);
Fl_Hold_Browser_set_color_with_bg_sel(sizeobj,53,3);
Fl_Hold_Browser_set_callback(sizeobj,size_cb);
Fl_Group_set_resizable(fontgroup,fontobj);
Fl_Group_end(fontgroup);
Fl_Tile_end(tile);
Fl_Double_Window_set_resizable(form,tile);
Fl_Double_Window_end(form);
}
#include <Fl_AskC.h>
int main (int argc, char** argv){
Fl_scheme(NULL);
Fl_args(argc,argv);
Fl_get_system_colors();
create_the_forms();
int i = 0;
int k = Fl_set_fonts("-*");
sizes = malloc(sizeof(int*) * k);
numsizes = malloc(sizeof(int) * k);
i = 0;
for (; i < k; i++) {
int t;
const char *name = Fl_get_font_name_with_attributes((Fl_Font)i,&t);
char buffer[128];
if (t) {
char *p = buffer;
if (t & FL_BOLD) {*p++ = '@'; *p++ = 'b';}
if (t & FL_ITALIC) {*p++ = '@'; *p++ = 'i';}
*p++ = '@'; *p++ = '.'; // Suppress subsequent formatting - some MS fonts have '@' in their name
strcpy(p,name);
name = buffer;
}
Fl_Hold_Browser_add(fontobj,name);
int s;
int* _s = &s;
int n = Fl_get_font_sizes((Fl_Font)i, _s);
numsizes[i] = n;
if (n) {
sizes[i] = malloc(sizeof(int) * n);
int j = 0;
for (; j<n; j++){sizes[i][j] = _s[j];}
}
}
Fl_Hold_Browser_set_value(fontobj,1);
font_cb(fontobj,0);
Fl_Double_Window_show_with_args(form,argc,argv);
return Fl_run();
}