Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 33046) +++ trunk/src/obj_poly.c (revision 33047) @@ -49,6 +49,7 @@ #include "obj_poly_op.h" #include "obj_poly_list.h" #include "obj_poly_draw.h" +#include "obj_term.h" #include "obj_subc_parent.h" #include "obj_hash.h" @@ -75,6 +76,8 @@ void pcb_poly_unreg(pcb_poly_t *poly) { pcb_layer_t *layer = poly->parent.layer; + + pcb_term_del_auto((pcb_any_obj_t *)poly); assert(poly->parent_type == PCB_PARENT_LAYER); polylist_remove(poly); if (layer->parent_type != PCB_PARENT_UI) { @@ -981,6 +984,7 @@ /* destroys a polygon from a layer */ void *pcb_polyop_destroy(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_poly_t *Polygon) { + pcb_term_del_auto((pcb_any_obj_t *)Polygon); rnd_r_delete_entry(Layer->polygon_tree, (rnd_box_t *) Polygon); pcb_poly_free_fields(Polygon); Index: trunk/src/obj_term.c =================================================================== --- trunk/src/obj_term.c (revision 33046) +++ trunk/src/obj_term.c (revision 33047) @@ -110,6 +110,20 @@ return PCB_TERM_ERR_NOT_IN_TERMINAL; } +pcb_term_err_t pcb_term_del_auto(pcb_any_obj_t *obj) +{ + pcb_subc_t *subc; + + if (obj->term == NULL) + return PCB_TERM_ERR_SUCCESS; + + subc = pcb_obj_parent_subc(obj); + if (subc == NULL) + return PCB_TERM_ERR_SUCCESS; + + return pcb_term_del(&subc->terminals, obj->term, obj); +} + static pcb_term_err_t pcb_term_remove_entry(htsp_t *terminals, htsp_entry_t *e) { vtp0_t *v = e->value; Index: trunk/src/obj_term.h =================================================================== --- trunk/src/obj_term.h (revision 33046) +++ trunk/src/obj_term.h (revision 33047) @@ -70,6 +70,9 @@ Removes terminal if it becomes empty. */ pcb_term_err_t pcb_term_del(htsp_t *terminals, const char *termid, pcb_any_obj_t *obj); +/* Automatically call pcb_term_del() on obj if needed - call this before removing an object */ +pcb_term_err_t pcb_term_del_auto(pcb_any_obj_t *obj); + /* Remove a terminal from, calling pcb_term_del() on all objects in it. */ pcb_term_err_t pcb_term_remove(htsp_t *terminals, const char *tname);