Index: trunk/src/board.c =================================================================== --- trunk/src/board.c (revision 34513) +++ trunk/src/board.c (revision 34514) @@ -61,6 +61,7 @@ free(pcb->PrintFilename); pcb_ratspatch_destroy(pcb); pcb_data_free(pcb->Data); + pcb_data_free(pcb->uilayer_data); /* release font symbols */ pcb_fontkit_free(&pcb->fontkit); @@ -84,6 +85,7 @@ /* allocate memory, switch all layers on and copy resources */ ptr = calloc(1, sizeof(pcb_board_t)); ptr->Data = pcb_buffer_new(ptr); + ptr->uilayer_data = pcb_buffer_new(ptr); for(i = 0; i < PCB_NUM_NETLISTS; i++) pcb_netlist_init(&(ptr->netlist[i])); Index: trunk/src/board.h =================================================================== --- trunk/src/board.h (revision 34513) +++ trunk/src/board.h (revision 34514) @@ -98,6 +98,8 @@ int line_mod_merge_inhibit; struct vtp0_s *line_mod_merge; + pcb_data_t *uilayer_data; /* parent of all UI layers */ + /* random */ unsigned suppress_warn_missing_font:1; /* do not warn for missing font; useful for alien formats not having embedded font */ }; Index: trunk/src/idpath.c =================================================================== --- trunk/src/idpath.c (revision 34513) +++ trunk/src/idpath.c (revision 34514) @@ -66,7 +66,7 @@ case PCB_PARENT_LAYER: assert(obj->parent.layer->parent_type = PCB_PARENT_DATA); data = obj->parent.layer->parent.data; - if (data == NULL) { /* ui layer */ + if (pcb_is_uilayer(obj->parent.layer)) { long uilid = pcb_uilayer_get_id(obj->parent.layer); if (uilid <= 0) { if (idp != NULL) @@ -248,7 +248,7 @@ { pcb_data_t *data; if (path->uilayer_addr > 0) { - data = pcb_uilayer_dummy_data; + data = pcb->uilayer_data; } else if (path->data_addr == 1) { if (pcb == NULL) Index: trunk/src/layer_ui.c =================================================================== --- trunk/src/layer_ui.c (revision 34513) +++ trunk/src/layer_ui.c (revision 34514) @@ -40,12 +40,11 @@ #include "layer_ui.h" vtp0_t pcb_uilayers; -pcb_data_t *pcb_uilayer_dummy_data; -static pcb_data_t pcb_uilayer_dummy_data_; pcb_layer_t *pcb_uilayer_alloc(const char *cookie, const char *name, const rnd_color_t *color) { int n; + pcb_board_t *pcb = PCB; pcb_layer_t *l; void **p; @@ -70,8 +69,8 @@ l->name = rnd_strdup(name); l->meta.real.vis = 1; l->parent_type = PCB_PARENT_UI; - l->parent.any = NULL; - rnd_event(&PCB->hidlib, PCB_EVENT_LAYERS_CHANGED, NULL); + l->parent.any = pcb->uilayer_data; + rnd_event(&pcb->hidlib, PCB_EVENT_LAYERS_CHANGED, NULL); return l; } @@ -108,14 +107,11 @@ void pcb_uilayer_init(void) { - pcb_uilayer_dummy_data = &pcb_uilayer_dummy_data_; - htip_init(&pcb_uilayer_dummy_data->id2obj, longhash, longkeyeq); } void pcb_uilayer_uninit(void) { vtp0_uninit(&pcb_uilayers); - htip_uninit(&pcb_uilayer_dummy_data->id2obj); } pcb_layer_t *pcb_uilayer_get(long ui_ly_id) Index: trunk/src/layer_ui.h =================================================================== --- trunk/src/layer_ui.h (revision 34513) +++ trunk/src/layer_ui.h (revision 34514) @@ -36,10 +36,11 @@ #include "genvector/vtp0.h" #include "genht/htip.h" +#include "data.h" +#include "board.h" /* list of all UI layers - each item is a persistent pointer to a layer struct */ extern vtp0_t pcb_uilayers; -extern pcb_data_t *pcb_uilayer_dummy_data; pcb_layer_t *pcb_uilayer_alloc(const char *cookie, const char *name, const rnd_color_t *color); @@ -53,7 +54,16 @@ RND_INLINE int pcb_is_uilayer(pcb_layer_t *layer) { - return (layer->parent_type == PCB_PARENT_UI) || (layer->parent.data == NULL); + if (layer->parent_type == PCB_PARENT_DATA) { + pcb_data_t *data = layer->parent.data; + if (data->parent_type == PCB_PARENT_BOARD) { + pcb_board_t *pcb = data->parent.board; + if (data == pcb->uilayer_data) + return 1; + } + return 0; + } + return (layer->parent_type == PCB_PARENT_UI); } #endif Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 34513) +++ trunk/src/obj_arc.c (revision 34514) @@ -63,7 +63,7 @@ PCB_SET_PARENT(arc, layer, layer); if (pcb_is_uilayer(layer)) - pcb_obj_id_reg(pcb_uilayer_dummy_data, arc); + pcb_obj_id_reg(layer->parent.data, arc); else if (layer->parent_type == PCB_PARENT_DATA) pcb_obj_id_reg(layer->parent.data, arc); } @@ -74,7 +74,7 @@ assert(arc->parent_type == PCB_PARENT_LAYER); arclist_remove(arc); if (pcb_is_uilayer(layer)) { - pcb_obj_id_del(pcb_uilayer_dummy_data, arc); + pcb_obj_id_del(layer->parent.data, arc); } else { assert(layer->parent_type == PCB_PARENT_DATA); Index: trunk/src/obj_gfx.c =================================================================== --- trunk/src/obj_gfx.c (revision 34513) +++ trunk/src/obj_gfx.c (revision 34514) @@ -63,7 +63,7 @@ PCB_SET_PARENT(gfx, layer, layer); if (pcb_is_uilayer(layer)) - pcb_obj_id_reg(pcb_uilayer_dummy_data, gfx); + pcb_obj_id_reg(layer->parent.data, gfx); else if (layer->parent_type == PCB_PARENT_DATA) pcb_obj_id_reg(layer->parent.data, gfx); } @@ -74,7 +74,7 @@ assert(gfx->parent_type == PCB_PARENT_LAYER); gfxlist_remove(gfx); if (pcb_is_uilayer(layer)) { - pcb_obj_id_del(pcb_uilayer_dummy_data, gfx); + pcb_obj_id_del(layer->parent.data, gfx); } else { assert(layer->parent_type == PCB_PARENT_DATA); Index: trunk/src/obj_line.c =================================================================== --- trunk/src/obj_line.c (revision 34513) +++ trunk/src/obj_line.c (revision 34514) @@ -67,10 +67,10 @@ PCB_SET_PARENT(line, layer, layer); if (pcb_is_uilayer(layer)) { - pcb_obj_id_reg(pcb_uilayer_dummy_data, line); + pcb_obj_id_reg(layer->parent.data, line); /* can not register points because they do not have the common object header - pcb_obj_id_reg(pcb_uilayer_dummy_data, &line->Point1); - pcb_obj_id_reg(pcb_uilayer_dummy_data, &line->Point2);*/ + pcb_obj_id_reg(layer->parent.data, &line->Point1); + pcb_obj_id_reg(layer->parent.data, &line->Point2);*/ } else if (layer->parent_type == PCB_PARENT_DATA) { pcb_obj_id_reg(layer->parent.data, line); @@ -86,9 +86,9 @@ assert(line->parent_type == PCB_PARENT_LAYER); linelist_remove(line); if (pcb_is_uilayer(layer)) { - pcb_obj_id_del(pcb_uilayer_dummy_data, line); - pcb_obj_id_del(pcb_uilayer_dummy_data, &line->Point1); - pcb_obj_id_del(pcb_uilayer_dummy_data, &line->Point2); + pcb_obj_id_del(layer->parent.data, line); + pcb_obj_id_del(layer->parent.data, &line->Point1); + pcb_obj_id_del(layer->parent.data, &line->Point2); } else { assert(layer->parent_type == PCB_PARENT_DATA); Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 34513) +++ trunk/src/obj_poly.c (revision 34514) @@ -70,7 +70,7 @@ PCB_SET_PARENT(poly, layer, layer); if (pcb_is_uilayer(layer)) - pcb_obj_id_reg(pcb_uilayer_dummy_data, poly); + pcb_obj_id_reg(layer->parent.data, poly); else if (layer->parent_type == PCB_PARENT_DATA) pcb_obj_id_reg(layer->parent.data, poly); } @@ -83,7 +83,7 @@ assert(poly->parent_type == PCB_PARENT_LAYER); polylist_remove(poly); if (pcb_is_uilayer(layer)) { - pcb_obj_id_del(pcb_uilayer_dummy_data, poly); + pcb_obj_id_del(layer->parent.data, poly); } else { assert(layer->parent_type == PCB_PARENT_DATA); Index: trunk/src/obj_text.c =================================================================== --- trunk/src/obj_text.c (revision 34513) +++ trunk/src/obj_text.c (revision 34514) @@ -66,7 +66,7 @@ PCB_SET_PARENT(text, layer, layer); if (pcb_is_uilayer(layer)) - pcb_obj_id_reg(pcb_uilayer_dummy_data, text); + pcb_obj_id_reg(layer->parent.data, text); else if (layer->parent_type == PCB_PARENT_DATA) pcb_obj_id_reg(layer->parent.data, text); } @@ -77,7 +77,7 @@ assert(text->parent_type == PCB_PARENT_LAYER); textlist_remove(text); if (pcb_is_uilayer(layer)) { - pcb_obj_id_del(pcb_uilayer_dummy_data, text); + pcb_obj_id_del(layer->parent.data, text); } else { assert(layer->parent_type == PCB_PARENT_DATA); pcb_obj_id_del(layer->parent.data, text);