Index: trunk/src/tool.c =================================================================== --- trunk/src/tool.c (revision 12562) +++ trunk/src/tool.c (revision 12563) @@ -146,6 +146,11 @@ wrap_retv(undo_act, return pcb_true, ()); } +pcb_bool pcb_tool_redo_act(void) +{ + wrap_retv(redo_act, return pcb_true, ()); +} + #warning tool TODO: move this out to a tool plugin #include "tool_arc.h" Index: trunk/src/tool.h =================================================================== --- trunk/src/tool.h (revision 12562) +++ trunk/src/tool.h (revision 12563) @@ -39,6 +39,7 @@ void (*notify_mode)(void); void (*adjust_attached_objects)(void); int (*undo_act)(void); + pcb_bool (*redo_act)(void); } pcb_tool_t; vtp0_t pcb_tools; @@ -68,6 +69,7 @@ void pcb_tool_notify_mode(void); void pcb_tool_adjust_attached_objects(void); pcb_bool pcb_tool_undo_act(void); +pcb_bool pcb_tool_redo_act(void); Index: trunk/src/tool_arc.c =================================================================== --- trunk/src/tool_arc.c (revision 12562) +++ trunk/src/tool_arc.c (revision 12563) @@ -127,5 +127,6 @@ "arc", NULL, 100, pcb_tool_arc_notify_mode, pcb_tool_arc_adjust_attached_objects, - pcb_tool_arc_undo_act + pcb_tool_arc_undo_act, + NULL }; Index: trunk/src/tool_arrow.c =================================================================== --- trunk/src/tool_arrow.c (revision 12562) +++ trunk/src/tool_arrow.c (revision 12563) @@ -149,5 +149,6 @@ "arrow", NULL, 10, pcb_tool_arrow_notify_mode, pcb_tool_arrow_adjust_attached_objects, + NULL, NULL }; Index: trunk/src/tool_buffer.c =================================================================== --- trunk/src/tool_buffer.c (revision 12562) +++ trunk/src/tool_buffer.c (revision 12563) @@ -93,5 +93,6 @@ "buffer", NULL, 100, pcb_tool_buffer_notify_mode, NULL, + NULL, NULL }; Index: trunk/src/tool_copy.c =================================================================== --- trunk/src/tool_copy.c (revision 12562) +++ trunk/src/tool_copy.c (revision 12563) @@ -80,5 +80,6 @@ "copy", NULL, 100, pcb_tool_copy_notify_mode, NULL, - pcb_tool_copy_undo_act + pcb_tool_copy_undo_act, + NULL }; Index: trunk/src/tool_insert.c =================================================================== --- trunk/src/tool_insert.c (revision 12562) +++ trunk/src/tool_insert.c (revision 12563) @@ -118,5 +118,6 @@ "insert", NULL, 100, pcb_tool_insert_notify_mode, pcb_tool_insert_adjust_attached_objects, - pcb_tool_insert_undo_act + pcb_tool_insert_undo_act, + NULL }; Index: trunk/src/tool_line.c =================================================================== --- trunk/src/tool_line.c (revision 12562) +++ trunk/src/tool_line.c (revision 12563) @@ -313,9 +313,26 @@ return pcb_true; } +pcb_bool pcb_tool_line_redo_act(void) +{ + if (pcb_crosshair.AttachedLine.State == PCB_CH_STATE_SECOND) + return pcb_false; + if (pcb_redo(pcb_true)) { + pcb_board_set_changed_flag(pcb_true); + if (pcb_crosshair.AttachedLine.State != PCB_CH_STATE_FIRST) { + pcb_line_t *line = linelist_last(&CURRENT->Line); + pcb_crosshair.AttachedLine.Point1.X = pcb_crosshair.AttachedLine.Point2.X = line->Point2.X; + pcb_crosshair.AttachedLine.Point1.Y = pcb_crosshair.AttachedLine.Point2.Y = line->Point2.Y; + pcb_added_lines++; + } + } + return pcb_false; +} + pcb_tool_t pcb_tool_line = { "line", NULL, 100, pcb_tool_line_notify_mode, pcb_tool_line_adjust_attached_objects, - pcb_tool_line_undo_act + pcb_tool_line_undo_act, + pcb_tool_line_redo_act }; Index: trunk/src/tool_line.h =================================================================== --- trunk/src/tool_line.h (revision 12562) +++ trunk/src/tool_line.h (revision 12563) @@ -3,3 +3,4 @@ void pcb_tool_line_notify_mode(void); void pcb_tool_line_adjust_attached_objects(void); pcb_bool pcb_tool_line_undo_act(void); +pcb_bool pcb_tool_line_redo_act(void); Index: trunk/src/tool_lock.c =================================================================== --- trunk/src/tool_lock.c (revision 12562) +++ trunk/src/tool_lock.c (revision 12563) @@ -97,5 +97,6 @@ "lock", NULL, 100, pcb_tool_lock_notify_mode, NULL, + NULL, NULL }; Index: trunk/src/tool_move.c =================================================================== --- trunk/src/tool_move.c (revision 12562) +++ trunk/src/tool_move.c (revision 12563) @@ -88,5 +88,6 @@ "move", NULL, 100, pcb_tool_move_notify_mode, NULL, - pcb_tool_move_undo_act + pcb_tool_move_undo_act, + NULL }; Index: trunk/src/tool_poly.c =================================================================== --- trunk/src/tool_poly.c (revision 12562) +++ trunk/src/tool_poly.c (revision 12563) @@ -88,9 +88,19 @@ return pcb_true; } +pcb_bool pcb_tool_poly_redo_act(void) +{ + if (pcb_crosshair.AttachedPolygon.PointN) + return pcb_false; + else + return pcb_true; +} + pcb_tool_t pcb_tool_poly = { "poly", NULL, 100, pcb_tool_poly_notify_mode, pcb_tool_poly_adjust_attached_objects, - pcb_tool_poly_undo_act + pcb_tool_poly_undo_act, + pcb_tool_poly_redo_act, + NULL }; Index: trunk/src/tool_poly.h =================================================================== --- trunk/src/tool_poly.h (revision 12562) +++ trunk/src/tool_poly.h (revision 12563) @@ -3,3 +3,4 @@ void pcb_tool_poly_notify_mode(void); void pcb_tool_poly_adjust_attached_objects(void); pcb_bool pcb_tool_poly_undo_act(void); +pcb_bool pcb_tool_poly_redo_act(void); Index: trunk/src/tool_polyhole.c =================================================================== --- trunk/src/tool_polyhole.c (revision 12562) +++ trunk/src/tool_polyhole.c (revision 12563) @@ -118,9 +118,19 @@ return pcb_true; } +pcb_bool pcb_tool_polyhole_redo_act(void) +{ + if (pcb_crosshair.AttachedPolygon.PointN) + return pcb_false; + else + return pcb_true; +} + pcb_tool_t pcb_tool_polyhole = { "polyhole", NULL, 100, pcb_tool_polyhole_notify_mode, pcb_tool_polyhole_adjust_attached_objects, - pcb_tool_polyhole_undo_act + pcb_tool_polyhole_undo_act, + pcb_tool_polyhole_redo_act, + NULL }; Index: trunk/src/tool_polyhole.h =================================================================== --- trunk/src/tool_polyhole.h (revision 12562) +++ trunk/src/tool_polyhole.h (revision 12563) @@ -3,3 +3,4 @@ void pcb_tool_polyhole_notify_mode(void); void pcb_tool_polyhole_adjust_attached_objects(void); pcb_bool pcb_tool_polyhole_undo_act(void); +pcb_bool pcb_tool_polyhole_redo_act(void); Index: trunk/src/tool_rectangle.c =================================================================== --- trunk/src/tool_rectangle.c (revision 12562) +++ trunk/src/tool_rectangle.c (revision 12563) @@ -102,5 +102,6 @@ "rectangle", NULL, 100, pcb_tool_rectangle_notify_mode, pcb_tool_rectangle_adjust_attached_objects, - pcb_tool_rectangle_undo_act + pcb_tool_rectangle_undo_act, + NULL }; Index: trunk/src/tool_remove.c =================================================================== --- trunk/src/tool_remove.c (revision 12562) +++ trunk/src/tool_remove.c (revision 12563) @@ -61,5 +61,6 @@ "remove", NULL, 100, pcb_tool_remove_notify_mode, NULL, + NULL, NULL }; Index: trunk/src/tool_rotate.c =================================================================== --- trunk/src/tool_rotate.c (revision 12562) +++ trunk/src/tool_rotate.c (revision 12563) @@ -45,5 +45,6 @@ "rotate", NULL, 100, pcb_tool_rotate_notify_mode, NULL, + NULL, NULL }; Index: trunk/src/tool_text.c =================================================================== --- trunk/src/tool_text.c (revision 12562) +++ trunk/src/tool_text.c (revision 12563) @@ -68,5 +68,6 @@ "text", NULL, 100, pcb_tool_text_notify_mode, NULL, + NULL, NULL }; Index: trunk/src/tool_thermal.c =================================================================== --- trunk/src/tool_thermal.c (revision 12562) +++ trunk/src/tool_thermal.c (revision 12563) @@ -116,5 +116,6 @@ "thermal", NULL, 100, pcb_tool_thermal_notify_mode, NULL, + NULL, NULL }; Index: trunk/src/tool_via.c =================================================================== --- trunk/src/tool_via.c (revision 12562) +++ trunk/src/tool_via.c (revision 12563) @@ -66,5 +66,6 @@ "via", NULL, 100, pcb_tool_via_notify_mode, NULL, + NULL, NULL }; Index: trunk/src/undo_act.c =================================================================== --- trunk/src/undo_act.c (revision 12562) +++ trunk/src/undo_act.c (revision 12563) @@ -203,19 +203,19 @@ int pcb_act_Redo(int argc, const char **argv, pcb_coord_t x, pcb_coord_t y) { - if (((conf_core.editor.mode == PCB_MODE_POLYGON || - conf_core.editor.mode == PCB_MODE_POLYGON_HOLE) && pcb_crosshair.AttachedPolygon.PointN) || pcb_crosshair.AttachedLine.State == PCB_CH_STATE_SECOND) - return 1; + pcb_bool redo = pcb_true; + pcb_notify_crosshair_change(pcb_false); - if (pcb_redo(pcb_true)) { - pcb_board_set_changed_flag(pcb_true); - if (conf_core.editor.mode == PCB_MODE_LINE && pcb_crosshair.AttachedLine.State != PCB_CH_STATE_FIRST) { - pcb_line_t *line = linelist_last(&CURRENT->Line); - pcb_crosshair.AttachedLine.Point1.X = pcb_crosshair.AttachedLine.Point2.X = line->Point2.X; - pcb_crosshair.AttachedLine.Point1.Y = pcb_crosshair.AttachedLine.Point2.Y = line->Point2.Y; - pcb_added_lines++; - } - } + if (conf_core.editor.mode == PCB_MODE_POLYGON) + redo = pcb_tool_poly_redo_act(); + if (conf_core.editor.mode == PCB_MODE_POLYGON_HOLE) + redo = pcb_tool_polyhole_redo_act(); + if (conf_core.editor.mode == PCB_MODE_LINE) + redo = pcb_tool_line_redo_act(); + + if (redo) + if (pcb_redo(pcb_true)) + pcb_board_set_changed_flag(pcb_true); pcb_notify_crosshair_change(pcb_true); return 0; }