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/ui/uxmanager.cpp | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) (limited to 'src/ui/uxmanager.cpp') 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); } -- cgit v1.2.3