static void start_splash_screen(void){ GDrawSetVisible(splashw,true); GDrawSync(NULL); GDrawProcessPendingEvents(NULL); GDrawProcessPendingEvents(NULL); splasht = GDrawRequestTimer(splashw,1000,1000,NULL); localsplash = false; }
static int GProgressProcess(GProgress *p) { int width, amount; int tenpt; if ( !p->visible ) GProgressTimeCheck(); tenpt = GDrawPointsToPixels(p->gw,10); width = p->width-2*tenpt; if ( p->tot==0 ) amount = 0; else amount = width * (p->stage*p->tot + p->sofar)/(p->stages*p->tot); if ( amount!=p->last_amount ) { if ( amount<p->last_amount || p->last_amount==0 ) GDrawRequestExpose(p->gw,NULL,false); else { GRect r; r.height = tenpt-1; r.width = amount - p->last_amount; r.x = tenpt + p->last_amount; r.y = p->boxy+1; GDrawFillRect(p->gw,&r,progress_fillcol); } p->last_amount = amount; } GDrawProcessPendingEvents(NULL); return( !p->aborted ); }
static void SVResize(SearchView *sv, GEvent *event) { int width, height; if ( !event->u.resize.sized ) return; GGadgetMove(GWidgetGetControl(sv->gw,CID_TopBox),4,4); GGadgetResize(GWidgetGetControl(sv->gw,CID_TopBox), event->u.resize.size.width-8, event->u.resize.size.height-12); width = (event->u.resize.size.width-40)/2; height = (event->u.resize.size.height-sv->cv_y-sv->button_height-8); if ( width<70 || height<80 ) { if ( width<70 ) width = 70; width = 2*width+40; if ( height<80 ) height = 80; height += sv->cv_y+sv->button_height+8; GDrawResize(sv->gw,width,height); return; } if ( width!=sv->cv_width || height!=sv->cv_height ) { GDrawResize(sv->cv_srch.gw,width,height); GDrawResize(sv->cv_rpl.gw,width,height); sv->cv_width = width; sv->cv_height = height; sv->rpl_x = 30+width; GDrawMove(sv->cv_rpl.gw,sv->rpl_x,sv->cv_y); } GDrawSync(NULL); GDrawProcessPendingEvents(NULL); GDrawRequestExpose(sv->gw,NULL,false); }
static int AW2_OK(GGadget *g, GEvent *e) { if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { GWindow gw = GGadgetGetWindow(g); struct widthinfo *wi = GDrawGetUserData(gw); int err = false; int separation, min_side, max_side, height, loop; separation = GetInt8(gw,CID_Separation, _("Separation"),&err); min_side = GetInt8(gw,CID_MinSep, _("Min Bearing"),&err); max_side = GetInt8(gw,CID_MaxSep, _("Max Bearing"),&err); height = GetInt8(gw,CID_Height, _("Height"),&err); loop = GetInt8(gw,CID_Loop, _("Loop Count"),&err); if ( err ) return( true ); GDrawSetVisible(gw,false); GDrawSync(NULL); GDrawProcessPendingEvents(NULL); width_last_em_size = wi->sf->ascent + wi->sf->descent; width_separation = separation; wi->sf->width_separation=separation; if ( wi->sf->italicangle==0 ) width_min_side_bearing = min_side; width_max_side_bearing = max_side; width_chunk_height = height; width_loop_cnt = loop; AutoWidth2((FontViewBase *) wi->fv,separation,min_side,max_side, height, loop); wi->done = true; } return( true ); }
static void SVResize(SearchView *sv, GEvent *event) { int width, height; if ( !event->u.resize.sized ) return; GGadgetMove(GWidgetGetControl(sv->gw,CID_TopBox),4,4); GGadgetResize(GWidgetGetControl(sv->gw,CID_TopBox), event->u.resize.size.width-8, event->u.resize.size.height-12); width = (event->u.resize.size.width-40)/2; height = (event->u.resize.size.height-sv->cv_y-sv->button_height-8); if ( width<70 || height<80 ) { if ( width<70 ) width = 70; width = 2*width+40; if ( height<80 ) height = 80; height += sv->cv_y+sv->button_height+8; GDrawResize(sv->gw,width,height); return; } if ( width!=sv->cv_width || height!=sv->cv_height ) { GDrawResize(sv->cv_srch.gw,width,height); GDrawResize(sv->cv_rpl.gw,width,height); sv->cv_width = width; sv->cv_height = height; sv->rpl_x = 30+width; GDrawMove(sv->cv_rpl.gw,sv->rpl_x,sv->cv_y); } #if 0 GGadgetGetSize(GWidgetGetControl(sv->gw,CID_Allow),&size); yoff = event->u.resize.size.height-sv->button_height-size.y; if ( yoff!=0 ) { for ( i=CID_Allow; i<=CID_Cancel; ++i ) { GGadgetGetSize(GWidgetGetControl(sv->gw,i),&size); GGadgetMove(GWidgetGetControl(sv->gw,i),size.x,size.y+yoff); } } xoff = (event->u.resize.size.width - sv->button_width)/2; GGadgetGetSize(GWidgetGetControl(sv->gw,CID_Find),&size); xoff -= size.x; if ( xoff!=0 ) { for ( i=CID_Find; i<=CID_Cancel; ++i ) { GGadgetGetSize(GWidgetGetControl(sv->gw,i),&size); GGadgetMove(GWidgetGetControl(sv->gw,i),size.x+xoff,size.y); } } #endif GDrawSync(NULL); GDrawProcessPendingEvents(NULL); GDrawRequestExpose(sv->gw,NULL,false); }
void CPUpdateInfo(CharView *cv, GEvent *event) { if ( !cv->showcpinfo ) return; if ( !cv->p.pressed ) { if ( cv->ruler_w!=NULL && GDrawIsVisible(cv->ruler_w)) { GDrawDestroyWindow(cv->ruler_w); cv->ruler_w = NULL; } return; } if ( cv->ruler_w==NULL ) CPStartInfo(cv,event); else { CpInfoPlace(cv,event); GDrawSync(NULL); GDrawProcessPendingEvents(NULL); /* The resize needs to happen before the expose */ if ( !cv->p.pressed ) /* but a mouse up might sneak in... */ return; GDrawRequestExpose(cv->ruler_w,NULL,false); } }
void CVMouseMoveRuler(CharView *cv, GEvent *event) { if ( cv->autonomous_ruler_w ) return; if ( !cv->p.pressed && (event->u.mouse.state&ksm_alt) ) { if ( cv->ruler_w!=NULL && GDrawIsVisible(cv->ruler_w)) { GDrawDestroyWindow(cv->ruler_w); cv->ruler_w = NULL; } return; } if ( !cv->p.pressed ) CVMouseAtSpline(cv,event); RulerPlace(cv,event); if ( !cv->p.pressed ) GDrawSetVisible(cv->ruler_w,true); GDrawSync(NULL); GDrawProcessPendingEvents(NULL); /* The resize needs to happen before the expose */ if ( !cv->p.pressed && (event->u.mouse.state&ksm_alt) ) /* but a mouse up might sneak in... */ return; GDrawRequestExpose(cv->ruler_w,NULL,false); GDrawRequestExpose(cv->v,NULL,false); }
void ScriptDlg(FontView *fv,CharView *cv) { GRect pos; static GWindow gw; GWindowAttrs wattrs; GGadgetCreateData gcd[12], boxes[5], *barray[4][8], *hvarray[4][2]; #if !defined(_NO_FFSCRIPT) && !defined(_NO_PYTHON) GGadgetCreateData *rarray[4]; #endif GTextInfo label[12]; struct sd_data sd; FontView *list; int i,l; memset(&sd,0,sizeof(sd)); sd.fv = fv; sd.sc = cv==NULL ? NULL : cv->b.sc; sd.layer = cv==NULL ? ly_fore : CVLayer((CharViewBase *) cv); sd.oldh = pos.height = GDrawPointsToPixels(NULL,SD_Height); if ( gw==NULL ) { memset(&wattrs,0,sizeof(wattrs)); wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_restrict|wam_isdlg; wattrs.event_masks = ~(1<<et_charup); wattrs.restrict_input_to_me = 1; wattrs.undercursor = 1; wattrs.cursor = ct_pointer; wattrs.utf8_window_title = _("Execute Script"); wattrs.is_dlg = true; pos.x = pos.y = 0; pos.width = GDrawPointsToPixels(NULL,GGadgetScale(SD_Width)); gw = GDrawCreateTopWindow(NULL,&pos,sd_e_h,&sd,&wattrs); memset(&boxes,0,sizeof(boxes)); memset(&gcd,0,sizeof(gcd)); memset(&label,0,sizeof(label)); i = l = 0; gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = 10; gcd[i].gd.pos.width = SD_Width-20; gcd[i].gd.pos.height = SD_Height-54; gcd[i].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap; gcd[i].gd.cid = CID_Script; gcd[i++].creator = GTextAreaCreate; hvarray[l][0] = &gcd[i-1]; hvarray[l++][1] = NULL; #if !defined(_NO_FFSCRIPT) && !defined(_NO_PYTHON) gcd[i-1].gd.pos.height -= 24; gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+gcd[i-1].gd.pos.height+1; gcd[i].gd.flags = gg_visible | gg_enabled | gg_cb_on; gcd[i].gd.cid = CID_Python; label[i].text = (unichar_t *) _("_Python"); label[i].text_is_1byte = true; label[i].text_in_resource = true; gcd[i].gd.label = &label[i]; gcd[i].gd.handle_controlevent = SD_LangChanged; gcd[i++].creator = GRadioCreate; rarray[0] = &gcd[i-1]; gcd[i].gd.pos.x = 70; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y; gcd[i].gd.flags = gg_visible | gg_enabled; /* disabled if cv!=NULL later */ gcd[i].gd.cid = CID_FF; label[i].text = (unichar_t *) _("_FF"); label[i].text_is_1byte = true; label[i].text_in_resource = true; gcd[i].gd.label = &label[i]; gcd[i].gd.handle_controlevent = SD_LangChanged; gcd[i++].creator = GRadioCreate; rarray[1] = &gcd[i-1]; rarray[2] = GCD_Glue; rarray[3] = NULL; boxes[2].gd.flags = gg_enabled | gg_visible; boxes[2].gd.u.boxelements = rarray; boxes[2].creator = GHBoxCreate; hvarray[l][0] = &boxes[2]; hvarray[l++][1] = NULL; #endif barray[0][0] = barray[1][0] = barray[0][6] = barray[1][6] = GCD_Glue; barray[0][2] = barray[1][2] = barray[0][4] = barray[1][4] = GCD_Glue; barray[0][1] = barray[0][5] = GCD_RowSpan; barray[0][7] = barray[1][7] = barray[2][0] = NULL; gcd[i].gd.pos.x = 25-3; gcd[i].gd.pos.y = SD_Height-32-3; gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; label[i].text = (unichar_t *) _("_OK"); label[i].text_is_1byte = true; label[i].text_in_resource = true; gcd[i].gd.mnemonic = 'O'; gcd[i].gd.label = &label[i]; gcd[i].gd.handle_controlevent = SD_OK; gcd[i].gd.cid = CID_OK; gcd[i++].creator = GButtonCreate; barray[1][1] = &gcd[i-1]; gcd[i].gd.pos.x = -25; gcd[i].gd.pos.y = SD_Height-32; gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; label[i].text = (unichar_t *) _("_Cancel"); label[i].text_is_1byte = true; label[i].text_in_resource = true; gcd[i].gd.label = &label[i]; gcd[i].gd.mnemonic = 'C'; gcd[i].gd.handle_controlevent = SD_Cancel; gcd[i].gd.cid = CID_Cancel; gcd[i++].creator = GButtonCreate; barray[1][5] = &gcd[i-1]; gcd[i].gd.pos.x = (SD_Width-GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor))/2; gcd[i].gd.pos.y = SD_Height-40; gcd[i].gd.flags = gg_visible | gg_enabled; label[i].text = (unichar_t *) _("C_all..."); label[i].text_is_1byte = true; label[i].text_in_resource = true; gcd[i].gd.label = &label[i]; gcd[i].gd.mnemonic = 'a'; gcd[i].gd.handle_controlevent = SD_Call; gcd[i].gd.cid = CID_Call; gcd[i++].creator = GButtonCreate; barray[0][3] = &gcd[i-1]; #if !defined(_NO_FFSCRIPT) gcd[i].gd.pos.width = gcd[i].gd.pos.height = 5; gcd[i].gd.flags = gg_visible | gg_enabled; gcd[i++].creator = GSpacerCreate; barray[1][3] = &gcd[i-1]; #else barray[1][3] = GCD_RowSpan; #endif barray[3][0] = NULL; boxes[3].gd.flags = gg_enabled | gg_visible; boxes[3].gd.u.boxelements = barray[0]; boxes[3].creator = GHVBoxCreate; hvarray[l][0] = &boxes[3]; hvarray[l++][1] = NULL; hvarray[l][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 = hvarray[0]; boxes[0].creator = GHVGroupCreate; GGadgetsCreate(gw,boxes); if ( boxes[2].ret!=NULL ) GHVBoxSetExpandableCol(boxes[2].ret,gb_expandglue); GHVBoxSetExpandableCol(boxes[3].ret,gb_expandgluesame); GHVBoxSetExpandableRow(boxes[0].ret,0); GHVBoxFitWindow(boxes[0].ret); } #if !defined(_NO_FFSCRIPT) && !defined(_NO_PYTHON) GGadgetSetEnabled(GWidgetGetControl(gw,CID_FF),cv==NULL); #endif sd.gw = gw; GDrawSetUserData(gw,&sd); GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_Script)); #if !defined(_NO_FFSCRIPT) && !defined(_NO_PYTHON) _SD_LangChanged(&sd); #endif GDrawSetVisible(gw,true); while ( !sd.done ) GDrawProcessOneEvent(NULL); GDrawSetVisible(gw,false); /* Selection may be out of date, force a refresh */ for ( list = fv_list; list!=NULL; list=(FontView *) list->b.next ) GDrawRequestExpose(list->v,NULL,false); GDrawSync(NULL); GDrawProcessPendingEvents(NULL); GDrawSetUserData(gw,NULL); }
unichar_t *FVOpenFont(char *title, const char *defaultfile, int mult) { GRect pos; int i, filter, renamei; GWindow gw; GWindowAttrs wattrs; GGadgetCreateData gcd[11], boxes[5], *varray[9], *harray1[7], *harray2[4], *harray3[9]; GTextInfo label[10]; struct gfc_data d; int bs = GIntGetResource(_NUM_Buttonsize), bsbigger, totwid, spacing; GGadget *tf; unichar_t *temp; char **nlnames; GTextInfo *namelistnames, **filts; int cnt; memset(&d,'\0',sizeof(d)); 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.is_dlg = true; wattrs.undercursor = 1; wattrs.cursor = ct_pointer; wattrs.utf8_window_title = title; pos.x = pos.y = 0; totwid = GGadgetScale(295); bsbigger = 4*bs+4*14>totwid; totwid = bsbigger?4*bs+4*12:totwid; spacing = (totwid-4*bs-2*12)/3; pos.width = GDrawPointsToPixels(NULL,totwid); pos.height = GDrawPointsToPixels(NULL,247); gw = GDrawCreateTopWindow(NULL,&pos,e_h,&d,&wattrs); memset(&label,0,sizeof(label)); memset(&gcd,0,sizeof(gcd)); memset(&boxes,0,sizeof(boxes)); i=0; gcd[i].gd.pos.x = 12; gcd[i].gd.pos.y = 6; gcd[i].gd.pos.width = totwid*100/GIntGetResource(_NUM_ScaleFactor)-24; gcd[i].gd.pos.height = 180; gcd[i].gd.flags = gg_visible | gg_enabled; if ( RecentFiles[0]!=NULL ) gcd[i].gd.flags = gg_visible | gg_enabled | gg_file_pulldown; if ( mult ) gcd[i].gd.flags |= gg_file_multiple; varray[0] = &gcd[i]; varray[1] = NULL; gcd[i++].creator = GFileChooserCreate; label[i].text = (unichar_t *) _("Filter:"); label[i].text_is_1byte = true; gcd[i].gd.label = &label[i]; gcd[i].gd.pos.x = 8; gcd[i].gd.pos.y = 188+6; gcd[i].gd.flags = gg_visible | gg_enabled | gg_utf8_popup; gcd[i].gd.popup_msg = (unichar_t *) _("Display files of this type" ); harray1[0] = GCD_Glue; harray1[1] = &gcd[i]; gcd[i++].creator = GLabelCreate; gcd[i].gd.pos.x = 0; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y-6; gcd[i].gd.flags = gg_visible | gg_enabled | gg_utf8_popup; gcd[i].gd.popup_msg = (unichar_t *) _("Display files of this type"); gcd[i].gd.handle_controlevent = GFD_FilterSelected; harray1[2] = &gcd[i]; harray1[3] = GCD_Glue; harray1[4] = GCD_Glue; harray1[5] = GCD_Glue; harray1[6] = NULL; gcd[i++].creator = GListButtonCreate; boxes[2].gd.flags = gg_visible | gg_enabled; boxes[2].gd.u.boxelements = harray1; boxes[2].creator = GHBoxCreate; varray[2] = &boxes[2]; varray[3] = NULL; label[i].text = (unichar_t *) _("Force glyph names to:"); label[i].text_is_1byte = true; gcd[i].gd.label = &label[i]; gcd[i].gd.pos.x = 8; gcd[i].gd.pos.y = 188+6; gcd[i].gd.flags = gg_visible | gg_enabled | gg_utf8_popup; gcd[i].gd.popup_msg = (unichar_t *) _("In the saved font, force all glyph names to match those in the specified namelist"); harray2[0] = &gcd[i]; gcd[i++].creator = GLabelCreate; renamei = i; gcd[i].gd.pos.x = 0; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y-6; gcd[i].gd.flags = gg_visible | gg_enabled | gg_utf8_popup; gcd[i].gd.popup_msg = (unichar_t *) _("In the saved font, force all glyph names to match those in the specified namelist"); gcd[i].creator = GListButtonCreate; nlnames = AllNamelistNames(); for ( cnt=0; nlnames[cnt]!=NULL; ++cnt); namelistnames = calloc(cnt+3,sizeof(GTextInfo)); namelistnames[0].text = (unichar_t *) _("No Rename"); namelistnames[0].text_is_1byte = true; if ( force_names_when_opening==NULL ) { namelistnames[0].selected = true; gcd[i].gd.label = &namelistnames[0]; } namelistnames[1].line = true; for ( cnt=0; nlnames[cnt]!=NULL; ++cnt) { namelistnames[cnt+2].text = (unichar_t *) nlnames[cnt]; namelistnames[cnt+2].text_is_1byte = true; if ( force_names_when_opening!=NULL && strcmp(_(force_names_when_opening->title),nlnames[cnt])==0 ) { namelistnames[cnt+2].selected = true; gcd[i].gd.label = &namelistnames[cnt+2]; } } harray2[1] = &gcd[i]; harray2[2] = GCD_Glue; harray2[3] = NULL; gcd[i++].gd.u.list = namelistnames; boxes[3].gd.flags = gg_visible | gg_enabled; boxes[3].gd.u.boxelements = harray2; boxes[3].creator = GHBoxCreate; varray[4] = &boxes[3]; varray[5] = NULL; gcd[i].gd.pos.x = 12; gcd[i].gd.pos.y = 216-3; gcd[i].gd.pos.width = -1; gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; label[i].text = (unichar_t *) _("_OK"); label[i].text_is_1byte = true; label[i].text_in_resource = true; gcd[i].gd.mnemonic = 'O'; gcd[i].gd.label = &label[i]; gcd[i].gd.handle_controlevent = GFD_Ok; harray3[0] = GCD_Glue; harray3[1] = &gcd[i]; gcd[i++].creator = GButtonCreate; gcd[i].gd.pos.x = -(spacing+bs)*100/GIntGetResource(_NUM_ScaleFactor)-12; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3; gcd[i].gd.pos.width = -1; gcd[i].gd.flags = gg_visible | gg_enabled; label[i].text = (unichar_t *) S_("Font|_New"); label[i].text_is_1byte = true; label[i].text_in_resource = true; gcd[i].gd.mnemonic = 'N'; gcd[i].gd.label = &label[i]; gcd[i].gd.handle_controlevent = GFD_New; harray3[2] = GCD_Glue; harray3[3] = &gcd[i]; gcd[i++].creator = GButtonCreate; filter = i; gcd[i].gd.pos.x = (spacing+bs)*100/GIntGetResource(_NUM_ScaleFactor)+12; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y; gcd[i].gd.pos.width = -1; gcd[i].gd.flags = /* gg_visible |*/ gg_enabled; label[i].text = (unichar_t *) _("_Filter"); label[i].text_is_1byte = true; label[i].text_in_resource = true; gcd[i].gd.mnemonic = 'F'; gcd[i].gd.label = &label[i]; gcd[i].gd.handle_controlevent = GFileChooserFilterEh; harray3[4] = &gcd[i]; gcd[i++].creator = GButtonCreate; gcd[i].gd.pos.x = -12; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y; gcd[i].gd.pos.width = -1; gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; label[i].text = (unichar_t *) _("_Cancel"); label[i].text_is_1byte = true; label[i].text_in_resource = true; gcd[i].gd.label = &label[i]; gcd[i].gd.mnemonic = 'C'; gcd[i].gd.handle_controlevent = GFD_Cancel; harray3[5] = GCD_Glue; harray3[6] = &gcd[i]; harray3[7] = GCD_Glue; harray3[8] = NULL; gcd[i++].creator = GButtonCreate; boxes[4].gd.flags = gg_visible | gg_enabled; boxes[4].gd.u.boxelements = harray3; boxes[4].creator = GHBoxCreate; varray[6] = &boxes[4]; varray[7] = NULL; varray[8] = NULL; boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2; boxes[0].gd.flags = gg_visible | gg_enabled; boxes[0].gd.u.boxelements = varray; boxes[0].creator = GHVGroupCreate; gcd[i].gd.pos.x = 2; gcd[i].gd.pos.y = 2; gcd[i].gd.pos.width = pos.width-4; gcd[i].gd.pos.height = pos.height-4; gcd[i].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; gcd[i++].creator = GGroupCreate; GGadgetsCreate(gw,boxes); d.gfc = gcd[0].ret; d.rename = gcd[renamei].ret; filts = StandardFilters(); GGadgetSetList(harray1[2]->ret,filts,true); GHVBoxSetExpandableRow(boxes[0].ret,0); GHVBoxSetExpandableCol(boxes[2].ret,gb_expandglue); GHVBoxSetExpandableCol(boxes[3].ret,gb_expandglue); GHVBoxSetExpandableCol(boxes[4].ret,gb_expandgluesame); GHVBoxFitWindow(boxes[0].ret); free(namelistnames); GGadgetSetUserData(gcd[filter].ret,gcd[0].ret); GFileChooserConnectButtons(gcd[0].ret,harray3[1]->ret,gcd[filter].ret); temp = utf82u_copy(filts[default_font_filter_index]->userdata); GFileChooserSetFilterText(gcd[0].ret,temp); free(temp); GFileChooserGetChildren(gcd[0].ret,NULL, NULL, &tf); if ( RecentFiles[0]!=NULL ) { GGadgetSetList(tf,GTextInfoFromChars(RecentFiles,RECENT_MAX),false); } GGadgetSetTitle8(gcd[0].ret,defaultfile); GWidgetHidePalettes(); GDrawSetVisible(gw,true); while ( !d.done ) GDrawProcessOneEvent(NULL); GDrawDestroyWindow(gw); GDrawProcessPendingEvents(NULL); /* Give the window a chance to vanish... */ GDrawSync(NULL); GDrawProcessPendingEvents(NULL); /* Give the window a chance to vanish... */ free( d.lastpopupfontname ); GTextInfoArrayFree(filts); for ( cnt=0; nlnames[cnt]!=NULL; ++cnt) { free(nlnames[cnt]); } free(nlnames); return(d.ret); }
static uint32_t * GWidgetOpenFileWPath (const uint32_t *title, const uint32_t *defaultfile, const uint32_t *initial_filter, char **mimetypes, GFileChooserFilterType filter, char **path) { GRect pos; GWindow gw; GWindowAttrs wattrs; GGadgetCreateData gcd[7], boxes[3], *varray[5], *harray[8]; GTextInfo label[4]; struct gfc_data d; int bs = GIntGetResource (_NUM_Buttonsize), bsbigger, totwid; GProgressPauseTimer (); memset (&wattrs, 0, sizeof (wattrs)); wattrs.mask = wam_events | wam_cursor | wam_wtitle | wam_undercursor | wam_restrict | wam_isdlg; wattrs.event_masks = ~(1 << et_charup); wattrs.restrict_input_to_me = 1; wattrs.undercursor = 1; wattrs.is_dlg = 1; wattrs.cursor = ct_pointer; wattrs.window_title = (uint32_t *) title; pos.x = pos.y = 0; totwid = GGadgetScale (223); bsbigger = 3 * bs + 4 * 14 > totwid; totwid = bsbigger ? 3 * bs + 4 * 12 : totwid; pos.width = GDrawPointsToPixels (NULL, totwid); pos.height = GDrawPointsToPixels (NULL, 223); gw = GDrawCreateTopWindow (NULL, &pos, e_h, &d, &wattrs); memset (&label, 0, sizeof (label)); memset (&gcd, 0, sizeof (gcd)); memset (&boxes, 0, sizeof (boxes)); gcd[0].gd.pos.x = 12; gcd[0].gd.pos.y = 6; gcd[0].gd.pos.width = 223 - 24; gcd[0].gd.pos.height = 180; gcd[0].gd.flags = gg_visible | gg_enabled; gcd[0].creator = GFileChooserCreate; varray[0] = &gcd[0]; varray[1] = NULL; gcd[1].gd.pos.x = 12; gcd[1].gd.pos.y = 192 - 3; gcd[1].gd.pos.width = -1; gcd[1].gd.flags = gg_visible | gg_enabled | gg_but_default; label[1].text = (uint32_t *) _("_OK"); label[1].text_is_1byte = true; label[1].text_has_mnemonic = true; gcd[1].gd.label = &label[1]; gcd[1].gd.handle_controlevent = GFD_Ok; gcd[1].creator = GButtonCreate; harray[0] = GCD_Glue; harray[1] = &gcd[1]; gcd[2].gd.pos.x = (totwid - bs) * 100 / GIntGetResource (_NUM_ScaleFactor) / 2; gcd[2].gd.pos.y = gcd[1].gd.pos.y + 3; gcd[2].gd.pos.width = -1; gcd[2].gd.flags = gg_visible | gg_enabled; label[2].text = (uint32_t *) _("_Filter"); label[2].text_is_1byte = true; label[2].text_has_mnemonic = true; gcd[2].gd.label = &label[2]; gcd[2].gd.handle_controlevent = GFileChooserFilterEh; gcd[2].creator = GButtonCreate; harray[2] = GCD_Glue; harray[3] = &gcd[2]; gcd[3].gd.pos.x = -gcd[1].gd.pos.x; gcd[3].gd.pos.y = gcd[2].gd.pos.y; gcd[3].gd.pos.width = -1; gcd[3].gd.flags = gg_visible | gg_enabled | gg_but_cancel; label[3].text = (uint32_t *) _("_Cancel"); label[3].text_is_1byte = true; label[3].text_has_mnemonic = true; gcd[3].gd.label = &label[3]; gcd[3].gd.handle_controlevent = GFD_Cancel; gcd[3].creator = GButtonCreate; harray[4] = GCD_Glue; harray[5] = &gcd[3]; harray[6] = GCD_Glue; harray[7] = NULL; boxes[2].gd.flags = gg_visible | gg_enabled; boxes[2].gd.u.boxelements = harray; boxes[2].creator = GHBoxCreate; varray[2] = &boxes[2]; varray[3] = NULL; varray[4] = NULL; boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2; boxes[0].gd.flags = gg_visible | gg_enabled; boxes[0].gd.u.boxelements = varray; boxes[0].creator = GHVGroupCreate; gcd[4].gd.pos.x = 2; gcd[4].gd.pos.y = 2; gcd[4].gd.pos.width = pos.width - 4; gcd[4].gd.pos.height = pos.height - 4; gcd[4].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; gcd[4].creator = GGroupCreate; GGadgetsCreate (gw, boxes); GGadgetSetUserData (gcd[2].ret, gcd[0].ret); GHVBoxSetExpandableRow (boxes[0].ret, 0); GHVBoxSetExpandableCol (boxes[2].ret, gb_expandgluesame); GHVBoxFitWindow (boxes[0].ret); GFileChooserConnectButtons (gcd[0].ret, gcd[1].ret, gcd[2].ret); GFileChooserSetFilterText (gcd[0].ret, initial_filter); GFileChooserSetFilterFunc (gcd[0].ret, filter); GFileChooserSetMimetypes (gcd[0].ret, mimetypes); GFileChooserSetPaths (gcd[0].ret, path); GGadgetSetTitle (gcd[0].ret, defaultfile); memset (&d, '\0', sizeof (d)); d.gfc = gcd[0].ret; GDrawSetVisible (gw, true); while (!d.done) GDrawProcessOneEvent (NULL); GDrawDestroyWindow (gw); GDrawProcessPendingEvents (NULL); /* Give the window a chance to vanish... */ GDrawSync (NULL); GDrawProcessPendingEvents (NULL); /* Give the window a chance to vanish... */ GProgressResumeTimer (); return (d.ret); }
static int _GWidget_TopLevel_eh(GWindow gw, GEvent *event) { GTopLevelD *td; int ret; if ( !GDrawNativeWindowExists(NULL,event->native_window) ) return( true ); td = (GTopLevelD *) (gw->widget_data); if ( td==NULL ) /* Dying */ return( true ); GGadgetPopupExternalEvent(event); if ( event->type==et_focus ) { if ( event->u.focus.gained_focus ) { if ( gw->is_toplevel && !gw->is_popup && !gw->is_dying ) { if ( last_input_window!=gw ) previous_focus_window = last_input_window; current_focus_window = gw; } } else if ( current_focus_window==gw ) { current_focus_window = NULL; } if ( !td->ispalette && gw->is_visible && event->u.focus.gained_focus && !gw->is_dying ) { GWindow dlg = GDrawGetRedirectWindow(NULL); if ( dlg==NULL || dlg==gw ) { /* If top level window loses the focus all its palettes go invisible */ /* if it gains focus then all palettes that are supposed to be vis */ /* become visible */ /* But not if we've got an active dialog */ GTopLevelD *palette; if ( last_paletted_focus_window!=NULL && !last_paletted_focus_window->is_dying ) { GTopLevelD *lpfw_td = (GTopLevelD *) (last_paletted_focus_window->widget_data); for ( palette=lpfw_td->palettes; palette!=NULL; palette = palette->nextp ) { if ( !palette->w->is_visible && palette->w->visible_request ) { GDrawSetVisible(palette->w,false); palette->w->visible_request = true; } } } for ( palette=td->palettes; palette!=NULL; palette = palette->nextp ) { if ( !palette->w->is_visible && palette->w->visible_request ) GDrawSetVisible(palette->w,true); } last_paletted_focus_window = gw; } } if ( !gw->is_dying && td->gfocus!=NULL && td->gfocus->funcs->handle_focus!=NULL ) { { oldtd = td; oldgfocus = td->gfocus; } /* Debug!!!! */ (td->gfocus->funcs->handle_focus)(td->gfocus,event); } else if ( !gw->is_dying && td->wfocus!=NULL ) { if ( td->wfocus->widget_data!=NULL ) { if ( td->wfocus->widget_data->e_h!=NULL ) (td->wfocus->widget_data->e_h)(td->wfocus,event); } else if ( td->wfocus->eh!=NULL ) (td->wfocus->eh)(td->wfocus,event); } if ( !gw->is_dying && td->e_h!=NULL ) (td->e_h)(gw,event); return( true ); } else if ( !gw->is_dying && event->type == et_crossing ) { GiveToAll((GContainerD *) td,event); return( true ); } else if ( event->type == et_char || event->type == et_charup ) { return( _GWidget_TopLevel_Key(gw,gw,event)); } else if ( !gw->is_dying && event->type == et_resize ) { GRect r; if ( td->gmenubar!=NULL ) { GGadgetGetSize(td->gmenubar,&r); GGadgetResize(td->gmenubar,event->u.resize.size.width,r.height); GGadgetRedraw(td->gmenubar); } /* status line, toolbar, etc. */ if ( td->palettes!=NULL && event->u.resize.moved ) { GTopLevelD *palette; for ( palette=td->palettes; palette!=NULL; palette = palette->nextp ) { if ( !broken_palettes || !palette->positioned_yet ) { int x = gw->pos.x + palette->owner_off_x, y = gw->pos.y + palette->owner_off_y; if ( x<0 ) x=0; if ( y<0 ) y=0; if ( x+palette->w->pos.width>GDrawGetRoot(NULL)->pos.width ) x = GDrawGetRoot(NULL)->pos.width-palette->w->pos.width; if ( y+palette->w->pos.height>GDrawGetRoot(NULL)->pos.height ) y = GDrawGetRoot(NULL)->pos.height-palette->w->pos.height; ++palette->programmove; if ( gw->is_visible ) GDrawTrueMove(palette->w, x, y); else GDrawMove(palette->w, x, y); palette->positioned_yet = true; } } } if ( td->ispalette ) { if ( td->programmove>0 ) --td->programmove; else { td->owner_off_x = gw->pos.x - td->owner->w->pos.x; td->owner_off_y = gw->pos.y - td->owner->w->pos.y; } } } else if ( event->type == et_close && td->ispalette ) { GDrawSetVisible(gw,false); return( true ); } else if ( !gw->is_dying && event->type == et_visibility ) { if ( broken_palettes ) /* Do Nothing */; else if ( td->ispalette && event->u.visibility.state!=vs_unobscured ) { if ( !GDrawIsAbove(gw,td->owner->w)) GDrawRaiseAbove(gw,td->owner->w); } } else if ( !gw->is_dying && event->type == et_map && !td->ispalette ) { /* If top level window goes invisible all its palettes follow */ /* if it goes visible then all palettes that are supposed to be vis */ /* follow */ ManagePalettesVis(td, event->u.map.is_visible ); } if ( event->type == et_destroy ) { if ( td->palettes!=NULL ) { struct gtopleveldata *palettes, *next; for ( palettes=td->palettes; palettes!=NULL; palettes = next ) { next = palettes->nextp; GDrawDestroyWindow(palettes->w); } /* Palettes must die before our widget data are freed */ GDrawSync(GDrawGetDisplayOfWindow(gw)); GDrawProcessPendingEvents(GDrawGetDisplayOfWindow(gw)); } } ret = _GWidget_Container_eh(gw,event); if ( event->type == et_destroy ) { if ( gw==current_focus_window ) current_focus_window = NULL; if ( gw==previous_focus_window ) previous_focus_window = NULL; if ( gw==last_input_window ) last_input_window = NULL; if ( gw==last_paletted_focus_window ) last_paletted_focus_window = NULL; ret = true; } return( ret ); }
static void allow_events(void) { GDrawSync(NULL); tinysleep(100); GDrawProcessPendingEvents(NULL); }
int fontforge_main( int argc, char **argv ) { extern const char *source_modtime_str; extern const char *source_version_str; const char *load_prefs = getenv("FONTFORGE_LOADPREFS"); int i; int recover=2; int any; int next_recent=0; GRect pos; GWindowAttrs wattrs; char *display = NULL; FontRequest rq; int ds, ld; int openflags=0; int doopen=0, quit_request=0; bool use_cairo = true; #if !(GLIB_CHECK_VERSION(2, 35, 0)) g_type_init(); #endif /* Must be done before we cache the current directory */ /* Change to HOME dir if specified on the commandline */ for ( i=1; i<argc; ++i ) { char *pt = argv[i]; if ( pt[0]=='-' && pt[1]=='-' ) ++pt; if (strcmp(pt,"-home")==0 || strncmp(pt,"-psn_",5)==0) { /* OK, I don't know what _-psn_ means, but to GW it means */ /* we've been started on the mac from the FontForge.app */ /* structure, and the current directory is (shudder) "/" */ if (getenv("HOME")!=NULL) chdir(getenv("HOME")); break; /* Done - Unnecessary to check more arguments */ } if (strcmp(pt,"-quiet")==0) quiet = 1; } if (!quiet) { fprintf( stderr, "Copyright (c) 2000-2014 by George Williams. See AUTHORS for Contributors.\n" ); fprintf( stderr, " License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n" ); fprintf( stderr, " with many parts BSD <http://fontforge.org/license.html>. Please read LICENSE.\n" ); fprintf( stderr, " Based on sources from %s" "-ML" #ifdef FREETYPE_HAS_DEBUGGER "-TtfDb" #endif #ifdef _NO_PYTHON "-NoPython" #endif #ifdef FONTFORGE_CONFIG_USE_DOUBLE "-D" #endif ".\n", FONTFORGE_MODTIME_STR ); fprintf( stderr, " Based on source from git with hash: %s\n", FONTFORGE_GIT_VERSION ); } #if defined(__Mac) /* Start X if they haven't already done so. Well... try anyway */ /* Must be before we change DYLD_LIBRARY_PATH or X won't start */ /* (osascript depends on a libjpeg which isn't found if we look in /sw/lib first */ int local_x = uses_local_x(argc,argv); if ( local_x==1 && getenv("DISPLAY")==NULL ) { /* Don't start X if we're just going to quit. */ /* if X exists, it isn't needed. If X doesn't exist it's wrong */ if ( !hasquit(argc,argv)) { /* This sequence is supposed to bring up an app without a window */ /* but X still opens an xterm */ system( "osascript -e 'tell application \"X11\" to launch'" ); system( "osascript -e 'tell application \"X11\" to activate'" ); } setenv("DISPLAY",":0.0",0); } else if ( local_x==1 && *getenv("DISPLAY")!='/' && strcmp(getenv("DISPLAY"),":0.0")!=0 && strcmp(getenv("DISPLAY"),":0")!=0 ) /* 10.5.7 uses a named socket or something "/tmp/launch-01ftWX:0" */ local_x = 0; #endif #if defined(__MINGW32__) if( getenv("DISPLAY")==NULL ) { putenv("DISPLAY=127.0.0.1:0.0"); } if( getenv("LC_ALL")==NULL ){ char lang[8]; char env[32]; if( GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, lang, 8) > 0 ){ strcpy(env, "LC_ALL="); strcat(env, lang); putenv(env); } } #endif FF_SetUiInterface(&gdraw_ui_interface); FF_SetPrefsInterface(&gdraw_prefs_interface); FF_SetSCInterface(&gdraw_sc_interface); FF_SetCVInterface(&gdraw_cv_interface); FF_SetBCInterface(&gdraw_bc_interface); FF_SetFVInterface(&gdraw_fv_interface); FF_SetFIInterface(&gdraw_fi_interface); FF_SetMVInterface(&gdraw_mv_interface); FF_SetClipInterface(&gdraw_clip_interface); #ifndef _NO_PYTHON PythonUI_Init(); #endif FindProgDir(argv[0]); InitSimpleStuff(); #if defined(__MINGW32__) { char path[MAX_PATH]; unsigned int len = GetModuleFileNameA(NULL, path, MAX_PATH); path[len] = '\0'; //The '.exe' must be removed as resources presumes it's not there. GResourceSetProg(GFileRemoveExtension(GFileNormalizePath(path))); } #else GResourceSetProg(argv[0]); #endif #if defined(__Mac) /* The mac seems to default to the "C" locale, LANG and LC_MESSAGES are not*/ /* defined. This means that gettext will not bother to look up any message*/ /* files -- even if we have a "C" or "POSIX" entry in the locale diretory */ /* Now if X11 gives us the command key, I want to force a rebinding to use */ /* Cmd rather than Control key -- more mac-like. But I can't do that if */ /* there is no locale. So I force a locale if there is none specified */ /* I force the US English locale, because that's the what the messages are */ /* by default so I'm changing as little as I can. I think. */ /* Now the locale command will treat a LANG which is "" as undefined, but */ /* gettext will not. So I don't bother to check for null strings or "C" */ /* or "POSIX". If they've mucked with the locale perhaps they know what */ /* they are doing */ { int did_keybindings = 0; int useCommandKey = get_mac_x11_prop("enable_key_equivalents") <= 0; if ( local_x && useCommandKey ) { hotkeySystemSetCanUseMacCommand( 1 ); /* Ok, we get the command key */ if ( getenv("LANG")==NULL && getenv("LC_MESSAGES")==NULL ) { setenv("LC_MESSAGES","en_US.UTF-8",0); } /* Can we find a set of keybindings designed for the mac with cmd key? */ bind_textdomain_codeset("Mac-FontForge-MenuShortCuts","UTF-8"); bindtextdomain("Mac-FontForge-MenuShortCuts", getLocaleDir()); if ( *dgettext("Mac-FontForge-MenuShortCuts","Flag0x10+")!='F' ) { GMenuSetShortcutDomain("Mac-FontForge-MenuShortCuts"); did_keybindings = 1; } } if ( !did_keybindings ) { /* Nope. we can't. Fall back to the normal stuff */ #endif GMenuSetShortcutDomain("FontForge-MenuShortCuts"); bind_textdomain_codeset("FontForge-MenuShortCuts","UTF-8"); bindtextdomain("FontForge-MenuShortCuts", getLocaleDir()); #if defined(__Mac) } } #endif bind_textdomain_codeset("FontForge","UTF-8"); bindtextdomain("FontForge", getLocaleDir()); textdomain("FontForge"); GResourceUseGetText(); { char shareDir[PATH_MAX]; char* sd = getShareDir(); strncpy( shareDir, sd, PATH_MAX ); shareDir[PATH_MAX-1] = '\0'; if(!sd) { strcpy( shareDir, SHAREDIR ); } char path[PATH_MAX]; snprintf(path, PATH_MAX, "%s%s", shareDir, "/pixmaps" ); GGadgetSetImageDir( path ); snprintf(path, PATH_MAX, "%s%s", shareDir, "/resources/fontforge.resource" ); GResourceAddResourceFile(path, GResourceProgramName,false); } hotkeysLoad(); // loadPrefsFiles(); Prefs_LoadDefaultPreferences(); if ( load_prefs!=NULL && strcasecmp(load_prefs,"Always")==0 ) LoadPrefs(); if ( default_encoding==NULL ) default_encoding=FindOrMakeEncoding("ISO8859-1"); if ( default_encoding==NULL ) default_encoding=&custom; /* In case iconv is broken */ // This no longer starts embedded Python unless control passes to the Python executors, // which exit independently rather than returning here. CheckIsScript(argc,argv); /* Will run the script and exit if it is a script */ /* If there is no UI, there is always a script */ /* and we will never return from the above */ if ( load_prefs==NULL || (strcasecmp(load_prefs,"Always")!=0 && /* Already loaded */ strcasecmp(load_prefs,"Never")!=0 )) LoadPrefs(); GrokNavigationMask(); for ( i=1; i<argc; ++i ) { char *pt = argv[i]; if ( pt[0]=='-' && pt[1]=='-' ) ++pt; if ( strcmp(pt,"-sync")==0 ) GResourceAddResourceString("Gdraw.Synchronize: true",argv[0]); else if ( strcmp(pt,"-depth")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.Depth", argv[++i]); else if ( strcmp(pt,"-vc")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.VisualClass", argv[++i]); else if ( (strcmp(pt,"-cmap")==0 || strcmp(pt,"-colormap")==0) && i<argc-1 ) AddR(argv[0],"Gdraw.Colormap", argv[++i]); else if ( (strcmp(pt,"-dontopenxdevices")==0) ) AddR(argv[0],"Gdraw.DontOpenXDevices", "true"); else if ( strcmp(pt,"-keyboard")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.Keyboard", argv[++i]); else if ( strcmp(pt,"-display")==0 && i<argc-1 ) display = argv[++i]; # if MyMemory else if ( strcmp(pt,"-memory")==0 ) __malloc_debug(5); # endif else if ( strncmp(pt,"-usecairo",strlen("-usecairo"))==0 ) { if ( strcmp(pt,"-usecairo=no")==0 ) use_cairo = false; else use_cairo = true; GDrawEnableCairo(use_cairo); } else if ( strcmp(pt,"-nosplash")==0 ) splash = 0; else if ( strcmp(pt,"-quiet")==0 ) /* already checked for this earlier, no need to do it again */; else if ( strcmp(pt,"-unique")==0 ) unique = 1; else if ( strcmp(pt,"-forceuihidden")==0 ) cmdlinearg_forceUIHidden = 0; else if ( strcmp(pt,"-recover")==0 && i<argc-1 ) { ++i; if ( strcmp(argv[i],"none")==0 ) recover=0; else if ( strcmp(argv[i],"clean")==0 ) recover= -1; else if ( strcmp(argv[i],"auto")==0 ) recover= 1; else if ( strcmp(argv[i],"inquire")==0 ) recover= 2; else { fprintf( stderr, "Invalid argument to -recover, must be none, auto, inquire or clean\n" ); dousage(); } } else if ( strcmp(pt,"-recover=none")==0 ) { recover = 0; } else if ( strcmp(pt,"-recover=clean")==0 ) { recover = -1; } else if ( strcmp(pt,"-recover=auto")==0 ) { recover = 1; } else if ( strcmp(pt,"-recover=inquire")==0 ) { recover = 2; } else if ( strcmp(pt,"-docs")==0 ) dohelp(); else if ( strcmp(pt,"-help")==0 ) dousage(); else if ( strcmp(pt,"-version")==0 || strcmp(pt,"-v")==0 || strcmp(pt,"-V")==0 ) doversion(FONTFORGE_MODTIME_STR); else if ( strcmp(pt,"-quit")==0 ) quit_request = true; else if ( strcmp(pt,"-home")==0 ) /* already did a chdir earlier, don't need to do it again */; #if defined(__Mac) else if ( strncmp(pt,"-psn_",5)==0 ) { /* OK, I don't know what _-psn_ means, but to GW it means */ /* we've been started on the mac from the FontForge.app */ /* structure, and the current directory was (shudder) "/" */ /* (however, we changed to HOME earlier in main routine). */ unique = 1; listen_to_apple_events = true; // This has been problematic on Mavericks and later. } #endif } ensureDotFontForgeIsSetup(); #if defined(__MINGW32__) && !defined(_NO_LIBCAIRO) //Load any custom fonts for the user interface if (use_cairo) { char *system_load = getGResourceProgramDir(); char *user_load = getFontForgeUserDir(Data); char lbuf[MAX_PATH]; int lret; if (system_load != NULL) { //Follow the FontConfig APPSHAREFONTDIR location lret = snprintf(lbuf, MAX_PATH, "%s/../share/fonts", system_load); if (lret > 0 && lret < MAX_PATH) { WinLoadUserFonts(lbuf); } } if (user_load != NULL) { lret = snprintf(lbuf, MAX_PATH, "%s/%s", user_load, "ui-fonts"); if (lret > 0 && lret < MAX_PATH) { WinLoadUserFonts(lbuf); } free(user_load); } } #endif InitImageCache(); // This is in gtextinfo.c. It zeroes imagecache for us. atexit(&ClearImageCache); // We register the destructor, which is also in gtextinfo.c. GDrawCreateDisplays(display,argv[0]); atexit(&GDrawDestroyDisplays); // We register the destructor so that it runs even if we call exit without finishing this function. default_background = GDrawGetDefaultBackground(screen_display); InitToolIconClut(default_background); InitToolIcons(); InitCursors(); /** * we have to do a quick sniff of argv[] here to see if the user * wanted to skip loading these python init files. */ for ( i=1; i<argc; ++i ) { char *pt = argv[i]; if ( !strcmp(pt,"-SkipPythonInitFiles")) { ProcessPythonInitFiles = 0; } } #ifndef _NO_PYTHON /*# ifndef GWW_TEST*/ FontForge_InitializeEmbeddedPython(); /* !!!!!! debug (valgrind doesn't like python) */ /*# endif*/ #endif #ifndef _NO_PYTHON if( ProcessPythonInitFiles ) PyFF_ProcessInitFiles(); #endif /* the splash screen used not to have a title bar (wam_nodecor) */ /* but I found I needed to know how much the window manager moved */ /* the window around, which I can determine if I have a positioned */ /* decorated window created at the begining */ /* Actually I don't care any more */ wattrs.mask = wam_events|wam_cursor|wam_bordwidth|wam_backcol|wam_positioned|wam_utf8_wtitle|wam_isdlg; wattrs.event_masks = ~(1<<et_charup); wattrs.positioned = 1; wattrs.cursor = ct_pointer; wattrs.utf8_window_title = "FontForge"; wattrs.border_width = 2; wattrs.background_color = 0xffffff; wattrs.is_dlg = !listen_to_apple_events; pos.x = pos.y = 200; pos.width = splashimage.u.image->width; pos.height = splashimage.u.image->height-56; /* 54 */ GDrawBindSelection(NULL,sn_user1,"FontForge"); if ( unique && GDrawSelectionOwned(NULL,sn_user1)) { /* Different event handler, not a dialog */ wattrs.is_dlg = false; splashw = GDrawCreateTopWindow(NULL,&pos,request_e_h,NULL,&wattrs); PingOtherFontForge(argc,argv); } else { if ( quit_request ) exit( 0 ); splashw = GDrawCreateTopWindow(NULL,&pos,splash_e_h,NULL,&wattrs); } memset(&rq,0,sizeof(rq)); rq.utf8_family_name = SERIF_UI_FAMILIES; rq.point_size = 12; rq.weight = 400; splash_font = GDrawInstanciateFont(NULL,&rq); splash_font = GResourceFindFont("Splash.Font",splash_font); GDrawDecomposeFont(splash_font, &rq); rq.style = fs_italic; splash_italic = GDrawInstanciateFont(NULL,&rq); splash_italic = GResourceFindFont("Splash.ItalicFont",splash_italic); GDrawSetFont(splashw,splash_font); SplashLayout(); localsplash = splash; if ( localsplash && !listen_to_apple_events ) start_splash_screen(); // // The below call will initialize the fontconfig cache if required. // That can take a while the first time it happens. // GDrawWindowFontMetrics(splashw,splash_font,&as,&ds,&ld); fh = as+ds+ld; if ( AutoSaveFrequency>0 ) autosave_timer=GDrawRequestTimer(splashw,2*AutoSaveFrequency*1000,AutoSaveFrequency*1000,NULL); GDrawProcessPendingEvents(NULL); GDrawSetBuildCharHooks(BuildCharHook,InsCharHook); any = 0; if ( recover==-1 ) CleanAutoRecovery(); else if ( recover ) any = DoAutoRecoveryExtended( recover-1 ); openflags = 0; for ( i=1; i<argc; ++i ) { char buffer[1025]; char *pt = argv[i]; GDrawProcessPendingEvents(NULL); if ( pt[0]=='-' && pt[1]=='-' && pt[2]!='\0') ++pt; if ( strcmp(pt,"-new")==0 ) { FontNew(); any = 1; # if HANYANG } else if ( strcmp(pt,"-newkorean")==0 ) { MenuNewComposition(NULL,NULL,NULL); any = 1; # endif } else if ( !strcmp(pt,"-SkipPythonInitFiles")) { // already handled above. } else if ( strcmp(pt,"-last")==0 ) { if ( next_recent<RECENT_MAX && RecentFiles[next_recent]!=NULL ) if ( ViewPostScriptFont(RecentFiles[next_recent++],openflags)) any = 1; } else if ( strcmp(pt,"-sync")==0 || strcmp(pt,"-memory")==0 || strcmp(pt,"-nosplash")==0 || strcmp(pt,"-recover=none")==0 || strcmp(pt,"-recover=clean")==0 || strcmp(pt,"-recover=auto")==0 || strcmp(pt,"-dontopenxdevices")==0 || strcmp(pt,"-unique")==0 || strncmp(pt,"-usecairo",strlen("-usecairo"))==0 || strcmp(pt,"-home")==0 || strcmp(pt,"-quiet")==0 || strcmp(pt,"-forceuihidden")==0 ) /* Already done, needed to be before display opened */; else if ( strncmp(pt,"-psn_",5)==0 ) /* Already done */; else if ( (strcmp(pt,"-depth")==0 || strcmp(pt,"-vc")==0 || strcmp(pt,"-cmap")==0 || strcmp(pt,"-colormap")==0 || strcmp(pt,"-keyboard")==0 || strcmp(pt,"-display")==0 || strcmp(pt,"-recover")==0 ) && i<argc-1 ) ++i; /* Already done, needed to be before display opened */ else if ( strcmp(pt,"-allglyphs")==0 ) openflags |= of_all_glyphs_in_ttc; else if ( strcmp(pt,"-open")==0 ) doopen = true; else { printf("else argv[i]:%s\n", argv[i] ); if ( strstr(argv[i],"://")!=NULL ) { /* Assume an absolute URL */ strncpy(buffer,argv[i],sizeof(buffer)); buffer[sizeof(buffer)-1]= '\0'; } else GFileGetAbsoluteName(argv[i],buffer,sizeof(buffer)); if ( GFileIsDir(buffer) || (strstr(buffer,"://")!=NULL && buffer[strlen(buffer)-1]=='/')) { char *fname; fname = malloc(strlen(buffer)+strlen("/glyphs/contents.plist")+1); strcpy(fname,buffer); strcat(fname,"/glyphs/contents.plist"); if ( GFileExists(fname)) { /* It's probably a Unified Font Object directory */ free(fname); if ( ViewPostScriptFont(buffer,openflags) ) any = 1; } else { strcpy(fname,buffer); strcat(fname,"/font.props"); if ( GFileExists(fname)) { /* It's probably a sf dir collection */ free(fname); if ( ViewPostScriptFont(buffer,openflags) ) any = 1; } else { free(fname); if ( buffer[strlen(buffer)-1]!='/' ) { /* If dirname doesn't end in "/" we'll be looking in parent dir */ buffer[strlen(buffer)+1]='\0'; buffer[strlen(buffer)] = '/'; } fname = GetPostScriptFontName(buffer,false); if ( fname!=NULL ) ViewPostScriptFont(fname,openflags); any = 1; /* Even if we didn't get a font, don't bring up dlg again */ free(fname); } } } else if ( ViewPostScriptFont(buffer,openflags)!=0 ) any = 1; } } if ( !any && !doopen ) any = ReopenLastFonts(); collabclient_ensureClientBeacon(); collabclient_sniffForLocalServer(); #ifndef _NO_PYTHON PythonUI_namedpipe_Init(); #endif #if defined(__Mac) if ( listen_to_apple_events ) { install_apple_event_handlers(); install_mac_timer(); setup_cocoa_app(); // WARNING: See declaration of RunApplicationEventLoop() above as to // why you might not want to call that function anymore. // RunApplicationEventLoop(); } else #endif if ( doopen || !any ) _FVMenuOpen(NULL); GDrawEventLoop(NULL); GDrawDestroyDisplays(); #ifndef _NO_PYTHON /*# ifndef GWW_TEST*/ FontForge_FinalizeEmbeddedPython(); /* !!!!!! debug (valgrind doesn't like python) */ /*# endif*/ #endif // These free menu translations, mostly. BitmapViewFinishNonStatic(); MetricsViewFinishNonStatic(); CharViewFinishNonStatic(); FontViewFinishNonStatic(); ClearImageCache(); // This frees the contents of imagecache. hotkeysSave(); LastFonts_Save(); #ifndef _NO_LIBUNICODENAMES uninm_names_db_close(names_db); /* close this database before exiting */ uninm_blocks_db_close(blocks_db); #endif lt_dlexit(); return( 0 ); }
static pascal void DoRealStuff(EventLoopTimerRef timer,void *ignored_data) { GDrawProcessPendingEvents(NULL); MacServiceReadFDs(); }
int fontforge_main( int argc, char **argv ) { extern const char *source_modtime_str; extern const char *source_version_str; const char *load_prefs = getenv("FONTFORGE_LOADPREFS"); int i; int recover=2; int any; int next_recent=0; GRect pos; GWindowAttrs wattrs; char *display = NULL; FontRequest rq; int ds, ld; int openflags=0; int doopen=0, quit_request=0; #if defined(__Mac) int local_x; #endif fprintf( stderr, "Copyright (c) 2000-2012 by George Williams.\n Executable based on sources from %s" "-ML" #ifdef FREETYPE_HAS_DEBUGGER "-TtfDb" #endif #ifdef _NO_PYTHON "-NoPython" #endif #ifdef FONTFORGE_CONFIG_USE_DOUBLE "-D" #endif ".\n", source_modtime_str ); fprintf( stderr, " Library based on sources from %s.\n", library_version_configuration.library_source_modtime_string ); /* Must be done before we cache the current directory */ /* Change to HOME dir if specified on the commandline */ for ( i=1; i<argc; ++i ) { char *pt = argv[i]; if ( pt[0]=='-' && pt[1]=='-' ) ++pt; #ifndef __Mac if (strcmp(pt,"-home")==0) { #else if (strcmp(pt,"-home")==0 || strncmp(pt,"-psn_",5)==0) { /* OK, I don't know what _-psn_ means, but to GW it means */ /* we've been started on the mac from the FontForge.app */ /* structure, and the current directory is (shudder) "/" */ #endif if (getenv("HOME")!=NULL) chdir(getenv("HOME")); break; /* Done - Unnecessary to check more arguments */ } } #if defined(__Mac) /* Start X if they haven't already done so. Well... try anyway */ /* Must be before we change DYLD_LIBRARY_PATH or X won't start */ /* (osascript depends on a libjpeg which isn't found if we look in /sw/lib first */ local_x = uses_local_x(argc,argv); if ( local_x==1 && getenv("DISPLAY")==NULL ) { /* Don't start X if we're just going to quit. */ /* if X exists, it isn't needed. If X doesn't exist it's wrong */ if ( !hasquit(argc,argv)) { #if 1 /* This sequence is supposed to bring up an app without a window */ /* but X still opens an xterm */ system( "osascript -e 'tell application \"X11\" to launch'" ); system( "osascript -e 'tell application \"X11\" to activate'" ); #else system( "open /Applications/Utilities/X11.app/" ); #endif } setenv("DISPLAY",":0.0",0); } else if ( local_x==1 && *getenv("DISPLAY")!='/' && strcmp(getenv("DISPLAY"),":0.0")!=0 && strcmp(getenv("DISPLAY"),":0")!=0 ) /* 10.5.7 uses a named socket or something "/tmp/launch-01ftWX:0" */ local_x = 0; #endif #if defined(__MINGW32__) if( getenv("DISPLAY")==NULL ) { putenv("DISPLAY=127.0.0.1:0.0"); } if( getenv("LC_ALL")==NULL ){ char lang[8]; char env[32]; if( GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, lang, 8) > 0 ){ strcpy(env, "LC_ALL="); strcat(env, lang); putenv(env); } } #endif FF_SetUiInterface(&gdraw_ui_interface); FF_SetPrefsInterface(&gdraw_prefs_interface); FF_SetSCInterface(&gdraw_sc_interface); FF_SetCVInterface(&gdraw_cv_interface); FF_SetBCInterface(&gdraw_bc_interface); FF_SetFVInterface(&gdraw_fv_interface); FF_SetFIInterface(&gdraw_fi_interface); FF_SetMVInterface(&gdraw_mv_interface); FF_SetClipInterface(&gdraw_clip_interface); #ifndef _NO_PYTHON PythonUI_Init(); #endif InitSimpleStuff(); FindProgDir(argv[0]); #if defined(__MINGW32__) { char path[MAX_PATH+4]; char *c = path; unsigned int len = GetModuleFileNameA(NULL, path, MAX_PATH); path[len] = '\0'; for(; *c; *c++) /* backslash to slash */ if(*c == '\\') *c = '/'; GResourceSetProg(path); } #else GResourceSetProg(argv[0]); #endif #if defined(__Mac) /* The mac seems to default to the "C" locale, LANG and LC_MESSAGES are not*/ /* defined. This means that gettext will not bother to look up any message*/ /* files -- even if we have a "C" or "POSIX" entry in the locale diretory */ /* Now if X11 gives us the command key, I want to force a rebinding to use */ /* Cmd rather than Control key -- more mac-like. But I can't do that if */ /* there is no locale. So I force a locale if there is none specified */ /* I force the US English locale, because that's the what the messages are */ /* by default so I'm changing as little as I can. I think. */ /* Now the locale command will treat a LANG which is "" as undefined, but */ /* gettext will not. So I don't bother to check for null strings or "C" */ /* or "POSIX". If they've mucked with the locale perhaps they know what */ /* they are doing */ { int did_keybindings = 0; if ( local_x && !get_mac_x11_prop("enable_key_equivalents") ) { /* Ok, we get the command key */ if ( getenv("LANG")==NULL && getenv("LC_MESSAGES")==NULL ) { setenv("LC_MESSAGES","en_US.UTF-8",0); } /* Can we find a set of keybindings designed for the mac with cmd key? */ bind_textdomain_codeset("Mac-FontForge-MenuShortCuts","UTF-8"); bindtextdomain("Mac-FontForge-MenuShortCuts", getLocaleDir()); if ( *dgettext("Mac-FontForge-MenuShortCuts","Flag0x10+")!='F' ) { GMenuSetShortcutDomain("Mac-FontForge-MenuShortCuts"); did_keybindings = 1; } } if ( !did_keybindings ) { /* Nope. we can't. Fall back to the normal stuff */ #endif GMenuSetShortcutDomain("FontForge-MenuShortCuts"); bind_textdomain_codeset("FontForge-MenuShortCuts","UTF-8"); bindtextdomain("FontForge-MenuShortCuts", getLocaleDir()); #if defined(__Mac) }} #endif bind_textdomain_codeset("FontForge","UTF-8"); bindtextdomain("FontForge", getLocaleDir()); textdomain("FontForge"); GResourceUseGetText(); #if defined(__MINGW32__) { size_t len = strlen(GResourceProgramDir); char* path = galloc(len + 64); strcpy(path, GResourceProgramDir); strcpy(path+len, "/share/fontforge/pixmaps"); /* PixmapDir */ GGadgetSetImageDir(path); strcpy(path+len, "/share/fontforge/resources/fontforge.resource"); /* Resource File */ GResourceAddResourceFile(path, GResourceProgramName, false); gfree(path); } #elif defined(SHAREDIR) GGadgetSetImageDir(SHAREDIR "/pixmaps"); GResourceAddResourceFile(SHAREDIR "/resources/fontforge.resource",GResourceProgramName,false); #endif hotkeysLoad(); if ( load_prefs!=NULL && strcasecmp(load_prefs,"Always")==0 ) LoadPrefs(); if ( default_encoding==NULL ) default_encoding=FindOrMakeEncoding("ISO8859-1"); if ( default_encoding==NULL ) default_encoding=&custom; /* In case iconv is broken */ CheckIsScript(argc,argv); /* Will run the script and exit if it is a script */ /* If there is no UI, there is always a script */ /* and we will never return from the above */ if ( load_prefs==NULL || (strcasecmp(load_prefs,"Always")!=0 && /* Already loaded */ strcasecmp(load_prefs,"Never")!=0 )) LoadPrefs(); GrokNavigationMask(); for ( i=1; i<argc; ++i ) { char *pt = argv[i]; if ( pt[0]=='-' && pt[1]=='-' ) ++pt; if ( strcmp(pt,"-sync")==0 ) GResourceAddResourceString("Gdraw.Synchronize: true",argv[0]); else if ( strcmp(pt,"-depth")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.Depth", argv[++i]); else if ( strcmp(pt,"-vc")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.VisualClass", argv[++i]); else if ( (strcmp(pt,"-cmap")==0 || strcmp(pt,"-colormap")==0) && i<argc-1 ) AddR(argv[0],"Gdraw.Colormap", argv[++i]); else if ( (strcmp(pt,"-dontopenxdevices")==0) ) AddR(argv[0],"Gdraw.DontOpenXDevices", "true"); else if ( strcmp(pt,"-keyboard")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.Keyboard", argv[++i]); else if ( strcmp(pt,"-display")==0 && i<argc-1 ) display = argv[++i]; # if MyMemory else if ( strcmp(pt,"-memory")==0 ) __malloc_debug(5); # endif else if ( strncmp(pt,"-usecairo",strlen("-usecairo"))==0 ) { if ( strcmp(pt,"-usecairo=no")==0 ) GDrawEnableCairo(false); else GDrawEnableCairo(true); } else if ( strcmp(pt,"-nosplash")==0 ) splash = 0; else if ( strcmp(pt,"-unique")==0 ) unique = 1; else if ( strcmp(pt,"-recover")==0 && i<argc-1 ) { ++i; if ( strcmp(argv[i],"none")==0 ) recover=0; else if ( strcmp(argv[i],"clean")==0 ) recover= -1; else if ( strcmp(argv[i],"auto")==0 ) recover= 1; else if ( strcmp(argv[i],"inquire")==0 ) recover= 2; else { fprintf( stderr, "Invalid argument to -recover, must be none, auto, inquire or clean\n" ); dousage(); } } else if ( strcmp(pt,"-recover=none")==0 ) { recover = 0; } else if ( strcmp(pt,"-recover=clean")==0 ) { recover = -1; } else if ( strcmp(pt,"-recover=auto")==0 ) { recover = 1; } else if ( strcmp(pt,"-recover=inquire")==0 ) { recover = 2; } else if ( strcmp(pt,"-docs")==0 ) dohelp(); else if ( strcmp(pt,"-help")==0 ) dousage(); else if ( strcmp(pt,"-version")==0 ) doversion(source_version_str); else if ( strcmp(pt,"-quit")==0 ) quit_request = true; else if ( strcmp(pt,"-home")==0 ) /* already did a chdir earlier, don't need to do it again */; #if defined(__Mac) else if ( strncmp(pt,"-psn_",5)==0 ) { /* OK, I don't know what _-psn_ means, but to GW it means */ /* we've been started on the mac from the FontForge.app */ /* structure, and the current directory was (shudder) "/" */ /* (however, we changed to HOME earlier in main routine). */ unique = 1; listen_to_apple_events = true; } #endif } ensureDotFontForgeIsSetup(); GDrawCreateDisplays(display,argv[0]); default_background = GDrawGetDefaultBackground(screen_display); InitToolIconClut(default_background); InitToolIcons(); InitCursors(); #ifndef _NO_PYTHON PyFF_ProcessInitFiles(); #endif /* Wait until the UI has started, otherwise people who don't have consoles*/ /* open won't get our error messages, and it's an important one */ /* Scripting doesn't care about a mismatch, because scripting interpretation */ /* all lives in the library */ check_library_version(&exe_library_version_configuration,true,false); /* the splash screen used not to have a title bar (wam_nodecor) */ /* but I found I needed to know how much the window manager moved */ /* the window around, which I can determine if I have a positioned */ /* decorated window created at the begining */ /* Actually I don't care any more */ wattrs.mask = wam_events|wam_cursor|wam_bordwidth|wam_backcol|wam_positioned|wam_utf8_wtitle|wam_isdlg; wattrs.event_masks = ~(1<<et_charup); wattrs.positioned = 1; wattrs.cursor = ct_pointer; wattrs.utf8_window_title = "FontForge"; wattrs.border_width = 2; wattrs.background_color = 0xffffff; wattrs.is_dlg = !listen_to_apple_events; pos.x = pos.y = 200; pos.width = splashimage.u.image->width; pos.height = splashimage.u.image->height-56; /* 54 */ GDrawBindSelection(NULL,sn_user1,"FontForge"); if ( unique && GDrawSelectionOwned(NULL,sn_user1)) { /* Different event handler, not a dialog */ wattrs.is_dlg = false; splashw = GDrawCreateTopWindow(NULL,&pos,request_e_h,NULL,&wattrs); PingOtherFontForge(argc,argv); } else { if ( quit_request ) exit( 0 ); splashw = GDrawCreateTopWindow(NULL,&pos,splash_e_h,NULL,&wattrs); } memset(&rq,0,sizeof(rq)); rq.utf8_family_name = SERIF_UI_FAMILIES; rq.point_size = 12; rq.weight = 400; splash_font = GDrawInstanciateFont(NULL,&rq); splash_font = GResourceFindFont("Splash.Font",splash_font); GDrawDecomposeFont(splash_font, &rq); rq.style = fs_italic; splash_italic = GDrawInstanciateFont(NULL,&rq); splash_italic = GResourceFindFont("Splash.ItalicFont",splash_italic); GDrawSetFont(splashw,splash_font); GDrawWindowFontMetrics(splashw,splash_font,&as,&ds,&ld); fh = as+ds+ld; SplashLayout(); localsplash = splash; if ( localsplash && !listen_to_apple_events ) start_splash_screen(); if ( AutoSaveFrequency>0 ) autosave_timer=GDrawRequestTimer(splashw,2*AutoSaveFrequency*1000,AutoSaveFrequency*1000,NULL); GDrawProcessPendingEvents(NULL); GDrawSetBuildCharHooks(BuildCharHook,InsCharHook); any = 0; if ( recover==-1 ) CleanAutoRecovery(); else if ( recover ) any = DoAutoRecovery(recover-1); openflags = 0; for ( i=1; i<argc; ++i ) { char buffer[1025]; char *pt = argv[i]; GDrawProcessPendingEvents(NULL); if ( pt[0]=='-' && pt[1]=='-' ) ++pt; if ( strcmp(pt,"-new")==0 ) { FontNew(); any = 1; # if HANYANG } else if ( strcmp(pt,"-newkorean")==0 ) { MenuNewComposition(NULL,NULL,NULL); any = 1; # endif } else if ( strcmp(pt,"-last")==0 ) { if ( next_recent<RECENT_MAX && RecentFiles[next_recent]!=NULL ) if ( ViewPostScriptFont(RecentFiles[next_recent++],openflags)) any = 1; } else if ( strcmp(pt,"-sync")==0 || strcmp(pt,"-memory")==0 || strcmp(pt,"-nosplash")==0 || strcmp(pt,"-recover=none")==0 || strcmp(pt,"-recover=clean")==0 || strcmp(pt,"-recover=auto")==0 || strcmp(pt,"-dontopenxdevices")==0 || strcmp(pt,"-unique")==0 || strncmp(pt,"-usecairo",strlen("-usecairo"))==0 || strcmp(pt,"-home")==0 ) /* Already done, needed to be before display opened */; else if ( strncmp(pt,"-psn_",5)==0 ) /* Already done */; else if ( (strcmp(pt,"-depth")==0 || strcmp(pt,"-vc")==0 || strcmp(pt,"-cmap")==0 || strcmp(pt,"-colormap")==0 || strcmp(pt,"-keyboard")==0 || strcmp(pt,"-display")==0 || strcmp(pt,"-recover")==0 ) && i<argc-1 ) ++i; /* Already done, needed to be before display opened */ else if ( strcmp(pt,"-allglyphs")==0 ) openflags |= of_all_glyphs_in_ttc; else if ( strcmp(pt,"-open")==0 ) doopen = true; else { if ( strstr(argv[i],"://")!=NULL ) { /* Assume an absolute URL */ strncpy(buffer,argv[i],sizeof(buffer)); buffer[sizeof(buffer)-1]= '\0'; } else GFileGetAbsoluteName(argv[i],buffer,sizeof(buffer)); if ( GFileIsDir(buffer) || (strstr(buffer,"://")!=NULL && buffer[strlen(buffer)-1]=='/')) { char *fname; fname = galloc(strlen(buffer)+strlen("/glyphs/contents.plist")+1); strcpy(fname,buffer); strcat(fname,"/glyphs/contents.plist"); if ( GFileExists(fname)) { /* It's probably a Unified Font Object directory */ free(fname); if ( ViewPostScriptFont(buffer,openflags) ) any = 1; } else { strcpy(fname,buffer); strcat(fname,"/font.props"); if ( GFileExists(fname)) { /* It's probably a sf dir collection */ free(fname); if ( ViewPostScriptFont(buffer,openflags) ) any = 1; } else { free(fname); if ( buffer[strlen(buffer)-1]!='/' ) { /* If dirname doesn't end in "/" we'll be looking in parent dir */ buffer[strlen(buffer)+1]='\0'; buffer[strlen(buffer)] = '/'; } fname = GetPostScriptFontName(buffer,false); if ( fname!=NULL ) ViewPostScriptFont(fname,openflags); any = 1; /* Even if we didn't get a font, don't bring up dlg again */ free(fname); } } } else if ( ViewPostScriptFont(buffer,openflags)!=0 ) any = 1; } } if ( !any && !doopen ) any = ReopenLastFonts(); #if defined(__Mac) if ( listen_to_apple_events ) { install_apple_event_handlers(); install_mac_timer(); RunApplicationEventLoop(); } else #endif if ( doopen || !any ) MenuOpen(NULL,NULL,NULL); GDrawEventLoop(NULL); hotkeysSave(); uninm_names_db_close(names_db); lt_dlexit(); return( 0 ); }
static int Delta_OK(GGadget *g, GEvent *e) { if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { QGData *qg = GDrawGetUserData(GGadgetGetWindow(g)); int err=false; int dpi, depth; double within; char *sizes; within = GetReal8(qg->gw,CID_Within,_("Proximity"),&err); dpi = GetInt8(qg->gw,CID_DPI,_("DPI"),&err); if ( err ) return(true); if ( within<=0 || within>=.5 ) { ff_post_error(_("Bad Number"),_("The \"Proximity\" field must be more than 0 and less than a half.")); return( true ); } if ( dpi<10 || dpi>5000 ) { ff_post_error(_("Unreasonable DPI"),_("The \"DPI\" field must be more than 10 and less than 5000.")); return( true ); } depth = GGadgetIsChecked(GWidgetGetControl(qg->gw,CID_BW)) ? 1 : 8; sizes = GGadgetGetTitle8(GWidgetGetControl(qg->gw,CID_Sizes)); GGadgetSetVisible(GWidgetGetControl(qg->gw,CID_Msg),true); GGadgetSetVisible(GWidgetGetControl(qg->gw,CID_Ok),false); GGadgetSetVisible(GWidgetGetControl(qg->gw,CID_Cancel),false); GDrawSetCursor(qg->gw,ct_watch); GDrawProcessPendingEvents(NULL); qg->within = within; qg->dpi = dpi; qg->pixelsizes = sizes; qg->depth = depth; TopFindQuestionablePoints(qg); GGadgetSetVisible(GWidgetGetControl(qg->gw,CID_Msg),false); GGadgetSetVisible(GWidgetGetControl(qg->gw,CID_Ok),true); GGadgetSetVisible(GWidgetGetControl(qg->gw,CID_Cancel),true); GDrawSetCursor(qg->gw,ct_pointer); GDrawProcessPendingEvents(NULL); if ( qg->error!=qg_ok ) { switch ( qg->error ) { case qg_notnumber: ff_post_error(_("Bad Number"),_("An entry in the \"Sizes\" field is not a number.")); break; case qg_badnumber: ff_post_error(_("Bad Number"),_("An entry in the \"Sizes\" field is unreasonable.")); break; case qg_badrange: ff_post_error(_("Bad Number"),_("An range in the \"Sizes\" field is incorrectly ordered.")); break; case qg_nofont: ff_post_error(_("FreeType unavailable"),_("FreeType unavailable.")); break; default: IError(_("Unexpected error")); break; } free(sizes); qg->cur = 0; return( true ); } free(delta_sizes); delta_within = within; delta_dpi = dpi; delta_depth = depth; delta_sizes = sizes; if ( qg->cur==0 ) { ff_post_error(_("Nothing found"),_("Nothng found.")); qg->done = true; return( true ); } if ( qg->cur >= qg->max ) qg->qg = realloc(qg->qg,(qg->max += 1) * sizeof(QuestionableGrid)); memset(qg->qg+qg->cur,0,sizeof(QuestionableGrid)); GDrawSetVisible(qg->gw,false); StartDeltaDisplay(qg); qg->done = true; } return( true ); }