Index: cam.c =================================================================== --- cam.c (revision 24100) +++ cam.c (revision 24101) @@ -57,7 +57,7 @@ char *argv[128]; /* [0] and [1] are for --cam; the rest point into args */ int argc; - char *old_base; + void *old_vars; gds_t tmp; } cam_ctx_t; @@ -65,23 +65,22 @@ static void cam_init_inst(cam_ctx_t *ctx) { memset(ctx, 0, sizeof(cam_ctx_t)); - ctx->old_base = pcb_cam_base; + ctx->old_vars = pcb_cam_init_vars(); + if (PCB->Filename != NULL) { - char *end = strrchr(PCB->Filename, PCB_DIR_SEPARATOR_C); + char *val, *end = strrchr(PCB->Filename, PCB_DIR_SEPARATOR_C); if (end != NULL) - pcb_cam_base = pcb_strdup(end+1); + val = pcb_strdup(end+1); else - pcb_cam_base = pcb_strdup(PCB->Filename); + val = pcb_strdup(PCB->Filename); + pcb_cam_set_var(pcb_strdup("base"), val); } - else - pcb_cam_base = NULL; } static void cam_uninit_inst(cam_ctx_t *ctx) { - free(pcb_cam_base); - pcb_cam_base = ctx->old_base; + pcb_cam_uninit_vars(ctx->old_vars); free(ctx->prefix); free(ctx->args); gds_uninit(&ctx->tmp); @@ -252,12 +251,7 @@ static int cam_parse_opt(cam_ctx_t *ctx, const char *opt) { - if (strncmp(opt, "base=", 5) == 0) { - free(pcb_cam_base); - pcb_cam_base = pcb_strdup(opt+5); - return 0; - } - else if (strncmp(opt, "outfile=", 8) == 0) { + if (strncmp(opt, "outfile=", 8) == 0) { char *fn, *tmp = pcb_strdup(opt+8); int dirlen = prefix_mkdir(tmp, &fn); @@ -270,11 +264,20 @@ } else ctx->prefix = NULL; - free(pcb_cam_base); - pcb_cam_base = pcb_strdup(fn); + pcb_cam_set_var(pcb_strdup("base"), pcb_strdup(fn)); free(tmp); return 0; } + else { + char *sep = strchr(opt, '='); + if (sep != NULL) { + char *key = pcb_strndup(opt, sep-opt); + char *val = pcb_strdup(sep+1); + pcb_cam_set_var(key, val); + return 0; + } + } + return 1; } Index: cam.conf =================================================================== --- cam.conf (revision 24100) +++ cam.conf (revision 24101) @@ -6,8 +6,8 @@ doc_png { desc export top and bottom copper and silk in 600 DPI pngs plugin png --dpi 600 - write top.png=top-copper,top-silk - write bottom.png=bottom-copper,bottom-silk + write %base%.top.png=top-copper,top-silk + write %base%.bottom.png=bottom-copper,bottom-silk } {gerber:eagle} { desc gerber export compatible with Eagle's gerber file names Index: cam_gui.c =================================================================== --- cam_gui.c (revision 24100) +++ cam_gui.c (revision 24101) @@ -91,6 +91,16 @@ pcb_dad_tree_update_hide(attr); } +static void cam_gui_export_cb(void *hid_ctx, void *caller_data, pcb_hid_attribute_t *attr_btn) +{ + cam_dlg_t *ctx = caller_data; + pcb_hid_attribute_t *attr = &ctx->dlg[ctx->wjobs]; + pcb_hid_row_t *row = pcb_dad_tree_get_selected(attr); + + if (row != NULL) + pcb_actionl("cam", "call", row->cell[0], NULL); +} + static void cam_job_select_cb(pcb_hid_attribute_t *attrib, void *hid_ctx, pcb_hid_row_t *row) { pcb_hid_tree_t *tree = (pcb_hid_tree_t *)attrib->enumerations; @@ -135,6 +145,7 @@ PCB_DAD_COMPFLAG(ctx->dlg, PCB_HATF_EXPFILL); PCB_DAD_END(ctx->dlg); PCB_DAD_BUTTON(ctx->dlg, "export!"); + PCB_DAD_CHANGE_CB(ctx->dlg, cam_gui_export_cb); PCB_DAD_END(ctx->dlg); PCB_DAD_END(ctx->dlg);