Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 31637) +++ trunk/src/buffer.c (revision 31638) @@ -212,7 +212,7 @@ rnd_hid_notify_crosshair_change(hidlib, rnd_false); ctx.buffer.src = pcb->Data; ctx.buffer.dst = Buffer->Data; - pcb_selected_operation(pcb, pcb->Data, fnc, &ctx, rnd_false, PCB_OBJ_ANY & (~PCB_OBJ_SUBC_PART), on_locked_too); + pcb_selected_operation(pcb, pcb->Data, fnc, &ctx, rnd_false, PCB_OBJ_ANY & (~PCB_OBJ_SUBC_PART), on_locked_too ? PCB_OP_ON_LOCKED : 0); /* set origin to passed or current position */ if (X || Y) { Index: trunk/src/change.c =================================================================== --- trunk/src/change.c (revision 31637) +++ trunk/src/change.c (revision 31638) @@ -342,7 +342,7 @@ ctx.chgtherm.style = therm_style; ctx.chgtherm.lid = lid; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeThermalFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeThermalFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -364,7 +364,7 @@ ctx.chgsize.is_absolute = fixIt; ctx.chgsize.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeSizeFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeSizeFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -386,7 +386,7 @@ ctx.chgsize.is_absolute = fixIt; ctx.chgsize.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeClearSizeFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeClearSizeFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -408,7 +408,7 @@ ctx.chgsize.is_absolute = fixIt; ctx.chgsize.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &Change2ndSizeFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &Change2ndSizeFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -430,7 +430,7 @@ ctx.chgsize.is_absolute = fixIt; ctx.chgsize.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeRotFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeRotFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -449,7 +449,7 @@ ctx.chgsize.pcb = PCB; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeJoinFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeJoinFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -468,7 +468,7 @@ ctx.chgsize.pcb = PCB; - change = pcb_selected_operation(PCB, PCB->Data, &SetJoinFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &SetJoinFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -487,7 +487,7 @@ ctx.chgsize.pcb = PCB; - change = pcb_selected_operation(PCB, PCB->Data, &ClrJoinFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &ClrJoinFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -506,7 +506,7 @@ ctx.chgsize.pcb = PCB; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeNonetlistFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeNonetlistFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -528,7 +528,7 @@ ctx.chgangle.is_absolute = fixIt; ctx.chgangle.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeAngleFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeAngleFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -550,7 +550,7 @@ ctx.chgsize.is_absolute = fixIt; ctx.chgsize.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeRadiusFunctions, &ctx, rnd_false, types, rnd_false); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeRadiusFunctions, &ctx, rnd_false, types, 0); if (change) { pcb_draw(); pcb_undo_inc_serial(); Index: trunk/src/move.c =================================================================== --- trunk/src/move.c (revision 31637) +++ trunk/src/move.c (revision 31638) @@ -284,7 +284,7 @@ ctx.move.dst_layer = Target; ctx.move.more_to_come = rnd_true; - changed = pcb_selected_operation(PCB, PCB->Data, &MoveToLayerFunctions, &ctx, rnd_true, PCB_OBJ_ANY, rnd_false); + changed = pcb_selected_operation(PCB, PCB->Data, &MoveToLayerFunctions, &ctx, rnd_true, PCB_OBJ_ANY, 0); /* passing rnd_true to above operation causes Undoserial to auto-increment */ return changed; } Index: trunk/src/operation.c =================================================================== --- trunk/src/operation.c (revision 31637) +++ trunk/src/operation.c (revision 31638) @@ -128,10 +128,11 @@ * resets the selected flag if requested * returns rnd_true if anything has changed */ -static rnd_bool pcb_selected_operation_(pcb_board_t *pcb, pcb_data_t *data, pcb_opfunc_t *F, pcb_opctx_t *ctx, rnd_bool Reset, int type, rnd_bool on_locked_too, rnd_bool floater_only) +static rnd_bool pcb_selected_operation_(pcb_board_t *pcb, pcb_data_t *data, pcb_opfunc_t *F, pcb_opctx_t *ctx, rnd_bool Reset, int type, pcb_op_mode_t mode, rnd_bool floater_only) { rnd_bool changed = rnd_false; pcb_any_obj_t *exto; + int on_locked_too = (mode & PCB_OP_ON_LOCKED); if (!(pcb_brave & PCB_BRAVE_NOCLIPBATCH) && (data != NULL)) pcb_data_clip_inhibit_inc(data); @@ -300,15 +301,15 @@ if (F->common_post != NULL) F->common_post(ctx, (pcb_any_obj_t *)subc, NULL); changed = rnd_true; - if (pcb_selected_operation_(pcb, subc->data, F, ctx, Reset, type, on_locked_too, 1)) + if (pcb_selected_operation_(pcb, subc->data, F, ctx, Reset, type, mode, 1)) changed = rnd_true; } else if ((pcb->loose_subc) || (type & PCB_OBJ_SUBC_PART) || (subc->extobj != NULL)) { - if (pcb_selected_operation_(pcb, subc->data, F, ctx, Reset, type, on_locked_too, 0)) + if (pcb_selected_operation_(pcb, subc->data, F, ctx, Reset, type, mode, 0)) changed = rnd_true; } else - if (pcb_selected_operation_(pcb, subc->data, F, ctx, Reset, type, on_locked_too, 1)) + if (pcb_selected_operation_(pcb, subc->data, F, ctx, Reset, type, mode, 1)) changed = rnd_true; } PCB_END_LOOP; @@ -316,7 +317,7 @@ else { /* there can be selected objects within subcircuits - but deal only with floaters */ PCB_SUBC_LOOP(data); { - if (pcb_selected_operation_(pcb, subc->data, F, ctx, Reset, type, on_locked_too, 1)) + if (pcb_selected_operation_(pcb, subc->data, F, ctx, Reset, type, mode, 1)) changed = rnd_true; } PCB_END_LOOP; @@ -382,8 +383,8 @@ return changed; } -rnd_bool pcb_selected_operation(pcb_board_t *pcb, pcb_data_t *data, pcb_opfunc_t *F, pcb_opctx_t *ctx, rnd_bool Reset, int type, rnd_bool on_locked_too) +rnd_bool pcb_selected_operation(pcb_board_t *pcb, pcb_data_t *data, pcb_opfunc_t *F, pcb_opctx_t *ctx, rnd_bool Reset, int type, pcb_op_mode_t mode) { - return pcb_selected_operation_(pcb, data, F, ctx, Reset, type, on_locked_too, 0); + return pcb_selected_operation_(pcb, data, F, ctx, Reset, type, mode, 0); } Index: trunk/src/operation.h =================================================================== --- trunk/src/operation.h (revision 31637) +++ trunk/src/operation.h (revision 31638) @@ -159,7 +159,11 @@ unsigned int extobj_inhibit_regen:1; } pcb_opfunc_t; +typedef enum { + PCB_OP_ON_LOCKED = 1 +} pcb_op_mode_t; + void *pcb_object_operation(pcb_opfunc_t *F, pcb_opctx_t *ctx, int Type, void *Ptr1, void *Ptr2, void *Ptr3); -rnd_bool pcb_selected_operation(pcb_board_t *pcb, pcb_data_t *data, pcb_opfunc_t *F, pcb_opctx_t *ctx, rnd_bool Reset, int type, rnd_bool on_locked_too); +rnd_bool pcb_selected_operation(pcb_board_t *pcb, pcb_data_t *data, pcb_opfunc_t *F, pcb_opctx_t *ctx, rnd_bool Reset, int type, pcb_op_mode_t mode); #endif Index: trunk/src/remove.c =================================================================== --- trunk/src/remove.c (revision 31637) +++ trunk/src/remove.c (revision 31638) @@ -97,7 +97,7 @@ ctx.remove.pcb = PCB; ctx.remove.destroy_target = NULL; - if (pcb_selected_operation(PCB, PCB->Data, &pcb_RemoveFunctions, &ctx, rnd_false, PCB_OBJ_ANY & (~PCB_OBJ_SUBC_PART), locked_too)) { + if (pcb_selected_operation(PCB, PCB->Data, &pcb_RemoveFunctions, &ctx, rnd_false, PCB_OBJ_ANY & (~PCB_OBJ_SUBC_PART), locked_too ? PCB_OP_ON_LOCKED : 0)) { pcb_undo_inc_serial(); pcb_draw(); return rnd_true;