diff --git a/src/viewport.cpp b/src/viewport.cpp --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -2708,11 +2708,18 @@ void SetObjectToPlaceWnd(CursorID icon, void SetObjectToPlace(CursorID icon, SpriteID pal, ViewportHighlightMode mode, WindowClass window_class, WindowNumber window_num) { - Window *w = NULL; - /* undo clicking on button and drag & drop */ if (_thd.place_mode != VHM_NONE || _special_mouse_mode == WSM_DRAGDROP) { - w = FindWindowById(_thd.window_class, _thd.window_number); + Window *w = FindWindowById(_thd.window_class, _thd.window_number); + if (w != NULL) { + /* Call the abort function, but set the window class to something + * that will never be used to avoid infinite loops. Setting it to + * the 'next' window class must not be done because recursion into + * this function might in some cases reset the newly set object to + * place or not properly reset the original selection. */ + _thd.window_class = WC_INVALID; + w->OnPlaceObjectAbort(); + } } SetTileSelectSize(1, 1); @@ -2739,10 +2746,6 @@ void SetObjectToPlace(CursorID icon, Spr SetMouseCursor(icon, pal); } - /* Call the abort function only *after* the window class/number - * are reset so one doesn't get into infinite loops when someone - * resets the object to place during the abort callback. */ - if (w != NULL) w->OnPlaceObjectAbort(); } void ResetObjectToPlace()