Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 29890) +++ trunk/src/data.c (revision 29891) @@ -325,10 +325,8 @@ void pcb_data_set_layer_parents(pcb_data_t *data) { pcb_layer_id_t n; - for(n = 0; n < PCB_MAX_LAYER; n++) { - data->Layer[n].parent.data = data; - data->Layer[n].parent_type = PCB_PARENT_DATA; - } + for(n = 0; n < PCB_MAX_LAYER; n++) + pcb_layer_setup(&data->Layer[n], data); } void pcb_data_bind_board_layers(pcb_board_t *pcb, pcb_data_t *data, int share_rtrees) Index: trunk/src/event.c =================================================================== --- trunk/src/event.c (revision 29890) +++ trunk/src/event.c (revision 29891) @@ -47,7 +47,8 @@ "pcbev_rubber_constrain_main_line", "pcbev_draw_crosshair_chatt", "pcbev_drc_run", - "pcbev_net_indicate_short" + "pcbev_net_indicate_short", + "pcbev_layer_key_change" }; void pcb_event_init_app(void) Index: trunk/src/event.h =================================================================== --- trunk/src/event.h (revision 29890) +++ trunk/src/event.h (revision 29891) @@ -57,6 +57,8 @@ PCB_EVENT_NET_INDICATE_SHORT, /* called by core to get a shortcircuit indicated (e.g. by mincut). Args: (pcb_net_t *net, pcb_any_obj_t *offending_term, pcb_net_t *offending_net, int *handled, int *cancel) - if *handled is non-zero, the short is already indicated; if *cancel is non-zero the whole process is cancelled, no more advanced short checking should take place in this session */ + PCB_EVENT_LAYER_KEY_CHANGE, /* called by core if a pcb-rnd::key::* attribute on a layer changes */ + PCB_EVENT_last /* not a real event */ }; Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 29890) +++ trunk/src/layer.c (revision 29891) @@ -127,6 +127,13 @@ } +static void layer_post_change(pcb_attribute_list_t *list, const char *name, const char *value) +{ + if (strncmp(name, "pcb-rnd::key::", 14) == 0) + pcb_event(&PCB->hidlib, PCB_EVENT_LAYER_KEY_CHANGE, NULL); +} + + #define UFC(f) ((void (*)(void *))(f)) void pcb_layer_free_fields(pcb_layer_t *layer, pcb_bool undoable) { @@ -158,6 +165,7 @@ } free((char *)layer->name); memset(layer, 0, sizeof(pcb_layer_t)); + layer->Attributes.post_change = layer_post_change; } pcb_bool pcb_layer_is_pure_empty(pcb_layer_t *layer) @@ -489,6 +497,7 @@ free((char *)pcb->Data->Layer[n].name); pcb->Data->Layer[n].name = pcb_strdup(""); pcb->Data->Layer[n].meta.real.grp = -1; + pcb->Data->Layer[n].Attributes.post_change = layer_post_change; } /* reset layer groups */ @@ -506,6 +515,7 @@ { memset(dst, 0, sizeof(pcb_layer_t)); dst->meta.real.grp = -1; + dst->Attributes.post_change = layer_post_change; } static void pcb_layer_undoable_created(pcb_board_t *pcb, pcb_layer_t *l); @@ -537,6 +547,7 @@ pcb->Data->Layer[id].parent_type = PCB_PARENT_DATA; pcb->Data->Layer[id].parent.data = pcb->Data; pcb->Data->Layer[id].type = PCB_OBJ_LAYER; + pcb->Data->Layer[id].Attributes.post_change = layer_post_change; if (pcb == PCB) pcb_board_set_changed_flag(1); @@ -748,6 +759,14 @@ return &conf_core.appearance.color.layer[idx % clrs]; } +void pcb_layer_setup(pcb_layer_t *ly, pcb_data_t *parent_data) +{ + ly->Attributes.post_change = layer_post_change; + ly->parent.data = parent_data; + ly->parent_type = PCB_PARENT_DATA; + ly->type = PCB_OBJ_LAYER; +} + /* Initialize a new layer with safe initial values */ static void layer_init(pcb_board_t *pcb, pcb_layer_t *lp, pcb_layer_id_t idx, pcb_layergrp_id_t gid, pcb_data_t *parent) { @@ -764,9 +783,7 @@ default: break; } } - lp->parent.data = parent; - lp->parent_type = PCB_PARENT_DATA; - lp->type = PCB_OBJ_LAYER; + pcb_layer_setup(lp, parent); } static pcb_layer_t *pcb_layer_move_append_(pcb_board_t *pcb, pcb_layer_id_t new_index, pcb_layergrp_id_t new_in_grp) Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 29890) +++ trunk/src/layer.h (revision 29891) @@ -272,6 +272,9 @@ /**** layer creation (for load/import code) ****/ +/* Set parent and attribute change callback */ +void pcb_layer_setup(pcb_layer_t *ly, pcb_data_t *parent_data); + /* Reset layers and layer groups to empty */ void pcb_layers_reset(pcb_board_t *pcb);