Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 18816) +++ trunk/src/buffer.c (revision 18817) @@ -143,7 +143,7 @@ pcb_notify_crosshair_change(pcb_false); ctx.buffer.src = pcb->Data; ctx.buffer.dst = Buffer->Data; - pcb_selected_operation(pcb, pcb->Data, fnc, &ctx, pcb_false, PCB_OBJ_ANY & (~PCB_OBJ_SUBC_PART)); + pcb_selected_operation(pcb, pcb->Data, fnc, &ctx, pcb_false, PCB_OBJ_ANY & (~PCB_OBJ_SUBC_PART), pcb_true); /* set origin to passed or current position */ if (X || Y) { Index: trunk/src/change.c =================================================================== --- trunk/src/change.c (revision 18816) +++ trunk/src/change.c (revision 18817) @@ -252,7 +252,7 @@ ctx.chgtherm.style = therm_style; ctx.chgtherm.lid = lid; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeThermalFunctions, &ctx, pcb_false, types); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeThermalFunctions, &ctx, pcb_false, types, pcb_false); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -274,7 +274,7 @@ ctx.chgsize.is_absolute = fixIt; ctx.chgsize.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeSizeFunctions, &ctx, pcb_false, types); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeSizeFunctions, &ctx, pcb_false, types, pcb_false); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -296,7 +296,7 @@ ctx.chgsize.is_absolute = fixIt; ctx.chgsize.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeClearSizeFunctions, &ctx, pcb_false, types); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeClearSizeFunctions, &ctx, pcb_false, types, pcb_false); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -318,7 +318,7 @@ ctx.chgsize.is_absolute = fixIt; ctx.chgsize.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &Change2ndSizeFunctions, &ctx, pcb_false, types); + change = pcb_selected_operation(PCB, PCB->Data, &Change2ndSizeFunctions, &ctx, pcb_false, types, pcb_false); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -337,7 +337,7 @@ ctx.chgsize.pcb = PCB; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeJoinFunctions, &ctx, pcb_false, types); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeJoinFunctions, &ctx, pcb_false, types, pcb_false); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -356,7 +356,7 @@ ctx.chgsize.pcb = PCB; - change = pcb_selected_operation(PCB, PCB->Data, &SetJoinFunctions, &ctx, pcb_false, types); + change = pcb_selected_operation(PCB, PCB->Data, &SetJoinFunctions, &ctx, pcb_false, types, pcb_false); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -375,7 +375,7 @@ ctx.chgsize.pcb = PCB; - change = pcb_selected_operation(PCB, PCB->Data, &ClrJoinFunctions, &ctx, pcb_false, types); + change = pcb_selected_operation(PCB, PCB->Data, &ClrJoinFunctions, &ctx, pcb_false, types, pcb_false); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -394,7 +394,7 @@ ctx.chgsize.pcb = PCB; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeNonetlistFunctions, &ctx, pcb_false, types); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeNonetlistFunctions, &ctx, pcb_false, types, pcb_false); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -416,7 +416,7 @@ ctx.chgangle.is_absolute = fixIt; ctx.chgangle.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeAngleFunctions, &ctx, pcb_false, types); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeAngleFunctions, &ctx, pcb_false, types, pcb_false); if (change) { pcb_draw(); pcb_undo_inc_serial(); @@ -438,7 +438,7 @@ ctx.chgsize.is_absolute = fixIt; ctx.chgsize.value = Difference; - change = pcb_selected_operation(PCB, PCB->Data, &ChangeRadiusFunctions, &ctx, pcb_false, types); + change = pcb_selected_operation(PCB, PCB->Data, &ChangeRadiusFunctions, &ctx, pcb_false, types, pcb_false); if (change) { pcb_draw(); pcb_undo_inc_serial(); Index: trunk/src/move.c =================================================================== --- trunk/src/move.c (revision 18816) +++ trunk/src/move.c (revision 18817) @@ -246,7 +246,7 @@ ctx.move.dst_layer = Target; ctx.move.more_to_come = pcb_true; - changed = pcb_selected_operation(PCB, PCB->Data, &MoveToLayerFunctions, &ctx, pcb_true, PCB_OBJ_ANY); + changed = pcb_selected_operation(PCB, PCB->Data, &MoveToLayerFunctions, &ctx, pcb_true, PCB_OBJ_ANY, pcb_false); /* passing pcb_true to above operation causes Undoserial to auto-increment */ return changed; } Index: trunk/src/operation.c =================================================================== --- trunk/src/operation.c (revision 18816) +++ trunk/src/operation.c (revision 18817) @@ -100,7 +100,7 @@ * resets the selected flag if requested * returns pcb_true if anything has changed */ -pcb_bool pcb_selected_operation(pcb_board_t *pcb, pcb_data_t *data, pcb_opfunc_t *F, pcb_opctx_t *ctx, pcb_bool Reset, int type) +pcb_bool pcb_selected_operation(pcb_board_t *pcb, pcb_data_t *data, pcb_opfunc_t *F, pcb_opctx_t *ctx, pcb_bool Reset, int type, pcb_bool on_locked_too) { pcb_bool changed = pcb_false; @@ -110,6 +110,8 @@ { if (!PCB_FLAG_TEST(PCB_FLAG_SELECTED, line)) continue; + if (!on_locked_too && PCB_FLAG_TEST(PCB_FLAG_LOCK, line)) + continue; if (Reset) { pcb_undo_add_obj_to_flag(line); PCB_FLAG_CLEAR(PCB_FLAG_SELECTED, line); @@ -180,7 +182,7 @@ changed = pcb_true; } else if ((pcb->loose_subc) || (type & PCB_OBJ_SUBC_PART)) { - if (pcb_selected_operation(pcb, subc->data, F, ctx, Reset, type)) + if (pcb_selected_operation(pcb, subc->data, F, ctx, Reset, type, on_locked_too)) changed = pcb_true; } } Index: trunk/src/operation.h =================================================================== --- trunk/src/operation.h (revision 18816) +++ trunk/src/operation.h (revision 18817) @@ -148,6 +148,6 @@ } pcb_opfunc_t; void *pcb_object_operation(pcb_opfunc_t *F, pcb_opctx_t *ctx, int Type, void *Ptr1, void *Ptr2, void *Ptr3); -pcb_bool pcb_selected_operation(pcb_board_t *pcb, pcb_data_t *data, pcb_opfunc_t *F, pcb_opctx_t *ctx, pcb_bool Reset, int type); +pcb_bool pcb_selected_operation(pcb_board_t *pcb, pcb_data_t *data, pcb_opfunc_t *F, pcb_opctx_t *ctx, pcb_bool Reset, int type, pcb_bool on_locked_too); #endif Index: trunk/src/remove.c =================================================================== --- trunk/src/remove.c (revision 18816) +++ trunk/src/remove.c (revision 18817) @@ -71,7 +71,7 @@ * removes all selected and visible objects * returns pcb_true if any objects have been removed */ -pcb_bool pcb_remove_selected(void) +pcb_bool pcb_remove_selected(pcb_bool locked_too) { pcb_opctx_t ctx; @@ -78,7 +78,7 @@ ctx.remove.pcb = PCB; ctx.remove.destroy_target = NULL; - if (pcb_selected_operation(PCB, PCB->Data, &RemoveFunctions, &ctx, pcb_false, PCB_OBJ_ANY & (~PCB_OBJ_SUBC_PART))) { + if (pcb_selected_operation(PCB, PCB->Data, &RemoveFunctions, &ctx, pcb_false, PCB_OBJ_ANY & (~PCB_OBJ_SUBC_PART), locked_too)) { pcb_undo_inc_serial(); pcb_draw(); return pcb_true; Index: trunk/src/remove.h =================================================================== --- trunk/src/remove.h (revision 18816) +++ trunk/src/remove.h (revision 18817) @@ -37,7 +37,7 @@ (PCB_OBJ_PSTK | PCB_OBJ_LINE_POINT | PCB_OBJ_LINE | PCB_OBJ_TEXT | PCB_OBJ_SUBC | \ PCB_OBJ_POLY_POINT | PCB_OBJ_POLY | PCB_OBJ_RAT | PCB_OBJ_ARC | PCB_OBJ_ARC_POINT) -pcb_bool pcb_remove_selected(void); +pcb_bool pcb_remove_selected(pcb_bool locked_too); /* Undoable delete (operation wrapper) */ void *pcb_remove_object(int Type, void *Ptr1, void *Ptr2, void *Ptr3); Index: trunk/src/remove_act.c =================================================================== --- trunk/src/remove_act.c (revision 18816) +++ trunk/src/remove_act.c (revision 18817) @@ -53,7 +53,7 @@ PCB_ACT_CONVARG(1, FGW_KEYWORD, Delete, id = fgw_keyword(&argv[1])); if (id == -1) { /* no arg */ - if (pcb_remove_selected() == pcb_false) + if (pcb_remove_selected(pcb_false) == pcb_false) id = F_Object; } @@ -66,7 +66,7 @@ pcb_tool_restore(); break; case F_Selected: - pcb_remove_selected(); + pcb_remove_selected(pcb_false); break; case F_AllRats: if (pcb_rats_destroy(pcb_false)) @@ -91,7 +91,7 @@ static fgw_error_t pcb_act_RemoveSelected(fgw_arg_t *res, int argc, fgw_arg_t *argv) { - if (pcb_remove_selected()) + if (pcb_remove_selected(pcb_false)) pcb_board_set_changed_flag(pcb_true); PCB_ACT_IRES(0); return 0; Index: trunk/src/select_act.c =================================================================== --- trunk/src/select_act.c (revision 18816) +++ trunk/src/select_act.c (revision 18817) @@ -151,7 +151,7 @@ y = pcb_grid_fit(y, PCB->Grid, PCB->GridOffsetY); pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, x, y, pcb_true); pcb_undo_save_serial(); - pcb_remove_selected(); + pcb_remove_selected(pcb_false); pcb_subc_convert_from_buffer(PCB_PASTEBUFFER); pcb_undo_restore_serial(); pcb_buffer_copy_to_layout(PCB, x, y); Index: trunk/src/tool_arrow.c =================================================================== --- trunk/src/tool_arrow.c (revision 18816) +++ trunk/src/tool_arrow.c (revision 18817) @@ -70,7 +70,7 @@ pcb_buffer_clear(PCB, PCB_PASTEBUFFER); pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, pcb_tool_note.X, pcb_tool_note.Y, pcb_true); pcb_undo_save_serial(); - pcb_remove_selected(); + pcb_remove_selected(pcb_false); pcb_tool_save(); pcb_tool_is_saved = pcb_true; pcb_tool_select_by_id(PCB_MODE_PASTE_BUFFER);