Author: tschmitz
Date: Tue Jul 12 09:45:32 2011
New Revision: 50279

URL: http://svn.gna.org/viewcvs/wesnoth?rev=50279&view=rev
Log:
Fixed loophole in disabling undo for whiteboard.

Activating the whiteboard while an undo (or redo) is in progress will no longer 
crash Wesnoth.

Modified:
    trunk/src/menu_events.cpp

Modified: trunk/src/menu_events.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/menu_events.cpp?rev=50279&r1=50278&r2=50279&view=diff
==============================================================================
--- trunk/src/menu_events.cpp (original)
+++ trunk/src/menu_events.cpp Tue Jul 12 09:45:32 2011
@@ -1054,7 +1054,9 @@
        const events::command_disabler disable_commands;
        team &current_team = teams_[side_num - 1];
 
-       undo_action& action = resources::undo_stack->back();
+       resources::redo_stack->push_back(resources::undo_stack->back());
+       resources::undo_stack->pop_back();
+       undo_action& action = resources::redo_stack->back();
        if (action.is_dismiss()) {
                //undo a dismissal
 
@@ -1135,14 +1137,16 @@
 
                action.starting_moves = u->movement_left();
 
-               unit_display::move_unit(route, *u, teams_, true, 
action.starting_dir);
+               undo_action action_copy(action);
+
+               unit_display::move_unit(route, *u, teams_, true, 
action_copy.starting_dir);
 
                units_.move(u->get_location(), route.back());
                unit::clear_status_caches();
 
                u = units_.find(route.back());
                u->set_goto(map_location());
-               std::swap(u->waypoints(), action.waypoints);
+               std::swap(u->waypoints(), action_copy.waypoints);
                u->set_movement(starting_moves);
                u->set_standing();
 
@@ -1153,9 +1157,6 @@
 
        gui_->invalidate_unit();
        gui_->invalidate_game_status();
-
-       resources::redo_stack->push_back(action);
-       resources::undo_stack->pop_back();
 
        recorder.undo();
 
@@ -1176,7 +1177,9 @@
        const events::command_disabler disable_commands;
        team &current_team = teams_[side_num - 1];
 
-       undo_action& action = resources::redo_stack->back();
+       resources::undo_stack->push_back(resources::redo_stack->back());
+       resources::redo_stack->pop_back();
+       undo_action& action = resources::undo_stack->back();
        if (action.is_dismiss()) {
                if(!current_team.persistent()) {
                        ERR_NG << "trying to redo a dismiss for side " << 
side_num
@@ -1275,21 +1278,23 @@
 
                action.starting_moves = u->movement_left();
 
+               undo_action action_copy(action);
+
                unit_display::move_unit(route, *u, teams_);
 
                units_.move(u->get_location(), route.back());
                u = units_.find(route.back());
 
                unit::clear_status_caches();
-               u->set_goto(action.affected_unit.get_goto());
-               std::swap(u->waypoints(), action.waypoints);
+               u->set_goto(action_copy.affected_unit.get_goto());
+               std::swap(u->waypoints(), action_copy.waypoints);
                u->set_movement(starting_moves);
                u->set_standing();
 
                if(map_.is_village(route.back())) {
                        get_village(route.back(), u->side());
                        //MP_COUNTDOWN restore capture bonus
-                       if(action.countdown_time_bonus)
+                       if(action_copy.countdown_time_bonus)
                        {
                                current_team.set_action_bonus_count(1 + 
current_team.action_bonus_count());
                        }
@@ -1299,13 +1304,10 @@
                resources::whiteboard->on_gamestate_change();
                gui_->draw();
 
-               recorder.add_movement(action.route);
+               recorder.add_movement(action_copy.route);
        }
        gui_->invalidate_unit();
        gui_->invalidate_game_status();
-
-       resources::undo_stack->push_back(action);
-       resources::redo_stack->pop_back();
 }
 
 bool menu_handler::clear_shroud(int side_num)


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to