summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabiertxo Arraiza Cenoz <jtx@jtx-desktop.markerlab.es>2017-11-13 22:07:46 +0000
committerJabiertxo Arraiza Cenoz <jtx@jtx-desktop.markerlab.es>2017-11-13 22:07:46 +0000
commitfefd7d0abce83c99c995bf96f716d76da0cb2977 (patch)
tree1c4b68b3183cb810842b0d9a03a0ad03ad57dc17 /src
parentWorking refactor (diff)
parentSPMeshArray: fix a crash when dragging control points (diff)
downloadinkscape-fefd7d0abce83c99c995bf96f716d76da0cb2977.tar.gz
inkscape-fefd7d0abce83c99c995bf96f716d76da0cb2977.zip
Merge branch 'master' into powerpencilII
Diffstat (limited to 'src')
-rw-r--r--src/desktop.cpp52
-rw-r--r--src/desktop.h5
-rw-r--r--src/inkscape.cpp2
-rw-r--r--src/sp-mesh-array.cpp27
-rw-r--r--src/ui/tools-switch.cpp2
-rw-r--r--src/widgets/desktop-widget.cpp3
6 files changed, 37 insertions, 54 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp
index 1264e0184..f798079fd 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -228,7 +228,7 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas, Inkscape::UI::View::EditWid
controls = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
// Set the select tool as the active tool.
- set_event_context2("/tools/select");
+ setEventContext("/tools/select");
// display rect and zoom are now handled in sp_desktop_widget_realize()
@@ -322,7 +322,6 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas, Inkscape::UI::View::EditWid
// canvas_debug = sp_canvas_item_new (main, SP_TYPE_CANVAS_DEBUG, NULL);
}
-
void SPDesktop::destroy()
{
_destroy_signal.emit(this);
@@ -331,6 +330,7 @@ void SPDesktop::destroy()
delete snapindicator;
snapindicator = NULL;
}
+
if (temporary_item_list) {
delete temporary_item_list;
temporary_item_list = NULL;
@@ -356,12 +356,6 @@ void SPDesktop::destroy()
g_signal_handlers_disconnect_by_func(G_OBJECT (main), (gpointer) G_CALLBACK(sp_desktop_root_handler), this);
g_signal_handlers_disconnect_by_func(G_OBJECT (drawing), (gpointer) G_CALLBACK(_arena_handler), this);
- if (event_context) {
- event_context->finish();
- delete event_context;
- event_context = NULL;
- }
-
delete layers;
if (layer_manager) {
@@ -656,34 +650,34 @@ SPDesktop::change_document (SPDocument *theDocument)
}
/**
- * Replaces the currently active tool with a new one.
+ * Replaces the currently active tool with a new one. Pass the empty string to
+ * unset and free the current tool.
*/
-void SPDesktop::set_event_context2(const std::string& toolName)
+void SPDesktop::setEventContext(const std::string& toolName)
{
- Inkscape::UI::Tools::ToolBase* old_tool = event_context;
-
- if (old_tool) {
- if (toolName.compare(old_tool->pref_observer->observed_path) != 0) {
- //g_message("Old tool: %s", old_tool->pref_observer->observed_path.c_str());
- //g_message("New tool: %s", toolName.c_str());
- old_tool->finish();
- delete old_tool;
+ if (event_context) {
+ if (toolName.compare(event_context->pref_observer->observed_path) != 0) {
+ event_context->finish();
+ delete event_context;
} else {
_event_context_changed_signal.emit(this, event_context);
return;
}
}
-
- Inkscape::UI::Tools::ToolBase* new_tool = ToolFactory::createObject(toolName);
- new_tool->desktop = this;
- new_tool->message_context = new Inkscape::MessageContext(this->messageStack());
- event_context = new_tool;
- new_tool->setup();
-
- // Make sure no delayed snapping events are carried over after switching tools
- // (this is only an additional safety measure against sloppy coding, because each
- // tool should take care of this by itself)
- sp_event_context_discard_delayed_snap_event(event_context);
+
+ if (toolName.empty()) {
+ event_context = nullptr;
+ } else {
+ event_context = ToolFactory::createObject(toolName);
+ event_context->desktop = this;
+ event_context->message_context = new Inkscape::MessageContext(this->messageStack());
+ event_context->setup();
+
+ // Make sure no delayed snapping events are carried over after switching tools
+ // (this is only an additional safety measure against sloppy coding, because each
+ // tool should take care of this by itself)
+ sp_event_context_discard_delayed_snap_event(event_context);
+ }
_event_context_changed_signal.emit(this, event_context);
}
diff --git a/src/desktop.h b/src/desktop.h
index 330d95607..0ddf3805b 100644
--- a/src/desktop.h
+++ b/src/desktop.h
@@ -310,10 +310,7 @@ public:
void change_document (SPDocument *document);
- void set_event_context2(const std::string& toolName);
-
- //void set_event_context (GType type, const gchar *config);
- //void push_event_context (GType type, const gchar *config, unsigned int key);
+ void setEventContext(const std::string& toolName);
void set_coordinate_status (Geom::Point p);
SPItem *getItemFromListAtPointBottom(const std::vector<SPItem*> &list, Geom::Point const &p) const;
diff --git a/src/inkscape.cpp b/src/inkscape.cpp
index e7e93929b..b30d06168 100644
--- a/src/inkscape.cpp
+++ b/src/inkscape.cpp
@@ -864,6 +864,8 @@ Application::remove_desktop (SPDesktop * desktop)
g_error("Attempted to remove desktop not in list.");
}
+ desktop->setEventContext("");
+
if (DESKTOP_IS_ACTIVE (desktop)) {
signal_deactivate_desktop.emit(desktop);
if (_desktops->size() > 1) {
diff --git a/src/sp-mesh-array.cpp b/src/sp-mesh-array.cpp
index a8d9e589c..905ad97eb 100644
--- a/src/sp-mesh-array.cpp
+++ b/src/sp-mesh-array.cpp
@@ -935,27 +935,18 @@ void SPMeshNodeArray::write( SPMeshGradient *mg ) {
mg_array = mg;
}
- // First we must delete reprs for old mesh rows and patches.
- std::vector<SPObject*> descendant_objects;
- std::vector<Inkscape::XML::Node *> descendant_reprs;
- for (auto& row: mg_array->children) {
- descendant_reprs.push_back(row.getRepr());
- descendant_objects.push_back(&row);
- for (auto& patch: row.children) {
- descendant_reprs.push_back(patch.getRepr());
- descendant_objects.push_back(&patch);
- for (auto& stop: patch.children) {
- descendant_reprs.push_back(stop.getRepr());
- descendant_objects.push_back(&stop);
- }
- }
+ // First we must delete reprs for old mesh rows and patches. We only need to call the
+ // deleteObject() method, which in turn calls sp_repr_unparent. Since iterators do not play
+ // well with boost::intrusive::list (which ChildrenList derive from) we need to iterate over a
+ // copy of the pointers to the objects.
+ std::vector<SPObject*> children_pointers;
+ for (auto& row : mg_array->children) {
+ children_pointers.push_back(&row);
}
- for (auto i:descendant_objects)
+ for (auto i : children_pointers) {
i->deleteObject();
-
- for (auto i:descendant_reprs)
- sp_repr_unparent(i);
+ }
// Now we build new reprs
Inkscape::XML::Node *mesh = mg->getRepr();
diff --git a/src/ui/tools-switch.cpp b/src/ui/tools-switch.cpp
index d87bcc51d..e2803ccfd 100644
--- a/src/ui/tools-switch.cpp
+++ b/src/ui/tools-switch.cpp
@@ -157,7 +157,7 @@ tools_switch(SPDesktop *dt, int num)
dt->_tool_changed.emit(num);
}
- dt->set_event_context2(tool_names[num]);
+ dt->setEventContext(tool_names[num]);
/* fixme: This is really ugly hack. We should bind and unbind class methods */
/* First 4 tools use guides, first is undefined but we don't care */
dt->activate_guides(num < 5);
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index 571f920bf..f9c8e4ac6 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -736,10 +736,9 @@ static void sp_desktop_widget_dispose(GObject *object)
g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->canvas), (gpointer) G_CALLBACK (sp_desktop_widget_event), dtw);
g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->canvas_tbl), (gpointer) G_CALLBACK (canvas_tbl_size_allocate), dtw);
-
dtw->layer_selector->setDesktop(NULL);
dtw->layer_selector->unreference();
- INKSCAPE.remove_desktop (dtw->desktop); // clears selection too
+ INKSCAPE.remove_desktop(dtw->desktop); // clears selection and event_context
dtw->modified_connection.disconnect();
dtw->desktop->destroy();
Inkscape::GC::release (dtw->desktop);