Index: trunk/src/action_helper.c =================================================================== --- trunk/src/action_helper.c (revision 12756) +++ trunk/src/action_helper.c (revision 12757) @@ -220,63 +220,8 @@ void pcb_release_mode(void) { - pcb_box_t box; + pcb_tool_release_mode(); - if (Note.Click) { - pcb_box_t box; - - box.X1 = -PCB_MAX_COORD; - box.Y1 = -PCB_MAX_COORD; - box.X2 = PCB_MAX_COORD; - box.Y2 = PCB_MAX_COORD; - - Note.Click = pcb_false; /* inhibit timer action */ - pcb_undo_save_serial(); - /* unselect first if shift key not down */ - if (!pcb_gui->shift_is_pressed()) { - if (pcb_select_block(PCB, &box, pcb_false)) - pcb_board_set_changed_flag(pcb_true); - if (Note.Moving) { - Note.Moving = 0; - Note.Hit = 0; - return; - } - } - /* Restore the SN so that if we select something the deselect/select combo - gets the same SN. */ - pcb_undo_restore_serial(); - if (pcb_select_object(PCB)) - pcb_board_set_changed_flag(pcb_true); - else - pcb_undo_inc_serial(); /* We didn't select anything new, so, the deselection should get its own SN. */ - Note.Hit = 0; - Note.Moving = 0; - } - else if (Note.Moving) { - pcb_undo_restore_serial(); - pcb_notify_mode(); - pcb_buffer_clear(PCB, PCB_PASTEBUFFER); - pcb_buffer_set_number(Note.Buffer); - Note.Moving = pcb_false; - Note.Hit = 0; - } - else if (Note.Hit) { - pcb_notify_mode(); - Note.Hit = 0; - } - else if (conf_core.editor.mode == PCB_MODE_ARROW) { - box.X1 = pcb_crosshair.AttachedBox.Point1.X; - box.Y1 = pcb_crosshair.AttachedBox.Point1.Y; - box.X2 = pcb_crosshair.AttachedBox.Point2.X; - box.Y2 = pcb_crosshair.AttachedBox.Point2.Y; - - pcb_undo_restore_serial(); - if (pcb_select_block(PCB, &box, pcb_true)) - pcb_board_set_changed_flag(pcb_true); - else if (pcb_bumped) - pcb_undo_inc_serial(); - pcb_crosshair.AttachedBox.State = PCB_CH_STATE_FIRST; - } if (saved_mode) pcb_crosshair_restore_mode(); saved_mode = pcb_false; Index: trunk/src/tool.c =================================================================== --- trunk/src/tool.c (revision 12756) +++ trunk/src/tool.c (revision 12757) @@ -138,6 +138,11 @@ wrap_void(notify_mode, ()); } +void pcb_tool_release_mode(void) +{ + wrap_void(release_mode, ()); +} + void pcb_tool_adjust_attached_objects(void) { wrap_void(adjust_attached_objects, ()); Index: trunk/src/tool.h =================================================================== --- trunk/src/tool.h (revision 12756) +++ trunk/src/tool.h (revision 12757) @@ -37,6 +37,7 @@ /* tool implementation */ void (*notify_mode)(void); + void (*release_mode)(void); void (*adjust_attached_objects)(void); void (*draw_attached)(void); pcb_bool (*undo_act)(void); @@ -68,6 +69,7 @@ as defined in conf_core.editor.mode ****/ void pcb_tool_notify_mode(void); +void pcb_tool_release_mode(void); void pcb_tool_adjust_attached_objects(void); void pcb_tool_draw_attached(void); pcb_bool pcb_tool_undo_act(void); Index: trunk/src/tool_arc.c =================================================================== --- trunk/src/tool_arc.c (revision 12756) +++ trunk/src/tool_arc.c (revision 12757) @@ -138,6 +138,7 @@ pcb_tool_t pcb_tool_arc = { "arc", NULL, 100, pcb_tool_arc_notify_mode, + NULL, pcb_tool_arc_adjust_attached_objects, pcb_tool_arc_draw_attached, pcb_tool_arc_undo_act, Index: trunk/src/tool_arrow.c =================================================================== --- trunk/src/tool_arrow.c (revision 12756) +++ trunk/src/tool_arrow.c (revision 12757) @@ -137,6 +137,55 @@ } } +void pcb_tool_arrow_release_mode(void) +{ + pcb_box_t box; + + if (Note.Click) { + pcb_box_t box; + + box.X1 = -PCB_MAX_COORD; + box.Y1 = -PCB_MAX_COORD; + box.X2 = PCB_MAX_COORD; + box.Y2 = PCB_MAX_COORD; + + Note.Click = pcb_false; /* inhibit timer action */ + pcb_undo_save_serial(); + /* unselect first if shift key not down */ + if (!pcb_gui->shift_is_pressed()) { + if (pcb_select_block(PCB, &box, pcb_false)) + pcb_board_set_changed_flag(pcb_true); + if (Note.Moving) { + Note.Moving = 0; + Note.Hit = 0; + return; + } + } + /* Restore the SN so that if we select something the deselect/select combo + gets the same SN. */ + pcb_undo_restore_serial(); + if (pcb_select_object(PCB)) + pcb_board_set_changed_flag(pcb_true); + else + pcb_undo_inc_serial(); /* We didn't select anything new, so, the deselection should get its own SN. */ + Note.Hit = 0; + Note.Moving = 0; + } + else { + box.X1 = pcb_crosshair.AttachedBox.Point1.X; + box.Y1 = pcb_crosshair.AttachedBox.Point1.Y; + box.X2 = pcb_crosshair.AttachedBox.Point2.X; + box.Y2 = pcb_crosshair.AttachedBox.Point2.Y; + + pcb_undo_restore_serial(); + if (pcb_select_block(PCB, &box, pcb_true)) + pcb_board_set_changed_flag(pcb_true); + else if (pcb_bumped) + pcb_undo_inc_serial(); + pcb_crosshair.AttachedBox.State = PCB_CH_STATE_FIRST; + } +} + void pcb_tool_arrow_adjust_attached_objects(void) { if (pcb_crosshair.AttachedBox.State) { @@ -148,6 +197,7 @@ pcb_tool_t pcb_tool_arrow = { "arrow", NULL, 10, pcb_tool_arrow_notify_mode, + pcb_tool_arrow_release_mode, pcb_tool_arrow_adjust_attached_objects, NULL, NULL, Index: trunk/src/tool_arrow.h =================================================================== --- trunk/src/tool_arrow.h (revision 12756) +++ trunk/src/tool_arrow.h (revision 12757) @@ -1,4 +1,5 @@ extern pcb_tool_t pcb_tool_arrow; void pcb_tool_arrow_notify_mode(void); +void pcb_tool_arrow_release_mode(void); void pcb_tool_arrow_adjust_attached_objects(void); Index: trunk/src/tool_buffer.c =================================================================== --- trunk/src/tool_buffer.c (revision 12756) +++ trunk/src/tool_buffer.c (revision 12757) @@ -38,6 +38,7 @@ #include "rtree.h" #include "search.h" #include "tool.h" +#include "undo.h" #include "obj_elem_draw.h" @@ -89,6 +90,18 @@ } } +void pcb_tool_buffer_release_mode(void) +{ + if (Note.Moving) { + pcb_undo_restore_serial(); + pcb_tool_buffer_notify_mode(); + pcb_buffer_clear(PCB, PCB_PASTEBUFFER); + pcb_buffer_set_number(Note.Buffer); + Note.Moving = pcb_false; + Note.Hit = 0; + } +} + void pcb_tool_buffer_draw_attached(void) { XORDrawBuffer(PCB_PASTEBUFFER); @@ -97,6 +110,7 @@ pcb_tool_t pcb_tool_buffer = { "buffer", NULL, 100, pcb_tool_buffer_notify_mode, + pcb_tool_buffer_release_mode, NULL, pcb_tool_buffer_draw_attached, NULL, Index: trunk/src/tool_buffer.h =================================================================== --- trunk/src/tool_buffer.h (revision 12756) +++ trunk/src/tool_buffer.h (revision 12757) @@ -1,4 +1,5 @@ extern pcb_tool_t pcb_tool_buffer; void pcb_tool_buffer_notify_mode(void); +void pcb_tool_buffer_release_mode(void); void pcb_tool_buffer_draw_attached(void); Index: trunk/src/tool_copy.c =================================================================== --- trunk/src/tool_copy.c (revision 12756) +++ trunk/src/tool_copy.c (revision 12757) @@ -68,6 +68,14 @@ } } +void pcb_tool_copy_release_mode (void) +{ + if (Note.Hit) { + pcb_tool_copy_notify_mode(); + Note.Hit = 0; + } +} + void pcb_tool_copy_draw_attached(void) { XORDrawMoveOrCopy(); @@ -84,6 +92,7 @@ pcb_tool_t pcb_tool_copy = { "copy", NULL, 100, pcb_tool_copy_notify_mode, + pcb_tool_copy_release_mode, NULL, pcb_tool_copy_draw_attached, pcb_tool_copy_undo_act, Index: trunk/src/tool_copy.h =================================================================== --- trunk/src/tool_copy.h (revision 12756) +++ trunk/src/tool_copy.h (revision 12757) @@ -1,5 +1,6 @@ extern pcb_tool_t pcb_tool_copy; void pcb_tool_copy_notify_mode(void); +void pcb_tool_copy_release_mode (void); void pcb_tool_copy_draw_attached(void); pcb_bool pcb_tool_copy_undo_act(void); Index: trunk/src/tool_insert.c =================================================================== --- trunk/src/tool_insert.c (revision 12756) +++ trunk/src/tool_insert.c (revision 12757) @@ -122,6 +122,7 @@ pcb_tool_t pcb_tool_insert = { "insert", NULL, 100, pcb_tool_insert_notify_mode, + NULL, pcb_tool_insert_adjust_attached_objects, pcb_tool_insert_draw_attached, pcb_tool_insert_undo_act, Index: trunk/src/tool_line.c =================================================================== --- trunk/src/tool_line.c (revision 12756) +++ trunk/src/tool_line.c (revision 12757) @@ -410,6 +410,7 @@ pcb_tool_t pcb_tool_line = { "line", NULL, 100, pcb_tool_line_notify_mode, + NULL, pcb_tool_line_adjust_attached_objects, pcb_tool_line_draw_attached, pcb_tool_line_undo_act, Index: trunk/src/tool_lock.c =================================================================== --- trunk/src/tool_lock.c (revision 12756) +++ trunk/src/tool_lock.c (revision 12757) @@ -99,5 +99,6 @@ NULL, NULL, NULL, + NULL, NULL }; Index: trunk/src/tool_move.c =================================================================== --- trunk/src/tool_move.c (revision 12756) +++ trunk/src/tool_move.c (revision 12757) @@ -76,6 +76,14 @@ } } +void pcb_tool_move_release_mode (void) +{ + if (Note.Hit) { + pcb_tool_move_notify_mode(); + Note.Hit = 0; + } +} + void pcb_tool_move_draw_attached(void) { XORDrawMoveOrCopy(); @@ -92,6 +100,7 @@ pcb_tool_t pcb_tool_move = { "move", NULL, 100, pcb_tool_move_notify_mode, + pcb_tool_move_release_mode, NULL, pcb_tool_move_draw_attached, pcb_tool_move_undo_act, Index: trunk/src/tool_move.h =================================================================== --- trunk/src/tool_move.h (revision 12756) +++ trunk/src/tool_move.h (revision 12757) @@ -1,5 +1,6 @@ extern pcb_tool_t pcb_tool_move; void pcb_tool_move_notify_mode(void); +void pcb_tool_move_release_mode (void); void pcb_tool_move_draw_attached(void); pcb_bool pcb_tool_move_undo_act(void); Index: trunk/src/tool_poly.c =================================================================== --- trunk/src/tool_poly.c (revision 12756) +++ trunk/src/tool_poly.c (revision 12757) @@ -117,6 +117,7 @@ pcb_tool_t pcb_tool_poly = { "poly", NULL, 100, pcb_tool_poly_notify_mode, + NULL, pcb_tool_poly_adjust_attached_objects, pcb_tool_poly_draw_attached, pcb_tool_poly_undo_act, Index: trunk/src/tool_polyhole.c =================================================================== --- trunk/src/tool_polyhole.c (revision 12756) +++ trunk/src/tool_polyhole.c (revision 12757) @@ -148,6 +148,7 @@ pcb_tool_t pcb_tool_polyhole = { "polyhole", NULL, 100, pcb_tool_polyhole_notify_mode, + NULL, pcb_tool_polyhole_adjust_attached_objects, pcb_tool_polyhole_draw_attached, pcb_tool_polyhole_undo_act, Index: trunk/src/tool_rectangle.c =================================================================== --- trunk/src/tool_rectangle.c (revision 12756) +++ trunk/src/tool_rectangle.c (revision 12757) @@ -101,6 +101,7 @@ pcb_tool_t pcb_tool_rectangle = { "rectangle", NULL, 100, pcb_tool_rectangle_notify_mode, + NULL, pcb_tool_rectangle_adjust_attached_objects, NULL, pcb_tool_rectangle_undo_act, Index: trunk/src/tool_remove.c =================================================================== --- trunk/src/tool_remove.c (revision 12756) +++ trunk/src/tool_remove.c (revision 12757) @@ -63,5 +63,6 @@ NULL, NULL, NULL, + NULL, NULL }; Index: trunk/src/tool_rotate.c =================================================================== --- trunk/src/tool_rotate.c (revision 12756) +++ trunk/src/tool_rotate.c (revision 12757) @@ -47,5 +47,6 @@ NULL, NULL, NULL, + NULL, NULL }; Index: trunk/src/tool_text.c =================================================================== --- trunk/src/tool_text.c (revision 12756) +++ trunk/src/tool_text.c (revision 12757) @@ -70,5 +70,6 @@ NULL, NULL, NULL, + NULL, NULL }; Index: trunk/src/tool_thermal.c =================================================================== --- trunk/src/tool_thermal.c (revision 12756) +++ trunk/src/tool_thermal.c (revision 12757) @@ -118,5 +118,6 @@ NULL, NULL, NULL, + NULL, NULL }; Index: trunk/src/tool_via.c =================================================================== --- trunk/src/tool_via.c (revision 12756) +++ trunk/src/tool_via.c (revision 12757) @@ -113,6 +113,7 @@ "via", NULL, 100, pcb_tool_via_notify_mode, NULL, + NULL, pcb_tool_via_draw_attached, NULL, NULL