From 17bd325574f452b76a3f87edf49cc2f9a39ddea7 Mon Sep 17 00:00:00 2001 From: belugas Date: Sat, 17 May 2008 03:29:16 +0000 Subject: [PATCH] (svn r13133) -Codechange: Add a base class (descending from Window) for all new windows that are going to require a ResetObjectToPlace to be performed on closing. This will allow to free the said window only once, and not twice otherwise --- src/window.cpp | 10 ++++++++++ src/window_gui.h | 13 ++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/window.cpp b/src/window.cpp index 1b7430aeea..c9bead7fdc 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -2350,3 +2350,13 @@ void RelocateAllWindows(int neww, int newh) w->top = top; } } + +/** Destructor of the base class PickerWindowBase + * Main utility is to stop the base Window destructor from triggering + * a free while the child will already be free, in this case by the ResetObjectToPlace(). + */ +PickerWindowBase::~PickerWindowBase() +{ + this->window_class = WC_INVALID; // stop the ancestor from freeing the already (to be) child + ResetObjectToPlace(); +} diff --git a/src/window_gui.h b/src/window_gui.h index 94482b2544..8d527f95fa 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -256,7 +256,7 @@ struct ViewportData : ViewPort { int32 dest_scrollpos_y; }; - /** +/** * Data structure for an opened window */ struct Window : ZeroedMemoryAllocator { @@ -493,6 +493,17 @@ public: /*** End of the event handling ***/ }; +/** + * Data structure for a window opened from a toolbar + */ +class PickerWindowBase : public Window { + +public: + PickerWindowBase(const WindowDesc *desc) : Window(desc) {}; // nothing special yet, just propagation + + virtual ~PickerWindowBase(); +}; + enum SortListFlags { VL_NONE = 0, ///< no sort VL_DESC = 1 << 0, ///< sort descending or ascending