summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJon A. Cruz <jon@joncruz.org>2012-01-01 11:45:32 +0000
committerJon A. Cruz <jon@joncruz.org>2012-01-01 11:45:32 +0000
commit8efbe2cbb9cda49278ec57c21551f943c7033fa4 (patch)
tree41e32ba9c6a874af9d6d4fc5b9b71948b91469d1 /src
parentFix for Bug #494722 (Docked dialogs in a floating window crashes on shutdown)... (diff)
downloadinkscape-8efbe2cbb9cda49278ec57c21551f943c7033fa4.tar.gz
inkscape-8efbe2cbb9cda49278ec57c21551f943c7033fa4.zip
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)
Diffstat (limited to 'src')
-rw-r--r--src/desktop.cpp6
-rw-r--r--src/desktop.h6
-rw-r--r--src/ui/uxmanager.cpp36
-rw-r--r--src/widgets/toolbox.cpp16
4 files changed, 57 insertions, 7 deletions
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<void, double> signal_zoom_changed;
+ sigc::connection connectDestroy(const sigc::slot<void, SPDesktop*> &slot)
+ {
+ return _destroy_signal.connect(slot);
+ }
+
sigc::connection connectDocumentReplaced (const sigc::slot<void,SPDesktop*,SPDocument*> & slot)
{
return _document_replaced_signal.connect (slot);
@@ -390,6 +395,7 @@ private:
void push_current_zoom(std::list<Geom::Rect> &);
+ sigc::signal<void, SPDesktop*> _destroy_signal;
sigc::signal<void,SPDesktop*,SPDocument*> _document_replaced_signal;
sigc::signal<void> _activate_signal;
sigc::signal<void> _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 <jon@joncruz.org>
@@ -27,7 +27,6 @@
#include <gdk/gdkx.h>
#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<GtkWidget*> boxes;
+};
+
static vector<SPDesktop*> desktops;
static vector<SPDesktopWidget*> dtws;
-static map<SPDesktop*, vector<GtkWidget*> > trackedBoxes;
+static std::map<SPDesktop*, TrackItem> trackedBoxes;
namespace {
+
+void desktopDestructHandler(SPDesktop *desktop)
+{
+ std::map<SPDesktop*, TrackItem>::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<GtkWidget *> const & toolboxes, SPDesktop *desktop )
{
- //static map<SPDesktop*, vector<GtkWidget*> > trackedBoxes;
+ TrackItem &tracker = trackedBoxes[desktop];
+ vector<GtkWidget*>& tracked = tracker.boxes;
+ if (desktop)
+ {
+ tracker.destroyConn = desktop->connectDestroy(&desktopDestructHandler);
+ }
for (vector<GtkWidget*>::const_iterator it = toolboxes.begin(); it != toolboxes.end(); ++it ) {
GtkWidget* toolbox = *it;
ToolboxFactory::setToolboxDesktop( toolbox, desktop );
- vector<GtkWidget*>& 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<SPDesktop*, Glib::RefPtr<Gtk::ActionGroup> > groups;
+
+static void desktopDestructHandler(SPDesktop *desktop)
+{
+ std::map<SPDesktop*, Glib::RefPtr<Gtk::ActionGroup> >::iterator it = groups.find(desktop);
+ if (it != groups.end())
+ {
+ groups.erase(it);
+ }
+}
+
static Glib::RefPtr<Gtk::ActionGroup> create_or_fetch_actions( SPDesktop* desktop )
{
Inkscape::UI::View::View *view = desktop;
@@ -934,7 +945,6 @@ static Glib::RefPtr<Gtk::ActionGroup> create_or_fetch_actions( SPDesktop* deskto
Inkscape::IconSize toolboxSize = ToolboxFactory::prefToSize("/toolbox/small");
- static std::map<SPDesktop*, Glib::RefPtr<Gtk::ActionGroup> > groups;
Glib::RefPtr<Gtk::ActionGroup> mainActions;
if ( groups.find(desktop) != groups.end() ) {
mainActions = groups[desktop];
@@ -943,6 +953,10 @@ static Glib::RefPtr<Gtk::ActionGroup> 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++ ) {