Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 28794) +++ trunk/src/buffer.c (revision 28795) @@ -61,6 +61,8 @@ #include "extobj.h" static pcb_opfunc_t AddBufferFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_add_to_buffer, pcb_textop_add_to_buffer, pcb_polyop_add_to_buffer, @@ -74,6 +76,8 @@ }; static pcb_opfunc_t MoveBufferFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_move_buffer, pcb_textop_move_buffer, pcb_polyop_move_buffer, Index: trunk/src/change.c =================================================================== --- trunk/src/change.c (revision 28794) +++ trunk/src/change.c (revision 28795) @@ -56,6 +56,8 @@ int defer_needs_update = 0; pcb_opfunc_t ChangeSizeFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_change_size, pcb_textop_change_size, pcb_polyop_change_clear, @@ -69,6 +71,8 @@ }; pcb_opfunc_t Change1stSizeFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_change_size, pcb_textop_change_size, pcb_polyop_change_clear, @@ -82,6 +86,8 @@ }; pcb_opfunc_t Change2ndSizeFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ NULL, pcb_textop_change_2nd_size, NULL, @@ -95,6 +101,8 @@ }; pcb_opfunc_t ChangeRotFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ NULL, pcb_textop_change_rot, NULL, @@ -108,6 +116,8 @@ }; static pcb_opfunc_t ChangeThermalFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ NULL, NULL, NULL, @@ -121,6 +131,8 @@ }; pcb_opfunc_t ChangeClearSizeFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_change_clear_size, NULL, pcb_polyop_change_clear_size, /* just to tell the user not to :-) */ @@ -134,6 +146,8 @@ }; static pcb_opfunc_t ChangeNameFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ NULL, pcb_textop_change_name, NULL, @@ -147,6 +161,8 @@ }; static pcb_opfunc_t ChangeNonetlistFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ NULL, NULL, NULL, @@ -160,6 +176,8 @@ }; static pcb_opfunc_t ChangeJoinFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_change_join, pcb_textop_change_join, pcb_polyop_change_join, @@ -173,6 +191,8 @@ }; static pcb_opfunc_t SetJoinFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_set_join, pcb_textop_set_join, NULL, @@ -186,6 +206,8 @@ }; static pcb_opfunc_t ClrJoinFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_clear_join, pcb_textop_clear_join, NULL, @@ -199,6 +221,8 @@ }; static pcb_opfunc_t ChangeRadiusFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ NULL, NULL, NULL, @@ -212,6 +236,8 @@ }; static pcb_opfunc_t ChangeAngleFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ NULL, NULL, NULL, @@ -225,6 +251,8 @@ }; pcb_opfunc_t ChgFlagFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_change_flag, pcb_textop_change_flag, pcb_polyop_change_flag, @@ -238,6 +266,8 @@ }; static pcb_opfunc_t InvalLabelFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_invalidate_label, pcb_textop_invalidate_label, pcb_polyop_invalidate_label, Index: trunk/src/insert.c =================================================================== --- trunk/src/insert.c (revision 28794) +++ trunk/src/insert.c (revision 28795) @@ -44,6 +44,8 @@ #include "obj_poly_op.h" static pcb_opfunc_t InsertFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_insert_point, NULL, pcb_polyop_insert_point, Index: trunk/src/move.c =================================================================== --- trunk/src/move.c (revision 28794) +++ trunk/src/move.c (revision 28795) @@ -50,6 +50,8 @@ #include "obj_rat_op.h" pcb_opfunc_t MoveFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_move, pcb_textop_move, pcb_polyop_move, @@ -63,6 +65,8 @@ }; pcb_opfunc_t MoveFunctions_noclip = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_move_noclip, pcb_textop_move_noclip, pcb_polyop_move_noclip, @@ -76,6 +80,8 @@ }; pcb_opfunc_t ClipFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_clip, pcb_textop_clip, pcb_polyop_clip, @@ -89,6 +95,8 @@ }; static pcb_opfunc_t MoveToLayerFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_move_to_layer, pcb_textop_move_to_layer, pcb_polyop_move_to_layer, @@ -102,6 +110,8 @@ }; static pcb_opfunc_t CopyFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_copy, pcb_textop_copy, pcb_polyop_copy, Index: trunk/src/operation.c =================================================================== --- trunk/src/operation.c (revision 28794) +++ trunk/src/operation.c (revision 28795) @@ -46,6 +46,9 @@ exto = pcb_extobj_edit_pre(Ptr2); + if (F->common_pre != NULL) + F->common_pre(ctx, Ptr2, Ptr3); + switch (Type) { case PCB_OBJ_LINE: if (F->Line) @@ -98,6 +101,9 @@ break; } + if (F->common_post != NULL) + F->common_post(ctx, Ptr2, Ptr3); + if (exto != NULL) pcb_extobj_edit_geo(exto); @@ -132,7 +138,9 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, line); } exto = pcb_extobj_edit_pre((pcb_any_obj_t *)line); + if (F->common_pre != NULL) F->common_pre(ctx, line, NULL); F->Line(ctx, layer, line); + if (F->common_post != NULL) F->common_post(ctx, line, NULL); if (exto != NULL) pcb_extobj_edit_geo(exto); changed = pcb_true; } @@ -152,7 +160,9 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, arc); } exto = pcb_extobj_edit_pre((pcb_any_obj_t *)arc); + if (F->common_pre != NULL) F->common_pre(ctx, arc, NULL); F->Arc(ctx, layer, arc); + if (F->common_post != NULL) F->common_post(ctx, arc, NULL); if (exto != NULL) pcb_extobj_edit_geo(exto); changed = pcb_true; } @@ -172,7 +182,9 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, text); } exto = pcb_extobj_edit_pre((pcb_any_obj_t *)text); + if (F->common_pre != NULL) F->common_pre(ctx, text, NULL); F->Text(ctx, layer, text); + if (F->common_post != NULL) F->common_post(ctx, text, NULL); if (exto != NULL) pcb_extobj_edit_geo(exto); changed = pcb_true; } @@ -192,7 +204,9 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, polygon); } exto = pcb_extobj_edit_pre((pcb_any_obj_t *)polygon); + if (F->common_pre != NULL) F->common_pre(ctx, polygon, NULL); F->Polygon(ctx, layer, polygon); + if (F->common_post != NULL) F->common_post(ctx, polygon, NULL); if (exto != NULL) pcb_extobj_edit_geo(exto); changed = pcb_true; } @@ -210,7 +224,9 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, subc); } exto = pcb_extobj_edit_pre((pcb_any_obj_t *)subc); + if (F->common_pre != NULL) F->common_pre(ctx, subc, NULL); F->subc(ctx, subc); + if (F->common_post != NULL) F->common_post(ctx, subc, NULL); if (exto != NULL) pcb_extobj_edit_geo(exto); changed = pcb_true; } @@ -235,7 +251,9 @@ PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, padstack); } exto = pcb_extobj_edit_pre((pcb_any_obj_t *)padstack); + if (F->common_pre != NULL) F->common_pre(ctx, padstack, NULL); F->padstack(ctx, padstack); + if (F->common_post != NULL) F->common_post(ctx, padstack, NULL); if (exto != NULL) pcb_extobj_edit_geo(exto); changed = pcb_true; } @@ -254,7 +272,9 @@ pcb_undo_add_obj_to_flag(line); PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, line); } + if (F->common_pre != NULL) F->common_pre(ctx, line, NULL); F->Rat(ctx, line); + if (F->common_post != NULL) F->common_post(ctx, line, NULL); changed = pcb_true; } PCB_END_LOOP; Index: trunk/src/operation.h =================================================================== --- trunk/src/operation.h (revision 28794) +++ trunk/src/operation.h (revision 28795) @@ -135,6 +135,9 @@ /* 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) */ + 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 *); void *(*Text)(pcb_opctx_t *ctx, pcb_layer_t *, pcb_text_t *); void *(*Polygon)(pcb_opctx_t *ctx, pcb_layer_t *, pcb_poly_t *); Index: trunk/src/remove.c =================================================================== --- trunk/src/remove.c (revision 28794) +++ trunk/src/remove.c (revision 28795) @@ -43,6 +43,8 @@ #include "obj_pstk_op.h" static pcb_opfunc_t RemoveFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_remove, pcb_textop_remove, pcb_polyop_remove, @@ -56,6 +58,8 @@ }; static pcb_opfunc_t DestroyFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_destroy, pcb_textop_destroy, pcb_polyop_destroy, Index: trunk/src/rotate.c =================================================================== --- trunk/src/rotate.c (revision 28794) +++ trunk/src/rotate.c (revision 28795) @@ -52,6 +52,8 @@ #include "obj_rat_draw.h" pcb_opfunc_t Rotate90Functions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_rotate90, pcb_textop_rotate90, pcb_polyop_rotate90, @@ -65,6 +67,8 @@ }; pcb_opfunc_t RotateFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ pcb_lineop_rotate, pcb_textop_rotate, pcb_polyop_rotate,