From 8efbe2cbb9cda49278ec57c21551f943c7033fa4 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Sun, 1 Jan 2012 03:45:32 -0800 Subject: Added signal for desktop destruction to allow for proper removal of tracked stale pointers. Fixes bug #869067. Fixed bugs: - https://launchpad.net/bugs/869067 (bzr r10814) --- src/desktop.cpp | 6 +++++- src/desktop.h | 6 ++++++ src/ui/uxmanager.cpp | 36 +++++++++++++++++++++++++++++++----- src/widgets/toolbox.cpp | 16 +++++++++++++++- 4 files changed, 57 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/desktop.cpp b/src/desktop.cpp index 995f35ab6..c6cdb64a2 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -318,6 +318,8 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas, Inkscape::UI::View::EditWid void SPDesktop::destroy() { + _destroy_signal.emit(this); + if (snapindicator) { delete snapindicator; snapindicator = NULL; @@ -378,7 +380,9 @@ void SPDesktop::destroy() _guides_message_context = NULL; } -SPDesktop::~SPDesktop() {} +SPDesktop::~SPDesktop() +{ +} //-------------------------------------------------------------------- /* Public methods */ diff --git a/src/desktop.h b/src/desktop.h index b466fff15..f0fd5064c 100644 --- a/src/desktop.h +++ b/src/desktop.h @@ -173,6 +173,11 @@ public: /// The parameter is the new zoom factor sigc::signal signal_zoom_changed; + sigc::connection connectDestroy(const sigc::slot &slot) + { + return _destroy_signal.connect(slot); + } + sigc::connection connectDocumentReplaced (const sigc::slot & slot) { return _document_replaced_signal.connect (slot); @@ -390,6 +395,7 @@ private: void push_current_zoom(std::list &); + sigc::signal _destroy_signal; sigc::signal _document_replaced_signal; sigc::signal _activate_signal; sigc::signal _deactivate_signal; diff --git a/src/ui/uxmanager.cpp b/src/ui/uxmanager.cpp index a3ccb3471..05a40bd42 100644 --- a/src/ui/uxmanager.cpp +++ b/src/ui/uxmanager.cpp @@ -1,5 +1,5 @@ /** \file - * Desktop widget implementation + * Desktop widget implementation. */ /* Authors: * Jon A. Cruz @@ -27,7 +27,6 @@ #include #endif // GDK_WINDOWING_X11 -using std::map; using std::vector; @@ -35,12 +34,35 @@ gchar const* KDE_WINDOW_MANAGER_NAME = "KWin"; gchar const* UNKOWN_WINDOW_MANAGER_NAME = "unknown"; +class TrackItem +{ +public: + TrackItem() : + destroyConn(), + boxes() + {} + + sigc::connection destroyConn; + std::vector boxes; +}; + static vector desktops; static vector dtws; -static map > trackedBoxes; +static std::map trackedBoxes; namespace { + +void desktopDestructHandler(SPDesktop *desktop) +{ + std::map::iterator it = trackedBoxes.find(desktop); + if (it != trackedBoxes.end()) + { + trackedBoxes.erase(it); + } +} + + // TODO unify this later: static Glib::ustring getLayoutPrefPath( Inkscape::UI::View::View *view ) { @@ -222,13 +244,17 @@ void UXManagerImpl::delTrack( SPDesktopWidget* dtw ) void UXManagerImpl::connectToDesktop( vector const & toolboxes, SPDesktop *desktop ) { - //static map > trackedBoxes; + TrackItem &tracker = trackedBoxes[desktop]; + vector& tracked = tracker.boxes; + if (desktop) + { + tracker.destroyConn = desktop->connectDestroy(&desktopDestructHandler); + } for (vector::const_iterator it = toolboxes.begin(); it != toolboxes.end(); ++it ) { GtkWidget* toolbox = *it; ToolboxFactory::setToolboxDesktop( toolbox, desktop ); - vector& tracked = trackedBoxes[desktop]; if (find(tracked.begin(), tracked.end(), toolbox) == tracked.end()) { tracked.push_back(toolbox); } diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 3a933db02..adfa334e1 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -886,6 +886,17 @@ static GtkAction* create_action_for_verb( Inkscape::Verb* verb, Inkscape::UI::Vi return act; } +static std::map > groups; + +static void desktopDestructHandler(SPDesktop *desktop) +{ + std::map >::iterator it = groups.find(desktop); + if (it != groups.end()) + { + groups.erase(it); + } +} + static Glib::RefPtr create_or_fetch_actions( SPDesktop* desktop ) { Inkscape::UI::View::View *view = desktop; @@ -934,7 +945,6 @@ static Glib::RefPtr create_or_fetch_actions( SPDesktop* deskto Inkscape::IconSize toolboxSize = ToolboxFactory::prefToSize("/toolbox/small"); - static std::map > groups; Glib::RefPtr mainActions; if ( groups.find(desktop) != groups.end() ) { mainActions = groups[desktop]; @@ -943,6 +953,10 @@ static Glib::RefPtr create_or_fetch_actions( SPDesktop* deskto if ( !mainActions ) { mainActions = Gtk::ActionGroup::create("main"); groups[desktop] = mainActions; + if (desktop) + { + desktop->connectDestroy(&desktopDestructHandler); + } } for ( guint i = 0; i < G_N_ELEMENTS(verbsToUse); i++ ) { -- cgit v1.2.3