diff options
Diffstat (limited to 'src')
60 files changed, 701 insertions, 884 deletions
diff --git a/src/attributes.cpp b/src/attributes.cpp index ad6a51c88..e8620a498 100644 --- a/src/attributes.cpp +++ b/src/attributes.cpp @@ -536,21 +536,13 @@ static SPStyleProp const props[] = { unsigned sp_attribute_lookup(gchar const *key) { - static GHashTable *propdict = NULL; - - if (!propdict) { - unsigned int i; - propdict = g_hash_table_new(g_str_hash, g_str_equal); - for (i = 1; i < n_attrs; i++) { - g_assert(props[i].code == static_cast< gint >(i) ); - // If this g_assert fails, then the sort order of SPAttributeEnum does not match the order in props[]! - g_hash_table_insert(propdict, - const_cast<void *>(static_cast<void const *>(props[i].name)), - GINT_TO_POINTER(props[i].code)); - } + for (unsigned int i = 1; i < n_attrs; i++) { + g_assert(props[i].code == static_cast< gint >(i) ); + // If this g_assert fails, then the sort order of SPAttributeEnum does not match the order in props[]! + if(g_str_equal(const_cast<void *>(static_cast<void const *>(props[i].name)), key)) + return GPOINTER_TO_UINT(GINT_TO_POINTER(props[i].code)); } - - return GPOINTER_TO_UINT(g_hash_table_lookup(propdict, key)); + return SP_ATTR_INVALID; } unsigned char const * diff --git a/src/color-profile.cpp b/src/color-profile.cpp index 690a72654..34f1b0155 100644 --- a/src/color-profile.cpp +++ b/src/color-profile.cpp @@ -488,18 +488,17 @@ static int getLcmsIntent( guint svgIntent ) static SPObject* bruteFind( SPDocument* document, gchar const* name ) { SPObject* result = 0; - const GSList * current = document->getResourceList("iccprofile"); - while ( current && !result ) { - if ( IS_COLORPROFILE(current->data) ) { - ColorProfile* prof = COLORPROFILE(current->data); + std::set<SPObject *> current = document->getResourceList("iccprofile"); + for (std::set<SPObject *>::const_iterator it = current.begin(); (!result) && (it != current.end()); ++it) { + if ( IS_COLORPROFILE(*it) ) { + ColorProfile* prof = COLORPROFILE(*it); if ( prof ) { if ( prof->name && (strcmp(prof->name, name) == 0) ) { - result = SP_OBJECT(current->data); + result = SP_OBJECT(*it); break; } } } - current = g_slist_next(current); } return result; diff --git a/src/conn-avoid-ref.cpp b/src/conn-avoid-ref.cpp index 4c9665fa0..d43d000a7 100644 --- a/src/conn-avoid-ref.cpp +++ b/src/conn-avoid-ref.cpp @@ -139,9 +139,9 @@ void SPAvoidRef::handleSettingChange(void) } -GSList *SPAvoidRef::getAttachedShapes(const unsigned int type) +std::vector<SPItem *> SPAvoidRef::getAttachedShapes(const unsigned int type) { - GSList *list = NULL; + std::vector<SPItem *> list; Avoid::IntList shapes; GQuark shapeId = g_quark_from_string(item->getId()); @@ -157,15 +157,15 @@ GSList *SPAvoidRef::getAttachedShapes(const unsigned int type) continue; } SPItem *shapeItem = SP_ITEM(obj); - list = g_slist_prepend(list, shapeItem); + list.push_back(shapeItem); } return list; } -GSList *SPAvoidRef::getAttachedConnectors(const unsigned int type) +std::vector<SPItem *> SPAvoidRef::getAttachedConnectors(const unsigned int type) { - GSList *list = NULL; + std::vector<SPItem *> list; Avoid::IntList conns; GQuark shapeId = g_quark_from_string(item->getId()); @@ -181,7 +181,7 @@ GSList *SPAvoidRef::getAttachedConnectors(const unsigned int type) continue; } SPItem *connItem = SP_ITEM(obj); - list = g_slist_prepend(list, connItem); + list.push_back(connItem); } return list; } @@ -331,7 +331,7 @@ static Avoid::Polygon avoid_item_poly(SPItem const *item) } -GSList *get_avoided_items(GSList *list, SPObject *from, SPDesktop *desktop, +std::vector<SPItem *> get_avoided_items(std::vector<SPItem *> &list, SPObject *from, SPDesktop *desktop, bool initialised) { for (SPObject *child = from->firstChild() ; child != NULL; child = child->next ) { @@ -342,7 +342,7 @@ GSList *get_avoided_items(GSList *list, SPObject *from, SPDesktop *desktop, (!initialised || SP_ITEM(child)->avoidRef->shapeRef) ) { - list = g_slist_prepend (list, SP_ITEM(child)); + list.push_back(SP_ITEM(child)); } if (SP_IS_ITEM(child) && desktop->isLayer(SP_ITEM(child))) { @@ -376,17 +376,15 @@ void init_avoided_shape_geometry(SPDesktop *desktop) DocumentUndo::setUndoSensitive(document, false); bool initialised = false; - GSList *items = get_avoided_items(NULL, desktop->currentRoot(), desktop, + std::vector<SPItem *> tmp; + std::vector<SPItem *> items = get_avoided_items(tmp, desktop->currentRoot(), desktop, initialised); - for ( GSList const *iter = items ; iter != NULL ; iter = iter->next ) { - SPItem *item = reinterpret_cast<SPItem *>(iter->data); + for (std::vector<SPItem *>::const_iterator iter = items.begin(); iter != items.end(); ++iter) { + SPItem *item = *iter; item->avoidRef->handleSettingChange(); } - if (items) { - g_slist_free(items); - } DocumentUndo::setUndoSensitive(document, saved); } diff --git a/src/conn-avoid-ref.h b/src/conn-avoid-ref.h index e9e12118f..2c7da9aae 100644 --- a/src/conn-avoid-ref.h +++ b/src/conn-avoid-ref.h @@ -20,7 +20,6 @@ class SPDesktop; class SPObject; class SPItem; -typedef struct _GSList GSList; namespace Avoid { class ShapeRef; } class SPAvoidRef { @@ -41,8 +40,8 @@ public: // Avoid::runningTo // Avoid::runningFrom // Avoid::runningToAndFrom - GSList *getAttachedShapes(const unsigned int type); - GSList *getAttachedConnectors(const unsigned int type); + std::vector<SPItem *> getAttachedShapes(const unsigned int type); + std::vector<SPItem *> getAttachedConnectors(const unsigned int type); private: SPItem *item; @@ -55,7 +54,7 @@ private: sigc::connection _transformed_connection; }; -extern GSList *get_avoided_items(GSList *list, SPObject *from, +extern std::vector<SPItem *> get_avoided_items(std::vector<SPItem *> &list, SPObject *from, SPDesktop *desktop, bool initialised = true); extern void avoid_item_move(Geom::Affine const *mp, SPItem *moved_item); extern void init_avoided_shape_geometry(SPDesktop *desktop); diff --git a/src/desktop-style.h b/src/desktop-style.h index b9199b615..bf05adadf 100644 --- a/src/desktop-style.h +++ b/src/desktop-style.h @@ -19,7 +19,6 @@ class SPDesktop; class SPObject; class SPItem; class SPStyle; -typedef struct _GSList GSList; namespace Inkscape { namespace XML { class Node; diff --git a/src/desktop.cpp b/src/desktop.cpp index ae92c058a..0aac46e8d 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -1479,7 +1479,7 @@ bool SPDesktop::colorProfAdjustEnabled() void SPDesktop::toggleGrids() { - if (namedview->grids) { + if (! namedview->grids.empty()) { if(gridgroup) { showGrids(!grids_visible); } @@ -1704,12 +1704,6 @@ static void _reconstruction_start(SPDesktop * desktop) desktop->_reconstruction_old_layer_id = desktop->currentLayer()->getId() ? desktop->currentLayer()->getId() : ""; desktop->layers->reset(); - /* - GSList const * selection_objs = desktop->selection->list(); - for (; selection_objs != NULL; selection_objs = selection_objs->next) { - - } - */ desktop->selection->clear(); } diff --git a/src/document-private.h b/src/document-private.h index a5033b3c2..eaed0020e 100644 --- a/src/document-private.h +++ b/src/document-private.h @@ -15,6 +15,8 @@ */ #include <map> +#include <set> +#include <string> #include <stddef.h> #include <sigc++/sigc++.h> #include "xml/event-fns.h" @@ -34,14 +36,12 @@ class Event; } } -typedef struct _GHashTable GHashTable; - struct SPDocumentPrivate { typedef std::map<GQuark, SPDocument::IDChangedSignal> IDChangedSignalMap; typedef std::map<GQuark, SPDocument::ResourcesChangedSignal> ResourcesChangedSignalMap; - GHashTable *iddef; /**< Dictionary of id -> SPObject mappings */ - GHashTable *reprdef; /**< Dictionary of Inkscape::XML::Node -> SPObject mappings */ + std::map<std::string, SPObject *> iddef; + std::map<Inkscape::XML::Node *, SPObject *> reprdef; unsigned long serial; @@ -49,8 +49,7 @@ struct SPDocumentPrivate { IDChangedSignalMap id_changed_signals; /* Resources */ - /* It is GHashTable of GSLists */ - GHashTable *resources; + std::map<std::string, std::set<SPObject *> > resources; ResourcesChangedSignalMap resources_changed_signals; sigc::signal<void> destroySignal; @@ -65,8 +64,8 @@ struct SPDocumentPrivate { bool sensitive; /* If we save actions to undo stack */ Inkscape::XML::Event * partial; /* partial undo log when interrupted */ int history_size; - GSList * undo; /* Undo stack of reprs */ - GSList * redo; /* Redo stack of reprs */ + std::vector<Inkscape::Event *> undo; /* Undo stack of reprs */ + std::vector<Inkscape::Event *> redo; /* Redo stack of reprs */ /* Undo listener */ Inkscape::CompositeUndoStackObserver undoStackObservers; diff --git a/src/document-undo.cpp b/src/document-undo.cpp index 59e060cd5..eb0ac7707 100644 --- a/src/document-undo.cpp +++ b/src/document-undo.cpp @@ -162,12 +162,12 @@ void Inkscape::DocumentUndo::maybeDone(SPDocument *doc, const gchar *key, const return; } - if (key && !doc->actionkey.empty() && (doc->actionkey == key) && doc->priv->undo) { - ((Inkscape::Event *)doc->priv->undo->data)->event = - sp_repr_coalesce_log (((Inkscape::Event *)doc->priv->undo->data)->event, log); + if (key && !doc->actionkey.empty() && (doc->actionkey == key) && !doc->priv->undo.empty()) { + (doc->priv->undo.back())->event = + sp_repr_coalesce_log ((doc->priv->undo.back())->event, log); } else { Inkscape::Event *event = new Inkscape::Event(log, event_type, event_description); - doc->priv->undo = g_slist_prepend (doc->priv->undo, event); + doc->priv->undo.push_back(event); doc->priv->history_size++; doc->priv->undoStackObservers.notifyUndoCommitEvent(event); } @@ -211,7 +211,7 @@ static void finish_incomplete_transaction(SPDocument &doc) { priv.partial = sp_repr_coalesce_log(priv.partial, log); sp_repr_debug_print_log(priv.partial); Inkscape::Event *event = new Inkscape::Event(priv.partial); - priv.undo = g_slist_prepend(priv.undo, event); + priv.undo.push_back(event); priv.undoStackObservers.notifyUndoCommitEvent(event); priv.partial = NULL; } @@ -227,8 +227,8 @@ static void perform_document_update(SPDocument &doc) { sp_repr_debug_print_log(update_log); //Coalesce the update changes with the last action performed by user - Inkscape::Event* undo_stack_top = (Inkscape::Event *)doc.priv->undo->data; - if (undo_stack_top) { + if (!doc.priv->undo.empty()) { + Inkscape::Event* undo_stack_top = doc.priv->undo.back(); undo_stack_top->event = sp_repr_coalesce_log(undo_stack_top->event, update_log); } else { sp_repr_free_log(update_log); @@ -256,13 +256,13 @@ gboolean Inkscape::DocumentUndo::undo(SPDocument *doc) finish_incomplete_transaction(*doc); - if (doc->priv->undo) { - Inkscape::Event *log=(Inkscape::Event *)doc->priv->undo->data; - doc->priv->undo = g_slist_remove (doc->priv->undo, log); + if (! doc->priv->undo.empty()) { + Inkscape::Event *log = doc->priv->undo.back(); + doc->priv->undo.pop_back(); sp_repr_undo_log (log->event); perform_document_update(*doc); - doc->priv->redo = g_slist_prepend (doc->priv->redo, log); + doc->priv->redo.push_back(log); doc->setModifiedSinceSave(); doc->priv->undoStackObservers.notifyUndoEvent(log); @@ -303,11 +303,11 @@ gboolean Inkscape::DocumentUndo::redo(SPDocument *doc) finish_incomplete_transaction(*doc); - if (doc->priv->redo) { - Inkscape::Event *log=(Inkscape::Event *)doc->priv->redo->data; - doc->priv->redo = g_slist_remove (doc->priv->redo, log); + if (! doc->priv->redo.empty()) { + Inkscape::Event *log = doc->priv->redo.back(); + doc->priv->redo.pop_back(); sp_repr_replay_log (log->event); - doc->priv->undo = g_slist_prepend (doc->priv->undo, log); + doc->priv->undo.push_back(log); doc->setModifiedSinceSave(); doc->priv->undoStackObservers.notifyRedoEvent(log); @@ -330,37 +330,29 @@ gboolean Inkscape::DocumentUndo::redo(SPDocument *doc) void Inkscape::DocumentUndo::clearUndo(SPDocument *doc) { - if (doc->priv->undo) - doc->priv->undoStackObservers.notifyClearUndoEvent(); - - while (doc->priv->undo) { - GSList *current; - - current = doc->priv->undo; - doc->priv->undo = current->next; - doc->priv->history_size--; - - delete ((Inkscape::Event *) current->data); - g_slist_free_1 (current); - } + if (! doc->priv->undo.empty()) + doc->priv->undoStackObservers.notifyClearUndoEvent(); + while (! doc->priv->undo.empty()) { + Inkscape::Event *e = doc->priv->undo.back(); + doc->priv->undo.pop_back(); + delete e; + doc->priv->history_size--; + } } void Inkscape::DocumentUndo::clearRedo(SPDocument *doc) { - if (doc->priv->redo) + if (!doc->priv->redo.empty()) doc->priv->undoStackObservers.notifyClearRedoEvent(); - while (doc->priv->redo) { - GSList *current; - - current = doc->priv->redo; - doc->priv->redo = current->next; - doc->priv->history_size--; - - delete ((Inkscape::Event *) current->data); - g_slist_free_1 (current); - } + while (! doc->priv->redo.empty()) { + Inkscape::Event *e = doc->priv->redo.back(); + doc->priv->redo.pop_back(); + delete e; + doc->priv->history_size--; + } } + /* Local Variables: mode:c++ diff --git a/src/document.cpp b/src/document.cpp index 23d99d78c..05e165965 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -81,7 +81,7 @@ using Inkscape::Util::unit_table; static gint sp_document_idle_handler(gpointer data); static gint sp_document_rerouting_handler(gpointer data); -gboolean sp_document_resource_list_free(gpointer key, gpointer value, gpointer data); +//gboolean sp_document_resource_list_free(gpointer key, gpointer value, gpointer data); static gint doc_count = 0; static gint doc_mem_count = 0; @@ -105,7 +105,6 @@ SPDocument::SPDocument() : rerouting_handler_id(0), profileManager(NULL), // deferred until after other initialization router(new Avoid::Router(Avoid::PolyLineRouting|Avoid::OrthogonalRouting)), - _collection_queue(NULL), oldSignalsConnected(false), current_persp3d(NULL), current_persp3d_impl(NULL), @@ -119,16 +118,9 @@ SPDocument::SPDocument() : p->serial = next_serial++; - p->iddef = g_hash_table_new(g_direct_hash, g_direct_equal); - p->reprdef = g_hash_table_new(g_direct_hash, g_direct_equal); - - p->resources = g_hash_table_new(g_str_hash, g_str_equal); - p->sensitive = false; p->partial = NULL; p->history_size = 0; - p->undo = NULL; - p->redo = NULL; p->seeking = false; priv = p; @@ -177,17 +169,10 @@ SPDocument::~SPDocument() { root = NULL; } - if (priv->iddef) g_hash_table_destroy(priv->iddef); - if (priv->reprdef) g_hash_table_destroy(priv->reprdef); - if (rdoc) Inkscape::GC::release(rdoc); /* Free resources */ - g_hash_table_foreach_remove(priv->resources, sp_document_resource_list_free, this); - g_hash_table_destroy(priv->resources); - - delete priv; - priv = NULL; + priv->resources.clear(); } cr_cascade_unref(style_cascade); @@ -295,19 +280,18 @@ void SPDocument::queueForOrphanCollection(SPObject *object) { g_return_if_fail(object->document == this); sp_object_ref(object, NULL); - _collection_queue = g_slist_prepend(_collection_queue, object); + _collection_queue.push_back(object); } void SPDocument::collectOrphans() { - while (_collection_queue) { - GSList *objects=_collection_queue; - _collection_queue = NULL; - for ( GSList *iter=objects ; iter ; iter = iter->next ) { - SPObject *object=reinterpret_cast<SPObject *>(iter->data); + while (!_collection_queue.empty()) { + std::vector<SPObject *> objects(_collection_queue); + _collection_queue.clear(); + for (std::vector<SPObject *>::const_iterator iter = objects.begin(); iter != objects.end(); ++iter) { + SPObject *object = *iter; object->collectOrphan(); sp_object_unref(object, NULL); } - g_slist_free(objects); } } @@ -1008,11 +992,15 @@ void SPDocument::bindObjectToId(gchar const *id, SPObject *object) { GQuark idq = g_quark_from_string(id); if (object) { - g_assert(g_hash_table_lookup(priv->iddef, GINT_TO_POINTER(idq)) == NULL); - g_hash_table_insert(priv->iddef, GINT_TO_POINTER(idq), object); + g_assert(priv->iddef.find(id)==priv->iddef.end()); + priv->iddef[id] = object; + //g_assert(g_hash_table_lookup(priv->iddef, GINT_TO_POINTER(idq)) == NULL); + //g_hash_table_insert(priv->iddef, GINT_TO_POINTER(idq), object); } else { - g_assert(g_hash_table_lookup(priv->iddef, GINT_TO_POINTER(idq)) != NULL); - g_hash_table_remove(priv->iddef, GINT_TO_POINTER(idq)); + g_assert(priv->iddef.find(id)!=priv->iddef.end()); + priv->iddef.erase(id); + //g_assert(g_hash_table_lookup(priv->iddef, GINT_TO_POINTER(idq)) != NULL); + //g_hash_table_remove(priv->iddef, GINT_TO_POINTER(idq)); } SPDocumentPrivate::IDChangedSignalMap::iterator pos; @@ -1047,15 +1035,16 @@ SPObject *SPDocument::getObjectById(Glib::ustring const &id) const SPObject *SPDocument::getObjectById(gchar const *id) const { g_return_val_if_fail(id != NULL, NULL); - if (!priv || !priv->iddef) { + if (!priv || priv->iddef.empty()) { return NULL; } GQuark idq = g_quark_from_string(id); - gpointer rv = g_hash_table_lookup(priv->iddef, GINT_TO_POINTER(idq)); - if(rv != NULL) + std::map<std::string, SPObject *>::iterator rv = priv->iddef.find(id); + //gpointer rv = g_hash_table_lookup(priv->iddef, GINT_TO_POINTER(idq)); + if(rv != priv->iddef.end()) { - return static_cast<SPObject*>(rv); + return (rv->second); } else { @@ -1072,18 +1061,22 @@ sigc::connection SPDocument::connectIdChanged(gchar const *id, void SPDocument::bindObjectToRepr(Inkscape::XML::Node *repr, SPObject *object) { if (object) { - g_assert(g_hash_table_lookup(priv->reprdef, repr) == NULL); - g_hash_table_insert(priv->reprdef, repr, object); + g_assert(priv->reprdef.find(repr)==priv->reprdef.end()); + priv->reprdef[repr] = object; } else { - g_assert(g_hash_table_lookup(priv->reprdef, repr) != NULL); - g_hash_table_remove(priv->reprdef, repr); + g_assert(priv->reprdef.find(repr)!=priv->reprdef.end()); + priv->reprdef.erase(repr); } } SPObject *SPDocument::getObjectByRepr(Inkscape::XML::Node *repr) const { g_return_val_if_fail(repr != NULL, NULL); - return static_cast<SPObject*>(g_hash_table_lookup(priv->reprdef, repr)); + std::map<Inkscape::XML::Node *, SPObject *>::iterator rv = priv->reprdef.find(repr); + if(rv != priv->reprdef.end()) + return (rv->second); + else + return NULL; } Glib::ustring SPDocument::getLanguage() const @@ -1528,10 +1521,9 @@ bool SPDocument::addResource(gchar const *key, SPObject *object) bool result = false; if ( !object->cloned ) { - GSList *rlist = (GSList*)g_hash_table_lookup(priv->resources, key); - g_return_val_if_fail(!g_slist_find(rlist, object), false); - rlist = g_slist_prepend(rlist, object); - g_hash_table_insert(priv->resources, (gpointer) key, rlist); + std::set<SPObject *> rlist = priv->resources[key]; + g_return_val_if_fail(rlist.find(object) == rlist.end(), false); + priv->resources[key].insert(object); GQuark q = g_quark_from_string(key); @@ -1560,11 +1552,10 @@ bool SPDocument::removeResource(gchar const *key, SPObject *object) bool result = false; if ( !object->cloned ) { - GSList *rlist = (GSList*)g_hash_table_lookup(priv->resources, key); - g_return_val_if_fail(rlist != NULL, false); - g_return_val_if_fail(g_slist_find(rlist, object), false); - rlist = g_slist_remove(rlist, object); - g_hash_table_insert(priv->resources, (gpointer) key, rlist); + std::set<SPObject *> rlist = priv->resources[key]; + g_return_val_if_fail(!rlist.empty(), false); + g_return_val_if_fail(rlist.find(object) != rlist.end(), false); + priv->resources[key].erase(object); GQuark q = g_quark_from_string(key); priv->resources_changed_signals[q].emit(); @@ -1575,12 +1566,13 @@ bool SPDocument::removeResource(gchar const *key, SPObject *object) return result; } -GSList const *SPDocument::getResourceList(gchar const *key) const +std::set<SPObject *> const SPDocument::getResourceList(gchar const *key) const { - g_return_val_if_fail(key != NULL, NULL); - g_return_val_if_fail(*key != '\0', NULL); + std::set<SPObject *> emptyset; + g_return_val_if_fail(key != NULL, emptyset); + g_return_val_if_fail(*key != '\0', emptyset); - return (GSList*)g_hash_table_lookup(this->priv->resources, key); + return this->priv->resources[key]; } sigc::connection SPDocument::connectResourcesChanged(gchar const *key, @@ -1592,13 +1584,6 @@ sigc::connection SPDocument::connectResourcesChanged(gchar const *key, /* Helpers */ -gboolean -sp_document_resource_list_free(gpointer /*key*/, gpointer value, gpointer /*data*/) -{ - g_slist_free((GSList *) value); - return TRUE; -} - static unsigned int count_objects_recursive(SPObject *obj, unsigned int count) { count++; // obj itself diff --git a/src/document.h b/src/document.h index be3f106d8..cf8ebc3cb 100644 --- a/src/document.h +++ b/src/document.h @@ -27,6 +27,7 @@ #include <glibmm/ustring.h> #include <boost/ptr_container/ptr_list.hpp> #include <vector> +#include <set> namespace Avoid { class Router; @@ -121,7 +122,7 @@ public: // Instance of the connector router Avoid::Router *router; - GSList *_collection_queue; + std::vector<SPObject *> _collection_queue; bool oldSignalsConnected; @@ -258,7 +259,7 @@ public: int ensureUpToDate(); bool addResource(char const *key, SPObject *object); bool removeResource(char const *key, SPObject *object); - const GSList *getResourceList(char const *key) const; + const std::set<SPObject *> getResourceList(char const *key) const; std::vector<SPItem*> getItemsInBox(unsigned int dkey, Geom::Rect const &box) const; std::vector<SPItem*> getItemsPartiallyInBox(unsigned int dkey, Geom::Rect const &box) const; SPItem *getItemAtPoint(unsigned int key, Geom::Point const &p, bool into_groups, SPItem *upto = NULL) const; diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index 97b84606f..8b7a22f21 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -130,14 +130,12 @@ CairoRenderContext::CairoRenderContext(CairoRenderer *parent) : _clip_mode(CLIP_MODE_MASK), _omittext_state(EMPTY) { - font_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, font_data_free); } CairoRenderContext::~CairoRenderContext(void) { - if(font_table != NULL) { - g_hash_table_remove_all(font_table); - } + for (std::map<gpointer, cairo_font_face_t *>::const_iterator iter = font_table.begin(); iter != font_table.end(); ++iter) + font_data_free(iter->second); if (_cr) cairo_destroy(_cr); if (_surface) cairo_surface_destroy(_surface); @@ -1645,7 +1643,9 @@ CairoRenderContext::renderGlyphtext(PangoFont *font, Geom::Affine const &font_ma // create a cairo_font_face from PangoFont double size = style->font_size.computed; /// \fixme why is this variable never used? gpointer fonthash = (gpointer)font; - cairo_font_face_t *font_face = (cairo_font_face_t *)g_hash_table_lookup(font_table, fonthash); + cairo_font_face_t *font_face = NULL; + if(font_table.find(fonthash)!=font_table.end()) + font_face = font_table[fonthash]; FcPattern *fc_pattern = NULL; @@ -1660,7 +1660,7 @@ CairoRenderContext::renderGlyphtext(PangoFont *font, Geom::Affine const &font_ma if(font_face == NULL) { font_face = cairo_win32_font_face_create_for_logfontw(&lfw); - g_hash_table_insert(font_table, fonthash, font_face); + font_table[fonthash] = font_face; } # endif #else @@ -1669,7 +1669,7 @@ CairoRenderContext::renderGlyphtext(PangoFont *font, Geom::Affine const &font_ma fc_pattern = fc_font->font_pattern; if(font_face == NULL) { font_face = cairo_ft_font_face_create_for_pattern(fc_pattern); - g_hash_table_insert(font_table, fonthash, font_face); + font_table[fonthash] = font_face; } # endif #endif diff --git a/src/extension/internal/cairo-render-context.h b/src/extension/internal/cairo-render-context.h index 57d155b60..b3ab3655a 100644 --- a/src/extension/internal/cairo-render-context.h +++ b/src/extension/internal/cairo-render-context.h @@ -219,7 +219,7 @@ protected: void _prepareRenderGraphic(void); void _prepareRenderText(void); - GHashTable *font_table; + std::map<gpointer, cairo_font_face_t *> font_table; static void font_data_free(gpointer data); CairoRenderState *_createState(void); diff --git a/src/gradient-chemistry.cpp b/src/gradient-chemistry.cpp index 886bf484d..9f2d030d4 100644 --- a/src/gradient-chemistry.cpp +++ b/src/gradient-chemistry.cpp @@ -1592,7 +1592,7 @@ void sp_gradient_reverse_selected_gradients(SPDesktop *desktop) GrDrag *drag = ev->get_drag(); // First try selected dragger - if (drag && drag->selected) { + if (drag && !drag->selected.empty()) { drag->selected_reverse_vector(); } else { // If no drag or no dragger selected, act on selection (both fill and stroke gradients) const std::vector<SPItem*> list=selection->itemList(); @@ -1612,9 +1612,9 @@ void sp_gradient_unset_swatch(SPDesktop *desktop, std::string id) SPDocument *doc = desktop ? desktop->doc() : 0; if (doc) { - const GSList *gradients = doc->getResourceList("gradient"); - for (const GSList *item = gradients; item; item = item->next) { - SPGradient* grad = SP_GRADIENT(item->data); + const std::set<SPObject *> gradients = doc->getResourceList("gradient"); + for (std::set<SPObject *>::const_iterator i = gradients.begin(); i != gradients.end(); ++i) { + SPGradient* grad = SP_GRADIENT(*i); if ( id == grad->getId() ) { grad->setSwatch(false); DocumentUndo::done(doc, SP_VERB_CONTEXT_GRADIENT, diff --git a/src/gradient-drag.cpp b/src/gradient-drag.cpp index f94ffb838..8fd997121 100644 --- a/src/gradient-drag.cpp +++ b/src/gradient-drag.cpp @@ -142,7 +142,7 @@ static int gr_drag_style_query(SPStyle *style, int property, gpointer data) return QUERY_STYLE_NOTHING; } - if (!drag->selected) { + if (drag->selected.empty()) { return QUERY_STYLE_NOTHING; } else { int ret = QUERY_STYLE_NOTHING; @@ -151,11 +151,10 @@ static int gr_drag_style_query(SPStyle *style, int property, gpointer data) cf[0] = cf[1] = cf[2] = cf[3] = 0; int count = 0; - - for (GList *i = drag->selected; i != NULL; i = i->next) { // for all selected draggers - GrDragger *d = (GrDragger *) i->data; - for (GSList const* j = d->draggables; j != NULL; j = j->next) { // for all draggables of dragger - GrDraggable *draggable = (GrDraggable *) j->data; + for(std::set<GrDragger *>::const_iterator it = drag->selected.begin(); it != drag->selected.end(); ++it) { //for all selected draggers + GrDragger *d = *it; + for(std::vector<GrDraggable *>::const_iterator it2 = d->draggables.begin(); it2 != d->draggables.end(); ++it2 ) { //for all draggables of dragger + GrDraggable *draggable = *it2; if (ret == QUERY_STYLE_NOTHING) { ret = QUERY_STYLE_SINGLE; @@ -209,9 +208,9 @@ Glib::ustring GrDrag::makeStopSafeColor( gchar const *str, bool &isNull ) Glib::ustring::size_type pos = colorStr.find("url(#"); if ( pos != Glib::ustring::npos ) { Glib::ustring targetName = colorStr.substr(pos + 5, colorStr.length() - 6); - const GSList *gradients = desktop->doc()->getResourceList("gradient"); - for (const GSList *item = gradients; item; item = item->next) { - SPGradient* grad = SP_GRADIENT(item->data); + std::set<SPObject *> gradients = desktop->doc()->getResourceList("gradient"); + for (std::set<SPObject *>::const_iterator it = gradients.begin(); it != gradients.end(); ++it) { + SPGradient* grad = SP_GRADIENT(*it); if ( targetName == grad->getId() ) { SPGradient *vect = grad->getVector(); SPStop *firstStop = (vect) ? vect->getFirstStop() : grad->getFirstStop(); @@ -239,7 +238,7 @@ Glib::ustring GrDrag::makeStopSafeColor( gchar const *str, bool &isNull ) bool GrDrag::styleSet( const SPCSSAttr *css ) { - if (!selected) { + if (selected.empty()) { return false; } @@ -307,11 +306,10 @@ bool GrDrag::styleSet( const SPCSSAttr *css ) return false; } - for (GList const* sel = selected; sel != NULL; sel = sel->next) { // for all selected draggers - GrDragger* dragger = reinterpret_cast<GrDragger*>(sel->data); - for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { // for all draggables of dragger - GrDraggable *draggable = reinterpret_cast<GrDraggable *>(i->data); - + for(std::set<GrDragger *>::const_iterator it = selected.begin(); it != selected.end(); ++it) { //for all selected draggers + GrDragger *d = *it; + for(std::vector<GrDraggable *>::const_iterator it2 = d->draggables.begin(); it2 != d->draggables.end(); ++it2 ) { //for all draggables of dragger + GrDraggable *draggable = *it2; local_change = true; sp_item_gradient_stop_set_style(draggable->item, draggable->point_type, draggable->point_i, draggable->fill_or_stroke, stop); } @@ -324,17 +322,17 @@ bool GrDrag::styleSet( const SPCSSAttr *css ) guint32 GrDrag::getColor() { - if (!selected) return 0; + if (selected.empty()) return 0; float cf[4]; cf[0] = cf[1] = cf[2] = cf[3] = 0; int count = 0; - for (GList *i = selected; i != NULL; i = i->next) { // for all selected draggers - GrDragger *d = (GrDragger *) i->data; - for (GSList const* j = d->draggables; j != NULL; j = j->next) { // for all draggables of dragger - GrDraggable *draggable = (GrDraggable *) j->data; + for(std::set<GrDragger *>::const_iterator it = selected.begin(); it != selected.end(); ++it) { //for all selected draggers + GrDragger *d = *it; + for(std::vector<GrDraggable *>::const_iterator it2 = d->draggables.begin(); it2 != d->draggables.end(); ++it2 ) { //for all draggables of dragger + GrDraggable *draggable = *it2; guint32 c = sp_item_gradient_stop_query_style (draggable->item, draggable->point_type, draggable->point_i, draggable->fill_or_stroke); cf[0] += SP_RGBA32_R_F (c); @@ -580,15 +578,15 @@ bool GrDrag::dropColor(SPItem */*item*/, gchar const *c, Geom::Point p) Glib::ustring toUse = makeStopSafeColor( c, stopIsNull ); // first, see if we can drop onto one of the existing draggers - for (GList *i = draggers; i != NULL; i = i->next) { // for all draggables of dragger - GrDragger *d = (GrDragger *) i->data; + for(std::vector<GrDragger *>::const_iterator i = draggers.begin(); i != draggers.end(); ++i) { //for all draggers + GrDragger *d = *i ; if (Geom::L2(p - d->point)*desktop->current_zoom() < 5) { SPCSSAttr *stop = sp_repr_css_attr_new (); sp_repr_css_set_property( stop, "stop-color", stopIsNull ? 0 : toUse.c_str() ); sp_repr_css_set_property( stop, "stop-opacity", "1" ); - for (GSList *j = d->draggables; j != NULL; j = j->next) { // for all draggables of dragger - GrDraggable *draggable = (GrDraggable *) j->data; + for(std::vector<GrDraggable *>::const_iterator j = d->draggables.begin(); j != d->draggables.end(); ++j) { //for all draggables of dragger + GrDraggable *draggable = *j; local_change = true; sp_item_gradient_stop_set_style (draggable->item, draggable->point_type, draggable->point_i, draggable->fill_or_stroke, stop); } @@ -599,9 +597,9 @@ bool GrDrag::dropColor(SPItem */*item*/, gchar const *c, Geom::Point p) // now see if we're over line and create a new stop bool over_line = false; - if (lines) { - for (GSList *l = lines; (l != NULL) && (!over_line); l = l->next) { - SPCtrlLine *line = (SPCtrlLine*) l->data; + if (!lines.empty()) { + for (std::vector<SPCtrlLine *>::const_iterator l = lines.begin(); l != lines.end() && (!over_line); ++l) { + SPCtrlLine *line = *l; Geom::LineSegment ls(line->s, line->e); Geom::Point nearest = ls.pointAt(ls.nearestTime(p)); double dist_screen = Geom::L2(p - nearest) * desktop->current_zoom(); @@ -623,7 +621,6 @@ bool GrDrag::dropColor(SPItem */*item*/, gchar const *c, Geom::Point p) GrDrag::GrDrag(SPDesktop *desktop) : - selected(0), keep_selection(false), local_change(false), desktop(desktop), @@ -676,8 +673,8 @@ GrDrag::~GrDrag() this->style_set_connection.disconnect(); this->style_query_connection.disconnect(); - if (this->selected) { - GrDraggable *draggable = (GrDraggable *) ((GrDragger*)this->selected->data)->draggables->data; + if (! this->selected.empty()) { + GrDraggable *draggable = (*(this->selected.begin()))->draggables[0]; desktop->gr_item = draggable->item; desktop->gr_point_type = draggable->point_type; desktop->gr_point_i = draggable->point_i; @@ -690,18 +687,16 @@ GrDrag::~GrDrag() } deselect_all(); - for (GList *l = this->draggers; l != NULL; l = l->next) { - delete ((GrDragger *) l->data); + for (std::vector<GrDragger *>::const_iterator it = this->draggers.begin(); it != this->draggers.end(); ++it) { + delete (*it); } - g_list_free (this->draggers); - this->draggers = NULL; - this->selected = NULL; + this->draggers.clear(); + this->selected.clear(); - for (GSList *l = this->lines; l != NULL; l = l->next) { - sp_canvas_item_destroy(SP_CANVAS_ITEM(l->data)); + for (std::vector<SPCtrlLine *>::const_iterator it = this->lines.begin(); it != this->lines.end(); ++it) { + sp_canvas_item_destroy(SP_CANVAS_ITEM(*it)); } - g_slist_free (this->lines); - this->lines = NULL; + this->lines.clear(); } GrDraggable::GrDraggable(SPItem *item, GrPointType point_type, guint point_i, Inkscape::PaintTarget fill_or_stroke) : @@ -751,39 +746,43 @@ static void gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, gui if (state & GDK_SHIFT_MASK) { // with Shift; unsnap if we carry more than one draggable - if (dragger->draggables && dragger->draggables->next) { + if (dragger->draggables.size()>1) { // create a new dragger GrDragger *dr_new = new GrDragger (dragger->parent, dragger->point, NULL); - dragger->parent->draggers = g_list_prepend (dragger->parent->draggers, dr_new); + dragger->parent->draggers.insert(dragger->parent->draggers.begin(), dr_new); // relink to it all but the first draggable in the list - for (GSList const* i = dragger->draggables->next; i != NULL; i = i->next) { - GrDraggable *draggable = (GrDraggable *) i->data; + std::vector<GrDraggable *>::const_iterator i = dragger->draggables.begin(); + for ( ++i ; i != dragger->draggables.end(); ++i ) { + GrDraggable *draggable = *i; dr_new->addDraggable (draggable); } dr_new->updateKnotShape(); - g_slist_free (dragger->draggables->next); - dragger->draggables->next = NULL; + if(dragger->draggables.size()>1){ + GrDraggable *tmp = dragger->draggables[0]; + dragger->draggables.clear(); + dragger->draggables.push_back(tmp); + } dragger->updateKnotShape(); dragger->updateTip(); } } else if (!(state & GDK_CONTROL_MASK)) { // without Shift or Ctrl; see if we need to snap to another dragger - for (GList *di = dragger->parent->draggers; di != NULL; di = di->next) { - GrDragger *d_new = (GrDragger *) di->data; + for (std::vector<GrDragger *>::const_iterator di = dragger->parent->draggers.begin(); di != dragger->parent->draggers.end() ; ++di) { + GrDragger *d_new = *di; if (dragger->mayMerge(d_new) && Geom::L2 (d_new->point - p) < snap_dist) { // Merge draggers: - for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { // for all draggables of dragger - GrDraggable *draggable = (GrDraggable *) i->data; + for (std::vector<GrDraggable *>::const_iterator i = dragger->draggables.begin(); i != dragger->draggables.end(); ++i) { + GrDraggable *draggable = *i; // copy draggable to d_new: GrDraggable *da_new = new GrDraggable (draggable->item, draggable->point_type, draggable->point_i, draggable->fill_or_stroke); d_new->addDraggable (da_new); } // unlink and delete this dragger - dragger->parent->draggers = g_list_remove (dragger->parent->draggers, dragger); - d_new->parent->draggers = g_list_remove (d_new->parent->draggers, dragger); - d_new->parent->selected = g_list_remove (d_new->parent->selected, dragger); + dragger->parent->draggers.erase(std::remove(dragger->parent->draggers.begin(),dragger->parent->draggers.end(), dragger),dragger->parent->draggers.end()); + d_new->parent->draggers.erase(std::remove(d_new->parent->draggers.begin(),d_new->parent->draggers.end(), dragger),d_new->parent->draggers.end()); + d_new->parent->selected.erase(dragger); delete dragger; // throw out delayed snap context @@ -817,14 +816,14 @@ static void gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, gui unsigned snaps = abs(prefs->getInt("/options/rotationsnapsperpi/value", 12)); /* 0 means no snapping. */ - for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { - GrDraggable *draggable = (GrDraggable *) i->data; + for (std::vector<GrDraggable *>::const_iterator i = dragger->draggables.begin(); i != dragger->draggables.end(); ++i) { + GrDraggable *draggable = *i; Geom::Point dr_snap(Geom::infinity(), Geom::infinity()); if (draggable->point_type == POINT_LG_BEGIN || draggable->point_type == POINT_LG_END) { - for (GList *di = dragger->parent->draggers; di != NULL; di = di->next) { - GrDragger *d_new = (GrDragger *) di->data; + for (std::vector<GrDragger *>::const_iterator di = dragger->parent->draggers.begin() ; di != dragger->parent->draggers.end() ; ++di) { + GrDragger *d_new = *di; if (d_new == dragger) continue; if (d_new->isA (draggable->item, @@ -842,8 +841,8 @@ static void gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, gui } } } else if (draggable->point_type == POINT_RG_R1 || draggable->point_type == POINT_RG_R2 || draggable->point_type == POINT_RG_FOCUS) { - for (GList *di = dragger->parent->draggers; di != NULL; di = di->next) { - GrDragger *d_new = (GrDragger *) di->data; + for (std::vector<GrDragger *>::const_iterator di = dragger->parent->draggers.begin(); di != dragger->parent->draggers.end(); ++di) { + GrDragger *d_new = *di; if (d_new == dragger) continue; if (d_new->isA (draggable->item, @@ -896,7 +895,7 @@ static void gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, gui knot->moveto(p); } - drag->keep_selection = (bool) g_list_find(drag->selected, dragger); + drag->keep_selection = (drag->selected.find(dragger)!=drag->selected.end()); bool scale_radial = (state & GDK_CONTROL_MASK) && (state & GDK_SHIFT_MASK); if (drag->keep_selection) { @@ -912,16 +911,16 @@ static void gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, gui } -static void gr_midpoint_limits(GrDragger *dragger, SPObject *server, Geom::Point *begin, Geom::Point *end, Geom::Point *low_lim, Geom::Point *high_lim, GSList **moving) +static void gr_midpoint_limits(GrDragger *dragger, SPObject *server, Geom::Point *begin, Geom::Point *end, Geom::Point *low_lim, Geom::Point *high_lim, std::vector<GrDragger *> &moving) { GrDrag *drag = dragger->parent; // a midpoint dragger can (logically) only contain one GrDraggable - GrDraggable *draggable = (GrDraggable *) dragger->draggables->data; + GrDraggable *draggable = dragger->draggables[0]; // get begin and end points between which dragging is allowed: // the draglimits are between knot(lowest_i - 1) and knot(highest_i + 1) - *moving = g_slist_append(*moving, dragger); + moving.push_back(dragger); guint lowest_i = draggable->point_i; guint highest_i = draggable->point_i; @@ -932,9 +931,9 @@ static void gr_midpoint_limits(GrDragger *dragger, SPObject *server, Geom::Point while ( true ) { d_add = drag->getDraggerFor(draggable->item, draggable->point_type, lowest_i - 1, draggable->fill_or_stroke); - if ( d_add && g_list_find(drag->selected, d_add) ) { + if ( d_add && drag->selected.find(d_add)!=drag->selected.end() ) { lowest_i = lowest_i - 1; - *moving = g_slist_prepend(*moving, d_add); + moving.insert(moving.begin(),d_add); lowest_dragger = d_add; } else { break; @@ -944,9 +943,9 @@ static void gr_midpoint_limits(GrDragger *dragger, SPObject *server, Geom::Point while ( true ) { d_add = drag->getDraggerFor(draggable->item, draggable->point_type, highest_i + 1, draggable->fill_or_stroke); - if ( d_add && g_list_find(drag->selected, d_add) ) { + if ( d_add && drag->selected.find(d_add)!=drag->selected.end() ) { highest_i = highest_i + 1; - *moving = g_slist_append(*moving, d_add); + moving.push_back(d_add); highest_dragger = d_add; } else { break; @@ -1002,7 +1001,7 @@ static void gr_knot_moved_midpoint_handler(SPKnot */*knot*/, Geom::Point const & GrDragger *dragger = (GrDragger *) data; GrDrag *drag = dragger->parent; // a midpoint dragger can (logically) only contain one GrDraggable - GrDraggable *draggable = (GrDraggable *) dragger->draggables->data; + GrDraggable *draggable = dragger->draggables[0]; // FIXME: take from prefs double snap_fraction = 0.1; @@ -1013,8 +1012,8 @@ static void gr_knot_moved_midpoint_handler(SPKnot */*knot*/, Geom::Point const & SPObject *server = draggable->getServer(); - GSList *moving = NULL; - gr_midpoint_limits(dragger, server, &begin, &end, &low_lim, &high_lim, &moving); + std::vector<GrDragger *> moving; + gr_midpoint_limits(dragger, server, &begin, &end, &low_lim, &high_lim, moving); if (state & GDK_CONTROL_MASK) { Geom::LineSegment ls(low_lim, high_lim); @@ -1033,8 +1032,8 @@ static void gr_knot_moved_midpoint_handler(SPKnot */*knot*/, Geom::Point const & } Geom::Point displacement = p - dragger->point; - for (GSList const* i = moving; i != NULL; i = i->next) { - GrDragger *drg = (GrDragger*) i->data; + for (std::vector<GrDragger *>::const_iterator i = moving.begin(); i!= moving.end(); ++i ) { + GrDragger *drg = *i; SPKnot *drgknot = drg->knot; Geom::Point this_move = displacement; if (state & GDK_MOD1_MASK) { @@ -1054,8 +1053,6 @@ static void gr_knot_moved_midpoint_handler(SPKnot */*knot*/, Geom::Point const & drg->updateDependencies(false); } - g_slist_free(moving); - drag->keep_selection = dragger->isSelected(); } @@ -1085,12 +1082,11 @@ static void gr_knot_ungrabbed_handler(SPKnot *knot, unsigned int state, gpointer dragger->fireDraggables (true); } dragger->updateHandles( dragger->point_original, MG_NODE_NO_SCALE ); - - for (GList *i = dragger->parent->selected; i != NULL; i = i->next) { - GrDragger *d = (GrDragger *) i->data; - if (d == dragger) + + for (std::set<GrDragger *>::const_iterator it = dragger->parent->selected.begin(); it != dragger->parent->selected.end() ; ++it ) { + if (*it == dragger) continue; - d->fireDraggables (true); + (*it)->fireDraggables (true); } // make this dragger selected @@ -1112,7 +1108,7 @@ static void gr_knot_ungrabbed_handler(SPKnot *knot, unsigned int state, gpointer static void gr_knot_clicked_handler(SPKnot */*knot*/, guint state, gpointer data) { GrDragger *dragger = (GrDragger *) data; - GrDraggable *draggable = (GrDraggable *) dragger->draggables->data; + GrDraggable *draggable = dragger->draggables[0]; if (!draggable) return; if ( (state & GDK_CONTROL_MASK) && (state & GDK_MOD1_MASK ) ) { @@ -1185,7 +1181,7 @@ static void gr_knot_doubleclicked_handler(SPKnot */*knot*/, guint /*state*/, gpo dragger->point_original = dragger->point; - if (dragger->draggables == NULL) + if (dragger->draggables.empty()) return; /* @@ -1200,8 +1196,8 @@ static void gr_knot_doubleclicked_handler(SPKnot */*knot*/, guint /*state*/, gpo */ void GrDragger::fireDraggables(bool write_repr, bool scale_radial, bool merging_focus) { - for (GSList const* i = this->draggables; i != NULL; i = i->next) { - GrDraggable *draggable = (GrDraggable *) i->data; + for (std::vector<GrDraggable *>::const_iterator i = this->draggables.begin(); i != this->draggables.end(); ++i) { + GrDraggable *draggable = *i; // set local_change flag so that selection_changed callback does not regenerate draggers this->parent->local_change = true; @@ -1221,8 +1217,8 @@ void GrDragger::fireDraggables(bool write_repr, bool scale_radial, bool merging_ */ bool GrDragger::isA(GrPointType point_type) { - for (GSList const* i = this->draggables; i != NULL; i = i->next) { - GrDraggable *draggable = reinterpret_cast<GrDraggable *>(i->data); + for (std::vector<GrDraggable *>::const_iterator i = this->draggables.begin(); i != this->draggables.end(); ++i) { + GrDraggable *draggable = *i; if (draggable->point_type == point_type) { return true; } @@ -1235,8 +1231,8 @@ bool GrDragger::isA(GrPointType point_type) */ bool GrDragger::isA(SPItem *item, GrPointType point_type, gint point_i, Inkscape::PaintTarget fill_or_stroke) { - for (GSList const* i = this->draggables; i != NULL; i = i->next) { - GrDraggable *draggable = (GrDraggable *) i->data; + for (std::vector<GrDraggable *>::const_iterator i = this->draggables.begin(); i != this->draggables.end(); ++i) { + GrDraggable *draggable = *i; if ( (draggable->point_type == point_type) && (draggable->point_i == point_i) && (draggable->item == item) && (draggable->fill_or_stroke == fill_or_stroke) ) { return true; } @@ -1249,8 +1245,8 @@ bool GrDragger::isA(SPItem *item, GrPointType point_type, gint point_i, Inkscape */ bool GrDragger::isA(SPItem *item, GrPointType point_type, Inkscape::PaintTarget fill_or_stroke) { - for (GSList const* i = this->draggables; i != NULL; i = i->next) { - GrDraggable *draggable = (GrDraggable *) i->data; + for (std::vector<GrDraggable *>::const_iterator i = this->draggables.begin(); i != this->draggables.end(); ++i) { + GrDraggable *draggable = *i; if ( (draggable->point_type == point_type) && (draggable->item == item) && (draggable->fill_or_stroke == fill_or_stroke) ) { return true; } @@ -1282,10 +1278,10 @@ bool GrDragger::mayMerge(GrDragger *other) if (this == other) return false; - for (GSList const* i = this->draggables; i != NULL; i = i->next) { // for all draggables of this - GrDraggable *da1 = (GrDraggable *) i->data; - for (GSList const* j = other->draggables; j != NULL; j = j->next) { // for all draggables of other - GrDraggable *da2 = (GrDraggable *) j->data; + for (std::vector<GrDraggable *>::const_iterator i = this->draggables.begin(); i != this->draggables.end(); ++i) { + GrDraggable *da1 = *i; + for (std::vector<GrDraggable *>::const_iterator j = other->draggables.begin(); j != other->draggables.end(); ++j) { + GrDraggable *da2 = *j; if (!da1->mayMerge(da2)) return false; } @@ -1295,8 +1291,8 @@ bool GrDragger::mayMerge(GrDragger *other) bool GrDragger::mayMerge(GrDraggable *da2) { - for (GSList const* i = this->draggables; i != NULL; i = i->next) { // for all draggables of this - GrDraggable *da1 = (GrDraggable *) i->data; + for (std::vector<GrDraggable *>::const_iterator i = this->draggables.begin(); i != this->draggables.end(); ++i) { + GrDraggable *da1 = *i; if (!da1->mayMerge(da2)) return false; } @@ -1339,10 +1335,10 @@ GrDragger::updateHandles ( Geom::Point pc_old, MeshNodeOperation op ) bool scale = false; if( scale == true ) { - for ( GList *i = drag->selected; i != NULL; i = i->next ) { - GrDragger *dragger = (GrDragger *) i->data; - for ( GSList *j = dragger->draggables; j != NULL; j = j->next ) { - GrDraggable *draggable = (GrDraggable *) j->data; + for( std::set<GrDragger *>::const_iterator it = drag->selected.begin(); it != drag->selected.end(); ++it ) { + GrDragger *dragger = *it; + for (std::vector<GrDraggable *>::const_iterator it2 = dragger->draggables.begin(); it2 != dragger->draggables.end(); ++it2 ) { + GrDraggable *draggable = *it2; // Check draggable is of type POINT_MG_CORNER (don't allow selection of POINT_MG_HANDLE) if( draggable->point_type != POINT_MG_CORNER ) continue; @@ -1360,8 +1356,8 @@ GrDragger::updateHandles ( Geom::Point pc_old, MeshNodeOperation op ) // Loop over all draggables in moved corner std::map<SPGradient*, std::vector<guint> > dragger_corners; - for ( GSList *j = draggables; j != NULL; j = j->next ) { - GrDraggable *draggable = (GrDraggable *) j->data; + for (std::vector<GrDraggable *>::const_iterator j = draggables.begin(); j != draggables.end(); ++j ) { + GrDraggable *draggable = *j; SPItem *item = draggable->item; gint point_type = draggable->point_type; @@ -1417,8 +1413,8 @@ void GrDragger::updateTip() this->knot->tip = NULL; } - if (g_slist_length (this->draggables) == 1) { - GrDraggable *draggable = (GrDraggable *) this->draggables->data; + if (this->draggables.size() == 1) { + GrDraggable *draggable = this->draggables[0]; char *item_desc = draggable->item->detailedDescription(); switch (draggable->point_type) { case POINT_LG_MID: @@ -1439,10 +1435,10 @@ void GrDragger::updateTip() break; } g_free(item_desc); - } else if (g_slist_length (draggables) == 2 && isA (POINT_RG_CENTER) && isA (POINT_RG_FOCUS)) { + } else if (draggables.size() == 2 && isA (POINT_RG_CENTER) && isA (POINT_RG_FOCUS)) { this->knot->tip = g_strdup_printf ("%s", _("Radial gradient <b>center</b> and <b>focus</b>; drag with <b>Shift</b> to separate focus")); } else { - int length = g_slist_length (this->draggables); + int length = this->draggables.size(); this->knot->tip = g_strdup_printf (ngettext("Gradient point shared by <b>%d</b> gradient; drag with <b>Shift</b> to separate", "Gradient point shared by <b>%d</b> gradients; drag with <b>Shift</b> to separate", length), @@ -1455,9 +1451,9 @@ void GrDragger::updateTip() */ void GrDragger::updateKnotShape() { - if (!draggables) + if (draggables.empty()) return; - GrDraggable *last = (GrDraggable *) g_slist_last(draggables)->data; + GrDraggable *last = draggables.back(); g_object_set (G_OBJECT (this->knot->item), "shape", gr_knot_shapes[last->point_type], NULL); } @@ -1466,7 +1462,7 @@ void GrDragger::updateKnotShape() */ void GrDragger::addDraggable(GrDraggable *draggable) { - this->draggables = g_slist_prepend (this->draggables, draggable); + this->draggables.insert(this->draggables.begin(), draggable); this->updateTip(); } @@ -1477,18 +1473,18 @@ void GrDragger::addDraggable(GrDraggable *draggable) */ void GrDragger::moveThisToDraggable(SPItem *item, GrPointType point_type, gint point_i, Inkscape::PaintTarget fill_or_stroke, bool write_repr) { - GrDraggable *dr_first = reinterpret_cast<GrDraggable *>(draggables->data); - if (!dr_first) { + if (draggables.empty()) return; - } + + GrDraggable *dr_first = draggables[0]; this->point = getGradientCoords(dr_first->item, dr_first->point_type, dr_first->point_i, dr_first->fill_or_stroke); this->point_original = this->point; this->knot->moveto(this->point); - for (GSList const* i = draggables; i != NULL; i = i->next) { - GrDraggable *da = (GrDraggable *) i->data; + for (std::vector<GrDraggable *>::const_iterator j = draggables.begin(); j != draggables.end(); ++j ) { + GrDraggable *da = *j; if ( (da->item == item) && (point_type == -1 || da->point_type == point_type) && (point_i == -1 || da->point_i == point_i) && @@ -1531,8 +1527,8 @@ void GrDragger::updateMidstopDependencies(GrDraggable *draggable, bool write_rep */ void GrDragger::updateDependencies(bool write_repr) { - for (GSList const* i = this->draggables; i != NULL; i = i->next) { - GrDraggable *draggable = (GrDraggable *) i->data; + for (std::vector<GrDraggable *>::const_iterator j = draggables.begin(); j != draggables.end(); ++j ) { + GrDraggable *draggable = *j; switch (draggable->point_type) { case POINT_LG_BEGIN: { @@ -1590,7 +1586,7 @@ GrDragger::GrDragger(GrDrag *parent, Geom::Point p, GrDraggable *draggable) : point(p), point_original(p) { - this->draggables = NULL; + this->draggables.clear(); this->parent = parent; @@ -1649,12 +1645,10 @@ GrDragger::~GrDragger() knot_unref(this->knot); // delete all draggables - for (GSList const* i = this->draggables; i != NULL; i = i->next) { - delete ((GrDraggable *) i->data); + for (std::vector<GrDraggable *>::const_iterator j = this->draggables.begin(); j != this->draggables.end(); ++j ) { + delete (*j); } - - g_slist_free (this->draggables); - this->draggables = NULL; + this->draggables.clear(); } /** @@ -1662,10 +1656,10 @@ GrDragger::~GrDragger() */ GrDragger *GrDrag::getDraggerFor(SPItem *item, GrPointType point_type, gint point_i, Inkscape::PaintTarget fill_or_stroke) { - for (GList const* i = this->draggers; i != NULL; i = i->next) { - GrDragger *dragger = (GrDragger *) i->data; - for (GSList const* j = dragger->draggables; j != NULL; j = j->next) { - GrDraggable *da2 = (GrDraggable *) j->data; + for (std::vector<GrDragger *>::const_iterator i = this->draggers.begin(); i != this->draggers.end(); ++i ) { + GrDragger *dragger = *i; + for (std::vector<GrDraggable *>::const_iterator j = dragger->draggables.begin(); j != dragger->draggables.end(); ++j ) { + GrDraggable *da2 = *j; if ( (da2->item == item) && (point_type == -1 || da2->point_type == point_type) && // -1 means this does not matter (point_i == -1 || da2->point_i == point_i) && // -1 means this does not matter @@ -1716,7 +1710,7 @@ void GrDragger::deselect() bool GrDragger::isSelected() { - return g_list_find (parent->selected, this); + return parent->selected.find(this) != parent->selected.end(); } /** @@ -1724,10 +1718,9 @@ GrDragger::isSelected() */ void GrDrag::deselect_all() { - while (selected) { - ( (GrDragger*) selected->data)->deselect(); - selected = g_list_remove(selected, selected->data); - } + for (std::set<GrDragger *>::const_iterator it = selected.begin(); it != selected.end(); ++it ) + (*it)->deselect(); + selected.clear(); } /** @@ -1744,8 +1737,8 @@ void GrDrag::deselectAll() */ void GrDrag::selectAll() { - for (GList *l = this->draggers; l != NULL; l = l->next) { - GrDragger *d = ((GrDragger *) l->data); + for (std::vector<GrDragger *>::const_iterator l = this->draggers.begin(); l != this->draggers.end(); ++l) { + GrDragger *d = *l; setSelected (d, true, true); } } @@ -1755,8 +1748,8 @@ void GrDrag::selectAll() */ void GrDrag::selectByCoords(std::vector<Geom::Point> coords) { - for (GList *l = this->draggers; l != NULL; l = l->next) { - GrDragger *d = ((GrDragger *) l->data); + for (std::vector<GrDragger *>::const_iterator l = this->draggers.begin(); l != this->draggers.end(); ++l) { + GrDragger *d = *l; for (guint k = 0; k < coords.size(); k++) { if (Geom::L2 (d->point - coords[k]) < 1e-4) { setSelected (d, true, true); @@ -1770,12 +1763,12 @@ void GrDrag::selectByCoords(std::vector<Geom::Point> coords) */ void GrDrag::selectByStop(SPStop *stop, bool add_to_selection, bool override ) { - for (GList *i = this->draggers; i != NULL; i = i->next) { + for (std::vector<GrDragger *>::const_iterator l = this->draggers.begin(); l != this->draggers.end(); ++l) { - GrDragger *dragger = (GrDragger *) i->data; - for (GSList const* j = dragger->draggables; j != NULL; j = j->next) { + GrDragger *dragger = *l; + for (std::vector<GrDraggable *>::const_iterator j = dragger->draggables.begin(); j != dragger->draggables.end(); ++j) { - GrDraggable *d = (GrDraggable *) j->data; + GrDraggable *d = *j; SPGradient *gradient = getGradient(d->item, d->fill_or_stroke); SPGradient *vector = gradient->getVector(false); SPStop *stop_i = sp_get_stop_i(vector, d->point_i); @@ -1791,8 +1784,8 @@ void GrDrag::selectByStop(SPStop *stop, bool add_to_selection, bool override ) */ void GrDrag::selectRect(Geom::Rect const &r) { - for (GList *l = this->draggers; l != NULL; l = l->next) { - GrDragger *d = ((GrDragger *) l->data); + for (std::vector<GrDragger *>::const_iterator l = this->draggers.begin(); l != this->draggers.end(); ++l) { + GrDragger *d = *l; if (r.contains(d->point)) { setSelected (d, true, true); } @@ -1816,20 +1809,18 @@ void GrDrag::setSelected(GrDragger *dragger, bool add_to_selection, bool overrid if (add_to_selection) { if (!dragger) return; if (override) { - if (!g_list_find(selected, dragger)) { - selected = g_list_prepend(selected, dragger); - } + selected.insert(dragger); dragger->select(); seldragger = dragger; } else { // toggle - if (g_list_find(selected, dragger)) { - selected = g_list_remove(selected, dragger); + if(selected.find(dragger)!=selected.end()) { + selected.erase(dragger); dragger->deselect(); - if (selected) { - seldragger = (GrDragger*) selected->data; // select the dragger that is first in the list + if (!selected.empty()) { + seldragger = *(selected.begin()); // select the dragger that is first in the list } } else { - selected = g_list_prepend(selected, dragger); + selected.insert(dragger); dragger->select(); seldragger = dragger; } @@ -1837,7 +1828,7 @@ void GrDrag::setSelected(GrDragger *dragger, bool add_to_selection, bool overrid } else { deselect_all(); if (dragger) { - selected = g_list_prepend(selected, dragger); + selected.insert(dragger); dragger->select(); seldragger = dragger; } @@ -1853,11 +1844,11 @@ void GrDrag::setSelected(GrDragger *dragger, bool add_to_selection, bool overrid */ void GrDrag::setDeselected(GrDragger *dragger) { - if (g_list_find(selected, dragger)) { - selected = g_list_remove(selected, dragger); + if (selected.find(dragger) != selected.end()) { + selected.erase(dragger); dragger->deselect(); } - this->desktop->emitToolSubselectionChanged((gpointer) (selected ? selected->data : NULL )); + this->desktop->emitToolSubselectionChanged((gpointer) (selected.empty() ? NULL :*(selected.begin()))); } @@ -1873,7 +1864,7 @@ void GrDrag::addLine(SPItem *item, Geom::Point p1, Geom::Point p2, Inkscape::Pai sp_canvas_item_move_to_z(line, 0); line->item = item; sp_canvas_item_show(line); - this->lines = g_slist_append(this->lines, line); + this->lines.push_back(line); } @@ -1889,7 +1880,7 @@ void GrDrag::addCurve(SPItem *item, Geom::Point p0, Geom::Point p1, Geom::Point sp_canvas_item_move_to_z(line, 0); line->item = item; sp_canvas_item_show (line); - this->lines = g_slist_append (this->lines, line); + this->lines.push_back(line); } @@ -1901,8 +1892,8 @@ void GrDrag::addDragger(GrDraggable *draggable) { Geom::Point p = getGradientCoords(draggable->item, draggable->point_type, draggable->point_i, draggable->fill_or_stroke); - for (GList *i = this->draggers; i != NULL; i = i->next) { - GrDragger *dragger = (GrDragger *) i->data; + for (std::vector<GrDragger *>::const_iterator l = this->draggers.begin(); l != this->draggers.end(); ++l) { + GrDragger *dragger = *l; if (dragger->mayMerge (draggable) && Geom::L2 (dragger->point - p) < MERGE_DIST) { // distance is small, merge this draggable into dragger, no need to create new dragger dragger->addDraggable (draggable); @@ -1913,7 +1904,7 @@ void GrDrag::addDragger(GrDraggable *draggable) GrDragger *new_dragger = new GrDragger(this, p, draggable); // fixme: draggers should be added AFTER the last one: this way tabbing through them will be from begin to end. - this->draggers = g_list_append (this->draggers, new_dragger); + this->draggers.push_back(new_dragger); } /** @@ -2071,15 +2062,12 @@ void GrDrag::grabKnot(SPItem *item, GrPointType point_type, gint point_i, Inksca */ void GrDrag::updateDraggers() { - while (selected) { - selected = g_list_remove(selected, selected->data); - } + selected.clear(); // delete old draggers - for (GList const* i = this->draggers; i != NULL; i = i->next) { - delete static_cast<GrDragger *>(i->data); + for (std::vector<GrDragger *>::const_iterator l = this->draggers.begin(); l != this->draggers.end(); ++l) { + delete (*l); } - g_list_free(this->draggers); - this->draggers = NULL; + this->draggers.clear(); g_return_if_fail(this->selection != NULL); std::vector<SPItem*> list = this->selection->itemList(); @@ -2127,8 +2115,8 @@ void GrDrag::updateDraggers() */ bool GrDrag::mouseOver() { - for (GList const* i = this->draggers; i != NULL; i = i->next) { - GrDragger *d = (GrDragger *) i->data; + for (std::vector<GrDragger *>::const_iterator l = this->draggers.begin(); l != this->draggers.end(); ++l) { + GrDragger *d = *l; if (d->knot && (d->knot->flags & SP_KNOT_MOUSEOVER)) { return true; } @@ -2143,11 +2131,10 @@ bool GrDrag::mouseOver() void GrDrag::updateLines() { // delete old lines - for (GSList const *i = this->lines; i != NULL; i = i->next) { - sp_canvas_item_destroy(SP_CANVAS_ITEM(i->data)); + for (std::vector<SPCtrlLine *>::const_iterator i = this->lines.begin(); i != this->lines.end(); ++i) { + sp_canvas_item_destroy(SP_CANVAS_ITEM(*i)); } - g_slist_free(this->lines); - this->lines = NULL; + this->lines.clear(); g_return_if_fail(this->selection != NULL); @@ -2313,13 +2300,11 @@ void GrDrag::updateLevels() void GrDrag::selected_reverse_vector() { - if (selected == NULL) + if (selected.empty()) return; - for (GSList const* i = ( (GrDragger*) selected->data )->draggables; i != NULL; i = i->next) { - GrDraggable *draggable = (GrDraggable *) i->data; - - sp_item_gradient_reverse_vector (draggable->item, draggable->fill_or_stroke); + for(std::vector<GrDraggable *>::const_iterator it = (*(selected.begin()))->draggables.begin(); it != (*(selected.begin()))->draggables.end(); ++it) { + sp_item_gradient_reverse_vector ((*it)->item, (*it)->fill_or_stroke); } } @@ -2330,13 +2315,13 @@ void GrDrag::selected_move_nowrite(double x, double y, bool scale_radial) void GrDrag::selected_move(double x, double y, bool write_repr, bool scale_radial) { - if (selected == NULL) + if (selected.empty()) return; bool did = false; - for (GList *i = selected; i != NULL; i = i->next) { - GrDragger *d = (GrDragger *) i->data; + for(std::set<GrDragger *>::const_iterator it = selected.begin(); it != selected.end(); ++it) { + GrDragger *d = *it; if (!d->isA(POINT_LG_MID) && !d->isA(POINT_RG_MID1) && !d->isA(POINT_RG_MID2)) { // if this is an endpoint, @@ -2347,12 +2332,12 @@ void GrDrag::selected_move(double x, double y, bool write_repr, bool scale_radia if (d->isA(POINT_RG_R1) || d->isA(POINT_RG_R2) || (d->isA(POINT_RG_FOCUS) && !d->isA(POINT_RG_CENTER))) { bool skip_radius_with_center = false; - for (GList *di = selected; di != NULL; di = di->next) { - GrDragger *d_new = (GrDragger *) di->data; - if (d_new->isA (((GrDraggable *) d->draggables->data)->item, + for(std::set<GrDragger *>::const_iterator di = selected.begin(); di != selected.end(); ++di) { + GrDragger *d_new = *di; + if (d_new->isA (( d->draggables[0])->item, POINT_RG_CENTER, 0, - ((GrDraggable *) d->draggables->data)->fill_or_stroke)) { + (d->draggables[0])->fill_or_stroke)) { // FIXME: here we take into account only the first draggable! skip_radius_with_center = true; } @@ -2382,23 +2367,23 @@ void GrDrag::selected_move(double x, double y, bool write_repr, bool scale_radia if (!did) { // none of the end draggers are selected, so let's try to move the mids - GrDragger *dragger = (GrDragger *) selected->data; + GrDragger *dragger = *(selected.begin()); // a midpoint dragger can (logically) only contain one GrDraggable - GrDraggable *draggable = (GrDraggable *) dragger->draggables->data; + GrDraggable *draggable = dragger->draggables[0]; Geom::Point begin(0,0), end(0,0); Geom::Point low_lim(0,0), high_lim(0,0); SPObject *server = draggable->getServer(); - GSList *moving = NULL; - gr_midpoint_limits(dragger, server, &begin, &end, &low_lim, &high_lim, &moving); + std::vector<GrDragger *> moving; + gr_midpoint_limits(dragger, server, &begin, &end, &low_lim, &high_lim, moving); Geom::LineSegment ls(low_lim, high_lim); Geom::Point p = ls.pointAt(ls.nearestTime(dragger->point + Geom::Point(x,y))); Geom::Point displacement = p - dragger->point; - for (GSList const* i = moving; i != NULL; i = i->next) { - GrDragger *drg = (GrDragger*) i->data; + for(std::vector<GrDragger *>::const_iterator i = moving.begin(); i!= moving.end();++i) { + GrDragger *drg = *i; SPKnot *drgknot = drg->knot; drg->point += displacement; drgknot->moveto(drg->point); @@ -2407,8 +2392,6 @@ void GrDrag::selected_move(double x, double y, bool write_repr, bool scale_radia did = true; } - g_slist_free(moving); - if (write_repr && did) { // we did an undoable action DocumentUndo::maybeDone(desktop->getDocument(), "grmovem", SP_VERB_CONTEXT_GRADIENT, @@ -2432,11 +2415,11 @@ void GrDrag::selected_move_screen(double x, double y) GrDragger *GrDrag::select_next() { GrDragger *d = NULL; - if (selected == NULL || g_list_find(draggers, selected->data)->next == NULL) { - if (draggers) - d = (GrDragger *) draggers->data; + if (selected.empty() || (++find(draggers.begin(),draggers.end(),*(selected.begin())))==draggers.end()) { + if (!draggers.empty()) + d = draggers[0]; } else { - d = (GrDragger *) g_list_find(draggers, selected->data)->next->data; + d = *(++find(draggers.begin(),draggers.end(),*(selected.begin()))); } if (d) setSelected (d); @@ -2449,11 +2432,11 @@ GrDragger *GrDrag::select_next() GrDragger *GrDrag::select_prev() { GrDragger *d = NULL; - if (selected == NULL || g_list_find(draggers, selected->data)->prev == NULL) { - if (draggers) - d = (GrDragger *) g_list_last (draggers)->data; + if (selected.empty() || draggers[0] == (*(selected.begin()))) { + if (!draggers.empty()) + d = draggers[draggers.size()-1]; } else { - d = (GrDragger *) g_list_find(draggers, selected->data)->prev->data; + d = *(--find(draggers.begin(),draggers.end(),*(selected.begin()))); } if (d) setSelected (d); @@ -2464,7 +2447,7 @@ GrDragger *GrDrag::select_prev() // FIXME: i.m.o. an ugly function that I just made to work, but... aargh! (Johan) void GrDrag::deleteSelected(bool just_one) { - if (!selected) return; + if (selected.empty()) return; SPDocument *document = NULL; @@ -2477,10 +2460,10 @@ void GrDrag::deleteSelected(bool just_one) GSList *midstoplist = NULL; // list of stops that must be deleted (will be deleted first) GSList *endstoplist = NULL; // list of stops that must be deleted - while (selected) { - GrDragger *dragger = (GrDragger*) selected->data; - for (GSList * drgble = dragger->draggables; drgble != NULL; drgble = drgble->next) { - GrDraggable *draggable = (GrDraggable*) drgble->data; + while (!selected.empty()) { + GrDragger *dragger = *(selected.begin()); + for(std::vector<GrDraggable *>::const_iterator drgble = dragger->draggables.begin(); drgble != dragger->draggables.end(); ++drgble) { + GrDraggable *draggable = *drgble; SPGradient *gradient = getGradient(draggable->item, draggable->fill_or_stroke); SPGradient *vector = sp_gradient_get_forked_vector_if_necessary (gradient, false); @@ -2538,7 +2521,7 @@ void GrDrag::deleteSelected(bool just_one) break; } } - selected = g_list_remove(selected, dragger); + selected.erase(dragger); if ( just_one ) break; // iterate once if just_one is set. } while (midstoplist) { diff --git a/src/gradient-drag.h b/src/gradient-drag.h index da264b4bb..b07f748a7 100644 --- a/src/gradient-drag.h +++ b/src/gradient-drag.h @@ -20,6 +20,7 @@ #include <stddef.h> #include <sigc++/sigc++.h> #include <vector> +#include <set> #include <glib.h> #include <glibmm/ustring.h> @@ -86,7 +87,7 @@ struct GrDragger { // position of the knot before it began to drag; updated when released Geom::Point point_original; - GSList *draggables; + std::vector<GrDraggable *> draggables; void addDraggable(GrDraggable *draggable); @@ -123,6 +124,7 @@ private: sigc::connection _ungrabbed_connection; }; +struct SPCtrlLine; /** This is the root class of the gradient dragging machinery. It holds lists of GrDraggers and of lines (simple canvas items). It also remembers one of the draggers as selected. @@ -133,20 +135,21 @@ public: // FIXME: make more of this private! GrDrag(SPDesktop *desktop); virtual ~GrDrag(); - bool isNonEmpty() {return (draggers != NULL);} - bool hasSelection() {return (selected != NULL);} - guint numSelected() {return (selected? g_list_length(selected) : 0);} - guint numDraggers() {return (draggers? g_list_length(draggers) : 0);} + bool isNonEmpty() {return !draggers.empty();} + bool hasSelection() {return !selected.empty();} + guint numSelected() {return selected.size();} + guint numDraggers() {return draggers.size();} guint singleSelectedDraggerNumDraggables() { - return (selected? g_slist_length(( static_cast<GrDragger *>(selected->data))->draggables) : 0); + return (selected.empty()? 0 : (*(selected.begin()))->draggables.size() ); } guint singleSelectedDraggerSingleDraggableType() { - return (selected? (static_cast<GrDraggable*>((static_cast<GrDragger*>(selected->data))->draggables->data))->point_type : 0);} + return (selected.empty() ? 0 : ((*(selected.begin()))->draggables[0]->point_type)); + } // especially the selection must be private, fix gradient-context to remove direct access to it - GList *selected; // list of GrDragger* + std::set<GrDragger *> selected; // list of GrDragger* void setSelected(GrDragger *dragger, bool add_to_selection = false, bool override = true); void setDeselected(GrDragger *dragger); void deselectAll(); @@ -178,8 +181,8 @@ public: // FIXME: make more of this private! std::vector<double> hor_levels; std::vector<double> vert_levels; - GList *draggers; - GSList *lines; + std::vector<GrDragger *> draggers; + std::vector<SPCtrlLine *> lines; void updateDraggers(); void updateLines(); diff --git a/src/graphlayout.cpp b/src/graphlayout.cpp index 9b67ba0b5..39ffb6cc7 100644 --- a/src/graphlayout.cpp +++ b/src/graphlayout.cpp @@ -106,7 +106,6 @@ void graphlayout(std::vector<SPItem*> const &items) { return; } - using Inkscape::Util::GSListIterator; list<SPItem *> selected; filterConnectors(items,selected); if (selected.empty()) return; @@ -164,10 +163,11 @@ void graphlayout(std::vector<SPItem*> const &items) { continue; } unsigned u=i_iter->second; - GSList *nlist=iu->avoidRef->getAttachedConnectors(Avoid::runningFrom); + std::vector<SPItem *> nlist=iu->avoidRef->getAttachedConnectors(Avoid::runningFrom); list<SPItem *> connectors; - connectors.insert<GSListIterator<SPItem *> >(connectors.end(),nlist,NULL); + connectors.insert(connectors.end(), nlist.begin(), nlist.end()); + for (list<SPItem *>::iterator j(connectors.begin()); j != connectors.end(); ++j) { @@ -203,9 +203,6 @@ void graphlayout(std::vector<SPItem*> const &items) { } } } - if(nlist) { - g_slist_free(nlist); - } } const unsigned E = es.size(); double eweights[E]; diff --git a/src/graphlayout.h b/src/graphlayout.h index 9794dd6b5..dfef45359 100644 --- a/src/graphlayout.h +++ b/src/graphlayout.h @@ -16,7 +16,6 @@ #include <list> -typedef struct _GSList GSList; class SPItem; void graphlayout(std::vector<SPItem*> const &items); diff --git a/src/guide-snapper.cpp b/src/guide-snapper.cpp index 960caed67..17f2d9583 100644 --- a/src/guide-snapper.cpp +++ b/src/guide-snapper.cpp @@ -44,11 +44,10 @@ Inkscape::GuideSnapper::LineList Inkscape::GuideSnapper::_getSnapLines(Geom::Poi } SPGuide const *guide_to_ignore = _snapmanager->getGuideToIgnore(); - - for (GSList const *l = _snapmanager->getNamedView()->guides; l != NULL; l = l->next) { - SPGuide const *g = SP_GUIDE(l->data); - if (g != guide_to_ignore) { - s.push_back(std::pair<Geom::Point, Geom::Point>(g->getNormal(), g->getPoint())); + std::vector<SPGuide *> guides = _snapmanager->getNamedView()->guides; + for(std::vector<SPGuide *>::const_iterator it = guides.begin() ; it != guides.end(); ++it) { + if ((*it) != guide_to_ignore) { + s.push_back(std::pair<Geom::Point, Geom::Point>((*it)->getNormal(), (*it)->getPoint())); } } diff --git a/src/layer-manager.cpp b/src/layer-manager.cpp index 3bbc831d5..5dae5f20a 100644 --- a/src/layer-manager.cpp +++ b/src/layer-manager.cpp @@ -191,15 +191,12 @@ Glib::ustring LayerManager::getNextLayerName( SPObject* obj, gchar const *label) } std::set<Glib::ustring> currentNames; - GSList const *layers=_document->getResourceList("layer"); + std::set<SPObject *> layers = _document->getResourceList("layer"); SPObject *root=_desktop->currentRoot(); if ( root ) { - for ( GSList const *iter=layers ; iter ; iter = iter->next ) { - SPObject *layer=static_cast<SPObject *>(iter->data); - if ( layer != obj ) { - currentNames.insert( layer->label() ? Glib::ustring(layer->label()) : Glib::ustring() ); - } - } + std::set<SPObject *>::iterator iter = layers.find(obj); + if (iter != layers.end()) + currentNames.insert( (*iter)->label() ? Glib::ustring((*iter)->label()) : Glib::ustring() ); } // Not sure if we need to cap it, but we'll just be paranoid for the moment @@ -262,15 +259,16 @@ void LayerManager::_rebuild() { if (!_document) // http://sourceforge.net/mailarchive/forum.php?thread_name=5747bce9a7ed077c1b4fc9f0f4f8a5e0%40localhost&forum_name=inkscape-devel return; - GSList const *layers = _document->getResourceList("layer"); + std::set<SPObject *> layers = _document->getResourceList("layer"); + SPObject *root=_desktop->currentRoot(); if ( root ) { _addOne(root); std::set<SPGroup*> layersToAdd; - for ( GSList const *iter = layers; iter; iter = iter->next ) { - SPObject *layer = static_cast<SPObject *>(iter->data); + for ( std::set<SPObject *>::const_iterator iter = layers.begin(); iter != layers.end(); ++iter ) { + SPObject *layer = *iter; // Debug::EventTracker<DebugLayerNote> tracker(Util::format("Examining %s", layer->label())); bool needsAdd = false; std::set<SPGroup*> additional; @@ -282,7 +280,7 @@ void LayerManager::_rebuild() { SPGroup* group = SP_GROUP(curr); if ( group->layerMode() == SPGroup::LAYER ) { // If we have a layer-group as the one or a parent, ensure it is listed as a valid layer. - needsAdd &= ( g_slist_find(const_cast<GSList *>(layers), curr) != NULL ); + needsAdd &= ( layers.find(curr) != layers.end() ); // XML Tree being used here directly while it shouldn't be... if ( (!(group->getRepr())) || (!(group->getRepr()->parent())) ) { needsAdd = false; diff --git a/src/path-chemistry.h b/src/path-chemistry.h index f454167a9..35ab923c0 100644 --- a/src/path-chemistry.h +++ b/src/path-chemistry.h @@ -24,7 +24,6 @@ class Node; } // namespace Inkscape typedef unsigned int guint32; -typedef struct _GSList GSList; void sp_selected_path_combine (SPDesktop *desktop); void sp_selected_path_break_apart (SPDesktop *desktop); diff --git a/src/profile-manager.cpp b/src/profile-manager.cpp index 90b124195..035aa6051 100644 --- a/src/profile-manager.cpp +++ b/src/profile-manager.cpp @@ -34,11 +34,9 @@ void ProfileManager::_resourcesChanged() { std::vector<SPObject*> newList; if (_doc) { - const GSList *current = _doc->getResourceList( "iccprofile" ); - while ( current ) { - newList.push_back(SP_OBJECT(current->data)); - current = g_slist_next(current); - } + std::set<SPObject *> current = _doc->getResourceList( "iccprofile" ); + for (std::set<SPObject *>::const_iterator i = current.begin(); i != current.end(); ++i) + newList.push_back(*i); } sort( newList.begin(), newList.end() ); diff --git a/src/removeoverlap.h b/src/removeoverlap.h index d873663d1..cc0c7d9b7 100644 --- a/src/removeoverlap.h +++ b/src/removeoverlap.h @@ -13,8 +13,6 @@ #ifndef SEEN_REMOVEOVERLAP_H #define SEEN_REMOVEOVERLAP_H -typedef struct _GSList GSList; - void removeoverlap(std::vector<SPItem*> const &items, double xGap, double yGap); #endif // SEEN_REMOVEOVERLAP_H diff --git a/src/resource-manager.cpp b/src/resource-manager.cpp index dbff27827..18d7c6ba2 100644 --- a/src/resource-manager.cpp +++ b/src/resource-manager.cpp @@ -179,9 +179,9 @@ std::vector<Glib::ustring> ResourceManagerImpl::findBrokenLinks( SPDocument *doc std::set<Glib::ustring> uniques; if ( doc ) { - GSList const *images = doc->getResourceList("image"); - for (GSList const *it = images; it; it = it->next) { - Inkscape::XML::Node *ir = static_cast<SPObject *>(it->data)->getRepr(); + std::set<SPObject *> images = doc->getResourceList("image"); + for (std::set<SPObject *>::const_iterator it = images.begin(); it != images.end(); ++it) { + Inkscape::XML::Node *ir = (*it)->getRepr(); gchar const *href = ir->attribute("xlink:href"); if ( href && ( uniques.find(href) == uniques.end() ) ) { @@ -305,10 +305,10 @@ bool ResourceManagerImpl::fixupBrokenLinks(SPDocument *doc) bool savedUndoState = DocumentUndo::getUndoSensitive(doc); DocumentUndo::setUndoSensitive(doc, true); - - GSList const *images = doc->getResourceList("image"); - for (GSList const *it = images; it; it = it->next) { - Inkscape::XML::Node *ir = static_cast<SPObject *>(it->data)->getRepr(); + + std::set<SPObject *> images = doc->getResourceList("image"); + for (std::set<SPObject *>::const_iterator it = images.begin(); it != images.end(); ++it) { + Inkscape::XML::Node *ir = (*it)->getRepr(); gchar const *href = ir->attribute("xlink:href"); if ( href ) { diff --git a/src/satisfied-guide-cns.cpp b/src/satisfied-guide-cns.cpp index 028a22405..a83417865 100644 --- a/src/satisfied-guide-cns.cpp +++ b/src/satisfied-guide-cns.cpp @@ -10,8 +10,8 @@ void satisfied_guide_cns(SPDesktop const &desktop, std::vector<SPGuideConstraint> &cns) { SPNamedView const &nv = *desktop.getNamedView(); - for (GSList const *l = nv.guides; l != NULL; l = l->next) { - SPGuide &g = *SP_GUIDE(l->data); + for(std::vector<SPGuide *>::const_iterator it = nv.guides.begin(); it != nv.guides.end(); ++it) { + SPGuide &g = *(*it); for (unsigned int i = 0; i < snappoints.size(); ++i) { if (Geom::are_near(g.getDistanceFrom(snappoints[i].getPoint()), 0, 1e-2)) { cns.push_back(SPGuideConstraint(&g, i)); diff --git a/src/selection-chemistry.h b/src/selection-chemistry.h index 5bcc5b1ea..4bfa2c0aa 100644 --- a/src/selection-chemistry.h +++ b/src/selection-chemistry.h @@ -22,7 +22,6 @@ class SPCSSAttr; class SPDesktop; -typedef struct _GSList GSList; namespace Inkscape { @@ -75,7 +74,6 @@ void sp_selection_unsymbol(SPDesktop *desktop); void sp_selection_tile(SPDesktop *desktop, bool apply = true); void sp_selection_untile(SPDesktop *desktop); -//void sp_selection_group_impl(GSList const *reprs_to_group, Inkscape::XML::Node *group, Inkscape::XML::Document *xml_doc, SPDocument *doc); void sp_selection_group(Inkscape::Selection *selection, SPDesktop *desktop); void sp_selection_ungroup(Inkscape::Selection *selection, SPDesktop *desktop); diff --git a/src/seltrans.h b/src/seltrans.h index 26c2e9cd9..f756cc77a 100644 --- a/src/seltrans.h +++ b/src/seltrans.h @@ -34,7 +34,6 @@ class SPDesktop; struct SPCanvasItem; struct SPCtrlLine; struct SPSelTransHandle; -typedef struct _GSList GSList; namespace Inkscape { diff --git a/src/snap.cpp b/src/snap.cpp index 4721283c3..7f0e8d9dc 100644 --- a/src/snap.cpp +++ b/src/snap.cpp @@ -69,9 +69,8 @@ SnapManager::SnapperList SnapManager::getGridSnappers() const SnapperList s; if (_desktop && _desktop->gridsEnabled() && snapprefs.isTargetSnappable(Inkscape::SNAPTARGET_GRID)) { - for ( GSList const *l = _named_view->grids; l != NULL; l = l->next) { - Inkscape::CanvasGrid *grid = (Inkscape::CanvasGrid*) l->data; - s.push_back(grid->snapper); + for(std::vector<Inkscape::CanvasGrid *>::const_iterator it = _named_view->grids.begin(); it != _named_view->grids.end(); ++it) { + s.push_back((*it)->snapper); } } @@ -173,8 +172,8 @@ Geom::Point SnapManager::multipleOfGridPitch(Geom::Point const &t, Geom::Point c // Cannot use getGridSnappers() because we need both the grids AND their snappers // Therefore we iterate through all grids manually - for (GSList const *l = _named_view->grids; l != NULL; l = l->next) { - Inkscape::CanvasGrid *grid = (Inkscape::CanvasGrid*) l->data; + for (std::vector<Inkscape::CanvasGrid *>::const_iterator it = _named_view->grids.begin(); it != _named_view->grids.end(); ++it) { + Inkscape::CanvasGrid *grid = (*it); const Inkscape::Snapper* snapper = grid->snapper; if (snapper && snapper->ThisSnapperMightSnap()) { // To find the nearest multiple of the grid pitch for a given translation t, we diff --git a/src/snap.h b/src/snap.h index c4dd67b4c..41d21b1b2 100644 --- a/src/snap.h +++ b/src/snap.h @@ -39,7 +39,6 @@ namespace Inkscape { class PureTransform; } -typedef struct _GSList GSList; /** * Class to coordinate snapping operations. diff --git a/src/sp-clippath.h b/src/sp-clippath.h index 8abe97f3f..7b1c83356 100644 --- a/src/sp-clippath.h +++ b/src/sp-clippath.h @@ -19,7 +19,6 @@ #define SP_IS_CLIPPATH(obj) (dynamic_cast<const SPClipPath*>((SPObject*)obj) != NULL) struct SPClipPathView; -typedef struct _GSList GSList; #include <cstdio> diff --git a/src/sp-guide.cpp b/src/sp-guide.cpp index fd07f76ef..70c73b7e3 100644 --- a/src/sp-guide.cpp +++ b/src/sp-guide.cpp @@ -53,7 +53,6 @@ SPGuide::SPGuide() : SPObject() , label(NULL) , locked(0) - , views(NULL) , normal_to_line(Geom::Point(0.,1.)) , point_on_line(Geom::Point(0.,0.)) , color(0x0000ff7f) @@ -64,8 +63,8 @@ void SPGuide::setColor(guint32 c) { color = c; - for (GSList *l = this->views; l != NULL; l = l->next) { - sp_guideline_set_color(SP_GUIDELINE(l->data), this->color); + for(std::vector<SPGuideLine *>::const_iterator it = this->views.begin(); it != this->views.end(); ++it) { + sp_guideline_set_color(*it, this->color); } } @@ -85,10 +84,10 @@ void SPGuide::build(SPDocument *document, Inkscape::XML::Node *repr) void SPGuide::release() { - while (this->views) { - sp_guideline_delete(SP_GUIDELINE(this->views->data)); - this->views = g_slist_remove(this->views, this->views->data); + for(std::vector<SPGuideLine *>::const_iterator it = this->views.begin(); it != this->views.end(); ++it) { + sp_guideline_delete(*it); } + this->views.clear(); if (this->document) { // Unregister ourselves @@ -265,10 +264,11 @@ void sp_guide_create_guides_around_page(SPDesktop *dt) void sp_guide_delete_all_guides(SPDesktop *dt) { SPDocument *doc=dt->getDocument(); - const GSList *current; - while ( (current = doc->getResourceList("guide")) ) { - SPGuide* guide = SP_GUIDE(current->data); + std::set<SPObject *> current = doc->getResourceList("guide"); + while (!current.empty()){ + SPGuide* guide = SP_GUIDE(*(current.begin())); sp_guide_remove(guide); + current = doc->getResourceList("guide"); } DocumentUndo::done(doc, SP_VERB_NONE, _("Delete All Guides")); @@ -281,14 +281,14 @@ void SPGuide::showSPGuide(SPCanvasGroup *group, GCallback handler) g_signal_connect(G_OBJECT(item), "event", G_CALLBACK(handler), this); - views = g_slist_prepend(views, item); + views.push_back(SP_GUIDELINE(item)); } void SPGuide::showSPGuide() { - for (GSList *v = views; v != NULL; v = v->next) { - sp_canvas_item_show(SP_CANVAS_ITEM(v->data)); - sp_canvas_item_show(SP_CANVAS_ITEM(SP_GUIDELINE(v->data)->origin)); + for(std::vector<SPGuideLine *>::const_iterator it = this->views.begin(); it != this->views.end(); ++it) { + sp_canvas_item_show(SP_CANVAS_ITEM(*it)); + sp_canvas_item_show(SP_CANVAS_ITEM((*it)->origin)); } } @@ -296,11 +296,10 @@ void SPGuide::hideSPGuide(SPCanvas *canvas) { g_assert(canvas != NULL); g_assert(SP_IS_CANVAS(canvas)); - - for (GSList *l = views; l != NULL; l = l->next) { - if (canvas == SP_CANVAS_ITEM(l->data)->canvas) { - sp_guideline_delete(SP_GUIDELINE(l->data)); - views = g_slist_remove(views, l->data); + for(std::vector<SPGuideLine *>::iterator it = this->views.begin(); it != this->views.end(); ++it) { + if (canvas == SP_CANVAS_ITEM(*it)->canvas) { + sp_guideline_delete(*it); + views.erase(it); return; } } @@ -310,9 +309,9 @@ void SPGuide::hideSPGuide(SPCanvas *canvas) void SPGuide::hideSPGuide() { - for (GSList *v = views; v != NULL; v = v->next) { - sp_canvas_item_hide(SP_CANVAS_ITEM(v->data)); - sp_canvas_item_hide(SP_CANVAS_ITEM(SP_GUIDELINE(v->data)->origin)); + for(std::vector<SPGuideLine *>::const_iterator it = this->views.begin(); it != this->views.end(); ++it) { + sp_canvas_item_hide(SP_CANVAS_ITEM(*it)); + sp_canvas_item_hide(SP_CANVAS_ITEM((*it)->origin)); } } @@ -321,9 +320,9 @@ void SPGuide::sensitize(SPCanvas *canvas, bool sensitive) g_assert(canvas != NULL); g_assert(SP_IS_CANVAS(canvas)); - for (GSList *l = views; l != NULL; l = l->next) { - if (canvas == SP_CANVAS_ITEM(l->data)->canvas) { - sp_guideline_set_sensitive(SP_GUIDELINE(l->data), sensitive); + for(std::vector<SPGuideLine *>::const_iterator it = this->views.begin(); it != this->views.end(); ++it) { + if (canvas == SP_CANVAS_ITEM(*it)->canvas) { + sp_guideline_set_sensitive(*it, sensitive); return; } } @@ -351,8 +350,8 @@ void SPGuide::moveto(Geom::Point const point_on_line, bool const commit) if(this->locked) { return; } - for (GSList *l = views; l != NULL; l = l->next) { - sp_guideline_set_position(SP_GUIDELINE(l->data), point_on_line); + for(std::vector<SPGuideLine *>::const_iterator it = this->views.begin(); it != this->views.end(); ++it) { + sp_guideline_set_position(*it, point_on_line); } /* Calling sp_repr_set_point must precede calling sp_item_notify_moveto in the commit @@ -400,8 +399,8 @@ void SPGuide::set_normal(Geom::Point const normal_to_line, bool const commit) if(this->locked) { return; } - for (GSList *l = this->views; l != NULL; l = l->next) { - sp_guideline_set_normal(SP_GUIDELINE(l->data), normal_to_line); + for(std::vector<SPGuideLine *>::const_iterator it = this->views.begin(); it != this->views.end(); ++it) { + sp_guideline_set_normal(*it, normal_to_line); } /* Calling sp_repr_set_svg_point must precede calling sp_item_notify_moveto in the commit @@ -426,8 +425,8 @@ void SPGuide::set_color(const unsigned r, const unsigned g, const unsigned b, bo { this->color = (r << 24) | (g << 16) | (b << 8) | 0x7f; - if (views) { - sp_guideline_set_color(SP_GUIDELINE(views->data), this->color); + if (! views.empty()) { + sp_guideline_set_color(views[0], this->color); } if (commit) { @@ -441,8 +440,8 @@ void SPGuide::set_color(const unsigned r, const unsigned g, const unsigned b, bo void SPGuide::set_locked(const bool locked, bool const commit) { this->locked = locked; - if (views) { - sp_guideline_set_locked(SP_GUIDELINE(views->data), locked); + if ( !views.empty() ) { + sp_guideline_set_locked(views[0], locked); } if (commit) { @@ -452,8 +451,8 @@ void SPGuide::set_locked(const bool locked, bool const commit) void SPGuide::set_label(const char* label, bool const commit) { - if (views) { - sp_guideline_set_label(SP_GUIDELINE(views->data), label); + if (!views.empty()) { + sp_guideline_set_label(views[0], label); } if (commit) { diff --git a/src/sp-guide.h b/src/sp-guide.h index 1ad415e85..25a0e5af8 100644 --- a/src/sp-guide.h +++ b/src/sp-guide.h @@ -22,13 +22,12 @@ typedef unsigned int guint32; extern "C" { typedef void (*GCallback) (void); - typedef struct _GSList GSList; } class SPDesktop; struct SPCanvas; struct SPCanvasGroup; - +struct SPGuideLine; #define SP_GUIDE(obj) (dynamic_cast<SPGuide*>((SPObject*)obj)) #define SP_IS_GUIDE(obj) (dynamic_cast<const SPGuide*>((SPObject*)obj) != NULL) @@ -80,8 +79,8 @@ protected: virtual void set(unsigned int key, const char* value); char* label; + std::vector<SPGuideLine *> views; // contains an object of type SPGuideline (see display/guideline.cpp for definition) bool locked; - GSList *views; // contains an object of type SPGuideline (see display/guideline.cpp for definition) Geom::Point normal_to_line; Geom::Point point_on_line; diff --git a/src/sp-item-group.h b/src/sp-item-group.h index fc0b6382f..0c74c3dc3 100644 --- a/src/sp-item-group.h +++ b/src/sp-item-group.h @@ -25,7 +25,6 @@ namespace Inkscape { class Drawing; class DrawingItem; -typedef struct _GSList GSList; } // namespace Inkscape diff --git a/src/sp-mask.cpp b/src/sp-mask.cpp index 5f7a2ec26..7b9ab11c3 100644 --- a/src/sp-mask.cpp +++ b/src/sp-mask.cpp @@ -138,23 +138,18 @@ void SPMask::update(SPCtx* ctx, unsigned int flags) { flags &= SP_OBJECT_MODIFIED_CASCADE; - GSList *l = NULL; - for (SPObject *child = this->firstChild(); child; child = child->getNext()) { - sp_object_ref(child); - l = g_slist_prepend (l, child); + std::vector<SPObject *> children = this->childList(false); + for (std::vector<SPObject *>::const_iterator child = children.begin();child != children.end();child++) { + sp_object_ref(*child); } - l = g_slist_reverse (l); - while (l) { - SPObject *child = SP_OBJECT(l->data); - l = g_slist_remove(l, child); - - if (flags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { - child->updateDisplay(ctx, flags); + for (std::vector<SPObject *>::const_iterator child = children.begin();child != children.end();child++) { + if (flags || ((*child)->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { + (*child)->updateDisplay(ctx, flags); } - sp_object_unref(child); + sp_object_unref(*child); } for (SPMaskView *v = this->display; v != NULL; v = v->next) { @@ -177,23 +172,17 @@ void SPMask::modified(unsigned int flags) { flags &= SP_OBJECT_MODIFIED_CASCADE; - GSList *l = NULL; - for (SPObject *child = this->firstChild(); child; child = child->getNext()) { - sp_object_ref(child); - l = g_slist_prepend(l, child); + std::vector<SPObject *> children = this->childList(false); + for (std::vector<SPObject *>::const_iterator child = children.begin();child != children.end();child++) { + sp_object_ref(*child); } - l = g_slist_reverse(l); - - while (l) { - SPObject *child = SP_OBJECT(l->data); - l = g_slist_remove(l, child); - - if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { - child->emitModified(flags); + for (std::vector<SPObject *>::const_iterator child = children.begin();child != children.end();child++) { + if (flags || ((*child)->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { + (*child)->emitModified(flags); } - sp_object_unref(child); + sp_object_unref(*child); } } diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index 22effd93c..50b567d2c 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -62,7 +62,7 @@ SPNamedView::SPNamedView() : SPObjectGroup(), snap_manager(this) { this->zoom = 0; this->guidecolor = 0; this->guidehicolor = 0; - this->views = NULL; + this->views.clear(); this->borderlayer = 0; this->page_size_units = NULL; this->window_x = 0; @@ -86,9 +86,9 @@ SPNamedView::SPNamedView() : SPObjectGroup(), snap_manager(this) { this->showborder = TRUE; this->showpageshadow = TRUE; - this->guides = NULL; + this->guides.clear(); this->viewcount = 0; - this->grids = NULL; + this->grids.clear(); this->default_layer_id = 0; @@ -249,7 +249,7 @@ void SPNamedView::build(SPDocument *document, Inkscape::XML::Node *repr) { for (SPObject *o = this->firstChild() ; o; o = o->getNext() ) { if (SP_IS_GUIDE(o)) { SPGuide * g = SP_GUIDE(o); - this->guides = g_slist_prepend(this->guides, g); + this->guides.push_back(g); //g_object_set(G_OBJECT(g), "color", nv->guidecolor, "hicolor", nv->guidehicolor, NULL); g->setColor(this->guidecolor); g->setHiColor(this->guidehicolor); @@ -272,18 +272,12 @@ void SPNamedView::build(SPDocument *document, Inkscape::XML::Node *repr) { } void SPNamedView::release() { - if (this->guides) { - g_slist_free(this->guides); - this->guides = NULL; - } + this->guides.clear(); // delete grids: - while ( this->grids ) { - Inkscape::CanvasGrid *gr = (Inkscape::CanvasGrid *)this->grids->data; // get first entry - delete gr; - this->grids = g_slist_remove_link(this->grids, this->grids); // deletes first entry - } - + for(std::vector<Inkscape::CanvasGrid *>::const_iterator it=this->grids.begin();it!=this->grids.end();++it ) + delete *it; + this->grids.clear(); SPObjectGroup::release(); } @@ -329,10 +323,9 @@ void SPNamedView::set(unsigned int key, const gchar* value) { this->guidecolor = (this->guidecolor & 0xff) | sp_svg_read_color(value, this->guidecolor); } - for (GSList *l = this->guides; l != NULL; l = l->next) { - SPGuide * g = SP_GUIDE(l->data); - g->setColor(this->guidecolor); - g->readAttr("inkscape:color"); + for(std::vector<SPGuide *>::const_iterator it=this->guides.begin();it!=this->guides.end();++it ) { + (*it)->setColor(this->guidecolor); + (*it)->readAttr("inkscape:color"); } this->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -341,10 +334,9 @@ void SPNamedView::set(unsigned int key, const gchar* value) { this->guidecolor = (this->guidecolor & 0xffffff00) | (DEFAULTGUIDECOLOR & 0xff); sp_nv_read_opacity(value, &this->guidecolor); - for (GSList *l = this->guides; l != NULL; l = l->next) { - SPGuide * g = SP_GUIDE(l->data); - g->setColor(this->guidecolor); - g->readAttr("inkscape:color"); + for(std::vector<SPGuide *>::const_iterator it=this->guides.begin();it!=this->guides.end();++it ) { + (*it)->setColor(this->guidecolor); + (*it)->readAttr("inkscape:color"); } this->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -355,10 +347,8 @@ void SPNamedView::set(unsigned int key, const gchar* value) { if (value) { this->guidehicolor = (this->guidehicolor & 0xff) | sp_svg_read_color(value, this->guidehicolor); } - - for (GSList *l = this->guides; l != NULL; l = l->next) { - //g_object_set(G_OBJECT(l->data), "hicolor", nv->guidehicolor, NULL); - SP_GUIDE(l->data)->setHiColor(this->guidehicolor); + for(std::vector<SPGuide *>::const_iterator it=this->guides.begin();it!=this->guides.end();++it ) { + (*it)->setHiColor(this->guidehicolor); } this->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -366,10 +356,8 @@ void SPNamedView::set(unsigned int key, const gchar* value) { case SP_ATTR_GUIDEHIOPACITY: this->guidehicolor = (this->guidehicolor & 0xffffff00) | (DEFAULTGUIDEHICOLOR & 0xff); sp_nv_read_opacity(value, &this->guidehicolor); - - for (GSList *l = this->guides; l != NULL; l = l->next) { - //g_object_set(G_OBJECT(l->data), "hicolor", nv->guidehicolor, NULL); - SP_GUIDE(l->data)->setHiColor(this->guidehicolor); + for(std::vector<SPGuide *>::const_iterator it=this->guides.begin();it!=this->guides.end();++it ) { + (*it)->setHiColor(this->guidehicolor); } this->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -623,10 +611,9 @@ static Inkscape::CanvasGrid* sp_namedview_add_grid(SPNamedView *nv, Inkscape::XML::Node *repr, SPDesktop *desktop) { Inkscape::CanvasGrid* grid = NULL; //check if namedview already has an object for this grid - for (GSList *l = nv->grids; l != NULL; l = l->next) { - Inkscape::CanvasGrid* g = (Inkscape::CanvasGrid*) l->data; - if (repr == g->repr) { - grid = g; + for(std::vector<Inkscape::CanvasGrid *>::const_iterator it=nv->grids.begin();it!=nv->grids.end();++it ) { + if (repr == (*it)->repr) { + grid = (*it); break; } } @@ -639,14 +626,13 @@ sp_namedview_add_grid(SPNamedView *nv, Inkscape::XML::Node *repr, SPDesktop *des return NULL; } grid = Inkscape::CanvasGrid::NewGrid(nv, repr, nv->document, gridtype); - nv->grids = g_slist_append(nv->grids, grid); + nv->grids.push_back(grid); } if (!desktop) { //add canvasitem to all desktops - for (GSList *l = nv->views; l != NULL; l = l->next) { - SPDesktop *dt = static_cast<SPDesktop*>(l->data); - grid->createCanvasItem(dt); + for(std::vector<SPDesktop *>::const_iterator it=nv->views.begin();it!=nv->views.end();++it ) { + grid->createCanvasItem(*it); } } else { //add canvasitem only for specified desktop @@ -669,7 +655,7 @@ void SPNamedView::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *r if (SP_IS_GUIDE(no)) { SPGuide *g = (SPGuide *) no; - this->guides = g_slist_prepend(this->guides, g); + this->guides.push_back(g); //g_object_set(G_OBJECT(g), "color", this->guidecolor, "hicolor", this->guidehicolor, NULL); g->setColor(this->guidecolor); @@ -677,11 +663,11 @@ void SPNamedView::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *r g->readAttr("inkscape:color"); if (this->editable) { - for (GSList *l = this->views; l != NULL; l = l->next) { - g->SPGuide::showSPGuide(static_cast<SPDesktop*>(l->data)->guides, (GCallback) sp_dt_guide_event); + for(std::vector<SPDesktop *>::const_iterator it=this->views.begin();it!=this->views.end();++it ) { + g->SPGuide::showSPGuide((*it)->guides, (GCallback) sp_dt_guide_event); - if (static_cast<SPDesktop*>(l->data)->guides_active) { - g->sensitize((static_cast<SPDesktop*> (l->data))->getCanvas(), TRUE); + if ((*it)->guides_active) { + g->sensitize((*it)->getCanvas(), TRUE); } sp_namedview_show_single_guide(SP_GUIDE(g), this->showguides); @@ -694,27 +680,19 @@ void SPNamedView::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *r void SPNamedView::remove_child(Inkscape::XML::Node *child) { if (!strcmp(child->name(), "inkscape:grid")) { - for ( GSList *iter = this->grids ; iter ; iter = iter->next ) { - Inkscape::CanvasGrid *gr = (Inkscape::CanvasGrid *)iter->data; - - if ( gr->repr == child ) { - delete gr; - this->grids = g_slist_remove_link(this->grids, iter); + for(std::vector<Inkscape::CanvasGrid *>::iterator it=this->grids.begin();it!=this->grids.end();++it ) { + if ( (*it)->repr == child ) { + delete (*it); + this->grids.erase(it); break; } } } else { - GSList **ref = &this->guides; - for ( GSList *iter = this->guides ; iter ; iter = iter->next ) { - - if ( reinterpret_cast<SPObject *>(iter->data)->getRepr() == child ) { - *ref = iter->next; - iter->next = NULL; - g_slist_free_1(iter); + for(std::vector<SPGuide *>::iterator it=this->guides.begin();it!=this->guides.end();++it ) { + if ( (*it)->getRepr() == child ) { + this->guides.erase(it); break; - } - - ref = &iter->next; + } } } @@ -737,16 +715,16 @@ Inkscape::XML::Node* SPNamedView::write(Inkscape::XML::Document *xml_doc, Inksca void SPNamedView::show(SPDesktop *desktop) { - for (GSList *l = guides; l != NULL; l = l->next) { - SP_GUIDE(l->data)->showSPGuide( desktop->guides, (GCallback) sp_dt_guide_event); + for(std::vector<SPGuide *>::const_iterator it=this->guides.begin();it!=this->guides.end();++it ) { + (*it)->showSPGuide( desktop->guides, (GCallback) sp_dt_guide_event); if (desktop->guides_active) { - SP_GUIDE(l->data)->sensitize(desktop->getCanvas(), TRUE); + (*it)->sensitize(desktop->getCanvas(), TRUE); } - sp_namedview_show_single_guide(SP_GUIDE(l->data), showguides); - sp_namedview_lock_single_guide(SP_GUIDE(l->data), lockguides); + sp_namedview_show_single_guide((*it), showguides); + sp_namedview_lock_single_guide((*it), lockguides); } - views = g_slist_prepend(views, desktop); + views.push_back(desktop); // generate grids specified in SVG: Inkscape::XML::Node *repr = this->getRepr(); @@ -935,38 +913,35 @@ void sp_namedview_document_from_window(SPDesktop *desktop) void SPNamedView::hide(SPDesktop const *desktop) { g_assert(desktop != NULL); - g_assert(g_slist_find(views, desktop)); - - for (GSList *l = guides; l != NULL; l = l->next) { - SP_GUIDE(l->data)->hideSPGuide(desktop->getCanvas()); + g_assert(std::find(views.begin(),views.end(),desktop)!=views.end()); + for(std::vector<SPGuide *>::iterator it=this->guides.begin();it!=this->guides.end();++it ) { + (*it)->hideSPGuide(desktop->getCanvas()); } - - views = g_slist_remove(views, desktop); + views.erase(std::remove(views.begin(),views.end(),desktop),views.end()); } void SPNamedView::activateGuides(void* desktop, bool active) { g_assert(desktop != NULL); - g_assert(g_slist_find(views, desktop)); + g_assert(std::find(views.begin(),views.end(),desktop)!=views.end()); SPDesktop *dt = static_cast<SPDesktop*>(desktop); - - for (GSList *l = guides; l != NULL; l = l->next) { - SP_GUIDE(l->data)->sensitize(dt->getCanvas(), active); + for(std::vector<SPGuide *>::iterator it=this->guides.begin();it!=this->guides.end();++it ) { + (*it)->sensitize(dt->getCanvas(), active); } } static void sp_namedview_setup_guides(SPNamedView *nv) { - for (GSList *l = nv->guides; l != NULL; l = l->next) { - sp_namedview_show_single_guide(SP_GUIDE(l->data), nv->showguides); + for(std::vector<SPGuide *>::iterator it=nv->guides.begin();it!=nv->guides.end();++it ) { + sp_namedview_show_single_guide(*it, nv->showguides); } } static void sp_namedview_lock_guides(SPNamedView *nv) { - for (GSList *l = nv->guides; l != NULL; l = l->next) { - sp_namedview_lock_single_guide(SP_GUIDE(l->data), nv->lockguides); + for(std::vector<SPGuide *>::iterator it=nv->guides.begin();it!=nv->guides.end();++it ) { + sp_namedview_lock_single_guide(*it, nv->lockguides); } } @@ -1050,7 +1025,7 @@ guint SPNamedView::getViewCount() return ++viewcount; } -GSList const *SPNamedView::getViewList() const +std::vector<SPDesktop *> const SPNamedView::getViewList() const { return views; } @@ -1185,18 +1160,17 @@ Inkscape::Util::Unit const & SPNamedView::getSVGUnit() const */ Inkscape::CanvasGrid * sp_namedview_get_first_enabled_grid(SPNamedView *namedview) { - for (GSList const * l = namedview->grids; l != NULL; l = l->next) { - Inkscape::CanvasGrid * grid = (Inkscape::CanvasGrid*) l->data; - if (grid->isEnabled()) - return grid; + for(std::vector<Inkscape::CanvasGrid *>::const_iterator it=namedview->grids.begin();it!=namedview->grids.end();++it ) { + if ((*it)->isEnabled()) + return (*it); } return NULL; } void SPNamedView::translateGuides(Geom::Translate const &tr) { - for (GSList *l = guides; l != NULL; l = l->next) { - SPGuide &guide = *SP_GUIDE(l->data); + for(std::vector<SPGuide *>::iterator it=this->guides.begin();it!=this->guides.end();++it ) { + SPGuide &guide = *(*it); Geom::Point point_on_line = guide.getPoint(); point_on_line *= tr; guide.moveto(point_on_line, true); @@ -1204,19 +1178,15 @@ void SPNamedView::translateGuides(Geom::Translate const &tr) { } void SPNamedView::translateGrids(Geom::Translate const &tr) { - for (GSList *l = grids; l != NULL; l = l->next) { - Inkscape::CanvasGrid* g = reinterpret_cast<Inkscape::CanvasGrid*>(l->data); - if (g) { - g->setOrigin(g->origin * tr); - } + for(std::vector<Inkscape::CanvasGrid *>::iterator it=this->grids.begin();it!=this->grids.end();++it ) { + (*it)->setOrigin((*it)->origin * tr); } } void SPNamedView::scrollAllDesktops(double dx, double dy, bool is_scrolling) { - for(GSList *l = views; l; l = l->next) { - SPDesktop *desktop = static_cast<SPDesktop *>(l->data); - desktop->scroll_world_in_svg_coords(dx, dy, is_scrolling); - } + for(std::vector<SPDesktop *>::iterator it=this->views.begin();it!=this->views.end();++it ) { + (*it)->scroll_world_in_svg_coords(dx, dy, is_scrolling); + } } diff --git a/src/sp-namedview.h b/src/sp-namedview.h index d95da1254..7aae90f40 100644 --- a/src/sp-namedview.h +++ b/src/sp-namedview.h @@ -21,6 +21,7 @@ #include "snap.h" #include "document.h" #include "util/units.h" +#include <vector> namespace Inkscape { class CanvasGrid; @@ -59,7 +60,7 @@ public: int window_maximized; SnapManager snap_manager; - GSList * grids; + std::vector<Inkscape::CanvasGrid *> grids; bool grids_visible; Inkscape::Util::Unit const *svg_units; // Units used for the values in SVG @@ -76,8 +77,8 @@ public: guint32 pagecolor; guint32 pageshadow; - GSList *guides; - GSList *views; + std::vector<SPGuide *> guides; + std::vector<SPDesktop *> views; int viewcount; @@ -86,7 +87,7 @@ public: void activateGuides(void* desktop, bool active); char const *getName() const; unsigned int getViewCount(); - GSList const *getViewList() const; + std::vector<SPDesktop *> const getViewList() const; Inkscape::Util::Unit const * getDisplayUnit() const; Inkscape::Util::Unit const & getSVGUnit() const; diff --git a/src/sp-object.h b/src/sp-object.h index 7bc02fad5..70d3e5df5 100644 --- a/src/sp-object.h +++ b/src/sp-object.h @@ -59,7 +59,6 @@ class SPObject; class SPCSSAttr; class SPStyle; -typedef struct _GSList GSList; namespace Inkscape { namespace XML { diff --git a/src/sp-switch.h b/src/sp-switch.h index 7152e1b82..57ce8b236 100644 --- a/src/sp-switch.h +++ b/src/sp-switch.h @@ -17,7 +17,6 @@ #include "sp-item-group.h" -typedef struct _GSList GSList; #define SP_SWITCH(obj) (dynamic_cast<SPSwitch*>((SPObject*)obj)) #define SP_IS_SWITCH(obj) (dynamic_cast<const SPSwitch*>((SPObject*)obj) != NULL) diff --git a/src/ui/dialog/document-properties.cpp b/src/ui/dialog/document-properties.cpp index b04e8ecc1..8af744fd3 100644 --- a/src/ui/dialog/document-properties.cpp +++ b/src/ui/dialog/document-properties.cpp @@ -511,17 +511,16 @@ void DocumentProperties::linkSelectedProfile() void DocumentProperties::populate_linked_profiles_box() { _LinkedProfilesListStore->clear(); - const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList( "iccprofile" ); - if (current) { - _emb_profiles_observer.set(SP_OBJECT(current->data)->parent); + std::set<SPObject *> current = SP_ACTIVE_DOCUMENT->getResourceList( "iccprofile" ); + if (! current.empty()) { + _emb_profiles_observer.set((*(current.begin()))->parent); } - while ( current ) { - SPObject* obj = SP_OBJECT(current->data); + for (std::set<SPObject *>::const_iterator it = current.begin(); it != current.end(); ++it) { + SPObject* obj = *it; Inkscape::ColorProfile* prof = reinterpret_cast<Inkscape::ColorProfile*>(obj); Gtk::TreeModel::Row row = *(_LinkedProfilesListStore->append()); row[_LinkedProfilesListColumns.nameColumn] = prof->name; // row[_LinkedProfilesListColumns.previewColumn] = "Color Preview"; - current = g_slist_next(current); } } @@ -594,10 +593,9 @@ void DocumentProperties::removeSelectedProfile(){ return; } } - - const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList( "iccprofile" ); - while ( current ) { - SPObject* obj = SP_OBJECT(current->data); + std::set<SPObject *> current = SP_ACTIVE_DOCUMENT->getResourceList( "iccprofile" ); + for (std::set<SPObject *>::const_iterator it = current.begin(); it != current.end(); ++it) { + SPObject* obj = *it; Inkscape::ColorProfile* prof = reinterpret_cast<Inkscape::ColorProfile*>(obj); if (!name.compare(prof->name)){ @@ -606,7 +604,6 @@ void DocumentProperties::removeSelectedProfile(){ DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_EDIT_REMOVE_COLOR_PROFILE, _("Remove linked color profile")); break; // removing the color profile likely invalidates part of the traversed list, stop traversing here. } - current = g_slist_next(current); } populate_linked_profiles_box(); @@ -722,9 +719,9 @@ void DocumentProperties::build_cms() _LinkedProfilesList.signal_button_release_event().connect_notify(sigc::mem_fun(*this, &DocumentProperties::linked_profiles_list_button_release)); cms_create_popup_menu(_LinkedProfilesList, sigc::mem_fun(*this, &DocumentProperties::removeSelectedProfile)); - const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList( "defs" ); - if (current) { - _emb_profiles_observer.set(SP_OBJECT(current->data)->parent); + std::set<SPObject *> current = SP_ACTIVE_DOCUMENT->getResourceList( "defs" ); + if (!current.empty()) { + _emb_profiles_observer.set((*(current.begin()))->parent); } _emb_profiles_observer.signal_changed().connect(sigc::mem_fun(*this, &DocumentProperties::populate_linked_profiles_box)); onColorProfileSelectRow(); @@ -959,9 +956,9 @@ void DocumentProperties::build_scripting() #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) //TODO: review this observers code: - const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList( "script" ); - if (current) { - _scripts_observer.set(SP_OBJECT(current->data)->parent); + std::set<SPObject *> current = SP_ACTIVE_DOCUMENT->getResourceList( "script" ); + if (! current.empty()) { + _scripts_observer.set((*(current.begin()))->parent); } _scripts_observer.signal_changed().connect(sigc::mem_fun(*this, &DocumentProperties::populate_script_lists)); onEmbeddedScriptSelectRow(); @@ -1174,9 +1171,9 @@ void DocumentProperties::removeExternalScript(){ } } - const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList( "script" ); - while ( current ) { - SPObject* obj = reinterpret_cast<SPObject *>(current->data); + std::set<SPObject *> current = SP_ACTIVE_DOCUMENT->getResourceList( "script" ); + for (std::set<SPObject *>::const_iterator it = current.begin(); it != current.end(); ++it) { + SPObject* obj = *it; if (obj) { SPScript* script = dynamic_cast<SPScript *>(obj); if (script && (name == script->xlinkhref)) { @@ -1191,7 +1188,6 @@ void DocumentProperties::removeExternalScript(){ } } } - current = g_slist_next(current); } populate_script_lists(); @@ -1253,9 +1249,9 @@ void DocumentProperties::changeEmbeddedScript(){ } bool voidscript=true; - const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList( "script" ); - while ( current ) { - SPObject* obj = SP_OBJECT(current->data); + std::set<SPObject *> current = SP_ACTIVE_DOCUMENT->getResourceList( "script" ); + for (std::set<SPObject *>::const_iterator it = current.begin(); it != current.end(); ++it) { + SPObject* obj = *it; if (id == obj->getId()){ int count=0; @@ -1279,7 +1275,6 @@ void DocumentProperties::changeEmbeddedScript(){ } } } - current = g_slist_next(current); } if (voidscript) @@ -1299,9 +1294,9 @@ void DocumentProperties::editEmbeddedScript(){ } Inkscape::XML::Document *xml_doc = SP_ACTIVE_DOCUMENT->getReprDoc(); - const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList( "script" ); - while ( current ) { - SPObject* obj = SP_OBJECT(current->data); + std::set<SPObject *> current = SP_ACTIVE_DOCUMENT->getResourceList( "script" ); + for (std::set<SPObject *>::const_iterator it = current.begin(); it != current.end(); ++it) { + SPObject* obj = *it; if (id == obj->getId()){ //XML Tree being used directly here while it shouldn't be. @@ -1317,21 +1312,20 @@ void DocumentProperties::editEmbeddedScript(){ DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_EDIT_EMBEDDED_SCRIPT, _("Edit embedded script")); } } - current = g_slist_next(current); } } void DocumentProperties::populate_script_lists(){ _ExternalScriptsListStore->clear(); _EmbeddedScriptsListStore->clear(); - const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList( "script" ); - if (current) { - SPObject *obj = reinterpret_cast<SPObject *>(current->data); + std::set<SPObject *> current = SP_ACTIVE_DOCUMENT->getResourceList( "script" ); + if (!current.empty()) { + SPObject *obj = *(current.begin()); g_assert(obj != NULL); _scripts_observer.set(obj->parent); } - while ( current ) { - SPObject* obj = reinterpret_cast<SPObject *>(current->data); + for (std::set<SPObject *>::const_iterator it = current.begin(); it != current.end(); ++it) { + SPObject* obj = *it; SPScript* script = dynamic_cast<SPScript *>(obj); g_assert(script != NULL); if (script->xlinkhref) @@ -1344,8 +1338,6 @@ void DocumentProperties::populate_script_lists(){ Gtk::TreeModel::Row row = *(_EmbeddedScriptsListStore->append()); row[_EmbeddedScriptsListColumns.idColumn] = obj->getId(); } - - current = g_slist_next(current); } } @@ -1364,12 +1356,11 @@ void DocumentProperties::update_gridspage() //add tabs bool grids_present = false; - for (GSList const * l = nv->grids; l != NULL; l = l->next) { - Inkscape::CanvasGrid * grid = (Inkscape::CanvasGrid*) l->data; - if (!grid->repr->attribute("id")) continue; // update_gridspage is called again when "id" is added - Glib::ustring name(grid->repr->attribute("id")); + for(std::vector<Inkscape::CanvasGrid *>::const_iterator it = nv->grids.begin(); it != nv->grids.end(); ++it) { + if (!(*it)->repr->attribute("id")) continue; // update_gridspage is called again when "id" is added + Glib::ustring name((*it)->repr->attribute("id")); const char *icon = NULL; - switch (grid->getGridType()) { + switch ((*it)->getGridType()) { case GRID_RECTANGULAR: icon = "grid-rectangular"; break; @@ -1379,7 +1370,7 @@ void DocumentProperties::update_gridspage() default: break; } - _grids_notebook.append_page(*grid->newWidget(), _createPageTabLabel(name, icon)); + _grids_notebook.append_page(*(*it)->newWidget(), _createPageTabLabel(name, icon)); grids_present = true; } _grids_notebook.show_all(); @@ -1639,14 +1630,9 @@ void DocumentProperties::onRemoveGrid() SPDesktop *dt = getDesktop(); SPNamedView *nv = dt->getNamedView(); Inkscape::CanvasGrid * found_grid = NULL; - int i = 0; - for (GSList const * l = nv->grids; l != NULL; l = l->next, i++) { // not a very nice fix, but works. - Inkscape::CanvasGrid * grid = (Inkscape::CanvasGrid*) l->data; - if (pagenum == i) { - found_grid = grid; - break; // break out of for-loop - } - } + if( pagenum < nv->grids.size()) + found_grid = nv->grids[pagenum]; + if (found_grid) { // delete the grid that corresponds with the selected tab // when the grid is deleted from SVG, the SPNamedview handler automatically deletes the object, so found_grid becomes an invalid pointer! diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp index 08a58291d..e3196bf59 100644 --- a/src/ui/dialog/filter-effects-dialog.cpp +++ b/src/ui/dialog/filter-effects-dialog.cpp @@ -1589,13 +1589,14 @@ void FilterEffectsDialog::FilterModifier::update_filters() { SPDesktop* desktop = _dialog.getDesktop(); SPDocument* document = desktop->getDocument(); - const GSList* filters = document->getResourceList("filter"); + + std::set<SPObject *> filters = document->getResourceList( "filter" ); _model->clear(); - for(const GSList *l = filters; l; l = l->next) { + for (std::set<SPObject *>::const_iterator it = filters.begin(); it != filters.end(); ++it) { Gtk::TreeModel::Row row = *_model->append(); - SPFilter* f = SP_FILTER(l->data); + SPFilter* f = SP_FILTER(*it); row[_columns.filter] = f; const gchar* lbl = f->label(); const gchar* id = f->getId(); diff --git a/src/ui/dialog/layers.cpp b/src/ui/dialog/layers.cpp index 3f5e80f8d..f4152e556 100644 --- a/src/ui/dialog/layers.cpp +++ b/src/ui/dialog/layers.cpp @@ -1040,14 +1040,6 @@ void LayersPanel::setDesktop( SPDesktop* desktop ) _layersChanged(); } } -/* - GSList const *layers = _desktop->doc()->getResourceList( "layer" ); - g_message( "layers list starts at %p", layers ); - for ( GSList const *iter=layers ; iter ; iter = iter->next ) { - SPObject *layer=static_cast<SPObject *>(iter->data); - g_message(" {%s} [%s]", layer->id, layer->label() ); - } -*/ deskTrack.setBase(desktop); } diff --git a/src/ui/dialog/svg-fonts-dialog.cpp b/src/ui/dialog/svg-fonts-dialog.cpp index 12b423602..46e045c14 100644 --- a/src/ui/dialog/svg-fonts-dialog.cpp +++ b/src/ui/dialog/svg-fonts-dialog.cpp @@ -266,12 +266,12 @@ void SvgFontsDialog::update_fonts() { SPDesktop* desktop = this->getDesktop(); SPDocument* document = desktop->getDocument(); - const GSList* fonts = document->getResourceList("font"); + std::set<SPObject *> fonts = document->getResourceList( "fonts" ); _model->clear(); - for(const GSList *l = fonts; l; l = l->next) { + for (std::set<SPObject *>::const_iterator it = fonts.begin(); it != fonts.end(); ++it) { Gtk::TreeModel::Row row = *_model->append(); - SPFont* f = SP_FONT(l->data); + SPFont* f = SP_FONT(*it); row[_columns.spfont] = f; row[_columns.svgfont] = new SvgFont(f); const gchar* lbl = f->label(); diff --git a/src/ui/dialog/swatches.cpp b/src/ui/dialog/swatches.cpp index 72677c07e..ed1cd2079 100644 --- a/src/ui/dialog/swatches.cpp +++ b/src/ui/dialog/swatches.cpp @@ -171,9 +171,9 @@ static void editGradient( GtkMenuItem */*menuitem*/, gpointer /*user_data*/ ) SPDocument *doc = desktop ? desktop->doc() : 0; if (doc) { std::string targetName(bounceTarget->def.descr); - const GSList *gradients = doc->getResourceList("gradient"); - for (const GSList *item = gradients; item; item = item->next) { - SPGradient* grad = SP_GRADIENT(item->data); + std::set<SPObject *> gradients = doc->getResourceList("gradient"); + for (std::set<SPObject *>::const_iterator item = gradients.begin(); item != gradients.end(); ++item) { + SPGradient* grad = SP_GRADIENT(*item); if ( targetName == grad->getId() ) { editGradientImpl( desktop, grad ); break; @@ -192,10 +192,10 @@ void SwatchesPanelHook::convertGradient( GtkMenuItem * /*menuitem*/, gpointer us gint index = GPOINTER_TO_INT(userData); if ( doc && (index >= 0) && (static_cast<guint>(index) < popupItems.size()) ) { Glib::ustring targetName = popupItems[index]; + std::set<SPObject *> gradients = doc->getResourceList("gradient"); + for (std::set<SPObject *>::const_iterator item = gradients.begin(); item != gradients.end(); ++item) { + SPGradient* grad = SP_GRADIENT(*item); - const GSList *gradients = doc->getResourceList("gradient"); - for (const GSList *item = gradients; item; item = item->next) { - SPGradient* grad = SP_GRADIENT(item->data); if ( targetName == grad->getId() ) { grad->setSwatch(); DocumentUndo::done(doc, SP_VERB_CONTEXT_GRADIENT, @@ -326,10 +326,10 @@ gboolean colorItemHandleButtonPress( GtkWidget* widget, GdkEventButton* event, g SPDesktopWidget *dtw = SP_DESKTOP_WIDGET(wdgt); if ( dtw && dtw->desktop ) { // Pick up all gradients with vectors - const GSList *gradients = (dtw->desktop->doc())->getResourceList("gradient"); + std::set<SPObject *> gradients = (dtw->desktop->doc())->getResourceList("gradient"); gint index = 0; - for (const GSList *curr = gradients; curr; curr = curr->next) { - SPGradient* grad = SP_GRADIENT(curr->data); + for (std::set<SPObject *>::const_iterator item = gradients.begin(); item != gradients.end(); ++item) { + SPGradient* grad = SP_GRADIENT(*item); if ( grad->hasStops() && !grad->isSwatch() ) { //gl = g_slist_prepend(gl, curr->data); processed = true; @@ -923,12 +923,11 @@ static void recalcSwatchContents(SPDocument* doc, std::map<ColorItem*, SPGradient*> &gradMappings) { std::vector<SPGradient*> newList; - - const GSList *gradients = doc->getResourceList("gradient"); - for (const GSList *item = gradients; item; item = item->next) { - SPGradient* grad = SP_GRADIENT(item->data); + std::set<SPObject *> gradients = doc->getResourceList("gradient"); + for (std::set<SPObject *>::const_iterator item = gradients.begin(); item != gradients.end(); ++item) { + SPGradient* grad = SP_GRADIENT(*item); if ( grad->isSwatch() ) { - newList.push_back(SP_GRADIENT(item->data)); + newList.push_back(SP_GRADIENT(*item)); } } diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp index 91301fb60..69b229519 100644 --- a/src/ui/interface.cpp +++ b/src/ui/interface.cpp @@ -1116,9 +1116,9 @@ sp_ui_drag_data_received(GtkWidget *widget, unsigned int b = color.getB(); SPGradient* matches = 0; - const GSList *gradients = doc->getResourceList("gradient"); - for (const GSList *item = gradients; item; item = item->next) { - SPGradient* grad = SP_GRADIENT(item->data); + std::set<SPObject *> gradients = doc->getResourceList("gradient"); + for (std::set<SPObject *>::const_iterator item = gradients.begin(); item != gradients.end(); ++item) { + SPGradient* grad = SP_GRADIENT(*item); if ( color.descr == grad->getId() ) { if ( grad->hasStops() ) { matches = grad; diff --git a/src/ui/tools/gradient-tool.cpp b/src/ui/tools/gradient-tool.cpp index bcb0b12b7..9d8101cc4 100644 --- a/src/ui/tools/gradient-tool.cpp +++ b/src/ui/tools/gradient-tool.cpp @@ -225,13 +225,13 @@ sp_gradient_context_get_stop_intervals (GrDrag *drag, GSList **these_stops, GSLi std::vector<Geom::Point> coords; // for all selected draggers - for (GList *i = drag->selected; i != NULL; i = i->next) { - GrDragger *dragger = (GrDragger *) i->data; + for (std::set<GrDragger *>::const_iterator i = drag->selected.begin(); i != drag->selected.end() ; ++i ) { + GrDragger *dragger = *i; // remember the coord of the dragger to reselect it later coords.push_back(dragger->point); // for all draggables of dragger - for (GSList const* j = dragger->draggables; j != NULL; j = j->next) { - GrDraggable *d = (GrDraggable *) j->data; + for (std::vector<GrDraggable *>::const_iterator j = dragger->draggables.begin(); j != dragger->draggables.end(); ++j) { + GrDraggable *d = *j; // find the gradient SPGradient *gradient = getGradient(d->item, d->fill_or_stroke); @@ -315,9 +315,9 @@ sp_gradient_context_add_stops_between_selected_stops (GradientTool *rc) if (g_slist_length(these_stops) == 0 && drag->numSelected() == 1) { // if a single stop is selected, add between that stop and the next one - GrDragger *dragger = (GrDragger *) drag->selected->data; - for (GSList const* j = dragger->draggables; j != NULL; j = j->next) { - GrDraggable *d = (GrDraggable *) j->data; + GrDragger *dragger = *(drag->selected.begin()); + for (std::vector<GrDraggable *>::const_iterator j = dragger->draggables.begin(); j != dragger->draggables.end(); ++j) { + GrDraggable *d = *j; if (d->point_type == POINT_RG_FOCUS) { /* * There are 2 draggables at the center (start) of a radial gradient @@ -482,9 +482,9 @@ bool GradientTool::root_handler(GdkEvent* event) { bool over_line = false; SPCtrlLine *line = NULL; - if (drag->lines) { - for (GSList *l = drag->lines; (l != NULL) && (!over_line); l = l->next) { - line = (SPCtrlLine*) l->data; + if (!drag->lines.empty()) { + for (std::vector<SPCtrlLine *>::const_iterator l = drag->lines.begin(); l != drag->lines.end() && (!over_line); ++l) { + line = *l; over_line |= sp_gradient_context_is_over_line (this, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y)); } } @@ -588,9 +588,9 @@ bool GradientTool::root_handler(GdkEvent* event) { bool over_line = false; - if (drag->lines) { - for (GSList *l = drag->lines; l != NULL; l = l->next) { - over_line |= sp_gradient_context_is_over_line (this, (SPItem*) l->data, Geom::Point(event->motion.x, event->motion.y)); + if (!drag->lines.empty()) { + for (std::vector<SPCtrlLine *>::const_iterator l = drag->lines.begin(); l != drag->lines.end(); ++l) { + over_line |= sp_gradient_context_is_over_line (this, (SPItem*) (*l), Geom::Point(event->motion.x, event->motion.y)); } } @@ -613,12 +613,10 @@ bool GradientTool::root_handler(GdkEvent* event) { bool over_line = false; SPCtrlLine *line = NULL; - if (drag->lines) { - for (GSList *l = drag->lines; (l != NULL) && (!over_line); l = l->next) { - line = (SPCtrlLine*) l->data; + if (!drag->lines.empty()) { + for (std::vector<SPCtrlLine *>::const_iterator l = drag->lines.begin(); l != drag->lines.end() && (!over_line); ++l) { + line = *l; over_line = sp_gradient_context_is_over_line (this, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y)); - if (over_line) - break; } } @@ -663,7 +661,7 @@ bool GradientTool::root_handler(GdkEvent* event) { } } else { // click in an empty space; do the same as Esc - if (drag->selected) { + if (!drag->selected.empty()) { drag->deselectAll(); } else { selection->clear(); @@ -719,7 +717,7 @@ bool GradientTool::root_handler(GdkEvent* event) { break; case GDK_KEY_Escape: - if (drag->selected) { + if (!drag->selected.empty()) { drag->deselectAll(); } else { Inkscape::SelectionHelper::selectNone(desktop); diff --git a/src/ui/tools/mesh-tool.cpp b/src/ui/tools/mesh-tool.cpp index 56ba08789..7db4e09d8 100644 --- a/src/ui/tools/mesh-tool.cpp +++ b/src/ui/tools/mesh-tool.cpp @@ -332,11 +332,11 @@ sp_mesh_context_corner_operation (MeshTool *rc, MeshCornerOperation operation ) // Get list of selected draggers for each mesh. // For all selected draggers - for (GList *i = drag->selected; i != NULL; i = i->next) { - GrDragger *dragger = (GrDragger *) i->data; + for (std::set<GrDragger *>::const_iterator i = drag->selected.begin(); i != drag->selected.end(); ++i) { + GrDragger *dragger = *i; // For all draggables of dragger - for (GSList const* j = dragger->draggables; j != NULL; j = j->next) { - GrDraggable *d = (GrDraggable *) j->data; + for (std::vector<GrDraggable *>::const_iterator j = dragger->draggables.begin(); j != dragger->draggables.end() ; ++j) { + GrDraggable *d = *j; // Only mesh corners if( d->point_type != POINT_MG_CORNER ) continue; @@ -457,9 +457,9 @@ bool MeshTool::root_handler(GdkEvent* event) { bool over_line = false; SPCtrlCurve *line = NULL; - if (drag->lines) { - for (GSList *l = drag->lines; (l != NULL) && (!over_line); l = l->next) { - line = (SPCtrlCurve*) l->data; + if (! drag->lines.empty()) { + for (std::vector<SPCtrlLine *>::const_iterator l = drag->lines.begin(); l != drag->lines.end() && (!over_line); l++) { + line = (SPCtrlCurve*) (*l); over_line |= sp_mesh_context_is_over_line (this, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y)); } } @@ -593,9 +593,9 @@ bool MeshTool::root_handler(GdkEvent* event) { // Change cursor shape if over line bool over_line = false; - if (drag->lines) { - for (GSList *l = drag->lines; l != NULL; l = l->next) { - over_line |= sp_mesh_context_is_over_line (this, (SPItem*) l->data, Geom::Point(event->motion.x, event->motion.y)); + if (!drag->lines.empty()) { + for (std::vector<SPCtrlLine *>::const_iterator l = drag->lines.begin(); l != drag->lines.end() ; l++) { + over_line |= sp_mesh_context_is_over_line (this, (SPItem*)(*l), Geom::Point(event->motion.x, event->motion.y)); } } @@ -624,9 +624,9 @@ bool MeshTool::root_handler(GdkEvent* event) { bool over_line = false; SPCtrlLine *line = NULL; - if (drag->lines) { - for (GSList *l = drag->lines; (l != NULL) && (!over_line); l = l->next) { - line = (SPCtrlLine*) l->data; + if (!drag->lines.empty()) { + for (std::vector<SPCtrlLine *>::const_iterator l = drag->lines.begin(); l != drag->lines.end() && (!over_line); l++) { + line = (SPCtrlLine*)(*l); over_line = sp_mesh_context_is_over_line (this, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y)); if (over_line) { @@ -678,7 +678,7 @@ bool MeshTool::root_handler(GdkEvent* event) { } } else { // click in an empty space; do the same as Esc - if (drag->selected) { + if (!drag->selected.empty()) { drag->deselectAll(); } else { selection->clear(); @@ -724,7 +724,7 @@ bool MeshTool::root_handler(GdkEvent* event) { break; case GDK_KEY_Escape: - if (drag->selected) { + if (!drag->selected.empty()) { drag->deselectAll(); } else { selection->clear(); @@ -841,7 +841,7 @@ bool MeshTool::root_handler(GdkEvent* event) { case GDK_KEY_Delete: case GDK_KEY_KP_Delete: case GDK_KEY_BackSpace: - if ( drag->selected ) { + if ( !drag->selected.empty() ) { std::cout << "Deleting mesh stops not implemented yet" << std::endl; ret = TRUE; } diff --git a/src/ui/tools/select-tool.cpp b/src/ui/tools/select-tool.cpp index f06b03d91..2b85216d2 100644 --- a/src/ui/tools/select-tool.cpp +++ b/src/ui/tools/select-tool.cpp @@ -89,10 +89,6 @@ SelectTool::SelectTool() , button_press_shift(false) , button_press_ctrl(false) , button_press_alt(false) - , cycling_items(NULL) - , cycling_items_cmp(NULL) - , cycling_items_selected_before(NULL) - , cycling_cur_item(NULL) , cycling_wrap(true) , item(NULL) , grabbed(NULL) @@ -390,16 +386,16 @@ bool SelectTool::item_handler(SPItem* item, GdkEvent* event) { } void SelectTool::sp_select_context_cycle_through_items(Inkscape::Selection *selection, GdkEventScroll *scroll_event, bool shift_pressed) { - if (!this->cycling_cur_item) { + if (this->cycling_cur_item == this->cycling_items.end()) { return; } Inkscape::DrawingItem *arenaitem; - SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(cycling_cur_item->data)); + SPItem *item = *cycling_cur_item; g_assert(item != NULL); // Deactivate current item - if (!g_list_find(this->cycling_items_selected_before, item) && selection->includes(item)) { + if (std::find(cycling_items_selected_before.begin(), cycling_items_selected_before.end(), item) == cycling_items_selected_before.end() && selection->includes(item)) { selection->remove(item); } @@ -407,20 +403,20 @@ void SelectTool::sp_select_context_cycle_through_items(Inkscape::Selection *sele arenaitem->setOpacity(0.3); // Find next item and activate it - GList *next; + std::vector<SPItem *>::iterator next = this->cycling_cur_item; if (scroll_event->direction == GDK_SCROLL_UP) { - next = this->cycling_cur_item->next; - if (next == NULL && this->cycling_wrap) - next = this->cycling_items; + next++; + if (next == this->cycling_items.end() && this->cycling_wrap) + next = this->cycling_items.begin(); } else { - next = this->cycling_cur_item->prev; - if (next == NULL && this->cycling_wrap) - next = g_list_last(this->cycling_items); + if(next == this->cycling_items.begin()) + next = this->cycling_items.end(); + next--; } - if (next) { + if (next!=this->cycling_items.end()) { this->cycling_cur_item = next; - item = dynamic_cast<SPItem *>(static_cast<SPObject *>(this->cycling_cur_item->data)); + item = *next; g_assert(item != NULL); } @@ -435,8 +431,8 @@ void SelectTool::sp_select_context_cycle_through_items(Inkscape::Selection *sele } void SelectTool::sp_select_context_reset_opacities() { - for (GList *l = this->cycling_items; l != NULL; l = g_list_next(l)) { - SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(l->data)); + for (std::vector<SPItem *>::const_iterator l = this->cycling_items.begin(); l != this->cycling_items.end(); ++l ) { + SPItem *item = *l; if (item) { Inkscape::DrawingItem *arenaitem = item->get_arenaitem(desktop->dkey); arenaitem->setOpacity(SP_SCALE24_TO_FLOAT(item->style->opacity.value)); @@ -445,14 +441,10 @@ void SelectTool::sp_select_context_reset_opacities() { } } - g_list_free(this->cycling_items); - g_list_free(this->cycling_items_selected_before); - g_list_free(this->cycling_items_cmp); - - this->cycling_items = NULL; - this->cycling_items_selected_before = NULL; - this->cycling_cur_item = NULL; - this->cycling_items_cmp = NULL; + this->cycling_items.clear(); + this->cycling_items_selected_before.clear(); + this->cycling_cur_item = this->cycling_items.end(); + this->cycling_items_cmp.clear(); } bool SelectTool::root_handler(GdkEvent* event) { @@ -819,70 +811,57 @@ bool SelectTool::root_handler(GdkEvent* event) { SPItem *item = desktop->getItemAtPoint(p, true, NULL); // Save pointer to current cycle-item so that we can find it again later, in the freshly built list - SPItem *tmp_cur_item = this->cycling_cur_item ? dynamic_cast<SPItem *>(static_cast<SPObject *>(this->cycling_cur_item->data)) : NULL; - g_list_free(this->cycling_items); - this->cycling_items = NULL; - this->cycling_cur_item = NULL; - + SPItem *tmp_cur_item = this->cycling_cur_item!=this->cycling_items.end() ? (*(this->cycling_cur_item)) : NULL; + this->cycling_items.clear(); + this->cycling_cur_item = this->cycling_items.end(); while(item != NULL) { - this->cycling_items = g_list_append(this->cycling_items, item); + this->cycling_items.push_back(item); item = desktop->getItemAtPoint(p, true, item); } /* Compare current item list with item list during previous scroll ... */ - GList *l1, *l2; - bool item_lists_differ = false; - - // Note that we can do an 'or' comparison in the loop because it is safe to call g_list_next with a NULL pointer. - for (l1 = this->cycling_items, l2 = this->cycling_items_cmp; l1 != NULL || l2 != NULL; l1 = g_list_next(l1), l2 = g_list_next(l2)) { - if ((l1 !=NULL && l2 == NULL) || (l1 == NULL && l2 != NULL) || (l1->data != l2->data)) { - item_lists_differ = true; - break; - } - } + bool item_lists_differ = this->cycling_items != this->cycling_items_cmp; /* If list of items under mouse pointer hasn't changed ... */ if (!item_lists_differ) { // ... find current item in the freshly built list and continue cycling ... // TODO: This wouldn't be necessary if cycling_cur_item pointed to an element of cycling_items_cmp instead - this->cycling_cur_item = g_list_find(this->cycling_items, tmp_cur_item); - g_assert(this->cycling_cur_item != NULL || this->cycling_items == NULL); + this->cycling_cur_item = std::find(this->cycling_items.begin(), this->cycling_items.end(), tmp_cur_item); + g_assert(this->cycling_cur_item != this->cycling_items.end() || this->cycling_items.empty()); } else { // ... otherwise reset opacities for outdated items ... Inkscape::DrawingItem *arenaitem; - for(GList *l = this->cycling_items_cmp; l != NULL; l = l->next) { - SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(l->data)); + for (std::vector<SPItem *>::const_iterator l = this->cycling_items_cmp.begin(); l != this->cycling_items_cmp.end(); ++l) { + SPItem *item = *l; if (item) { arenaitem = item->get_arenaitem(desktop->dkey); arenaitem->setOpacity(1.0); //if (!shift_pressed && !g_list_find(this->cycling_items_selected_before, item) && selection->includes(item)) - if (!g_list_find(this->cycling_items_selected_before, item) && selection->includes(item)) { + if (std::find(this->cycling_items_selected_before.begin(),this->cycling_items_selected_before.end(), item)==this->cycling_items_selected_before.end() && selection->includes(item)) { selection->remove(item); } } } // ... clear the lists ... - g_list_free(this->cycling_items_cmp); - g_list_free(this->cycling_items_selected_before); - this->cycling_items_cmp = NULL; - this->cycling_items_selected_before = NULL; - this->cycling_cur_item = NULL; + this->cycling_items_cmp.clear(); + this->cycling_items_selected_before.clear(); + this->cycling_cur_item = this->cycling_items.end(); // ... and rebuild them with the new items. - this->cycling_items_cmp = g_list_copy(this->cycling_items); + this->cycling_items_cmp = (this->cycling_items); - for(GList *l = this->cycling_items; l != NULL; l = l->next) { - SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(l->data)); + for(std::vector<SPItem *>::const_iterator l = this->cycling_items.begin(); l != this->cycling_items.end(); ++l) { + SPItem *item =*l; if (item) { arenaitem = item->get_arenaitem(desktop->dkey); arenaitem->setOpacity(0.3); if (selection->includes(item)) { // already selected items are stored separately, too - this->cycling_items_selected_before = g_list_append(this->cycling_items_selected_before, item); + this->cycling_items_selected_before.push_back(item); } } else { g_assert_not_reached(); @@ -890,7 +869,8 @@ bool SelectTool::root_handler(GdkEvent* event) { } // set the current item to the bottommost one so that the cycling step below re-starts at the top - this->cycling_cur_item = g_list_last(this->cycling_items); + this->cycling_cur_item = this->cycling_items.end(); + this->cycling_cur_item--; } this->cycling_wrap = prefs->getBool("/options/selection/cycleWrap", true); diff --git a/src/ui/tools/select-tool.h b/src/ui/tools/select-tool.h index 5af99a56a..af183b1ca 100644 --- a/src/ui/tools/select-tool.h +++ b/src/ui/tools/select-tool.h @@ -40,10 +40,10 @@ public: bool button_press_ctrl; bool button_press_alt; - GList *cycling_items; - GList *cycling_items_cmp; - GList *cycling_items_selected_before; - GList *cycling_cur_item; + std::vector<SPItem *> cycling_items; + std::vector<SPItem *> cycling_items_cmp; + std::vector<SPItem *> cycling_items_selected_before; + std::vector<SPItem *>::iterator cycling_cur_item; bool cycling_wrap; SPItem *item; diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp index bf7b61b61..abac2c091 100644 --- a/src/ui/tools/tool-base.cpp +++ b/src/ui/tools/tool-base.cpp @@ -924,7 +924,7 @@ void ToolBase::enableGrDrag(bool enable) { */ bool ToolBase::deleteSelectedDrag(bool just_one) { - if (_grdrag && _grdrag->selected) { + if (_grdrag && !_grdrag->selected.empty()) { _grdrag->deleteSelected(just_one); return TRUE; } diff --git a/src/ui/widget/color-icc-selector.cpp b/src/ui/widget/color-icc-selector.cpp index 1c31ae33a..2fe4a0704 100644 --- a/src/ui/widget/color-icc-selector.cpp +++ b/src/ui/widget/color-icc-selector.cpp @@ -676,9 +676,9 @@ void ColorICCSelectorImpl::_profilesChanged(std::string const &name) gtk_combo_box_set_active(combo, 0); int index = 1; - const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList("iccprofile"); - while (current) { - SPObject *obj = SP_OBJECT(current->data); + std::set<SPObject *> current = SP_ACTIVE_DOCUMENT->getResourceList("iccprofile"); + for (std::set<SPObject *>::const_iterator it = current.begin(); it != current.end(); ++it) { + SPObject *obj = *it; Inkscape::ColorProfile *prof = reinterpret_cast<Inkscape::ColorProfile *>(obj); gtk_list_store_append(store, &iter); @@ -690,7 +690,6 @@ void ColorICCSelectorImpl::_profilesChanged(std::string const &name) } index++; - current = g_slist_next(current); } g_signal_handler_unblock(G_OBJECT(_profileSel), _profChangedID); diff --git a/src/unclump.h b/src/unclump.h index 461e99d0b..c6948f320 100644 --- a/src/unclump.h +++ b/src/unclump.h @@ -11,7 +11,6 @@ #ifndef SEEN_DIALOGS_UNCLUMP_H #define SEEN_DIALOGS_UNCLUMP_H -typedef struct _GSList GSList; void unclump(std::vector<SPItem*> &items); diff --git a/src/vanishing-point.cpp b/src/vanishing-point.cpp index 19750bd37..9ce60fce7 100644 --- a/src/vanishing-point.cpp +++ b/src/vanishing-point.cpp @@ -137,8 +137,8 @@ vp_knot_moved_handler (SPKnot *knot, Geom::Point const &ppointer, guint state, g if (!(state & GDK_SHIFT_MASK)) { // without Shift; see if we need to snap to another dragger - for (GList *di = dragger->parent->draggers; di != NULL; di = di->next) { - VPDragger *d_new = (VPDragger *) di->data; + for (std::vector<VPDragger *>::const_iterator di = dragger->parent->draggers.begin(); di != dragger->parent->draggers.end(); ++di) { + VPDragger *d_new = *di; if ((d_new != dragger) && (Geom::L2 (d_new->point - p) < snap_dist)) { if (have_VPs_of_same_perspective (dragger, d_new)) { // this would result in degenerate boxes, which we disallow for the time being @@ -155,7 +155,7 @@ vp_knot_moved_handler (SPKnot *knot, Geom::Point const &ppointer, guint state, g d_new->vps.merge(dragger->vps); // ... delete old dragger ... - drag->draggers = g_list_remove (drag->draggers, dragger); + drag->draggers.erase(std::remove(drag->draggers.begin(), drag->draggers.end(), dragger),drag->draggers.end()); delete dragger; dragger = NULL; @@ -494,8 +494,6 @@ VPDrag::VPDrag (SPDocument *document) this->document = document; this->selection = SP_ACTIVE_DESKTOP->getSelection(); - this->draggers = NULL; - this->lines = NULL; this->show_lines = true; this->front_or_rear_lines = 0x1; @@ -522,17 +520,15 @@ VPDrag::~VPDrag() this->sel_changed_connection.disconnect(); this->sel_modified_connection.disconnect(); - for (GList *l = this->draggers; l != NULL; l = l->next) { - delete ((VPDragger *) l->data); + for (std::vector<VPDragger *>::const_iterator i = this->draggers.begin(); i != this->draggers.end(); ++i) { + delete (*i); } - g_list_free (this->draggers); - this->draggers = NULL; + this->draggers.clear(); - for (GSList const *i = this->lines; i != NULL; i = i->next) { - sp_canvas_item_destroy(SP_CANVAS_ITEM(i->data)); + for (std::vector<SPCtrlLine *>::const_iterator i = this->lines.begin(); i != this->lines.end(); ++i) { + sp_canvas_item_destroy(SP_CANVAS_ITEM(*i)); } - g_slist_free (this->lines); - this->lines = NULL; + this->lines.clear(); } /** @@ -541,8 +537,8 @@ VPDrag::~VPDrag() VPDragger * VPDrag::getDraggerFor (VanishingPoint const &vp) { - for (GList const* i = this->draggers; i != NULL; i = i->next) { - VPDragger *dragger = (VPDragger *) i->data; + for (std::vector<VPDragger *>::const_iterator i = this->draggers.begin(); i != this->draggers.end(); ++i) { + VPDragger *dragger = *i; for (std::list<VanishingPoint>::iterator j = dragger->vps.begin(); j != dragger->vps.end(); ++j) { // TODO: Should we compare the pointers or the VPs themselves!?!?!?! if (*j == vp) { @@ -557,8 +553,8 @@ void VPDrag::printDraggers () { g_print ("=== VPDrag info: =================================\n"); - for (GList const* i = this->draggers; i != NULL; i = i->next) { - ((VPDragger *) i->data)->printVPs(); + for (std::vector<VPDragger *>::const_iterator i = this->draggers.begin(); i != this->draggers.end(); ++i) { + (*i)->printVPs(); g_print ("========\n"); } g_print ("=================================================\n"); @@ -573,11 +569,10 @@ VPDrag::updateDraggers () if (this->dragging) return; // delete old draggers - for (GList const* i = this->draggers; i != NULL; i = i->next) { - delete ((VPDragger *) i->data); + for (std::vector<VPDragger *>::const_iterator i = this->draggers.begin(); i != this->draggers.end(); ++i) { + delete (*i); } - g_list_free (this->draggers); - this->draggers = NULL; + this->draggers.clear(); g_return_if_fail (this->selection != NULL); @@ -603,11 +598,10 @@ void VPDrag::updateLines () { // delete old lines - for (GSList const *i = this->lines; i != NULL; i = i->next) { - sp_canvas_item_destroy(SP_CANVAS_ITEM(i->data)); + for (std::vector<SPCtrlLine *>::const_iterator i = this->lines.begin(); i != this->lines.end(); ++i) { + sp_canvas_item_destroy(SP_CANVAS_ITEM(*i)); } - g_slist_free (this->lines); - this->lines = NULL; + this->lines.clear(); // do nothing if perspective lines are currently disabled if (this->show_lines == 0) return; @@ -651,8 +645,8 @@ VPDrag::updateBoxHandles () void VPDrag::updateBoxReprs () { - for (GList *i = this->draggers; i != NULL; i = i->next) { - VPDragger *dragger = (VPDragger *) i->data; + for (std::vector<VPDragger *>::const_iterator i = this->draggers.begin(); i != this->draggers.end(); ++i) { + VPDragger *dragger = *i; for (std::list<VanishingPoint>::iterator i = dragger->vps.begin(); i != dragger->vps.end(); ++i) { (*i).updateBoxReprs(); } @@ -662,8 +656,8 @@ VPDrag::updateBoxReprs () void VPDrag::updateBoxDisplays () { - for (GList *i = this->draggers; i != NULL; i = i->next) { - VPDragger *dragger = (VPDragger *) i->data; + for (std::vector<VPDragger *>::const_iterator i = this->draggers.begin(); i != this->draggers.end(); ++i) { + VPDragger *dragger = *i; for (std::list<VanishingPoint>::iterator i = dragger->vps.begin(); i != dragger->vps.end(); ++i) { (*i).updateBoxDisplays(); } @@ -758,8 +752,8 @@ VPDrag::addDragger (VanishingPoint &vp) } Geom::Point p = vp.get_pos(); - for (GList *i = this->draggers; i != NULL; i = i->next) { - VPDragger *dragger = (VPDragger *) i->data; + for (std::vector<VPDragger *>::const_iterator i = this->draggers.begin(); i != this->draggers.end(); ++i) { + VPDragger *dragger = *i; if (Geom::L2 (dragger->point - p) < MERGE_DIST) { // distance is small, merge this draggable into dragger, no need to create new dragger dragger->addVP (vp); @@ -769,16 +763,16 @@ VPDrag::addDragger (VanishingPoint &vp) VPDragger *new_dragger = new VPDragger(this, p, vp); // fixme: draggers should be added AFTER the last one: this way tabbing through them will be from begin to end. - this->draggers = g_list_append (this->draggers, new_dragger); + this->draggers.push_back(new_dragger); } void VPDrag::swap_perspectives_of_VPs(Persp3D *persp2, Persp3D *persp1) { // iterate over all VP in all draggers and replace persp2 with persp1 - for (GList *i = this->draggers; i != NULL; i = i->next) { - for (std::list<VanishingPoint>::iterator j = ((VPDragger *) (i->data))->vps.begin(); - j != ((VPDragger *) (i->data))->vps.end(); ++j) { + for (std::vector<VPDragger *>::const_iterator i = this->draggers.begin(); i != this->draggers.end(); ++i) { + for (std::list<VanishingPoint>::iterator j = (*i)->vps.begin(); + j != (*i)->vps.end(); ++j) { if ((*j).get_perspective() == persp2) { (*j).set_perspective(persp1); } @@ -790,7 +784,7 @@ void VPDrag::addLine(Geom::Point const &p1, Geom::Point const &p2, Inkscape::Ctr { SPCtrlLine *line = ControlManager::getManager().createControlLine(SP_ACTIVE_DESKTOP->getControls(), p1, p2, type); sp_canvas_item_show(line); - this->lines = g_slist_append(this->lines, line); + this->lines.push_back(line); } } // namespace Box3D diff --git a/src/vanishing-point.h b/src/vanishing-point.h index 7242a94ee..28da8e7fa 100644 --- a/src/vanishing-point.h +++ b/src/vanishing-point.h @@ -23,8 +23,6 @@ #include "ui/control-manager.h" // TODO break enums out separately class SPBox3D; -typedef struct _GList GList; -typedef struct _GSList GSList; namespace Box3D { @@ -173,8 +171,8 @@ public: bool dragging; SPDocument *document; - GList *draggers; - GSList *lines; + std::vector<VPDragger *> draggers; + std::vector<SPCtrlLine *> lines; void printDraggers(); // convenience for debugging /* @@ -195,7 +193,6 @@ public: inline bool hasEmptySelection() { return this->selection->isEmpty(); } bool allBoxesAreSelected (VPDragger *dragger); - GSList * selectedBoxesWithVPinDragger (VPDragger *dragger); // FIXME: Should this be private? (It's the case with the corresponding function in gradient-drag.h) // But vp_knot_grabbed_handler diff --git a/src/widgets/connector-toolbar.cpp b/src/widgets/connector-toolbar.cpp index 8cc254bd2..733fb34e8 100644 --- a/src/widgets/connector-toolbar.cpp +++ b/src/widgets/connector-toolbar.cpp @@ -200,17 +200,15 @@ static void connector_spacing_changed(GtkAdjustment *adj, GObject* tbl) desktop->namedview->updateRepr(); bool modmade = false; - GSList *items = get_avoided_items(NULL, desktop->currentRoot(), desktop); - for ( GSList const *iter = items ; iter != NULL ; iter = iter->next ) { - SPItem *item = reinterpret_cast<SPItem *>(iter->data); + std::vector<SPItem *> items; + items = get_avoided_items(items, desktop->currentRoot(), desktop); + for (std::vector<SPItem *>::const_iterator iter = items.begin(); iter != items.end(); ++iter ) { + SPItem *item = *iter; Geom::Affine m = Geom::identity(); avoid_item_move(&m, item); modmade = true; } - if (items) { - g_slist_free(items); - } if(modmade) { DocumentUndo::done(doc, SP_VERB_CONTEXT_CONNECTOR, _("Change connector spacing")); diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index 431b7a05d..85f58c830 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -1868,9 +1868,9 @@ bool SPDesktopWidget::onFocusInEvent(GdkEventFocus*) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (prefs->getBool("/options/bitmapautoreload/value", true)) { - GSList const *imageList = (desktop->doc())->getResourceList("image"); - for (GSList const *p = imageList; p; p = p->next) { - SPImage* image = SP_IMAGE(p->data); + std::set<SPObject *> imageList = (desktop->doc())->getResourceList("image"); + for (std::set<SPObject *>::const_iterator it = imageList.begin(); it != imageList.end(); ++it) { + SPImage* image = SP_IMAGE(*it); sp_image_refresh_if_outdated( image ); } } diff --git a/src/widgets/gradient-toolbar.cpp b/src/widgets/gradient-toolbar.cpp index b24615126..858aa05db 100644 --- a/src/widgets/gradient-toolbar.cpp +++ b/src/widgets/gradient-toolbar.cpp @@ -106,10 +106,10 @@ void gr_apply_gradient(Inkscape::Selection *selection, GrDrag *drag, SPGradient // GRADIENTFIXME: make this work for multiple selected draggers. // First try selected dragger - if (drag && drag->selected) { - GrDragger *dragger = static_cast<GrDragger*>(drag->selected->data); - for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { // for all draggables of dragger - GrDraggable *draggable = static_cast<GrDraggable*>(i->data); + if (drag && !drag->selected.empty()) { + GrDragger *dragger = *(drag->selected.begin()); + for(std::vector<GrDraggable *>::const_iterator i = dragger->draggables.begin(); i != dragger->draggables.end(); ++i) { //for all draggables of dragger + GrDraggable *draggable = *i; gr_apply_gradient_to_item(draggable->item, gr, initialType, initialMode, draggable->fill_or_stroke); } return; @@ -139,19 +139,18 @@ gboolean gr_vector_list(GtkWidget *combo_box, SPDesktop *desktop, bool selection /* Clear old list, if there is any */ gtk_list_store_clear(store); - GSList *gl = NULL; - const GSList *gradients = document->getResourceList("gradient"); - for (const GSList *i = gradients; i != NULL; i = i->next) { - SPGradient *grad = SP_GRADIENT(i->data); + std::vector<SPObject *> gl; + std::set<SPObject *> gradients = document->getResourceList( "gradient" ); + for (std::set<SPObject *>::const_iterator it = gradients.begin(); it != gradients.end(); ++it) { + SPGradient *grad = SP_GRADIENT(*it); if ( grad->hasStops() && !grad->isSolid() ) { - gl = g_slist_prepend(gl, i->data); + gl.push_back(*it); } } - gl = g_slist_reverse(gl); guint pos = 0; - if (!gl) { + if (gl.empty()) { // The document has no gradients gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, _("No gradient"), 1, NULL, 2, NULL, -1); @@ -180,9 +179,8 @@ gboolean gr_vector_list(GtkWidget *combo_box, SPDesktop *desktop, bool selection } guint idx = 0; - while (gl) { - SPGradient *gradient = SP_GRADIENT(gl->data); - gl = g_slist_remove(gl, gradient); + for (std::vector<SPObject *>::const_iterator it = gl.begin(); it != gl.end(); ++it) { + SPGradient *gradient = SP_GRADIENT(*it); Glib::ustring label = gr_prepare_label(gradient); GdkPixbuf *pixb = sp_gradient_to_pixbuf(gradient, 64, 16); @@ -255,11 +253,11 @@ void gr_read_selection( Inkscape::Selection *selection, SPGradientSpread &spr_selected, bool &spr_multi ) { - if (drag && drag->selected) { + if (drag && !drag->selected.empty()) { // GRADIENTFIXME: make this work for more than one selected dragger? - GrDragger *dragger = static_cast<GrDragger*>(drag->selected->data); - for (GSList const* i = dragger->draggables; i; i = i->next) { // for all draggables of dragger - GrDraggable *draggable = static_cast<GrDraggable *>(i->data); + GrDragger *dragger = *(drag->selected.begin()); + for(std::vector<GrDraggable *>::const_iterator i = dragger->draggables.begin(); i != dragger->draggables.end(); ++i) { //for all draggables of dragger + GrDraggable *draggable = *i; SPGradient *gradient = sp_item_gradient_get_vector(draggable->item, draggable->fill_or_stroke); SPGradientSpread spread = sp_item_gradient_get_spread(draggable->item, draggable->fill_or_stroke); @@ -394,10 +392,10 @@ static void gr_tb_selection_changed(Inkscape::Selection * /*selection*/, gpointe } InkAction *add = (InkAction *) g_object_get_data(G_OBJECT(widget), "gradient_stops_add_action"); - gtk_action_set_sensitive(GTK_ACTION(add), (gr_selected && !gr_multi && drag && drag->selected)); + gtk_action_set_sensitive(GTK_ACTION(add), (gr_selected && !gr_multi && drag && !drag->selected.empty())); InkAction *del = (InkAction *) g_object_get_data(G_OBJECT(widget), "gradient_stops_delete_action"); - gtk_action_set_sensitive(GTK_ACTION(del), (gr_selected && !gr_multi && drag && drag->selected)); + gtk_action_set_sensitive(GTK_ACTION(del), (gr_selected && !gr_multi && drag && !drag->selected.empty())); InkAction *reverse = (InkAction *) g_object_get_data(G_OBJECT(widget), "gradient_stops_reverse_action"); gtk_action_set_sensitive(GTK_ACTION(reverse), (gr_selected!= NULL)); @@ -649,7 +647,7 @@ static void select_stop_by_drag(GtkWidget *combo_box, SPGradient *gradient, Tool GrDrag *drag = ev->get_drag(); - if (!drag || !drag->selected) { + if (!drag || drag->selected.empty()) { blocked = TRUE; gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box) , 0); gr_stop_set_offset(GTK_COMBO_BOX(combo_box), data); @@ -660,11 +658,10 @@ static void select_stop_by_drag(GtkWidget *combo_box, SPGradient *gradient, Tool gint n = 0; // for all selected draggers - for (GList *i = drag->selected; i != NULL; i = i->next) { - GrDragger *dragger = static_cast<GrDragger*>(i->data); - // for all draggables of dragger - for (GSList const* j = dragger->draggables; j != NULL; j = j->next) { - GrDraggable *draggable = static_cast<GrDraggable*>(j->data); + for(std::set<GrDragger *>::const_iterator i = drag->selected.begin(); i != drag->selected.end(); ++i) { //for all draggables of dragger + GrDragger *dragger = *i; + for(std::vector<GrDraggable *>::const_iterator j = dragger->draggables.begin(); j != dragger->draggables.end(); ++j) { //for all draggables of dragger + GrDraggable *draggable = *j; if (draggable->point_type != POINT_RG_FOCUS) { n++; @@ -766,25 +763,25 @@ static gboolean update_stop_list( GtkWidget *stop_combo, SPGradient *gradient, S } /* Populate the combobox store */ - GSList *sl = NULL; + std::vector<SPObject *> sl; if ( gradient->hasStops() ) { for ( SPObject *ochild = gradient->firstChild() ; ochild ; ochild = ochild->getNext() ) { if (SP_IS_STOP(ochild)) { - sl = g_slist_append(sl, ochild); + sl.push_back(ochild); } } } - if (!sl) { + if (sl.empty()) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, _("No stops in gradient"), 1, NULL, 2, NULL, -1); sensitive = FALSE; } else { - for (; sl != NULL; sl = sl->next){ - if (SP_IS_STOP(sl->data)){ - SPStop *stop = SP_STOP(sl->data); - Inkscape::XML::Node *repr = reinterpret_cast<SPItem *>(sl->data)->getRepr(); + for (std::vector<SPObject *>::const_iterator it = sl.begin(); it != sl.end(); ++it) { + if (SP_IS_STOP(*it)){ + SPStop *stop = SP_STOP(*it); + Inkscape::XML::Node *repr = reinterpret_cast<SPItem *>(*it)->getRepr(); Inkscape::UI::Widget::ColorPreview *cpv = Gtk::manage(new Inkscape::UI::Widget::ColorPreview(stop->get_rgba32())); GdkPixbuf *pb = cpv->toPixbuf(32, 16); Glib::ustring label = gr_ellipsize_text(repr->attribute("id"), 25); diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp index 8e92f589a..35c1e4a8d 100644 --- a/src/widgets/gradient-vector.cpp +++ b/src/widgets/gradient-vector.cpp @@ -298,11 +298,11 @@ static void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs) /* Pick up all gradients with vectors */ GSList *gl = NULL; if (gvs->gr) { - const GSList *gradients = gvs->gr->document->getResourceList("gradient"); - for (const GSList *curr = gradients; curr; curr = curr->next) { - SPGradient* grad = SP_GRADIENT(curr->data); + std::set<SPObject *> gradients = gvs->gr->document->getResourceList("gradient"); + for (std::set<SPObject *>::const_iterator it = gradients.begin(); it != gradients.end(); ++it) { + SPGradient* grad = SP_GRADIENT(*it); if ( grad->hasStops() && (grad->isSwatch() == gvs->swatched) ) { - gl = g_slist_prepend(gl, curr->data); + gl = g_slist_prepend(gl, *it); } } } diff --git a/src/widgets/mesh-toolbar.cpp b/src/widgets/mesh-toolbar.cpp index 9937b23ed..3643ce00c 100644 --- a/src/widgets/mesh-toolbar.cpp +++ b/src/widgets/mesh-toolbar.cpp @@ -433,14 +433,14 @@ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObj /* Number of mesh rows */ { - gchar const* labels[] = {}; + gchar const** labels = NULL; gdouble values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; eact = create_adjustment_action( "MeshRowAction", _("Rows"), _("Rows:"), _("Number of rows in new mesh"), "/tools/mesh/mesh_rows", 1, GTK_WIDGET(desktop->canvas), holder, FALSE, NULL, 1, 20, 1, 1, - labels, values, G_N_ELEMENTS(labels), + labels, values, 0, ms_row_changed, NULL /*unit tracker*/, 1.0, 0 ); gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); @@ -449,14 +449,14 @@ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObj /* Number of mesh columns */ { - gchar const* labels[] = {}; + gchar const** labels = NULL; gdouble values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; eact = create_adjustment_action( "MeshColumnAction", _("Columns"), _("Columns:"), _("Number of columns in new mesh"), "/tools/mesh/mesh_cols", 1, GTK_WIDGET(desktop->canvas), holder, FALSE, NULL, 1, 20, 1, 1, - labels, values, G_N_ELEMENTS(labels), + labels, values, 0, ms_col_changed, NULL /*unit tracker*/, 1.0, 0 ); gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); diff --git a/src/widgets/paint-selector.cpp b/src/widgets/paint-selector.cpp index d8d314834..602cad3c3 100644 --- a/src/widgets/paint-selector.cpp +++ b/src/widgets/paint-selector.cpp @@ -844,10 +844,10 @@ ink_pattern_list_get (SPDocument *source) return NULL; GSList *pl = NULL; - GSList const *patterns = source->getResourceList("pattern"); - for (GSList *l = const_cast<GSList *>(patterns); l != NULL; l = l->next) { - if (SP_PATTERN(l->data) == SP_PATTERN(l->data)->rootPattern()) { // only if this is a root pattern - pl = g_slist_prepend(pl, l->data); + std::set<SPObject *> patterns = source->getResourceList("pattern"); + for (std::set<SPObject *>::const_iterator it = patterns.begin(); it != patterns.end(); ++it) { + if (SP_PATTERN(*it) == SP_PATTERN(*it)->rootPattern()) { // only if this is a root pattern + pl = g_slist_prepend(pl, *it); } } diff --git a/src/xml/rebase-hrefs.cpp b/src/xml/rebase-hrefs.cpp index 9d4f4f9fc..2bcae5d81 100644 --- a/src/xml/rebase-hrefs.cpp +++ b/src/xml/rebase-hrefs.cpp @@ -220,9 +220,9 @@ void Inkscape::XML::rebase_hrefs(SPDocument *const doc, gchar const *const new_b * * Note also that Inkscape only supports fragment hrefs (href="#pattern257") for many of these * cases. */ - GSList const *images = doc->getResourceList("image"); - for (GSList const *l = images; l != NULL; l = l->next) { - Inkscape::XML::Node *ir = static_cast<SPObject *>(l->data)->getRepr(); + std::set<SPObject *> images = doc->getResourceList("image"); + for (std::set<SPObject *>::const_iterator it = images.begin(); it != images.end(); ++it) { + Inkscape::XML::Node *ir = (*it)->getRepr(); std::string uri; { diff --git a/src/xml/repr-io.cpp b/src/xml/repr-io.cpp index a4146f215..4a6f59b43 100644 --- a/src/xml/repr-io.cpp +++ b/src/xml/repr-io.cpp @@ -38,6 +38,7 @@ #include "preferences.h" #include <glibmm/miscutils.h> +#include <map> using Inkscape::IO::Writer; using Inkscape::Util::List; @@ -50,8 +51,8 @@ using Inkscape::XML::calc_abs_doc_base; using Inkscape::XML::rebase_href_attrs; Document *sp_repr_do_read (xmlDocPtr doc, const gchar *default_ns); -static Node *sp_repr_svg_read_node (Document *xml_doc, xmlNodePtr node, const gchar *default_ns, GHashTable *prefix_map); -static gint sp_repr_qualified_name (gchar *p, gint len, xmlNsPtr ns, const xmlChar *name, const gchar *default_ns, GHashTable *prefix_map); +static Node *sp_repr_svg_read_node (Document *xml_doc, xmlNodePtr node, const gchar *default_ns, std::map<std::string, std::string> &prefix_map); +static gint sp_repr_qualified_name (gchar *p, gint len, xmlNsPtr ns, const xmlChar *name, const gchar *default_ns, std::map<std::string, std::string> &prefix_map); static void sp_repr_write_stream_root_element(Node *repr, Writer &out, bool add_whitespace, gchar const *default_ns, int inlineattrs, int indent, @@ -486,8 +487,7 @@ Document *sp_repr_do_read (xmlDocPtr doc, const gchar *default_ns) return NULL; } - GHashTable * prefix_map; - prefix_map = g_hash_table_new (g_str_hash, g_str_equal); + std::map<std::string, std::string> prefix_map; Document *rdoc = new Inkscape::XML::SimpleDocument(); @@ -536,21 +536,17 @@ Document *sp_repr_do_read (xmlDocPtr doc, const gchar *default_ns) } } - g_hash_table_destroy (prefix_map); - return rdoc; } -gint sp_repr_qualified_name (gchar *p, gint len, xmlNsPtr ns, const xmlChar *name, const gchar */*default_ns*/, GHashTable *prefix_map) +gint sp_repr_qualified_name (gchar *p, gint len, xmlNsPtr ns, const xmlChar *name, const gchar */*default_ns*/, std::map<std::string, std::string> &prefix_map) { const xmlChar *prefix; if (ns){ if (ns->href ) { prefix = reinterpret_cast<const xmlChar*>( sp_xml_ns_uri_prefix(reinterpret_cast<const gchar*>(ns->href), reinterpret_cast<const char*>(ns->prefix)) ); - void* p0 = reinterpret_cast<gpointer>(const_cast<xmlChar *>(prefix)); - void* p1 = reinterpret_cast<gpointer>(const_cast<xmlChar *>(ns->href)); - g_hash_table_insert( prefix_map, p0, p1 ); + prefix_map[reinterpret_cast<const char*>(prefix)] = reinterpret_cast<const char*>(ns->href); } else { prefix = NULL; @@ -567,7 +563,7 @@ gint sp_repr_qualified_name (gchar *p, gint len, xmlNsPtr ns, const xmlChar *nam } } -static Node *sp_repr_svg_read_node (Document *xml_doc, xmlNodePtr node, const gchar *default_ns, GHashTable *prefix_map) +static Node *sp_repr_svg_read_node (Document *xml_doc, xmlNodePtr node, const gchar *default_ns, std::map<std::string, std::string> &prefix_map) { xmlAttrPtr prop; xmlNodePtr child; |
