Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 28844) +++ trunk/src/buffer.c (revision 28845) @@ -60,7 +60,7 @@ #include "tool.h" #include "extobj.h" -static void move_buffer_pre(pcb_opctx_t *ctx, pcb_any_obj_t *ptr2, void *ptr3); +static int move_buffer_pre(pcb_opctx_t *ctx, pcb_any_obj_t *ptr2, void *ptr3); static void add_buffer_pre(pcb_opctx_t *ctx, pcb_any_obj_t *ptr2, void *ptr3); static pcb_opfunc_t AddBufferFunctions = { @@ -93,11 +93,12 @@ pcb_pstkop_move_buffer, }; -static void move_buffer_pre(pcb_opctx_t *ctx, pcb_any_obj_t *obj, void *ptr3) +static int move_buffer_pre(pcb_opctx_t *ctx, pcb_any_obj_t *obj, void *ptr3) { TODO("extobj floater: move the whole subc instead"); /* when an edit-object is moved to buffer, the corresponding subc obj needs to be moved too */ /* pcb_subcop_move_buffer(ctx, subc);*/ + return 0; } static void add_buffer_pre(pcb_opctx_t *ctx, pcb_any_obj_t *obj, void *ptr3) Index: trunk/src/extobj.h =================================================================== --- trunk/src/extobj.h (revision 28844) +++ trunk/src/extobj.h (revision 28845) @@ -68,8 +68,9 @@ copy all data from there (including objects). */ void pcb_extobj_new_subc(pcb_any_obj_t *edit_obj, pcb_subc_t *subc_copy_from); -/* Called to remove the subc of an edit object floater */ -PCB_INLINE void pcb_extobj_del_floater(pcb_any_obj_t *edit_obj); +/* Called to remove the subc of an edit object floater; returns 0 on no + action, 1 if it removed an extobj subc */ +PCB_INLINE int pcb_extobj_del_floater(pcb_any_obj_t *edit_obj); /* called (by the subc code) before an edit-obj is removed */ @@ -115,23 +116,25 @@ eo->chg_attr(subc, key, value); } -PCB_INLINE void pcb_extobj_del_floater(pcb_any_obj_t *flt) +PCB_INLINE int pcb_extobj_del_floater(pcb_any_obj_t *flt) { pcb_subc_t *subc; pcb_extobj_t *eo; if (!PCB_FLAG_TEST(PCB_FLAG_FLOATER, flt)) - return; + return 0; subc = pcb_obj_parent_subc(flt); if (subc == NULL) - return; + return 0; eo = pcb_extobj_get(subc); if (eo == NULL) - return; /* do not delete non-extobjs */ + return 0; /* do not delete non-extobjs */ +pcb_trace("del floater removes subc\n"); pcb_subc_remove(subc); + return 1; } PCB_INLINE void pcb_extobj_float_new(pcb_any_obj_t *flt) Index: trunk/src/operation.c =================================================================== --- trunk/src/operation.c (revision 28844) +++ trunk/src/operation.c (revision 28845) @@ -46,8 +46,10 @@ exto = pcb_extobj_float_pre(Ptr2); - if (F->common_pre != NULL) - F->common_pre(ctx, Ptr2, Ptr3); + if (F->common_pre != NULL) { + if (F->common_pre(ctx, Ptr2, Ptr3) == 1) + return NULL; + } switch (Type) { case PCB_OBJ_LINE: @@ -138,7 +140,8 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, line); } exto = pcb_extobj_float_pre((pcb_any_obj_t *)line); - if (F->common_pre != NULL) F->common_pre(ctx, (pcb_any_obj_t *)line, NULL); + if (F->common_pre != NULL) + if (F->common_pre(ctx, (pcb_any_obj_t *)line, NULL) == 1) continue; F->Line(ctx, layer, line); if (F->common_post != NULL) F->common_post(ctx, (pcb_any_obj_t *)line, NULL); if (exto != NULL) pcb_extobj_float_geo(exto); @@ -160,7 +163,8 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, arc); } exto = pcb_extobj_float_pre((pcb_any_obj_t *)arc); - if (F->common_pre != NULL) F->common_pre(ctx, (pcb_any_obj_t *)arc, NULL); + if (F->common_pre != NULL) + if (F->common_pre(ctx, (pcb_any_obj_t *)arc, NULL) == 1) continue; F->Arc(ctx, layer, arc); if (F->common_post != NULL) F->common_post(ctx, (pcb_any_obj_t *)arc, NULL); if (exto != NULL) pcb_extobj_float_geo(exto); @@ -182,7 +186,8 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, text); } exto = pcb_extobj_float_pre((pcb_any_obj_t *)text); - if (F->common_pre != NULL) F->common_pre(ctx, (pcb_any_obj_t *)text, NULL); + if (F->common_pre != NULL) + if (F->common_pre(ctx, (pcb_any_obj_t *)text, NULL) == 1) continue; F->Text(ctx, layer, text); if (F->common_post != NULL) F->common_post(ctx, (pcb_any_obj_t *)text, NULL); if (exto != NULL) pcb_extobj_float_geo(exto); @@ -204,7 +209,8 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, polygon); } exto = pcb_extobj_float_pre((pcb_any_obj_t *)polygon); - if (F->common_pre != NULL) F->common_pre(ctx, (pcb_any_obj_t *)polygon, NULL); + if (F->common_pre != NULL) + if (F->common_pre(ctx, (pcb_any_obj_t *)polygon, NULL) == 1) continue; F->Polygon(ctx, layer, polygon); if (F->common_post != NULL) F->common_post(ctx, (pcb_any_obj_t *)polygon, NULL); if (exto != NULL) pcb_extobj_float_geo(exto); @@ -224,7 +230,8 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, subc); } exto = pcb_extobj_float_pre((pcb_any_obj_t *)subc); - if (F->common_pre != NULL) F->common_pre(ctx, (pcb_any_obj_t *)subc, NULL); + if (F->common_pre != NULL) + if (F->common_pre(ctx, (pcb_any_obj_t *)subc, NULL) == 1) continue; F->subc(ctx, subc); if (F->common_post != NULL) F->common_post(ctx, (pcb_any_obj_t *)subc, NULL); if (exto != NULL) pcb_extobj_float_geo(exto); @@ -251,7 +258,8 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, padstack); } exto = pcb_extobj_float_pre((pcb_any_obj_t *)padstack); - if (F->common_pre != NULL) F->common_pre(ctx, (pcb_any_obj_t *)padstack, NULL); + if (F->common_pre != NULL) + if (F->common_pre(ctx, (pcb_any_obj_t *)padstack, NULL) == 1) continue; F->padstack(ctx, padstack); if (F->common_post != NULL) F->common_post(ctx, (pcb_any_obj_t *)padstack, NULL); if (exto != NULL) pcb_extobj_float_geo(exto); @@ -272,7 +280,8 @@ pcb_undo_add_obj_to_flag(line); PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, line); } - if (F->common_pre != NULL) F->common_pre(ctx, (pcb_any_obj_t *)line, NULL); + if (F->common_pre != NULL) + if (F->common_pre(ctx, (pcb_any_obj_t *)line, NULL) == 1) continue; F->Rat(ctx, line); if (F->common_post != NULL) F->common_post(ctx, (pcb_any_obj_t *)line, NULL); changed = pcb_true; Index: trunk/src/operation.h =================================================================== --- trunk/src/operation.h (revision 28844) +++ trunk/src/operation.h (revision 28845) @@ -135,7 +135,7 @@ /* pointer to low-level operation (copy, move and rotate) functions */ typedef struct { - void (*common_pre)(pcb_opctx_t *ctx, pcb_any_obj_t *ptr2, void *ptr3); /* called before anything else (not object-type-dependent) */ + int (*common_pre)(pcb_opctx_t *ctx, pcb_any_obj_t *ptr2, void *ptr3); /* called before anything else (not object-type-dependent); skip the rest of the call for the object if returns 1 */ void (*common_post)(pcb_opctx_t *ctx, pcb_any_obj_t *ptr2, void *ptr3); /* called after everything else (not object-type-dependent) */ void *(*Line)(pcb_opctx_t *ctx, pcb_layer_t *, pcb_line_t *); Index: trunk/src/remove.c =================================================================== --- trunk/src/remove.c (revision 28844) +++ trunk/src/remove.c (revision 28845) @@ -42,7 +42,7 @@ #include "obj_subc_op.h" #include "obj_pstk_op.h" -static void remove_pre(pcb_opctx_t *ctx, pcb_any_obj_t *obj, void *ptr3); +static int remove_pre(pcb_opctx_t *ctx, pcb_any_obj_t *obj, void *ptr3); static pcb_opfunc_t RemoveFunctions = { remove_pre, @@ -74,10 +74,10 @@ pcb_pstkop_destroy, }; -static void remove_pre(pcb_opctx_t *ctx, pcb_any_obj_t *obj, void *ptr3) +static int remove_pre(pcb_opctx_t *ctx, pcb_any_obj_t *obj, void *ptr3) { /* when an edit-object is removed, the corresponding subc obj needs to be removed */ - pcb_extobj_del_floater(obj); + return pcb_extobj_del_floater(obj); }