Index: work/gtk/layersel/layersel.c =================================================================== --- work/gtk/layersel/layersel.c (revision 8551) +++ work/gtk/layersel/layersel.c (revision 8552) @@ -120,6 +120,11 @@ /*** Event handling ***/ +static int ev_lyr_no_select(layersel_layer_t *lsl) +{ + return 1; /* layer can not be selected ever */ +} + static gboolean group_vis_press_cb(GtkWidget *widget, GdkEvent *event, layersel_grp_t *lsg) { switch(event->button.button) { @@ -139,7 +144,8 @@ layersel_layer_t *lsl = user_data; switch(event->button.button) { case 1: - lsl->on = !lsl->on; + if ((lsl->ev_toggle_vis == NULL) || (lsl->ev_toggle_vis(lsl) == 0)) + lsl->on = !lsl->on; layer_vis_sync(lsl); break; case 3: @@ -155,11 +161,13 @@ switch(event->button.button) { case 1: printf("layer select!\n"); - old_curr = current; - current = lsl; - if (old_curr != NULL) - layer_vis_sync(old_curr); - layer_vis_sync(lsl); + if ((lsl->ev_selected == NULL) || (lsl->ev_selected(lsl) == 0)) { + old_curr = current; + current = lsl; + if (old_curr != NULL) + layer_vis_sync(old_curr); + layer_vis_sync(lsl); + } break; case 3: pcb_hid_actionl("Popup", "layer", NULL); @@ -338,6 +346,12 @@ gtk_box_pack_start(GTK_BOX(lsg->layers), build_layer(lsg, &lsg->layer[1], "Vias"), FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(lsg->layers), build_layer(lsg, &lsg->layer[2], "Far side"), FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(lsg->layers), build_layer(lsg, &lsg->layer[3], "All-silk"), FALSE, FALSE, 1); + + lsg->layer[0].ev_selected = ev_lyr_no_select; + lsg->layer[1].ev_selected = ev_lyr_no_select; + lsg->layer[2].ev_selected = ev_lyr_no_select; + lsg->layer[3].ev_selected = ev_lyr_no_select; + build_group_finish(lsg); } Index: work/gtk/layersel/layersel.h =================================================================== --- work/gtk/layersel/layersel.h (revision 8551) +++ work/gtk/layersel/layersel.h (revision 8552) @@ -10,6 +10,9 @@ struct layersel_layer_s { GtkWidget *box, *vis_on, *vis_off, *name_box; + int (*ev_toggle_vis)(layersel_layer_t *lsl); /* called first in click handler, if returns non-zero, normal visibility update is supressed */ + int (*ev_selected)(layersel_layer_t *lsl); /* called first in click handler, if returns non-zero, layer can not be selected */ + unsigned on:1; /* TODO: temporary hack: should be extracted from the layer struct */ /* for callbacks */