diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c index 20f42491831fdf5f85fa818f43906481ebbd2196..dc4f6221ad43627a6568aecc77ffe6eea19cb55f 100644 --- a/src/syncterm/bbslist.c +++ b/src/syncterm/bbslist.c @@ -5,6 +5,7 @@ #include <ini_file.h> #include <uifc.h> #include "filepick.h" +#include "allfonts.h" #include "syncterm.h" #include "bbslist.h" @@ -103,7 +104,7 @@ void read_item(FILE *listfile, struct bbslist *entry, char *bbsname, int id, int entry->loglevel=iniReadInteger(listfile,bbsname,"LogLevel",LOG_INFO); entry->bpsrate=iniReadInteger(listfile,bbsname,"BPSRate",0); entry->music=iniReadInteger(listfile,bbsname,"ANSIMusic",CTERM_MUSIC_BANSI); - entry->font=iniReadInteger(listfile,bbsname,"Font",default_font); + iniReadString(listfile,bbsname,"Font","Codepage 437 English",entry->font); entry->type=type; } @@ -191,7 +192,7 @@ int edit_list(struct bbslist *item,char *listpath,int isdefault) sprintf(opt[i++],"Log Level %s",log_levels[item->loglevel]); sprintf(opt[i++],"Simulated BPS %s",rate_names[get_rate_num(item->bpsrate)]); sprintf(opt[i++],"ANSI Music %s",music_names[item->music]); - sprintf(opt[i++],"Font %s",font_names[item->font]); + sprintf(opt[i++],"Font %s",item->font); opt[i++][0]=0; uifc.changes=0; @@ -418,11 +419,11 @@ int edit_list(struct bbslist *item,char *listpath,int isdefault) "Select the desired font for this connection.\n\n" "Some fonts do not allow some modes. When this is the case, 80x25 will be" "forced.\n"; - i=item->font; - uifc.list(WIN_SAV,0,0,0,&i,NULL,"Font",font_names); - if(i != item->font) { - item->font=i; - iniSetInteger(&inifile,itemname,"Font",item->font,&ini_style); + i=j=find_font_id(item->font); + uifc.list(WIN_SAV,0,0,0,&i,&j,"Font",font_names); + if(i!=find_font_id(item->font)) { + strcpy(item->font,font_names[i]); + iniSetString(&inifile,itemname,"Font",item->font,&ini_style); changed=1; } break; @@ -464,7 +465,7 @@ void add_bbs(char *listpath, struct bbslist *bbs) iniSetInteger(&inifile,bbs->name,"LogLevel",bbs->loglevel,&ini_style); iniSetInteger(&inifile,bbs->name,"BPSRate",bbs->bpsrate,&ini_style); iniSetInteger(&inifile,bbs->name,"ANSIMusic",bbs->music,&ini_style); - iniSetInteger(&inifile,bbs->name,"Font",bbs->font,&ini_style); + iniSetString(&inifile,bbs->name,"Font",bbs->font,&ini_style); if((listfile=fopen(listpath,"w"))!=NULL) { iniWriteFile(listfile,inifile); fclose(listfile); @@ -489,13 +490,6 @@ void del_bbs(char *listpath, struct bbslist *bbs) } } -struct font_files { - char *name; - char *path8x8; - char *path8x14; - char *path8x16; -}; - void free_font_files(struct font_files *ff) { int i; @@ -600,6 +594,93 @@ struct font_files *read_font_files(int *count) return(ret); } +void load_font_files(void) +{ + int count=0; + int i; + int nextfont=CONIO_FIRST_FREE_FONT; + struct font_files *ff; + FILE *fontfile; + char *fontdata; + + ff=read_font_files(&count); + for(i=0; i<count; i++) { + if(conio_fontdata[nextfont].eight_by_sixteen) + FREE_AND_NULL(conio_fontdata[nextfont].eight_by_sixteen); + if(conio_fontdata[nextfont].eight_by_fourteen) + FREE_AND_NULL(conio_fontdata[nextfont].eight_by_fourteen); + if(conio_fontdata[nextfont].eight_by_sixteen) + FREE_AND_NULL(conio_fontdata[nextfont].eight_by_eight); + if(conio_fontdata[nextfont].desc) + FREE_AND_NULL(conio_fontdata[nextfont].desc); + if(ff[i].name) + conio_fontdata[nextfont].desc=strdup(ff[i].name); + else + continue; + if(ff[i].path8x8) { + if((fontfile=fopen(ff[i].path8x8,"r"))!=NULL) { + if((fontdata=(char *)malloc(2048))!=NULL) { + if(fread(fontdata, 1, 2048, fontfile)==2048) { + conio_fontdata[nextfont].eight_by_eight=fontdata; + } + else { + free(fontdata); + } + } + } + } + if(ff[i].path8x14) { + if((fontfile=fopen(ff[i].path8x14,"r"))!=NULL) { + if((fontdata=(char *)malloc(3584))!=NULL) { + if(fread(fontdata, 1, 3584, fontfile)==3584) { + conio_fontdata[nextfont].eight_by_fourteen=fontdata; + } + else { + free(fontdata); + } + } + } + } + if(ff[i].path8x16) { + if((fontfile=fopen(ff[i].path8x16,"r"))!=NULL) { + if((fontdata=(char *)malloc(4096))!=NULL) { + if(fread(fontdata, 1, 4096, fontfile)==4096) { + conio_fontdata[nextfont].eight_by_sixteen=fontdata; + } + else { + free(fontdata); + } + } + } + } + nextfont++; + } + free_font_files(ff); + + for(i=0; conio_fontdata[i].desc != NULL; i++) { + font_names[i]=conio_fontdata[i].desc; + if(!strcmp(conio_fontdata[i].desc,"Codepage 437 English")) { + default_font=i; + } + } + font_names[i]=""; +} + +int find_font_id(char *name) +{ + int ret=0; + int i; + + for(i=0; i<256; i++) { + if(!conio_fontdata[i].desc) + continue; + if(!strcmp(conio_fontdata[i].desc,name)) { + ret=i; + break; + } + } +} + void font_management(void) { int i,j; diff --git a/src/syncterm/bbslist.h b/src/syncterm/bbslist.h index 53d80e410bddfcd71735ba73d7ce56dac806155d..d73bdda91b0aaa87f3adb5640be095043801178e 100644 --- a/src/syncterm/bbslist.h +++ b/src/syncterm/bbslist.h @@ -55,7 +55,14 @@ struct bbslist { int loglevel; int bpsrate; int music; - int font; + char font[80]; +}; + +struct font_files { + char *name; + char *path8x8; + char *path8x14; + char *path8x16; }; struct bbslist *show_bbslist(int mode); @@ -67,5 +74,10 @@ void read_list(char *listpath, struct bbslist **list, struct bbslist *defaults, void free_list(struct bbslist **list, int listcount); void add_bbs(char *listpath, struct bbslist *bbs); int get_rate_num(int rate); +void free_font_files(struct font_files *ff); +void save_font_files(struct font_files *fonts); +struct font_files *read_font_files(int *count); +void load_font_files(void); +int find_font_id(char *name); #endif diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c index 99175551af5ff639f6872124037b750ec7b857c1..bf643664b044bfaaf9de9e8ac25354b1ee3c6b85 100644 --- a/src/syncterm/syncterm.c +++ b/src/syncterm/syncterm.c @@ -33,7 +33,7 @@ char* syncterm_version = "SyncTERM 0.6" ; char *inpath=NULL; -int default_font; +int default_font=0; char *font_names[sizeof(conio_fontdata)/sizeof(struct conio_font_data_struct)]; #ifdef _WINSOCKAPI_ @@ -87,7 +87,7 @@ void parse_url(char *url, struct bbslist *bbs, int dflt_conn_type, int force_def bbs->port=(dflt_conn_type==CONN_TYPE_TELNET)?23:513; bbs->loglevel=LOG_INFO; bbs->music=CTERM_MUSIC_BANSI; - bbs->font=default_font; + strcpy(bbs->font,"Codepage 437 English"); } p1=url; if(!strnicmp("rlogin://",url,9)) { @@ -347,14 +347,6 @@ int main(int argc, char **argv) initciolib(ciolib_mode); - for(i=0; conio_fontdata[i].desc != NULL; i++) { - font_names[i]=conio_fontdata[i].desc; - if(!strcmp(conio_fontdata[i].desc,"Codepage 437 English")) { - default_font=i; - } - } - font_names[i]=""; - gettextinfo(&txtinfo); if((txtinfo.screenwidth<40) || txtinfo.screenheight<24) { fputs("Window too small, must be at least 80x24\n",stderr); @@ -396,6 +388,7 @@ int main(int argc, char **argv) if(!winsock_startup()) return(1); + load_font_files(); while(bbs!=NULL || (bbs=show_bbslist(BBSLIST_SELECT))!=NULL) { gettextinfo(&txtinfo); /* Current mode may have changed while in show_bbslist() */ if(!conn_connect(bbs->addr,bbs->port,bbs->reversed?bbs->password:bbs->user,bbs->reversed?bbs->user:bbs->password,bbs->syspass,bbs->conn_type,bbs->bpsrate)) { @@ -417,7 +410,8 @@ int main(int argc, char **argv) } } uifcbail(); - setfont(bbs->font,TRUE); + load_font_files(); + setfont(find_font_id(bbs->font),TRUE); switch(bbs->screen_mode) { case SCREEN_MODE_80X25: textmode(C80); @@ -442,6 +436,13 @@ int main(int argc, char **argv) return(1); exit_now=doterm(bbs); setfont(default_font,TRUE); + for(i=CONIO_FIRST_FREE_FONT; i<256; i++) { + FREE_AND_NULL(conio_fontdata[i].eight_by_sixteen); + FREE_AND_NULL(conio_fontdata[i].eight_by_fourteen); + FREE_AND_NULL(conio_fontdata[i].eight_by_eight); + FREE_AND_NULL(conio_fontdata[i].desc); + } + load_font_files(); textmode(txtinfo.currmode); settitle("SyncTERM"); }