static void SplashLayout() { unichar_t *start, *pt, *lastspace; extern const char *source_modtime_str; extern const char *source_version_str; uc_strcpy(msg, "When my father finished his book on Renaissance printing (The Craft of Printing and the Publication of Shakespeare's Works) he told me that I would have to write the chapter on computer typography. This is my attempt to do so."); GDrawSetFont(splashw,splash_font); linecnt = 0; lines[linecnt++] = msg-1; for ( start = msg; *start!='\0'; start = pt ) { lastspace = NULL; for ( pt=start; ; ++pt ) { if ( *pt==' ' || *pt=='\0' ) { if ( GDrawGetTextWidth(splashw,start,pt-start)<splashimage.u.image->width-10 ) lastspace = pt; else break; if ( *pt=='\0' ) break; } } if ( lastspace!=NULL ) pt = lastspace; lines[linecnt++] = pt; if ( *pt ) ++pt; } uc_strcpy(pt, " FontForge used to be named PfaEdit."); pt += u_strlen(pt); lines[linecnt++] = pt; uc_strcpy(pt," git hash: ");; pt += u_strlen(pt); lines[linecnt++] = pt; uc_strcat(pt, FONTFORGE_GIT_VERSION); pt += u_strlen(pt); lines[linecnt++] = pt; uc_strcpy(pt," Version: ");; uc_strcat(pt,FONTFORGE_MODTIME_STR); pt += u_strlen(pt); lines[linecnt++] = pt; uc_strcat(pt," ("); uc_strcat(pt,FONTFORGE_MODTIME_STR); uc_strcat(pt,"-ML"); #ifdef FREETYPE_HAS_DEBUGGER uc_strcat(pt,"-TtfDb"); #endif uc_strcat(pt,")"); pt += u_strlen(pt); lines[linecnt++] = pt; uc_strcpy(pt," Lib Version: "); uc_strcat(pt,FONTFORGE_MODTIME_STR); lines[linecnt++] = pt+u_strlen(pt); lines[linecnt] = NULL; is = u_strchr(msg,'('); ie = u_strchr(msg,')'); }
static void RH_SetupHint(ReviewHintData *hd) { char buffer[20]; unichar_t ubuf[20]; static unichar_t nullstr[] = {'\0'}; StemInfo *h; int pos,cnt; if ( hd->lastactive!=NULL ) hd->lastactive->active = false; pos = cnt = 0; for ( h=hd->ishstem ? hd->cv->b.sc->hstem : hd->cv->b.sc->vstem; h!=NULL; h=h->next ) { ++cnt; if ( h==hd->active ) pos=cnt; } sprintf( buffer,"%d/%d", pos, cnt ); if ( cnt==3 ) { StemInfo *h2, *h3; h = hd->ishstem ? hd->cv->b.sc->hstem : hd->cv->b.sc->vstem; h2 = h->next; h3 = h2->next; if ( h->width == h2->width && h2->width==h3->width && h2->start-h->start == h3->start-h2->start ) strcat( buffer, hd->ishstem ? " hstem3" : " vstem3" ); } uc_strcpy(ubuf,buffer); GGadgetSetTitle(GWidgetGetControl(hd->gw,CID_Count),ubuf); if ( hd->active==NULL ) { GGadgetSetTitle(GWidgetGetControl(hd->gw,CID_Base),nullstr); GGadgetSetTitle(GWidgetGetControl(hd->gw,CID_Width),nullstr); GGadgetSetVisible(GWidgetGetControl(hd->gw,CID_Overlap),false); } else { hd->active->active = true; sprintf( buffer,"%g", (double) (!hd->active->ghost ? hd->active->start : hd->active->start+hd->active->width) ); uc_strcpy(ubuf,buffer); GGadgetSetTitle(GWidgetGetControl(hd->gw,CID_Base),ubuf); GTextFieldShow(GWidgetGetControl(hd->gw,CID_Base),0); sprintf( buffer,"%g", (double) (!hd->active->ghost ? hd->active->width : -hd->active->width) ); uc_strcpy(ubuf,buffer); GGadgetSetTitle(GWidgetGetControl(hd->gw,CID_Width),ubuf); GTextFieldShow(GWidgetGetControl(hd->gw,CID_Width),0); GGadgetSetVisible(GWidgetGetControl(hd->gw,CID_Overlap),hd->active->hasconflicts); } if ( hd->lastactive!=hd->active ) { hd->lastactive = hd->active; SCOutOfDateBackground(hd->cv->b.sc); SCUpdateAll(hd->cv->b.sc); /* Changing the active Hint means we should redraw everything */ } RH_SetNextPrev(hd); }
static int Trans_TypeChange(GGadget *g, GEvent *e) { if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { GWindow bw = GGadgetGetWindow(g); int offset = GGadgetGetCid(g)-CID_Type; int index = GGadgetGetFirstListSelectedItem(g); int mask = (intpt) transformtypes[index].userdata; int i; if ( mask & 0x400 ) { real xoff = last_ruler_offset[0].x, yoff = last_ruler_offset[0].y; char buf[24]; unichar_t ubuf[24]; if ( mask & 0x20 ) index -= 4; /* skew */ else index -= 7; /* move or rotate */ GGadgetSelectOneListItem( g,index ); mask &= ~0x400; if ( mask&1 ) { /* Move */ sprintf( buf, "%.1f", (double) xoff ); uc_strcpy(ubuf,buf); GGadgetSetTitle(GWidgetGetControl(bw,CID_XMove+offset), ubuf ); sprintf( buf, "%.1f", (double) yoff ); uc_strcpy(ubuf,buf); GGadgetSetTitle(GWidgetGetControl(bw,CID_YMove+offset), ubuf ); } else { sprintf( buf, "%.0f", atan2(yoff,xoff)*180/3.1415926535897932 ); uc_strcpy(ubuf,buf); GGadgetSetTitle(GWidgetGetControl(bw,((mask&0x2)?CID_Angle:CID_SkewAng)+offset), ubuf ); GGadgetSetChecked(GWidgetGetControl(bw,CID_Clockwise+offset), false ); GGadgetSetChecked(GWidgetGetControl(bw,CID_CounterClockwise+offset), true ); } } for ( i=CID_First; i<=CID_Last; ++i ) { GGadget *sg; sg = GWidgetGetControl(bw,i+offset); GGadgetSetVisible(sg, ( ((intpt) GGadgetGetUserData(sg))&mask )?1:0); } if ( selcid[index]!=0 ) { GGadget *tf = GWidgetGetControl(bw,selcid[index]+offset); GWidgetIndicateFocusGadget(tf); GTextFieldSelect(tf,0,-1); } GWidgetToDesiredSize(bw); GDrawRequestExpose(bw,NULL,false); } return( true ); }
static void AnchorD_SetDevTabs(AnchorDlg *a) { char buffer[20]; unichar_t ubuf[20]; int min, max; GGadgetClearList(GWidgetGetControl(a->gw,CID_DisplaySize)); min = 1; max = 0; if ( a->xadjust.corrections!=NULL ) { min = a->xadjust.first_pixel_size; max = a->xadjust.last_pixel_size; } if ( a->yadjust.corrections!=NULL ) { if ( a->yadjust.first_pixel_size<min ) min = a->yadjust.first_pixel_size; if ( a->yadjust.last_pixel_size>max ) max = a->yadjust.last_pixel_size; } if ( max>min ) { int i; int len = max-min+1; char buffer[20]; GTextInfo **ti = malloc((len+1)*sizeof(GTextInfo *)); for ( i=0; i<len; ++i ) { ti[i] = calloc(1,sizeof(GTextInfo)); sprintf( buffer, "%d", i+min ); ti[i]->text = uc_copy(buffer); ti[i]->fg = ti[i]->bg = COLOR_DEFAULT; } ti[i] = calloc(1,sizeof(GTextInfo)); GGadgetSetList(GWidgetGetControl(a->gw,CID_DisplaySize),ti,false); } ubuf[0] = '0'; ubuf[1] = '\0'; if ( a->xadjust.corrections!=NULL && a->pixelsize>=a->xadjust.first_pixel_size && a->pixelsize<=a->xadjust.last_pixel_size ) { sprintf( buffer, "%d", a->xadjust.corrections[ a->pixelsize-a->xadjust.first_pixel_size]); uc_strcpy(ubuf,buffer); } GGadgetSetTitle(GWidgetGetControl(a->gw,CID_XCor),ubuf); ubuf[0] = '0'; ubuf[1] = '\0'; if ( a->yadjust.corrections!=NULL && a->pixelsize>=a->yadjust.first_pixel_size && a->pixelsize<=a->yadjust.last_pixel_size ) { sprintf( buffer, "%d", a->yadjust.corrections[ a->pixelsize-a->yadjust.first_pixel_size]); uc_strcpy(ubuf,buffer); } GGadgetSetTitle(GWidgetGetControl(a->gw,CID_YCor),ubuf); }
static void PoV_DoVanish(struct nldlg *d) { double x,y,dv,tilt,dir; double t; int err = false; double vp; char buf[80]; unichar_t ubuf[80]; extern char *coord_sep; x = GetQuietReal(d->gw,CID_XValue,&err); y = GetQuietReal(d->gw,CID_YValue,&err); /*z = GetQuietReal(d->gw,CID_ZValue,&err);*/ dv = GetQuietReal(d->gw,CID_DValue,&err); tilt = GetQuietReal(d->gw,CID_Tilt,&err)*3.1415926535897932/180; dir = GetQuietReal(d->gw,CID_GazeDirection,&err)*3.1415926535897932/180; if ( err ) return; if ( GGadgetGetFirstListSelectedItem( GWidgetGetControl(d->gw,CID_XType))!=3 ) x = 0; if ( GGadgetGetFirstListSelectedItem( GWidgetGetControl(d->gw,CID_YType))!=3 ) y = 0; t = tan(tilt); if ( t<.000001 && t>-.000001 ) sprintf(buf,"inf%sinf", coord_sep); else { vp = dv/t; x -= sin(dir)*vp; y += cos(dir)*vp; sprintf(buf,"%g%s%g", x, coord_sep, y ); } uc_strcpy(ubuf,buf); GGadgetSetTitle( GWidgetGetControl(d->gw,CID_Vanish), ubuf ); }
static int WithinList(struct gfc_data *d,GEvent *event) { GRect size; GGadget *list; int32 pos; unichar_t *ufile; char *file, **fontnames; int cnt, len; unichar_t *msg; if ( event->type!=et_mousemove ) return( false ); GFileChooserGetChildren(d->gfc,NULL, &list, NULL); if ( list==NULL ) return( false ); if ( !GGadgetWithin(list,event->u.mouse.x,event->u.mouse.y) ) return( false ); pos = GListIndexFromY(list,event->u.mouse.y); if ( pos == d->filename_popup_pos ) return( pos!=-1 ); if ( pos==-1 || GFileChooserPosIsDir(d->gfc,pos)) { d->filename_popup_pos = -1; return( pos!=-1 ); } ufile = GFileChooserFileNameOfPos(d->gfc,pos); if ( ufile==NULL ) return( true ); file = u2def_copy(ufile); free(ufile); fontnames = GetFontNames(file, 0); if ( fontnames==NULL || fontnames[0]==NULL ) msg = uc_copy( "???" ); else { len = 0; for ( cnt=0; fontnames[cnt]!=NULL; ++cnt ) len += strlen(fontnames[cnt])+1; msg = malloc((len+2)*sizeof(unichar_t)); len = 0; for ( cnt=0; fontnames[cnt]!=NULL; ++cnt ) { uc_strcpy(msg+len,fontnames[cnt]); len += strlen(fontnames[cnt]); msg[len++] = '\n'; } msg[len-1] = '\0'; } GGadgetPreparePopup(GGadgetGetWindow(d->gfc),msg); if ( fontnames!=NULL ) { for ( cnt=0; fontnames[cnt]!=NULL; ++cnt ) { free(fontnames[cnt]); } free(fontnames); } free(file); free(d->lastpopupfontname); d->lastpopupfontname = msg; return( true ); }
static void AnchorD_DrawPos(AnchorDlg *a) { GRect r; char buffer[20]; unichar_t ubuf[20]; sprintf( buffer, "%g", (double) a->apos.x ); uc_strcpy(ubuf,buffer); GGadgetSetTitle(GWidgetGetControl(a->gw,CID_X),ubuf); sprintf( buffer, "%g", (double) a->apos.y ); uc_strcpy(ubuf,buffer); GGadgetSetTitle(GWidgetGetControl(a->gw,CID_Y),ubuf); r.x = a->ctl_len; r.y = 0; r.width = a->char_size*a->magfactor; r.height = a->full_height; GDrawRequestExpose(a->gw,&r,false); }
static void kpdpopup(KPData *kpd) { char buffer[100]; if ( kpd->ac==NULL ) { sprintf( buffer, "total kern pairs=%d\nchars starting kerns=%d", kpd->kcnt, kpd->firstcnt ); } else { sprintf( buffer, "total anchored pairs=%d\nbase char cnt=%d", kpd->kcnt, kpd->firstcnt ); } uc_strcpy(upopupbuf,buffer); GGadgetPreparePopup(kpd->gw,upopupbuf); }
static int AnchorD_DisplaySizeChanged(GGadget *g, GEvent *e) { AnchorDlg *a = GDrawGetUserData(GGadgetGetWindow(g)); if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(a->gw,CID_DisplaySize)); unichar_t *end; int pixelsize = u_strtol(ret,&end,10); while ( *end==' ' ) ++end; if ( pixelsize>4 && pixelsize<400 && *end=='\0' ) { unichar_t ubuf[20]; char buffer[20]; ubuf[0] = '0'; ubuf[1] = '\0'; if ( a->xadjust.corrections!=NULL && pixelsize>=a->xadjust.first_pixel_size && pixelsize<=a->xadjust.last_pixel_size ) { sprintf( buffer, "%d", a->xadjust.corrections[ pixelsize-a->xadjust.first_pixel_size]); uc_strcpy(ubuf,buffer); } GGadgetSetTitle(GWidgetGetControl(a->gw,CID_XCor),ubuf); ubuf[0] = '0'; ubuf[1] = '\0'; if ( a->yadjust.corrections!=NULL && pixelsize>=a->yadjust.first_pixel_size && pixelsize<=a->yadjust.last_pixel_size ) { sprintf( buffer, "%d", a->yadjust.corrections[ pixelsize-a->yadjust.first_pixel_size]); uc_strcpy(ubuf,buffer); } GGadgetSetTitle(GWidgetGetControl(a->gw,CID_YCor),ubuf); a->xoff = pixelsize*a->xoff/a->pixelsize; a->pixelsize = aa_pixelsize = pixelsize; AnchorD_ChangeSize(a); GDrawRequestExpose(a->gw,NULL,false); } } return( true ); }
unichar_t *u_GFileGetAbsoluteName(unichar_t *name, unichar_t *result, int rsiz) { /* result may be the same as name */ unichar_t buffer[1000]; if ( ! u_GFileIsAbsolute(name) ) { unichar_t *pt, *spt, *rpt, *bpt; if ( dirname_[0]=='\0' ) { getcwd(dirname_,sizeof(dirname_)); } uc_strcpy(buffer,dirname_); if ( buffer[u_strlen(buffer)-1]!='/' ) uc_strcat(buffer,"/"); u_strcat(buffer,name); _u_backslash_to_slash(buffer); /* Normalize out any .. */ spt = rpt = buffer; while ( *spt!='\0' ) { if ( *spt=='/' ) ++spt; for ( pt = spt; *pt!='\0' && *pt!='/'; ++pt ); if ( pt==spt ) /* Found // in a path spec, reduce to / (we've*/ u_strcpy(spt,pt); /* skipped past the :// of the machine name) */ else if ( pt==spt+1 && spt[0]=='.' && *pt=='/' ) /* Noop */ u_strcpy(spt,spt+2); else if ( pt==spt+2 && spt[0]=='.' && spt[1]=='.' ) { for ( bpt=spt-2 ; bpt>rpt && *bpt!='/'; --bpt ); if ( bpt>=rpt && *bpt=='/' ) { u_strcpy(bpt,pt); spt = bpt; } else { rpt = pt; spt = pt; } } else spt = pt; } name = buffer; } if (result!=name) { u_strncpy(result,name,rsiz); result[rsiz-1]='\0'; _u_backslash_to_slash(result); } return(result); }
static SplineChar* u_WordlistEscapedInputStringToRealString_readGlyphName( SplineFont *sf, unichar_t* in, unichar_t* in_end, unichar_t** updated_in, unichar_t* glyphname ) { int startedWithBackSlash = (*in == '\\'); if( *in != '/' && *in != '\\' ) return 0; bool startsWithBackSlash = *in == '\\'; // move over the delimiter that we know we are on in++; unichar_t* startpos = in; // Get the largest possible 'glyphname' from the input stream. memset( glyphname, '\0', PATH_MAX ); unichar_t* outname = glyphname; while( *in != '/' && ( !startsWithBackSlash || *in != '\\' ) && *in != ' ' && *in != ']' && in != in_end ) { *outname = *in; ++outname; in++; } bool FullMatchEndsOnSpace = 0; unichar_t* maxpos = in; unichar_t* endpos = maxpos-1; TRACE("WordlistEscapedInputStringToRealString_readGlyphName(x1) -->:%s:<--\n", u_to_c(glyphname)); int loopCounter = 0; int firstLookup = 1; for( ; endpos >= startpos; endpos--, loopCounter++ ) { // printf("WordlistEscapedInputStringToRealString_readGlyphName(trim loop top) gn:%s\n", u_to_c(glyphname) ); SplineChar* sc = 0; if( startedWithBackSlash ) { if( glyphname[0] == 'u' ) glyphname++; unichar_t* endptr = 0; long unicodepoint = u_strtoul( glyphname+1, &endptr, 16 ); TRACE("AAA glyphname:%s\n", u_to_c(glyphname+1) ); TRACE("AAA unicodepoint:%ld\n", unicodepoint ); sc = SFGetChar( sf, unicodepoint, 0 ); if( sc && endptr ) { unichar_t* endofglyphname = glyphname + u_strlen(glyphname); /* printf("glyphname:%p\n", glyphname ); */ /* printf("endptr:%p endofglyphname:%p\n", endptr, endofglyphname ); */ for( ; endptr < endofglyphname; endptr++ ) --endpos; } if( !sc ) { // printf("WordlistEscapedInputStringToRealString_readGlyphName() no char found for backslashed unicodepoint:%ld\n", unicodepoint ); uc_strcpy(glyphname,"backslash"); sc = SFGetChar( sf, -1, u_to_c(glyphname) ); endpos = startpos; } } else { if( uc_startswith( glyphname, "uni")) { unichar_t* endptr = 0; long unicodepoint = u_strtoul( glyphname+3, &endptr, 16 ); SplineChar* tmp = 0; TRACE("uni prefix, codepoint: %ld\n", unicodepoint ); sc = SFGetChar( sf, unicodepoint, 0 ); if ((tmp = SFGetChar( sf, -1, u_to_c(glyphname) ))) { TRACE("have subst. char: %s\n", tmp->name ); sc = tmp; } else { if( sc && endptr ) { unichar_t* endofglyphname = glyphname + u_strlen(glyphname); // printf("endptr:%p endofglyphname:%p\n", endptr, endofglyphname ); for( ; endptr < endofglyphname; endptr++ ) --endpos; } } } if( firstLookup && glyphname[0] == '#' ) { unichar_t* endptr = 0; long unicodepoint = u_strtoul( glyphname+1, &endptr, 16 ); // printf("WordlistEscapedInputStringToRealString_readGlyphName() unicodepoint:%ld\n", unicodepoint ); sc = SFGetChar( sf, unicodepoint, 0 ); if( sc && endptr ) { unichar_t* endofglyphname = glyphname + u_strlen(glyphname); // printf("endptr:%p endofglyphname:%p\n", endptr, endofglyphname ); for( ; endptr < endofglyphname; endptr++ ) --endpos; } } if( !sc ) { // printf("WordlistEscapedInputStringToRealString_readGlyphName(getchar) gn:%s\n", glyphname ); sc = SFGetChar( sf, -1, u_to_c(glyphname) ); } } if( sc ) { // printf("WordlistEscapedInputStringToRealString_readGlyphName(found!) gn:%s start:%p end:%p\n", glyphname, startpos, endpos ); if( !loopCounter && FullMatchEndsOnSpace ) { endpos++; } *updated_in = endpos; return sc; } if( glyphname[0] != '\0' ) glyphname[ u_strlen(glyphname)-1 ] = '\0'; } *updated_in = endpos; // printf("WordlistEscapedInputStringToRealString_readGlyphName(end) gn:%s\n", glyphname ); return 0; }
static void GIOdispatch(GIOControl *gc, enum giofuncs gf) { unichar_t *temp, *pt, *tpt; int i; gc->gf = gf; if ( _GIO_stdfuncs.useragent == NULL ) _GIO_stdfuncs.useragent = copy("*****@*****.**"); temp = _GIO_translateURL(gc->path,gf); if ( temp!=NULL ) { if ( gc->origpath==NULL ) gc->origpath = gc->path; else free(gc->path); gc->path = temp; } if ( gc->topath!=NULL ) { temp = _GIO_translateURL(gc->topath,gf); if ( temp!=NULL ) { free(gc->topath); gc->topath = temp; } if ( gf==gf_renamefile ) { if (( pt = uc_strstr(gc->path,"://"))== NULL ) pt = gc->path; else { pt=u_strchr(pt+3,'/'); if ( pt==NULL ) pt = gc->path+u_strlen(gc->path); } if (( tpt = uc_strstr(gc->topath,"://"))== NULL ) tpt = gc->topath; else { tpt=u_strchr(tpt+3,'/'); if ( tpt==NULL ) tpt = gc->topath+u_strlen(gc->topath); } if ( tpt-gc->topath!=pt-gc->path || u_strnmatch(gc->path,gc->topath,pt-gc->path)!=0 ) { _GIO_reporterror(gc,EXDEV); return; } } } pt = uc_strstr(gc->path,"://"); if ( pt!=NULL ) { for ( i=0; i<plen; ++i ) if ( u_strnmatch(protocols[i].proto,gc->path,pt-gc->path)==0 ) break; if ( i>=plen && !AddProtocol(gc->path,pt-gc->path) ) { gc->protocol_index = -2; gc->return_code = 501; gc->error = err501; uc_strcpy(gc->status,"No support for browsing: "); u_strncpy(gc->status+u_strlen(gc->status), gc->path, pt-gc->path ); gc->done = true; (gc->receiveerror)(gc); return; } gc->protocol_index = i; if ( !protocols[i].dothread ) (protocols[i].dispatcher)(gc); else { #ifndef HAVE_PTHREAD_H gc->return_code = 501; gc->error = err501; uc_strcpy(gc->status,"No support for protocol"); gc->done = true; (gc->receiveerror)(gc); return; #else static pthread_cond_t initcond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t initmutex = PTHREAD_MUTEX_INITIALIZER; /* could put stuff here to queue functions if we get too many */ /* threads, or perhaps even a thread pool */ uc_strcpy(gc->status,"Queued"); gc->threaddata = (struct gio_threaddata *) malloc(sizeof(struct gio_threaddata)); gc->threaddata->mutex = initmutex; gc->threaddata->cond = initcond; if ( _GIO_stdfuncs.gdraw_sync_thread!=NULL ) (_GIO_stdfuncs.gdraw_sync_thread)(NULL,NULL,NULL); pthread_create(&gc->threaddata->thread,NULL, (ptread_startfunc_t *) (protocols[i].dispatcher), gc); #endif } } else { gc->protocol_index = -1; _GIO_localDispatch(gc); } }
static int kpdv_e_h(GWindow gw, GEvent *event) { KPData *kpd = GDrawGetUserData(gw); int index, old_sel, temp; char buffer[100]; static int done=false; switch ( event->type ) { case et_expose: KP_ExposeKerns(kpd,gw,&event->u.expose.rect); break; case et_char: if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { help("kernpairs.html"); return( true ); } KP_Commands(kpd,event); break; case et_mousedown: GGadgetEndPopup(); kpd->pressed = true; index = kpd->off_top + event->u.mouse.y/kpd->uh; if ( index>=kpd->kcnt ) index = -1; if ( index!=kpd->selected ) { old_sel = kpd->selected; kpd->selected = index; KP_RefreshSel(kpd,old_sel); KP_RefreshSel(kpd,index); } if ( event->u.mouse.button==3 && index>=0 ) { if ( !done ) { int i; for ( i=0; kernmenu[i].ti.text!=NULL || kernmenu[i].ti.line; ++i ) if ( kernmenu[i].ti.text!=NULL ) kernmenu[i].ti.text = (unichar_t *) _((char *) kernmenu[i].ti.text); for ( i=0; acmenu[i].ti.text!=NULL || acmenu[i].ti.line; ++i ) if ( acmenu[i].ti.text!=NULL ) acmenu[i].ti.text = (unichar_t *) _((char *) acmenu[i].ti.text); done = true; } if ( kpd->ac==NULL ) GMenuCreatePopupMenu(gw,event, kernmenu); else GMenuCreatePopupMenu(gw,event, acmenu); } else if ( KP_Cursor(kpd,event)!=NULL ) { kpd->pressed_x = event->u.mouse.x; kpd->old_val = kpd->kerns[index].newoff; } else kpd->pressed_x = -1; break; case et_mouseup: if ( kpd->pressed_x!=-1 ) kpd->last_index = kpd->selected; else kpd->last_index = -1; if ( kpd->selected>=0 && event->u.mouse.clicks>1 ) { if ( kpd->ac==NULL ) KPKPCloseup(kpd); else KPAC(kpd,true); return( true ); } /* Fall through... */ case et_mousemove: GGadgetEndPopup(); index = kpd->off_top + event->u.mouse.y/kpd->uh; if ( !kpd->pressed && index<kpd->kcnt ) { sprintf( buffer, "%.20s %d U+%04x", kpd->kerns[index].first->name, kpd->kerns[index].first->orig_pos, kpd->kerns[index].first->unicodeenc ); if ( kpd->kerns[index].first->unicodeenc==-1 ) strcpy(buffer+strlen(buffer)-4, "????"); sprintf( buffer+strlen(buffer), " + %.20s %d U+%04x", kpd->kerns[index].second->name, kpd->kerns[index].second->orig_pos, kpd->kerns[index].second->unicodeenc ); if ( kpd->kerns[index].second->unicodeenc==-1 ) strcpy(buffer+strlen(buffer)-4, "????"); uc_strcpy(upopupbuf,buffer); GGadgetPreparePopup(gw,upopupbuf); KP_Cursor(kpd,event); } else if ( kpd->pressed && kpd->pressed_x!=-1 ) { if ( kpd->ac!=NULL ) { /* Nothing to be done. That's what I find so wonderful. Happy Days */ } else if ( index==kpd->selected ) { KP_SetCursor(kpd,true); temp = kpd->old_val + (event->u.mouse.x-kpd->pressed_x)*(kpd->sf->ascent+kpd->sf->descent)/kpd->bdf->pixelsize; if ( temp!=kpd->kerns[index].newoff ) { kpd->kerns[index].newoff = temp; KP_RefreshKP(kpd,index); } } else { if ( kpd->movecursor ) { kpd->kerns[kpd->selected].newoff = kpd->old_val; KP_SetCursor(kpd,false); KP_RefreshKP(kpd,kpd->selected); } } if ( kpd->ac==NULL && kpd->kerns[index].kp->kcid!=0 && event->type==et_mouseup ) KP_KernClassAlter(kpd,index); } if ( event->type==et_mouseup ) kpd->pressed = false; break; case et_resize: KPV_Resize(kpd); break; } return( true ); }
void CVCreateHint(CharView *cv,int ishstem,int preservehints) { GRect pos; GWindow gw; GWindowAttrs wattrs; GGadgetCreateData gcd[9], *harray1[4], *harray2[9], *barray[7], *varray[5][2], boxes[5]; GTextInfo label[9]; static CreateHintData chd; char buffer[20]; unichar_t ubuf[20]; chd.done = false; chd.ishstem = ishstem; chd.preservehints = preservehints; chd.cv = cv; if ( chd.gw==NULL ) { memset(&wattrs,0,sizeof(wattrs)); wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict; wattrs.event_masks = ~(1<<et_charup); wattrs.restrict_input_to_me = 1; wattrs.undercursor = 1; wattrs.cursor = ct_pointer; wattrs.utf8_window_title = _("Create Hint"); wattrs.is_dlg = true; pos.x = pos.y = 0; pos.width = GGadgetScale(GDrawPointsToPixels(NULL,170)); pos.height = GDrawPointsToPixels(NULL,90); chd.gw = gw = GDrawCreateTopWindow(NULL,&pos,chd_e_h,&chd,&wattrs); memset(&label,0,sizeof(label)); memset(&gcd,0,sizeof(gcd)); memset(&boxes,0,sizeof(boxes)); label[0].text = (unichar_t *) _("_Base:"); label[0].text_is_1byte = true; label[0].text_in_resource = true; gcd[0].gd.label = &label[0]; gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = 17+5+6; gcd[0].gd.flags = gg_enabled|gg_visible; gcd[0].creator = GLabelCreate; harray2[0] = GCD_Glue; harray2[1] = &gcd[0]; sprintf( buffer, "%g", (double) (ishstem ? cv->p.cy : cv->p.cx) ); label[1].text = (unichar_t *) buffer; label[1].text_is_1byte = true; gcd[1].gd.label = &label[1]; gcd[1].gd.pos.x = 37; gcd[1].gd.pos.y = 17+5; gcd[1].gd.pos.width = 40; gcd[1].gd.flags = gg_enabled|gg_visible; gcd[1].gd.cid = CID_Base; gcd[1].creator = GTextFieldCreate; harray2[2] = &gcd[1]; label[2].text = (unichar_t *) _("_Size:"); label[2].text_is_1byte = true; label[2].text_in_resource = true; gcd[2].gd.label = &label[2]; gcd[2].gd.pos.x = 90; gcd[2].gd.pos.y = 17+5+6; gcd[2].gd.flags = gg_enabled|gg_visible; gcd[2].creator = GLabelCreate; harray2[3] = GCD_Glue; harray2[4] = &gcd[2]; label[3].text = (unichar_t *) "60"; label[3].text_is_1byte = true; gcd[3].gd.label = &label[3]; gcd[3].gd.pos.x = 120; gcd[3].gd.pos.y = 17+5; gcd[3].gd.pos.width = 40; gcd[3].gd.flags = gg_enabled|gg_visible; gcd[3].gd.cid = CID_Width; gcd[3].creator = GTextFieldCreate; harray2[5] = &gcd[3]; harray2[6] = GCD_Glue; harray2[7] = NULL; gcd[4].gd.pos.x = 20-3; gcd[4].gd.pos.y = 17+37; gcd[4].gd.pos.width = -1; gcd[4].gd.pos.height = 0; gcd[4].gd.flags = gg_visible | gg_enabled | gg_but_default; label[4].text = (unichar_t *) _("_OK"); label[4].text_is_1byte = true; label[4].text_in_resource = true; gcd[4].gd.mnemonic = 'O'; gcd[4].gd.label = &label[4]; gcd[4].gd.handle_controlevent = CH_OK; gcd[4].creator = GButtonCreate; barray[0] = GCD_Glue; barray[1] = &gcd[4]; barray[2] = GCD_Glue; gcd[5].gd.pos.x = -20; gcd[5].gd.pos.y = 17+37+3; gcd[5].gd.pos.width = -1; gcd[5].gd.pos.height = 0; gcd[5].gd.flags = gg_visible | gg_enabled | gg_but_cancel; label[5].text = (unichar_t *) _("_Cancel"); label[5].text_is_1byte = true; label[5].text_in_resource = true; gcd[5].gd.label = &label[5]; gcd[5].gd.mnemonic = 'C'; gcd[5].gd.handle_controlevent = CH_Cancel; gcd[5].creator = GButtonCreate; barray[3] = GCD_Glue; barray[4] = &gcd[5]; barray[5] = GCD_Glue; barray[6] = NULL; label[6].text = (unichar_t *) _("Create Horizontal Stem Hint"); /* Initialize to bigger size */ label[6].text_is_1byte = true; gcd[6].gd.label = &label[6]; gcd[6].gd.pos.x = 17; gcd[6].gd.pos.y = 5; gcd[6].gd.flags = gg_enabled|gg_visible; gcd[6].gd.cid = CID_Label; gcd[6].creator = GLabelCreate; harray1[0] = GCD_Glue; harray1[1] = &gcd[6]; harray1[2] = GCD_Glue; harray1[3] = NULL; gcd[7].gd.pos.x = 5; gcd[7].gd.pos.y = 17+31; gcd[7].gd.pos.width = 170-10; gcd[7].gd.flags = gg_enabled|gg_visible; gcd[7].creator = GLineCreate; boxes[2].gd.flags = gg_enabled|gg_visible; boxes[2].gd.u.boxelements = harray1; boxes[2].creator = GHBoxCreate; boxes[3].gd.flags = gg_enabled|gg_visible; boxes[3].gd.u.boxelements = harray2; boxes[3].creator = GHBoxCreate; boxes[4].gd.flags = gg_enabled|gg_visible; boxes[4].gd.u.boxelements = barray; boxes[4].creator = GHBoxCreate; varray[0][0] = &boxes[2]; varray[0][1] = NULL; varray[1][0] = &boxes[3]; varray[1][1] = NULL; varray[2][0] = &gcd[7]; varray[2][1] = NULL; varray[3][0] = &boxes[4]; varray[3][1] = NULL; varray[4][0] = NULL; boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2; boxes[0].gd.flags = gg_enabled|gg_visible; boxes[0].gd.u.boxelements = varray[0]; boxes[0].creator = GHVGroupCreate; GGadgetsCreate(gw,boxes); GHVBoxSetExpandableCol(boxes[2].ret,gb_expandglue); GHVBoxSetExpandableCol(boxes[3].ret,gb_expandglue); GHVBoxSetExpandableCol(boxes[4].ret,gb_expandgluesame); GHVBoxFitWindow(boxes[0].ret); } else { gw = chd.gw; sprintf( buffer, "%g", (double) (ishstem ? cv->p.cy : cv->p.cx) ); uc_strcpy(ubuf,buffer); GGadgetSetTitle(GWidgetGetControl(gw,CID_Base),ubuf); GDrawSetTransientFor(gw,(GWindow) -1); } GGadgetSetTitle8(GWidgetGetControl(gw,CID_Label), ishstem ? _("Create Horizontal Stem Hint") : _("Create Vertical Stem Hint")); GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_Base)); GTextFieldSelect(GWidgetGetControl(gw,CID_Base),0,-1); GWidgetHidePalettes(); GDrawSetVisible(gw,true); while ( !chd.done ) GDrawProcessOneEvent(NULL); GDrawSetVisible(gw,false); }
static void SplashLayout() { unichar_t *start, *pt, *lastspace; extern const char *source_modtime_str; extern const char *source_version_str; uc_strcpy(msg, "When my father finished his book on Renaissance printing (The Craft of Printing and the Publication of Shakespeare's Works) he told me that I would have to write the chapter on computer typography. This is my attempt to do so."); GDrawSetFont(splashw,splash_font); linecnt = 0; lines[linecnt++] = msg-1; for ( start = msg; *start!='\0'; start = pt ) { lastspace = NULL; for ( pt=start; ; ++pt ) { if ( *pt==' ' || *pt=='\0' ) { if ( GDrawGetTextWidth(splashw,start,pt-start,NULL)<splashimage.u.image->width-10 ) lastspace = pt; else break; if ( *pt=='\0' ) break; } } if ( lastspace!=NULL ) pt = lastspace; lines[linecnt++] = pt; if ( *pt ) ++pt; } uc_strcpy(pt, " FontForge used to be named PfaEdit."); pt += u_strlen(pt); lines[linecnt++] = pt; uc_strcpy(pt," Version: ");; uc_strcat(pt,source_modtime_str); uc_strcat(pt," ("); uc_strcat(pt,source_version_str); #ifdef FONTFORGE_CONFIG_TYPE3 uc_strcat(pt,"-ML"); #endif #ifdef FREETYPE_HAS_DEBUGGER uc_strcat(pt,"-TtfDb"); #endif #ifdef _NO_PYTHON uc_strcat(pt,"-NoPython"); #endif #ifdef FONTFORGE_CONFIG_USE_LONGDOUBLE uc_strcat(pt,"-LD"); #elif defined(FONTFORGE_CONFIG_USE_DOUBLE) uc_strcat(pt,"-D"); #endif #ifndef FONTFORGE_CONFIG_DEVICETABLES uc_strcat(pt,"-NoDevTab"); #endif uc_strcat(pt,")"); pt += u_strlen(pt); lines[linecnt++] = pt; uc_strcpy(pt," Library Version: "); uc_strcat(pt,library_version_configuration.library_source_modtime_string); lines[linecnt++] = pt+u_strlen(pt); lines[linecnt] = NULL; is = u_strchr(msg,'('); ie = u_strchr(msg,')'); }