diff options
| author | Jon A. Cruz <jon@joncruz.org> | 2012-01-01 11:45:32 +0000 |
|---|---|---|
| committer | Jon A. Cruz <jon@joncruz.org> | 2012-01-01 11:45:32 +0000 |
| commit | 8efbe2cbb9cda49278ec57c21551f943c7033fa4 (patch) | |
| tree | 41e32ba9c6a874af9d6d4fc5b9b71948b91469d1 /src | |
| parent | Fix for Bug #494722 (Docked dialogs in a floating window crashes on shutdown)... (diff) | |
| download | inkscape-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.cpp | 6 | ||||
| -rw-r--r-- | src/desktop.h | 6 | ||||
| -rw-r--r-- | src/ui/uxmanager.cpp | 36 | ||||
| -rw-r--r-- | src/widgets/toolbox.cpp | 16 |
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++ ) { |
