Index: trunk/src/libcschem/cnc_pen.c =================================================================== --- trunk/src/libcschem/cnc_pen.c (revision 2693) +++ trunk/src/libcschem/cnc_pen.c (revision 2694) @@ -38,9 +38,11 @@ #include "undo.h" #include "op_common.h" +static const csch_comm_str_t csch_pen_default_unknown_name = {""}; + csch_cpen_t csch_pen_default_unknown = { {{0}, 0, CSCH_CTYPE_PEN, 0}, - "\001", + csch_pen_default_unknown_name, /* tip */ CSCH_PSHP_ROUND, 1, {0xF0, 0xC0, 0x00, 0x00, 0xF0C00000, 0.95, 0.8, 0, 0, "#F0C000"}, @@ -73,20 +75,19 @@ pen = calloc(sizeof(csch_cpen_t), 1); csch_cobj_init(&pen->hdr, sheet, parent, oid, CSCH_CTYPE_PEN); - pen->name = (name == NULL ? NULL : rnd_strdup(name)); - if (pen->name != NULL) - htsp_set(&parent->name2pen, pen->name, pen); + pen->name = csch_comm_str(sheet, name, 1); + if (pen->name.str != NULL) + htsp_set(&parent->name2pen, (char *)pen->name.str, pen); return pen; } csch_cpen_t *csch_pen_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cpen_t *src) { - csch_cpen_t *dst = csch_pen_alloc(sheet, parent, src->name); + csch_cpen_t *dst = csch_pen_alloc(sheet, parent, src->name.str); dst->shape = src->shape; dst->size = src->size; dst->color = src->color; dst->dash = src->dash; - dst->name = src->name == NULL ? NULL : rnd_strdup(src->name); return dst; } @@ -96,9 +97,6 @@ { csch_comm_str_t *target; - if (pen->hdr.sheet != hdr->sheet) - return 0; /* unlikely: pen is from a different sheet, will not ever match */ - if (is_fill) target = &hdr->stroke_name; else @@ -107,7 +105,8 @@ if (target->str == NULL) return 0; - return (strcmp(target->str, pen->name) == 0); + /* it is safe to compare str pointers because they are from the same hash */ + return target->str == pen->name.str; } /* Remove cached ->pen pointers that depend on the given pen from all @@ -146,14 +145,14 @@ if (font && (csch_cb_pen_invalidate_font != NULL)) csch_cb_pen_invalidate_font(pen->hdr.sheet, pen); - if (remov && (pen->name != NULL)) { - htsp_popentry(&pen->hdr.parent->name2pen, pen->name); + if (remov && (pen->name.str != NULL)) { + htsp_popentry(&pen->hdr.parent->name2pen, pen->name.str); /* it's unlikely, but if another pen has the same name in the same group, we should fall back to that */ for(e = htip_first(&pen->hdr.parent->id2obj); e; e = htip_next(&pen->hdr.parent->id2obj, e)) { csch_cpen_t *p = e->value; - if ((p->hdr.type == CSCH_CTYPE_PEN) && (p != pen) && (p->name != NULL) && (strcmp(p->name, pen->name) == 0)) { - htsp_set(&pen->hdr.parent->name2pen, p->name, p); + if ((p->hdr.type == CSCH_CTYPE_PEN) && (p != pen) && (p->name.str != NULL) && (p->name.str == pen->name.str)) { + htsp_set(&pen->hdr.parent->name2pen, (char *)p->name.str, p); break; } } @@ -166,7 +165,6 @@ csch_pen_invalidate(pen, 1, 1, 1); csch_cobj_uninit(&pen->hdr); - free(pen->name); free(pen); } @@ -238,8 +236,8 @@ csch_cnc_common_remove_undo(slot, CSCH_REM_FROM_RTREE | CSCH_REM_FROM_PARENT | CSCH_REM_DEL_EMPTY_PARENT); - if (pen->name != NULL) - htsp_set(&pen->hdr.parent->name2pen, pen->name, pen); + if (pen->name.str != NULL) + htsp_set(&pen->hdr.parent->name2pen, (char *)pen->name.str, pen); } static int pen_isc_with_box(csch_chdr_t *obj, csch_rtree_box_t *box) @@ -261,7 +259,7 @@ csch_pen_shape_t shape; csch_coord_t size; rnd_color_t color; - char *name; + csch_comm_str_t name; unsigned short dash; csch_coord_t dash_period; } undo_pen_modify_tip_t; @@ -271,7 +269,7 @@ { undo_pen_modify_tip_t *u = udata; - if (u->name != u->pen->name) + if (u->name.str != u->pen->name.str) csch_pen_invalidate(u->pen, 1, 1, 1); else csch_pen_invalidate(u->pen, 0, 1, 0); /* font color may depend on re-render */ @@ -279,12 +277,12 @@ rnd_swap(csch_pen_shape_t, u->shape, u->pen->shape); rnd_swap(csch_coord_t, u->size, u->pen->size); rnd_swap(rnd_color_t, u->color, u->pen->color); - rnd_swap(char *, u->name, u->pen->name); + rnd_swap(csch_comm_str_t, u->name, u->pen->name); rnd_swap(unsigned short, u->dash, u->pen->dash); rnd_swap(csch_coord_t, u->dash_period, u->pen->dash_period); - if (u->name != u->pen->name) - htsp_set(&u->pen->hdr.parent->name2pen, u->pen->name, u->pen); + if (u->name.str != u->pen->name.str) + htsp_set(&u->pen->hdr.parent->name2pen, (char *)u->pen->name.str, u->pen); csch_sheet_set_changed(u->pen->hdr.sheet, 1); @@ -294,25 +292,17 @@ static void undo_pen_modify_tip_print(void *udata, char *dst, size_t dst_len) { undo_pen_modify_tip_t *u = udata; - if (u->pen->name != u->name) - rnd_snprintf(dst, dst_len, "pen name change: %s <--> %s", u->pen->name, u->name); + if (u->pen->name.str != u->name.str) + rnd_snprintf(dst, dst_len, "pen name change: %s <--> %s", u->pen->name.str, u->name.str); else - rnd_snprintf(dst, dst_len, "pen tip modification (in %s)", u->pen->name); + rnd_snprintf(dst, dst_len, "pen tip modification (in %s)", u->pen->name.str); } -static void undo_pen_modify_tip_free(void *udata) -{ - undo_pen_modify_tip_t *u = udata; - if (u->name != u->pen->name) - free(u->name); -} - - static const char core_cpen_cookie[] = "libcschem/core/cnc_pen.c"; static const uundo_oper_t undo_pen_modify_tip = { core_cpen_cookie, - undo_pen_modify_tip_free, + NULL, undo_pen_modify_tip_swap, undo_pen_modify_tip_swap, undo_pen_modify_tip_print @@ -329,13 +319,15 @@ u->shape = CSCH_UNDO_MODIFY(pen, shape); u->size = CSCH_UNDO_MODIFY(pen, size); u->color = CSCH_UNDO_MODIFY(pen, color); - u->name = CSCH_UNDO_MODIFY(pen, name); u->dash = CSCH_UNDO_MODIFY(pen, dash); u->dash_period = CSCH_UNDO_MODIFY(pen, dash_period); + if (name == NULL) + u->name = pen->name; + else + u->name = csch_comm_str(sheet, *name, 1); undo_pen_modify_tip_swap(u); if (undoable) csch_undo_inc_serial(sheet); - else undo_pen_modify_tip_free(u); } @@ -366,7 +358,7 @@ static void undo_pen_modify_font_print(void *udata, char *dst, size_t dst_len) { undo_pen_modify_font_t *u = udata; - rnd_snprintf(dst, dst_len, "pen font modification (in %s)", u->pen->name); + rnd_snprintf(dst, dst_len, "pen font modification (in %s)", u->pen->name.str); } static void undo_pen_modify_font_free(void *udata) Index: trunk/src/libcschem/cnc_pen.h =================================================================== --- trunk/src/libcschem/cnc_pen.h (revision 2693) +++ trunk/src/libcschem/cnc_pen.h (revision 2694) @@ -40,7 +40,7 @@ struct csch_cpen_s { csch_chdr_t hdr; - char *name; + csch_comm_str_t name; /* tip properties */ csch_pen_shape_t shape; Index: trunk/src/libcschem/util_grp.c =================================================================== --- trunk/src/libcschem/util_grp.c (revision 2693) +++ trunk/src/libcschem/util_grp.c (revision 2694) @@ -164,7 +164,7 @@ text->spec1.x = x1; text->spec1.y = y1; text->text = rnd_strdup_printf("%%../A.%s%%", key); - text->hdr.stroke_name = csch_comm_str(sheet, pen->name, 1); + text->hdr.stroke_name = csch_comm_str(sheet, pen->name.str, 1); text->hdr.floater = 1; text->dyntext = 1; csch_text_update(sheet, text, 1); Index: trunk/src/plugins/io_lihata/write.c =================================================================== --- trunk/src/plugins/io_lihata/write.c (revision 2693) +++ trunk/src/plugins/io_lihata/write.c (revision 2694) @@ -357,7 +357,7 @@ if (obj->type == CSCH_CTYPE_PEN) { TODO("may need to quote ID") csch_cpen_t *pen = (csch_cpen_t *)obj; - fprintf(ctx->f, "%s ha:pen.%s {", parind, pen->name); + fprintf(ctx->f, "%s ha:pen.%s {", parind, pen->name.str); r = lht_print_pen(ctx, indlev+1, parind, pen); return r; } Index: trunk/src/plugins/place/attrib.c =================================================================== --- trunk/src/plugins/place/attrib.c (revision 2693) +++ trunk/src/plugins/place/attrib.c (revision 2694) @@ -78,7 +78,7 @@ stroke = csch_pen_resolve(parent, penname); if (stroke == NULL) stroke = &csch_pen_default_unknown; - text->hdr.stroke_name = csch_comm_str(sheet, stroke->name, 1); + text->hdr.stroke_name = csch_comm_str(sheet, stroke->name.str, 1); csch_text_update(sheet, text, 1); Index: trunk/src/plugins/sch_dialogs/dlg_pen.c =================================================================== --- trunk/src/plugins/sch_dialogs/dlg_pen.c (revision 2693) +++ trunk/src/plugins/sch_dialogs/dlg_pen.c (revision 2694) @@ -125,7 +125,7 @@ static int pen_cmp(const void *p1_, const void *p2_) { const csch_cpen_t **p1 = (const csch_cpen_t **)p1_, **p2 = (const csch_cpen_t **)p2_; - return strcmp((*p1)->name, (*p2)->name); /* never returns 0 because these are coming from a hash table by name */ + return strcmp((*p1)->name.str, (*p2)->name.str); /* never returns 0 because these are coming from a hash table by name */ } static void pens2dlg_load_tree(pendlg_ctx_t *ctx, rnd_hid_attribute_t *attr) @@ -148,7 +148,7 @@ for(n = 0, pen = (const csch_cpen_t **)sorted.array; n < sorted.used; n++, pen++) { rnd_hid_row_t *row; - cell[0] = rnd_strdup((*pen)->name); + cell[0] = rnd_strdup((*pen)->name.str); cell[1] = rnd_strdup((*pen)->hdr.parent == ctx->grp ? "local" : "inherited"); row = rnd_dad_tree_append(attr, NULL, cell); row->user_data = (void *)(*pen); @@ -194,7 +194,7 @@ int enab; if (pen != NULL) { - RND_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wname, str, pen->name); + RND_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wname, str, pen->name.str); RND_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wsize, lng, pen->size); RND_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wshape, lng, pen->shape); RND_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wcolor, clr, pen->color); @@ -268,7 +268,7 @@ pen = (csch_cpen_t *)csch_op_create(ctx->sheet, ctx->grp, CSCH_CTYPE_PEN); if (pen != NULL) { pen_dlg_remap_redraw(ctx); - pen_dlg_select_by_name(ctx, pen->name); + pen_dlg_select_by_name(ctx, pen->name.str); } } @@ -331,7 +331,7 @@ pendlg_ctx_t *ctx = caller_data; csch_cpen_t *pen = get_dlg_pen(ctx); - if ((pen == NULL) || (strcmp(attr->val.str, pen->name) == 0)) + if ((pen == NULL) || (strcmp(attr->val.str, pen->name.str) == 0)) return; ctx->tip.pen = pen; @@ -455,8 +455,8 @@ for(h = csch_grpo_first(&it, ctx->sheet, grp); h != NULL; h = csch_grpo_next(&it)) { if (h->type == CSCH_CTYPE_PEN) { csch_cpen_t *pen = (csch_cpen_t *)h; - if (!htsp_has(&ctx->pens, pen->name)) - htsp_set(&ctx->pens, pen->name, pen); + if (!htsp_has(&ctx->pens, pen->name.str)) + htsp_set(&ctx->pens, (char *)pen->name.str, pen); } } @@ -589,11 +589,11 @@ pen2dlg(ctx, NULL); if (modal) { - char *pn = NULL; + const char *pn = NULL; if (RND_DAD_RUN(ctx->dlg)) { if (ctx->last_pen != NULL) - pn = ctx->last_pen->name; + pn = ctx->last_pen->name.str; } RND_DAD_FREE(ctx->dlg); Index: trunk/src/plugins/sch_dialogs/dlg_tree.c =================================================================== --- trunk/src/plugins/sch_dialogs/dlg_tree.c (revision 2693) +++ trunk/src/plugins/sch_dialogs/dlg_tree.c (revision 2694) @@ -212,6 +212,9 @@ if (name != NULL) gds_append_str(&tmp, name); + rnd_append_printf(&tmp, "\nxform: r=%.2f mx=%d my=%d", grp->xform.rot, grp->xform.mirx, grp->xform.miry); + + gds_append(&tmp, '\n'); text = tmp.array; } Index: trunk/src/plugins/std_tools/line_common.c =================================================================== --- trunk/src/plugins/std_tools/line_common.c (revision 2693) +++ trunk/src/plugins/std_tools/line_common.c (revision 2694) @@ -48,6 +48,7 @@ csch_tool_line_dir_t dir; unsigned dir_temp_inv:1; csch_cpen_t *stroke; + const char *stroke_name; /* statates */ csch_coord_t x1, y1, x2, y2; /* in cschem coords, not in screen coords */ @@ -204,12 +205,12 @@ line->spec.p1.x = x1; line->spec.p1.y = y1; line->spec.p2.x = x2; line->spec.p2.y = y2; - line->hdr.stroke_name = csch_comm_str(sheet, csch_tool_line.stroke->name, 1); + line->hdr.stroke_name = csch_comm_str(sheet, csch_tool_line.stroke_name, 1); csch_line_update(sheet, line, 1); chg++; } else { - csch_wirenet_draw(sheet, csch_comm_str(sheet, csch_tool_line.stroke->name, 1), x1, y1, x2, y2); + csch_wirenet_draw(sheet, csch_comm_str(sheet, csch_tool_line.stroke_name, 1), x1, y1, x2, y2); chg++; } } Index: trunk/src/plugins/std_tools/tool_circle.c =================================================================== --- trunk/src/plugins/std_tools/tool_circle.c (revision 2693) +++ trunk/src/plugins/std_tools/tool_circle.c (revision 2694) @@ -54,7 +54,9 @@ csch_sheet_t *sheet = (csch_sheet_t *)hl; if (csch_tool_circle.clicked) { + const char *stroke_name; csch_arc_t *arc = (csch_arc_t *)csch_op_create(sheet, &sheet->direct, CSCH_CTYPE_ARC); + arc->spec.c.x = csch_tool_circle.x; arc->spec.c.y = csch_tool_circle.y; arc->spec.r = csch_tool_circle.r; @@ -61,10 +63,9 @@ arc->spec.start = 0; arc->spec.delta = 360 / RND_RAD_TO_DEG; - if (csch_tool_circle.stroke == NULL) - csch_tool_circle.stroke = CSCH_DIRECT_PEN(sheet, tool_circle_stroke); + csch_tool_circle.stroke = CSCH_DIRECT_PEN(sheet, tool_circle_stroke, &stroke_name); - arc->hdr.stroke_name = csch_comm_str(sheet, csch_tool_circle.stroke->name, 1); + arc->hdr.stroke_name = csch_comm_str(sheet, stroke_name, 1); csch_arc_update(sheet, arc, 1); csch_sheet_set_changed(sheet, 1); @@ -93,7 +94,7 @@ rnd_coord_t ps; if (csch_tool_circle.stroke == NULL) - csch_tool_circle.stroke = CSCH_DIRECT_PEN(sheet, tool_circle_stroke); + csch_tool_circle.stroke = CSCH_DIRECT_PEN(sheet, tool_circle_stroke, NULL); ps = (csch_tool_circle.stroke == NULL) ? C2P(1000) : C2P(csch_tool_circle.stroke->size); dx = csch_tool_circle.x - P2C(csch_crosshair_x); Index: trunk/src/plugins/std_tools/tool_line.c =================================================================== --- trunk/src/plugins/std_tools/tool_line.c (revision 2693) +++ trunk/src/plugins/std_tools/tool_line.c (revision 2694) @@ -30,6 +30,7 @@ line_init(); csch_tool_line.dir = CSCH_TOOL_LINEDIR_ALL; csch_tool_line.stroke = NULL; + csch_tool_line.stroke_name = NULL; } static void tool_line_uninit(void) @@ -47,7 +48,7 @@ csch_sheet_t *sheet = (csch_sheet_t *)hl; TODO("symedit: when editing symbol, use the symbol deco style"); if (csch_tool_line.stroke == NULL) - csch_tool_line.stroke = CSCH_DIRECT_PEN(sheet, tool_line_stroke); + csch_tool_line.stroke = CSCH_DIRECT_PEN(sheet, tool_line_stroke, &csch_tool_line.stroke_name); line_create_all(hl, &sheet->direct, 0); line_continue(hl); } @@ -64,7 +65,7 @@ csch_sheet_t *sheet = (csch_sheet_t *)hl; TODO("symedit: when editing symbol, use the symbol deco style"); if (csch_tool_line.stroke == NULL) - csch_tool_line.stroke = CSCH_DIRECT_PEN(sheet, tool_line_stroke); + csch_tool_line.stroke = CSCH_DIRECT_PEN(sheet, tool_line_stroke, &csch_tool_line.stroke_name); line_draw_attached(hl, &sheet->direct); } Index: trunk/src/plugins/std_tools/tool_rect.c =================================================================== --- trunk/src/plugins/std_tools/tool_rect.c (revision 2693) +++ trunk/src/plugins/std_tools/tool_rect.c (revision 2694) @@ -63,14 +63,13 @@ csch_sheet_t *sheet = (csch_sheet_t *)hl; if (csch_tool_rect.clicked) { + const char *stroke_name, *fill_name; static const csch_source_arg_t src = {'c', "unsaved", "manual_draw_rectangle"}; csch_cpoly_t *poly = (csch_cgrp_t *)csch_op_create(sheet, &sheet->direct, CSCH_CTYPE_POLY); rnd_coord_t x1, y1, x2, y2; - if (csch_tool_rect.stroke == NULL) - csch_tool_rect.stroke = CSCH_DIRECT_PEN(sheet, tool_rect_stroke); - if (csch_tool_rect.fill == NULL) - csch_tool_rect.fill = CSCH_DIRECT_PEN(sheet, tool_rect_fill); + csch_tool_rect.stroke = CSCH_DIRECT_PEN(sheet, tool_rect_stroke, &stroke_name); + csch_tool_rect.fill = CSCH_DIRECT_PEN(sheet, tool_rect_fill, &fill_name); x1 = csch_tool_rect.x; y1 = csch_tool_rect.y; @@ -82,9 +81,9 @@ new_line(sheet, poly, x2, y2, x2, y1); new_line(sheet, poly, x2, y1, x1, y1); - poly->hdr.stroke_name = csch_comm_str(sheet, csch_tool_rect.stroke->name, 1); + poly->hdr.stroke_name = csch_comm_str(sheet, stroke_name, 1); poly->has_stroke = conf_core.editor.style.tool_rect_has_stroke; - poly->hdr.fill_name = csch_comm_str(sheet, csch_tool_rect.fill->name, 1); + poly->hdr.fill_name = csch_comm_str(sheet, fill_name, 1); poly->has_fill = conf_core.editor.style.tool_rect_has_fill; csch_poly_update(sheet, poly, 1); @@ -113,9 +112,9 @@ rnd_coord_t x1, y1, x2, y2, ps; if (csch_tool_rect.stroke == NULL) - csch_tool_rect.stroke = CSCH_DIRECT_PEN(sheet, tool_rect_stroke); + csch_tool_rect.stroke = CSCH_DIRECT_PEN(sheet, tool_rect_stroke, NULL); if (csch_tool_rect.fill == NULL) - csch_tool_rect.fill = CSCH_DIRECT_PEN(sheet, tool_rect_fill); + csch_tool_rect.fill = CSCH_DIRECT_PEN(sheet, tool_rect_fill, NULL); ps = (csch_tool_rect.stroke == NULL) ? C2P(1000) : C2P(csch_tool_rect.stroke->size); x1 = C2P(csch_tool_rect.x); Index: trunk/src/plugins/std_tools/tool_text.c =================================================================== --- trunk/src/plugins/std_tools/tool_text.c (revision 2693) +++ trunk/src/plugins/std_tools/tool_text.c (revision 2694) @@ -50,15 +50,16 @@ char *new_str = rnd_hid_prompt_for(hl, "Enter text:", "", "text"); if ((new_str != NULL) && (*new_str != '\0')) { + const char *stroke_name; csch_text_t *text = (csch_text_t *)csch_op_create(sheet, &sheet->direct, CSCH_CTYPE_TEXT); + text->spec1.x = P2C(csch_crosshair_x); text->spec1.y = P2C(csch_crosshair_y); text->text = new_str; - if (csch_tool_text.stroke == NULL) - csch_tool_text.stroke = CSCH_DIRECT_PEN(sheet, tool_text_stroke); + csch_tool_text.stroke = CSCH_DIRECT_PEN(sheet, tool_text_stroke, &stroke_name); - text->hdr.stroke_name = csch_comm_str(sheet, csch_tool_text.stroke->name, 1); + text->hdr.stroke_name = csch_comm_str(sheet, stroke_name, 1); csch_text_update(sheet, text, 1); csch_sheet_set_changed(sheet, 1); /* do not free new_str: owner is text now */ @@ -71,7 +72,7 @@ rnd_coord_t x1, y1, x2, y2, d, h; if (csch_tool_text.stroke == NULL) - csch_tool_text.stroke = CSCH_DIRECT_PEN(sheet, tool_text_stroke); + csch_tool_text.stroke = CSCH_DIRECT_PEN(sheet, tool_text_stroke, NULL); h = csch_tool_text.stroke->font_height; if (h <= 0) Index: trunk/src/plugins/std_tools/tool_wirenet.c =================================================================== --- trunk/src/plugins/std_tools/tool_wirenet.c (revision 2693) +++ trunk/src/plugins/std_tools/tool_wirenet.c (revision 2694) @@ -30,6 +30,7 @@ line_init(); csch_tool_line.dir = CSCH_TOOL_LINEDIR_HV; csch_tool_line.stroke = NULL; + csch_tool_line.stroke_name = NULL; } static void tool_wirenet_uninit(void) @@ -46,7 +47,7 @@ if (line_release(hl)) { csch_sheet_t *sheet = (csch_sheet_t *)hl; if (csch_tool_line.stroke == NULL) - csch_tool_line.stroke = CSCH_DIRECT_PEN(sheet, tool_wire_stroke); + csch_tool_line.stroke = CSCH_DIRECT_PEN(sheet, tool_wire_stroke, &csch_tool_line.stroke_name); line_create_all(hl, &sheet->direct, 1); line_continue(hl); } @@ -62,7 +63,7 @@ { csch_sheet_t *sheet = (csch_sheet_t *)hl; if (csch_tool_line.stroke == NULL) - csch_tool_line.stroke = CSCH_DIRECT_PEN(sheet, tool_wire_stroke); + csch_tool_line.stroke = CSCH_DIRECT_PEN(sheet, tool_wire_stroke, &csch_tool_line.stroke_name); line_draw_attached(hl, &sheet->direct); } Index: trunk/src/sch-rnd/style.c =================================================================== --- trunk/src/sch-rnd/style.c (revision 2693) +++ trunk/src/sch-rnd/style.c (revision 2694) @@ -32,20 +32,30 @@ #include "style.h" -csch_cpen_t *csch_style_get_pen(csch_sheet_t *sheet, csch_cgrp_t *grp, const rnd_conflist_t *lst) +csch_cpen_t *csch_style_get_pen(csch_sheet_t *sheet, csch_cgrp_t *grp, const rnd_conflist_t *lst, const char **strout) { rnd_conf_listitem_t *ci; csch_cpen_t *pen; + const char *first = NULL; for(ci = rnd_conflist_first((rnd_conflist_t *)lst); ci != NULL; ci = rnd_conflist_next(ci)) { const char *pn = ci->val.string[0]; + + if (first == NULL) + first = pn; + if ((pn != NULL) && (*pn != '\0')) { pen = csch_pen_get(sheet, grp, pn); - if (pen != NULL) + if (pen != NULL) { + if (strout != NULL) + *strout = pn; return pen; + } } } + if (strout != NULL) + *strout = first; return &csch_pen_default_unknown; } Index: trunk/src/sch-rnd/style.h =================================================================== --- trunk/src/sch-rnd/style.h (revision 2693) +++ trunk/src/sch-rnd/style.h (revision 2694) @@ -27,7 +27,8 @@ #include #include -csch_cpen_t *csch_style_get_pen(csch_sheet_t *sheet, csch_cgrp_t *grp, const rnd_conflist_t *lst); +csch_cpen_t *csch_style_get_pen(csch_sheet_t *sheet, csch_cgrp_t *grp, const rnd_conflist_t *lst, const char **str_out); -#define CSCH_DIRECT_PEN(sheet, confname) \ - csch_style_get_pen(sheet, &sheet->direct, &conf_core.editor.style.confname) +#define CSCH_DIRECT_PEN(sheet, confname, strout) \ + csch_style_get_pen(sheet, &sheet->direct, &conf_core.editor.style.confname, strout) +