Index: trunk/src/crosshair.h =================================================================== --- trunk/src/crosshair.h (revision 28717) +++ trunk/src/crosshair.h (revision 28718) @@ -74,6 +74,7 @@ vtop_t onpoint_objs; vtop_t old_onpoint_objs; pcb_pstk_t *snapped_pstk; + pcb_any_obj_t *extobj_edit; /* refers to the editobject (of an extobj) being edited */ /* list of object IDs that could have been dragged so that they can be cycled */ long int *drags; Index: trunk/src/extobj.h =================================================================== --- trunk/src/extobj.h (revision 28717) +++ trunk/src/extobj.h (revision 28718) @@ -98,20 +98,23 @@ return pcb_extobj_get_editobj_by_attr(obj); } -PCB_INLINE void pcb_extobj_edit_pre(pcb_any_obj_t *edit_obj) +/* Calls edit_pre() and returns edit_obj if it is really the edit object of + a known extended object */ +PCB_INLINE pcb_any_obj_t *pcb_extobj_edit_pre(pcb_any_obj_t *edit_obj) { pcb_subc_t *sc = pcb_extobj_get_subcobj_by_attr(edit_obj); pcb_extobj_t *eo; if (sc == NULL) - return; + return NULL; eo = pcb_extobj_get(sc); if (eo == NULL) - return; + return NULL; if (eo->edit_pre != NULL) eo->edit_pre(sc, edit_obj); + return edit_obj; } PCB_INLINE void pcb_extobj_edit_geo(pcb_any_obj_t *edit_obj) Index: trunk/src/tool_arrow.c =================================================================== --- trunk/src/tool_arrow.c (revision 28717) +++ trunk/src/tool_arrow.c (revision 28718) @@ -55,6 +55,7 @@ pcb_crosshair.AttachedObject.Type = PCB_OBJ_VOID; pcb_crosshair.AttachedObject.State = PCB_CH_STATE_FIRST; pcb_crosshair.AttachedBox.State = PCB_CH_STATE_FIRST; + pcb_crosshair.extobj_edit = NULL; pcb_notify_crosshair_change(pcb_true); } @@ -154,7 +155,7 @@ pcb_tool_note.ptr3 = ptr3; pcb_crosshair.AttachedObject.tx = pcb_tool_note.X; pcb_crosshair.AttachedObject.ty = pcb_tool_note.Y; - pcb_extobj_edit_pre(ptr2); + pcb_crosshair.extobj_edit = pcb_extobj_edit_pre(ptr2); } if (!pcb_tool_note.Moving && (type & (PCB_SELECT_TYPES | PCB_LOOSE_SUBC(PCB))) && PCB_FLAG_TEST(PCB_FLAG_SELECTED, (pcb_any_obj_t *) ptr2)) { pcb_tool_note.Moving = pcb_true; @@ -161,7 +162,7 @@ /* remember where the user clicked to start this op */ pcb_crosshair.AttachedObject.tx = pcb_crosshair.AttachedObject.X = pcb_tool_note.X; pcb_crosshair.AttachedObject.ty = pcb_crosshair.AttachedObject.Y = pcb_tool_note.Y; - pcb_extobj_edit_pre(ptr2); + pcb_crosshair.extobj_edit = pcb_extobj_edit_pre(ptr2); } if ((pcb_tool_note.Hit && pcb_tool_note.Moving) || type == PCB_OBJ_VOID) return; Index: trunk/src/tool_copy.c =================================================================== --- trunk/src/tool_copy.c (revision 28717) +++ trunk/src/tool_copy.c (revision 28718) @@ -46,6 +46,7 @@ pcb_crosshair.AttachedObject.Type = PCB_OBJ_VOID; pcb_crosshair.AttachedObject.State = PCB_CH_STATE_FIRST; pcb_notify_crosshair_change(pcb_true); + pcb_crosshair.extobj_edit = NULL; } void pcb_tool_copy_notify_mode(pcb_hidlib_t *hl) @@ -85,6 +86,7 @@ /* reset identifiers */ pcb_crosshair.AttachedObject.Type = PCB_OBJ_VOID; pcb_crosshair.AttachedObject.State = PCB_CH_STATE_FIRST; + pcb_crosshair.extobj_edit = NULL; break; } } Index: trunk/src/tool_insert.c =================================================================== --- trunk/src/tool_insert.c (revision 28717) +++ trunk/src/tool_insert.c (revision 28718) @@ -56,6 +56,7 @@ pcb_notify_crosshair_change(pcb_false); pcb_crosshair.AttachedObject.Type = PCB_OBJ_VOID; pcb_crosshair.AttachedObject.State = PCB_CH_STATE_FIRST; + pcb_crosshair.extobj_edit = NULL; pcb_notify_crosshair_change(pcb_true); } @@ -73,6 +74,7 @@ if (PCB_FLAG_TEST(PCB_FLAG_LOCK, obj)) { pcb_message(PCB_MSG_WARNING, "Sorry, %s object is locked\n", pcb_obj_type_name(obj->type)); pcb_crosshair.AttachedObject.Type = PCB_OBJ_VOID; + pcb_crosshair.extobj_edit = NULL; break; } else { @@ -106,6 +108,7 @@ /* reset identifiers */ pcb_crosshair.AttachedObject.Type = PCB_OBJ_VOID; pcb_crosshair.AttachedObject.State = PCB_CH_STATE_FIRST; + pcb_crosshair.extobj_edit = NULL; break; } } Index: trunk/src/tool_move.c =================================================================== --- trunk/src/tool_move.c (revision 28717) +++ trunk/src/tool_move.c (revision 28718) @@ -48,6 +48,7 @@ pcb_crosshair.AttachedObject.Type = PCB_OBJ_VOID; pcb_crosshair.AttachedObject.State = PCB_CH_STATE_FIRST; pcb_notify_crosshair_change(pcb_true); + pcb_crosshair.extobj_edit = NULL; } void pcb_tool_move_notify_mode(pcb_hidlib_t *hl) @@ -68,6 +69,7 @@ if (PCB_FLAG_TEST(PCB_FLAG_LOCK, obj)) { pcb_message(PCB_MSG_WARNING, "Sorry, %s object is locked\n", pcb_obj_type_name(obj->type)); pcb_crosshair.AttachedObject.Type = PCB_OBJ_VOID; + pcb_crosshair.extobj_edit = NULL; } else pcb_tool_attach_for_copy(hl, pcb_tool_note.X, pcb_tool_note.Y, pcb_true); @@ -87,11 +89,14 @@ pcb_subc_as_board_update(PCB); pcb_board_set_changed_flag(pcb_true); } + else if (pcb_crosshair.extobj_edit != NULL) + pcb_extobj_edit_geo(pcb_crosshair.extobj_edit); /* reset identifiers */ pcb_crosshair.AttachedObject.Type = PCB_OBJ_VOID; pcb_crosshair.AttachedObject.State = PCB_CH_STATE_FIRST; pcb_crosshair_set_range(0, 0, hl->size_x, hl->size_y); + pcb_crosshair.extobj_edit = NULL; break; } } Index: trunk/src/tool_polyhole.c =================================================================== --- trunk/src/tool_polyhole.c (revision 28717) +++ trunk/src/tool_polyhole.c (revision 28718) @@ -71,6 +71,7 @@ if (PCB_FLAG_TEST(PCB_FLAG_LOCK, (pcb_poly_t *)pcb_crosshair.AttachedObject.Ptr2)) { pcb_message(PCB_MSG_WARNING, "Sorry, poly object is locked\n"); pcb_crosshair.AttachedObject.Type = PCB_OBJ_VOID; + pcb_crosshair.extobj_edit = NULL; break; } else