struct font_name *_GDraw_HashFontFamily(FState *fonts,unichar_t *name, int prop) { struct font_name *fn; int ch; int b,i; ch = *name; if ( isupper(ch)) ch = tolower(ch); if ( ch<'a' ) ch = 'q'; else if ( ch>'z' ) ch='z'; ch -= 'a'; fn = fonts->font_names[ch]; while ( fn!=NULL ) { if ( u_strmatch(name,fn->family_name)==0 ) break; fn = fn->next; } if ( fn==NULL ) { fn = gcalloc(1,sizeof(struct font_name)); fn->family_name = u_copy(name); fn->ft = _GDraw_ClassifyFontName(fn->family_name,&b,&i); if ( !prop && fn->ft==ft_unknown ) fn->ft = ft_mono; fn->next = fonts->font_names[ch]; fonts->font_names[ch] = fn; } return( fn ); }
static int GFD_Ok(GGadget *g, GEvent *e) { if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); GGadget *tf; GFileChooserGetChildren(d->gfc,NULL,NULL,&tf); if ( *_GGadgetGetTitle(tf)!='\0' ) { extern int allow_utf8_glyphnames; GTextInfo *ti = GGadgetGetListItemSelected(d->rename); char *nlname = u2utf8_copy(ti->text); force_names_when_opening = NameListByName(nlname); free(nlname); if ( force_names_when_opening!=NULL && force_names_when_opening->uses_unicode && !allow_utf8_glyphnames) { ff_post_error(_("Namelist contains non-ASCII names"),_("Glyph names should be limited to characters in the ASCII character set, but there are names in this namelist which use characters outside that range.")); return(true); } d->done = true; d->ret = GGadgetGetTitle(d->gfc); // Trim trailing '/' if its there and put that string back as // the d->gfc string. int tmplen = u_strlen( d->ret ); if( tmplen > 0 ) { if( d->ret[ tmplen-1 ] == '/' ) { unichar_t* tmp = u_copy( d->ret ); tmp[ tmplen-1 ] = '\0'; GGadgetSetTitle(d->gfc, tmp); free(tmp); d->ret = GGadgetGetTitle(d->gfc); } } } } return( true ); }
/* Builds up a menu containing any user defined scripts */ void MenuScriptsBuild(GWindow base,struct gmenuitem *mi,GEvent *e) { int i; GMenuItem *sub; if ( mi->sub!=NULL ) { GMenuItemArrayFree(mi->sub); mi->sub = NULL; } for ( i=0; i<SCRIPT_MENU_MAX && script_menu_names[i]!=NULL; ++i ); if ( i==0 ) { /* This can't happen */ return; } sub = calloc(i+1,sizeof(GMenuItem)); for ( i=0; i<SCRIPT_MENU_MAX && script_menu_names[i]!=NULL; ++i ) { GMenuItem *mi = &sub[i]; mi->ti.userdata = (void *) (intpt) i; mi->ti.bg = mi->ti.fg = COLOR_DEFAULT; mi->invoke = ScriptSelect; mi->shortcut = i==9?'0':'1'+i; mi->short_mask = ksm_control|ksm_meta; mi->ti.text = u_copy(script_menu_names[i]); } mi->sub = sub; }
static void GRadioSetImageTitle(GGadget *g,GImage *img,const unichar_t *tit, int before) { GRadio *b = (GRadio *) g; if ( b->g.free_box ) free( b->g.box ); free(b->label); b->label = u_copy(tit); b->image = img; b->image_precedes = before; _ggadget_redraw(g); }
GIOControl *GIOCreate(unichar_t *path,void *userdata, void (*receivedata)(struct giocontrol *), void (*receiveerror)(struct giocontrol *)) { GIOControl *gc = (GIOControl *) gcalloc(1,sizeof(GIOControl)); gc->path = u_copy(path); gc->userdata = userdata; gc->receivedata = receivedata; gc->receiveerror = receiveerror; return(gc); }
WordListLine WordlistEscapedInputStringToParsedDataComplex( SplineFont* sf, const unichar_t* input_const, WordlistEscapedInputStringToRealString_getFakeUnicodeOfScFunc getUnicodeFunc, void* udata ) { unichar_t* input = u_copy( input_const ); WordListChar* ret = calloc( WordListLineSz, sizeof(WordListChar)); WordListChar* out = ret; unichar_t* in = input; unichar_t* in_end = input + u_strlen(input); // trim comment and beyond from input { unichar_t* p = input; while( p && p < in_end ) { p = u_strchr( p, '#' ); if( p > input && *(p-1) == '/' ) { p++; continue; } if( p ) *p = '\0'; break; } } in_end = input + u_strlen(input); int addingGlyphsToSelected = 0; int currentGlyphIndex = -1; for ( ; in < in_end; in++ ) { unichar_t ch = *in; TRACE("in:%p end:%p got char %d %c\n", in, in_end, ch, ch ); if( ch == '[' ) { addingGlyphsToSelected = 1; continue; } if( ch == ']' ) { addingGlyphsToSelected = 0; continue; } int isSelected = addingGlyphsToSelected; currentGlyphIndex++; if( ch == '/' || ch == '\\' ) { // start of a glyph name unichar_t glyphname[ PATH_MAX+1 ]; unichar_t* updated_in = 0; SplineChar* sc = u_WordlistEscapedInputStringToRealString_readGlyphName( sf, in, in_end, &updated_in, glyphname ); if( sc ) { in = updated_in; int n = getUnicodeFunc( sc, udata ); if( n == -1 ) { /* * Okay, this probably means we've got an unencoded glyph (generally * used for OpenType substitutions). * Redeem the value from the SplineFont datamap instead of fetching from * the Unicode identifier. */ n = sf->map->backmap[sc->orig_pos]; /* * Unencoded glyphs have special mappings in the SplineFont that * start from 65536 (values beyond Unicode, 65535 being the reserved * "frontier" value). */ if ( (sf->map->enc->is_unicodebmp || sf->map->enc->is_unicodefull) && n < 65536 ) { TRACE("ToRealString: backmapped position does not match Unicode encoding\n"); TRACE("orig_pos: %d, backmap: %d, attached unicode enc: %d\n", sc->orig_pos, n, sc->unicodeenc ); TRACE("ToRealString: INVALID CHAR POSITION, name: %s\n", sc->name ); } } out->sc = sc; out->isSelected = isSelected; out->currentGlyphIndex = currentGlyphIndex; out->n = n; out++; /* out = utf8_idpb( out, n, 0 ); */ /* if( !out ) */ /* printf("ToRealString error on out\n"); */ continue; } } /* If we reach this point, we're looking based on codepoint. */ SplineChar* sc = SFGetOrMakeChar( sf, (int)ch, 0 ); out->sc = sc; out->isSelected = isSelected; out->currentGlyphIndex = currentGlyphIndex; out++; } free(input); return(ret); }
/* Builds up a menu containing the titles of all the major windows */ void WindowMenuBuild(GWindow basew,struct gmenuitem *mi,GEvent *e) { int i, cnt, precnt; FontViewBase *fv; CharViewBase *cv; MetricsView *mv; BitmapView *bv; GMenuItem *sub; BDFFont *bdf; precnt = 6; cnt = precnt; for ( fv = (FontViewBase *) fv_list; fv!=NULL; fv = fv->next ) { ++cnt; /* for the font */ for ( i=0; i<fv->sf->glyphcnt; ++i ) if ( fv->sf->glyphs[i]!=NULL ) { for ( cv = fv->sf->glyphs[i]->views; cv!=NULL; cv=cv->next ) ++cnt; /* for each char view in the font */ } for ( bdf= fv->sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { for ( i=0; i<bdf->glyphcnt; ++i ) if ( bdf->glyphs[i]!=NULL ) { for ( bv = bdf->glyphs[i]->views; bv!=NULL; bv=bv->next ) ++cnt; } } for ( mv=fv->sf->metrics; mv!=NULL; mv=mv->next ) ++cnt; } if ( cnt==0 ) { /* This can't happen */ return; } sub = calloc(cnt+1,sizeof(GMenuItem)); memcpy(sub,mi->sub,precnt*sizeof(struct gmenuitem)); for ( i=0; i<precnt; ++i ) mi->sub[i].ti.text = NULL; GMenuItemArrayFree(mi->sub); mi->sub = sub; for ( i=0; sub[i].ti.text!=NULL || sub[i].ti.line; ++i ) { if ( sub[i].ti.text_is_1byte && sub[i].ti.text_in_resource) { sub[i].ti.text = utf82u_mncopy((char *) sub[i].ti.text,&sub[i].ti.mnemonic); sub[i].ti.text_is_1byte = sub[i].ti.text_in_resource = false; } else if ( sub[i].ti.text_is_1byte ) { sub[i].ti.text = utf82u_copy((char *) sub[i].ti.text); sub[i].ti.text_is_1byte = false; } else if ( sub[i].ti.text_in_resource ) { sub[i].ti.text = u_copy(GStringGetResource((intpt) sub[i].ti.text,NULL)); sub[i].ti.text_in_resource = false; } else sub[i].ti.text = u_copy(sub[i].ti.text); } cnt = precnt; for ( fv = (FontViewBase *) fv_list; fv!=NULL; fv = fv->next ) { if( !((FontView *) fv)->gw ) { continue; } AddMI(&sub[cnt++],((FontView *) fv)->gw,fv->sf->changed,true); for ( i=0; i<fv->sf->glyphcnt; ++i ) if ( fv->sf->glyphs[i]!=NULL ) { for ( cv = fv->sf->glyphs[i]->views; cv!=NULL; cv=cv->next ) AddMI(&sub[cnt++],((CharView *) cv)->gw,cv->sc->changed,false); } for ( bdf= fv->sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { for ( i=0; i<bdf->glyphcnt; ++i ) if ( bdf->glyphs[i]!=NULL ) { for ( bv = bdf->glyphs[i]->views; bv!=NULL; bv=bv->next ) AddMI(&sub[cnt++],bv->gw,bv->bc->changed,false); } } for ( mv=fv->sf->metrics; mv!=NULL; mv=mv->next ) AddMI(&sub[cnt++],mv->gw,false,false); } }
static void GRadioSetTitle(GGadget *g,const unichar_t *tit) { GRadio *b = (GRadio *) g; free(b->label); b->label = u_copy(tit); }
static void _gio_file_dir(GIOControl *gc,char *path) { DIR *dir; struct dirent *ent; GDirEntry *head=NULL, *last=NULL, *cur; char *buffer, *ept, *temp; struct stat statb; dir = opendir(path); if ( dir==NULL ) { _GIO_reporterror(gc,errno); return; } buffer = (char *) malloc(strlen(path)+FILENAME_MAX+3); strcpy(buffer,path); ept = buffer+strlen(buffer); if ( ept[-1]!='/' ) *ept++ = '/'; while (( ent = readdir(dir))!=NULL ) { cur = (GDirEntry *) calloc(1,sizeof(GDirEntry)); cur->name = def2u_copy(ent->d_name); strcpy(ept,ent->d_name); stat(buffer,&statb); cur->hasdir = cur->hasexe = cur->hasmode = cur->hassize = cur->hastime = true; cur->size = statb.st_size; cur->mode = statb.st_mode; cur->modtime = statb.st_mtime; cur->isdir = S_ISDIR(cur->mode); cur->isexe = !cur->isdir && (cur->mode & 0100); temp = NULL; // Things go badly if we open a pipe or a device. So we don't. #ifdef __MINGW32__ //Symlinks behave differently on Windows and are transparent, so no S_ISLNK. if (S_ISREG(statb.st_mode) || S_ISDIR(statb.st_mode)) { #else if (S_ISREG(statb.st_mode) || S_ISDIR(statb.st_mode) || S_ISLNK(statb.st_mode)) { #endif // We look at the file and try to determine a MIME type. if ( (temp=GIOguessMimeType(buffer)) || (temp=GIOGetMimeType(buffer)) ) { cur->mimetype = u_copy(c_to_u(temp)); free(temp); } } if ( last==NULL ) head = last = cur; else { last->next = cur; last = cur; } } #if __CygWin /* Under cygwin we should give the user access to /cygdrive, even though */ /* a diropen("/") will not find it */ if ( strcmp(path,"/")==0 ) { cur = (GDirEntry *) calloc(1,sizeof(GDirEntry)); cur->name = def2u_copy("cygdrive"); strcpy(ept,"cygdrive"); stat(buffer,&statb); cur->hasdir = cur->hasexe = cur->hasmode = cur->hassize = cur->hastime = true; cur->size = statb.st_size; cur->mode = statb.st_mode; cur->modtime = statb.st_mtime; cur->isdir = S_ISDIR(cur->mode); cur->isexe = !cur->isdir && (cur->mode & 0100); if ( last==NULL ) head = last = cur; else { last->next = cur; last = cur; } } #endif closedir(dir); free(buffer); gc->iodata = head; gc->direntrydata = true; gc->return_code = 200; gc->done = true; (gc->receivedata)(gc); } static void _gio_file_statfile(GIOControl *gc,char *path) { GDirEntry *cur; struct stat statb; if ( stat(path,&statb)==-1 ) { _GIO_reporterror(gc,errno); } else { cur = (GDirEntry *) calloc(1,sizeof(GDirEntry)); cur->name = uc_copy(GFileNameTail(path)); cur->hasdir = cur->hasexe = cur->hasmode = cur->hassize = cur->hastime = true; cur->size = statb.st_size; cur->mode = statb.st_mode; cur->modtime = statb.st_mtime; cur->isdir = S_ISDIR(cur->mode); cur->isexe = !cur->isdir && (cur->mode & 0100); gc->iodata = cur; gc->direntrydata = true; gc->return_code = 200; gc->done = true; (gc->receivedata)(gc); } }
static void _gio_file_dir(GIOControl *gc,char *path) { DIR *dir; struct dirent *ent; GDirEntry *head=NULL, *last=NULL, *cur; char *buffer, *ept; struct stat statb; dir = opendir(path); if ( dir==NULL ) { _GIO_reporterror(gc,errno); return; } buffer = (char *) galloc(strlen(path)+FILENAME_MAX+3); strcpy(buffer,path); ept = buffer+strlen(buffer); if ( ept[-1]!='/' ) *ept++ = '/'; while (( ent = readdir(dir))!=NULL ) { cur = (GDirEntry *) gcalloc(1,sizeof(GDirEntry)); cur->name = def2u_copy(ent->d_name); strcpy(ept,ent->d_name); stat(buffer,&statb); cur->hasdir = cur->hasexe = cur->hasmode = cur->hassize = cur->hastime = true; cur->size = statb.st_size; cur->mode = statb.st_mode; cur->modtime = statb.st_mtime; cur->isdir = S_ISDIR(cur->mode); cur->isexe = !cur->isdir && (cur->mode & 0100); cur->mimetype= u_copy(c_to_u(GIOGetMimeType(buffer, false))); if ( last==NULL ) head = last = cur; else { last->next = cur; last = cur; } } #if __CygWin /* Under cygwin we should give the user access to /cygdrive, even though */ /* a diropen("/") will not find it */ if ( strcmp(path,"/")==0 ) { cur = (GDirEntry *) gcalloc(1,sizeof(GDirEntry)); cur->name = def2u_copy("cygdrive"); strcpy(ept,"cygdrive"); stat(buffer,&statb); cur->hasdir = cur->hasexe = cur->hasmode = cur->hassize = cur->hastime = true; cur->size = statb.st_size; cur->mode = statb.st_mode; cur->modtime = statb.st_mtime; cur->isdir = S_ISDIR(cur->mode); cur->isexe = !cur->isdir && (cur->mode & 0100); if ( last==NULL ) head = last = cur; else { last->next = cur; last = cur; } } #endif closedir(dir); free(buffer); gc->iodata = head; gc->direntrydata = true; gc->return_code = 200; gc->done = true; (gc->receivedata)(gc); }