Hello community, here is the log from the commit of package umbrello for openSUSE:Factory checked in at 2014-03-30 07:53:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/umbrello (Old) and /work/SRC/openSUSE:Factory/.umbrello.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "umbrello" Changes: -------- --- /work/SRC/openSUSE:Factory/umbrello/umbrello.changes 2014-03-18 17:17:17.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.umbrello.new/umbrello.changes 2014-03-30 12:07:16.000000000 +0200 @@ -1,0 +2,14 @@ +Thu Mar 27 18:14:45 UTC 2014 - [email protected] + +- Update to 4.12.97 + * KDE 4.13 RC release + * See http://www.kde.org/announcements/announce-4.13-rc.php + +------------------------------------------------------------------- +Thu Mar 20 18:31:57 UTC 2014 - [email protected] + +- Update to 4.12.95 + * KDE 4.13 Beta 3 release + * See http://www.kde.org/announcements/announce-4.13-beta3.php + +------------------------------------------------------------------- Old: ---- umbrello-4.12.90.tar.xz New: ---- umbrello-4.12.97.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ umbrello.spec ++++++ --- /var/tmp/diff_new_pack.UPKgCJ/_old 2014-03-30 12:07:22.000000000 +0200 +++ /var/tmp/diff_new_pack.UPKgCJ/_new 2014-03-30 12:07:22.000000000 +0200 @@ -24,7 +24,7 @@ License: GPL-2.0 and GFDL-1.2 Group: Development/Tools/Other Url: http://www.kde.org/ -Version: 4.12.90 +Version: 4.12.97 Release: 0 Source0: %{name}-%{version}.tar.xz BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ umbrello-4.12.90.tar.xz -> umbrello-4.12.97.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/CMakeLists.txt new/umbrello-4.12.97/CMakeLists.txt --- old/umbrello-4.12.90/CMakeLists.txt 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/CMakeLists.txt 2014-03-25 09:28:52.000000000 +0100 @@ -8,7 +8,7 @@ set(VERSION_MAJOR "2") set(VERSION_MINOR "12") -set(VERSION_PATCH "99") +set(VERSION_PATCH "97") # set default umbrello version # umbrello version could be overridden by cmake command line using -DUMBRELLO_VERSION_STRING=major.minor.patch diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/cppparser/cachemanager.h new/umbrello-4.12.97/lib/cppparser/cachemanager.h --- old/umbrello-4.12.90/lib/cppparser/cachemanager.h 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/cppparser/cachemanager.h 2014-03-25 09:28:52.000000000 +0100 @@ -21,6 +21,13 @@ class CacheManager; +#ifndef inline +#define inline __inline +#endif + +#ifdef _MSC_VER +typedef unsigned int uint; +#endif class CacheNode { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/cppparser/driver.h new/umbrello-4.12.97/lib/cppparser/driver.h --- old/umbrello-4.12.90/lib/cppparser/driver.h 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/cppparser/driver.h 2014-03-25 09:28:52.000000000 +0100 @@ -32,7 +32,6 @@ #include <map> #include <set> #include <hashedstring.h> -#include <ext/hash_map> #include "lexercache.h" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/cppparser/keywords.h new/umbrello-4.12.97/lib/cppparser/keywords.h --- old/umbrello-4.12.90/lib/cppparser/keywords.h 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/cppparser/keywords.h 2014-03-25 09:28:52.000000000 +0100 @@ -2,7 +2,7 @@ // Keywords file is included in lookup.cpp // [erbsland] replacement for old hash table // -#define INSERT(x, y) keywords.insert(std::pair<HashedString, Type>(x, y)) +#define INSERT(x, y) keywords.insert(x, y) // KDE Keywords INSERT("K_DCOP", Token_K_DCOP); INSERT("k_dcop", Token_k_dcop); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/cppparser/lexer.cpp new/umbrello-4.12.97/lib/cppparser/lexer.cpp --- old/umbrello-4.12.90/lib/cppparser/lexer.cpp 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/cppparser/lexer.cpp 2014-03-25 09:28:52.000000000 +0100 @@ -422,18 +422,18 @@ tk.setStartPosition(startLine, startColumn); tk.setEndPosition(m_currentLine, m_currentColumn); } else if (m_skipWordsEnabled) { - __gnu_cxx::hash_map< HashedString, QPair<SkipType, QString> >::iterator pos = m_words.find(ide); + QHash< HashedString, QPair<SkipType, QString> >::iterator pos = m_words.find(ide); if (pos != m_words.end()) { - if ((*pos).second.first == SkipWordAndArguments) { + if ((*pos).first == SkipWordAndArguments) { readWhiteSpaces(); if (currentChar() == '(') skip('(', ')'); } - if (!(*pos).second.second.isEmpty()) { + if (!(*pos).second.isEmpty()) { #if defined(KDEVELOP_BGPARSER) qthread_yield(); #endif - insertCurrent(QString(" ") + (*pos).second.second + QString(" ")); + insertCurrent(QString(" ") + (*pos).second + QString(" ")); } } else if ( /*qt_rx.exactMatch(ide) ||*/ ide.str().endsWith(QLatin1String("EXPORT")) || diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/cppparser/lexer.h new/umbrello-4.12.97/lib/cppparser/lexer.h --- old/umbrello-4.12.90/lib/cppparser/lexer.h 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/cppparser/lexer.h 2014-03-25 09:28:52.000000000 +0100 @@ -28,7 +28,6 @@ #include <qmap.h> #include <qpair.h> #include <hashedstring.h> -#include <ext/hash_map> #define CHARTYPE QChar @@ -331,7 +330,7 @@ bool m_recordComments; bool m_recordWhiteSpaces; bool m_startLine; - __gnu_cxx::hash_map< HashedString, QPair<SkipType, QString> > m_words; + QHash< HashedString, QPair<SkipType, QString> > m_words; int m_skippedLines; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/cppparser/lexercache.cpp new/umbrello-4.12.97/lib/cppparser/lexercache.cpp --- old/umbrello-4.12.90/lib/cppparser/lexercache.cpp 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/cppparser/lexercache.cpp 2014-03-25 09:28:52.000000000 +0100 @@ -112,11 +112,11 @@ QDateTime LexerCache::fileModificationTimeCached(const HashedString& fileName) { - FileModificationMap::const_iterator it = m_fileModificationCache.find(fileName); - if (it != m_fileModificationCache.end()) { + FileModificationMap::const_iterator it = m_fileModificationCache.constFind(fileName); + if (it != m_fileModificationCache.constEnd()) { ///Use the cache for 10 seconds - if ((*it).second.m_readTime.secsTo(m_currentDateTime) < 10) { - return (*it).second.m_modificationTime; + if ((*it).m_readTime.secsTo(m_currentDateTime) < 10) { + return (*it).m_modificationTime; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/cppparser/lexercache.h new/umbrello-4.12.97/lib/cppparser/lexercache.h --- old/umbrello-4.12.90/lib/cppparser/lexercache.h 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/cppparser/lexercache.h 2014-03-25 09:28:52.000000000 +0100 @@ -15,12 +15,11 @@ #ifndef LEXERCACHE_H #define LEXERCACHE_H #include <hashedstring.h> -#include <ext/hash_map> #include "macro.h" #include <kdebug.h> #include <qdatetime.h> #include <qfileinfo.h> -#include <ext/hash_set> +#include <hash_set> #include "cachemanager.h" //#define LEXERCACHE_DEBUG @@ -141,7 +140,7 @@ const HashedString& unifyString(const HashedString& str) { - __gnu_cxx::hash_set<HashedString>::const_iterator it = m_totalStringSet.find(str); + QSet<HashedString>::const_iterator it = m_totalStringSet.find(str); if (it != m_totalStringSet.end()) { return *it; } else { @@ -159,12 +158,12 @@ //typedef __gnu_cxx::hash_multimap<HashedString, CachedLexedFilePointer> CachedLexedFileMap; typedef std::multimap<HashedString, CachedLexedFilePointer> CachedLexedFileMap; CachedLexedFileMap m_files; - __gnu_cxx::hash_set<HashedString> m_totalStringSet; ///This is used to reduce memory-usage: Most strings appear again and again. Because QString is reference-counted, this set contains a unique copy of each string to used for each appearance of the string + QSet<HashedString> m_totalStringSet; ///This is used to reduce memory-usage: Most strings appear again and again. Because QString is reference-counted, this set contains a unique copy of each string to used for each appearance of the string struct FileModificationCache { QDateTime m_readTime; QDateTime m_modificationTime; }; - typedef __gnu_cxx::hash_map<HashedString, FileModificationCache> FileModificationMap; + typedef QHash<HashedString, FileModificationCache> FileModificationMap; FileModificationMap m_fileModificationCache; Driver* m_driver; QDateTime m_currentDateTime; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/cppparser/lookup.cpp new/umbrello-4.12.97/lib/cppparser/lookup.cpp --- old/umbrello-4.12.90/lib/cppparser/lookup.cpp 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/cppparser/lookup.cpp 2014-03-25 09:28:52.000000000 +0100 @@ -25,7 +25,7 @@ KeywordMap::const_iterator it = keywords().find(s); if (it == keywords().end()) return -1; - return static_cast<int>((*it).second); + return static_cast<int>((*it)); } const Lookup::KeywordMap& Lookup::keywords() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/cppparser/lookup.h new/umbrello-4.12.97/lib/cppparser/lookup.h --- old/umbrello-4.12.90/lib/cppparser/lookup.h 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/cppparser/lookup.h 2014-03-25 09:28:52.000000000 +0100 @@ -25,7 +25,6 @@ #include <qmap.h> #include "lexer.h" -#include <ext/hash_map> #include <hashedstring.h> /** @@ -34,7 +33,7 @@ class Lookup { public: - typedef __gnu_cxx::hash_map<HashedString,Type> KeywordMap; + typedef QHash<HashedString,Type> KeywordMap; /** * Find an entry in the table, and return its value */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/cppparser/macro.h new/umbrello-4.12.97/lib/cppparser/macro.h --- old/umbrello-4.12.90/lib/cppparser/macro.h 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/cppparser/macro.h 2014-03-25 09:28:52.000000000 +0100 @@ -26,7 +26,6 @@ #include <hashedstring.h> #include <kdatastream.h> #include <codemodel.h> -#include <ext/hash_map> typedef signed char Q_INT8; @@ -133,7 +132,8 @@ Macro(const QString &n, const QString &b) : m_idHashValid(false), m_valueHashValid(false), m_name(n), m_line(0), m_column(0), m_body(b), m_hasArguments(false), m_isUndefMacro(false) {} //Sorts the macros by their hash-value, then by their name. - struct NameArgCompare { + class NameArgCompare { + public: bool operator () (const Macro& lhs, const Macro& rhs) const { size_t lhash = lhs.idHash(); @@ -157,7 +157,8 @@ return false; } }; - struct NameCompare { + class NameCompare { + public: bool operator () (const Macro& lhs, const Macro& rhs) const { size_t lhash = lhs.idHash(); @@ -170,14 +171,16 @@ } }; - struct NameArgHash { + class NameArgHash { + public: size_t operator () (const Macro& macro) const { return macro.idHash(); } }; - struct NameArgEqual { + class NameArgEqual { + public: bool operator () (const Macro& lhs, const Macro& rhs) const { int df = lhs.m_name.compare(rhs.m_name); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/interfaces/hashedstring.cpp new/umbrello-4.12.97/lib/interfaces/hashedstring.cpp --- old/umbrello-4.12.90/lib/interfaces/hashedstring.cpp 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/interfaces/hashedstring.cpp 2014-03-25 09:28:52.000000000 +0100 @@ -17,9 +17,9 @@ #include <sstream> #include <algorithm> #include <iterator> -#include<ext/hash_set> -#include<set> -#include<algorithm> +#include <hash_set> +#include <set> +#include <algorithm> //It needs to be measured whether this flag should be turned on or off. It seems just to move the complexity from one position to the other, without any variant being really better. #define USE_HASHMAP @@ -67,9 +67,9 @@ { public: #ifdef USE_HASHMAP - typedef __gnu_cxx::hash_set<HashedString> StringSet; + typedef QSet<HashedString> StringSet; #else - typedef std::set<HashedString> StringSet; //must be a set, so the set-algorithms work + typedef QSet<HashedString> StringSet; //must be a set, so the set-algorithms work #endif StringSet m_files; mutable bool m_hashValid; @@ -139,7 +139,9 @@ std::set_union(oldData->m_files.begin(), oldData->m_files.end(), rhs.m_data->m_files.begin(), rhs.m_data->m_files.end(), std::insert_iterator<HashedStringSetData::StringSet>(m_data->m_files, m_data->m_files.end())); #else makeDataPrivate(); - m_data->m_files.insert(rhs.m_data->m_files.begin(), rhs.m_data->m_files.end()); + for (HashedStringSetData::StringSet::const_iterator it = rhs.m_data->m_files.begin(); it != rhs.m_data->m_files.end(); ++it) { + m_data->m_files.insert(*it); + } /*HashedStringSetData::StringSet::const_iterator end = rhs.m_data->m_files.end(); HashedStringSetData::StringSet& mySet(m_data->m_files); for(HashedStringSetData::StringSet::const_iterator it = rhs.m_data->m_files.begin(); it != end; ++it) { @@ -163,7 +165,7 @@ HashedStringSetData::StringSet::const_iterator end = rhs.m_data->m_files.end(); HashedStringSetData::StringSet& mySet(m_data->m_files); for (HashedStringSetData::StringSet::const_iterator it = rhs.m_data->m_files.begin(); it != end; ++it) { - mySet.erase(*it); + mySet.remove(*it); } #endif @@ -314,9 +316,9 @@ for (HashedStringSetData::StringSet::const_iterator it = set.m_data->m_files.begin(); it != set.m_data->m_files.end(); ++it) { GroupMap::iterator itr = m_map.find(*it); if (itr == m_map.end()) { - itr = m_map.insert(std::make_pair(*it, ItemSet())).first; + itr = m_map.insert(*it, ItemSet()); } - itr->second.insert(id); + itr->insert(id); } } else { m_global.insert(id); @@ -342,9 +344,9 @@ { m_disabled.erase(id); m_global.erase(id); - m_sizeMap.erase(id); + m_sizeMap.remove(id); for (GroupMap::iterator it = m_map.begin(); it != m_map.end(); ++it) { - it->second.erase(id); + it->erase(id); } } @@ -356,7 +358,7 @@ return; } //This might yet be optimized by sorting the sets according to their size, and starting the intersectioning with the smallest ones. - __gnu_cxx::hash_map<size_t, uint> hitCounts; + QHash<size_t, uint> hitCounts; for (HashedStringSetData::StringSet::const_iterator it = strings.m_data->m_files.begin(); it != strings.m_data->m_files.end(); ++it) { GroupMap::const_iterator itr = m_map.find(*it); @@ -365,10 +367,10 @@ continue; } - for (ItemSet::const_iterator it2 = itr->second.begin(); it2 != itr->second.end(); ++it2) { - __gnu_cxx::hash_map<size_t, uint>::iterator v = hitCounts.find(*it2); + for (ItemSet::const_iterator it2 = itr->begin(); it2 != itr->end(); ++it2) { + QHash<size_t, uint>::iterator v = hitCounts.find(*it2); if (v != hitCounts.end()) { - ++(*v).second; + ++(*v); } else { hitCounts[*it2] = 1; } @@ -377,9 +379,9 @@ //Now count together all groups that are completely within the given string-set(their hitCount equals their size) ItemSet found; - for (__gnu_cxx::hash_map<size_t, uint>::const_iterator it = hitCounts.begin(); it != hitCounts.end(); ++it) { - if ((*it).second == (*m_sizeMap.find((*it).first)).second) - found.insert((*it).first); + for (QHash<size_t, uint>::const_iterator it = hitCounts.constBegin(); it != hitCounts.constEnd(); ++it) { + if (it.value() == (*m_sizeMap.find(it.key()))) + found.insert(it.key()); } @@ -389,3 +391,8 @@ target.clear(); std::set_difference(found.begin(), found.end(), m_disabled.begin(), m_disabled.end(), std::insert_iterator<ItemSet>(target, target.end())); } + +uint qHash(const HashedString &key) +{ + return key.hash(); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/lib/interfaces/hashedstring.h new/umbrello-4.12.97/lib/interfaces/hashedstring.h --- old/umbrello-4.12.90/lib/interfaces/hashedstring.h 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/lib/interfaces/hashedstring.h 2014-03-25 09:28:52.000000000 +0100 @@ -17,10 +17,11 @@ #include "ast.h" +#include <QHash> +#include <QSet> #include <QString> #include <qdatastream.h> #include <set> -#include <ext/hash_map> #include <string> ///A simple class that stores a string together with it's appropriate hash-key @@ -131,17 +132,6 @@ HashedStringSet operator + (const HashedStringSet& lhs, const HashedStringSet& rhs); -namespace __gnu_cxx -{ -template<> -struct hash<HashedString> { - size_t operator () (const HashedString& str) const - { - return str.hash(); - } -}; -} - ///Used to find all registered HashedStringSet's that contain all strings given to findGroups(..) class HashedStringSetGroup { @@ -157,11 +147,14 @@ void findGroups(HashedStringSet strings, ItemSet& target) const; private: - typedef __gnu_cxx::hash_map<HashedString, ItemSet> GroupMap; - typedef __gnu_cxx::hash_map<size_t, size_t> SizeMap; + typedef QHash<HashedString, ItemSet> GroupMap; + typedef QHash<size_t, size_t> SizeMap; GroupMap m_map; SizeMap m_sizeMap; ItemSet m_disabled; ItemSet m_global; }; + +uint qHash(const HashedString &key); + #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/umbrello/codeimport/cppimport.cpp new/umbrello-4.12.97/umbrello/codeimport/cppimport.cpp --- old/umbrello-4.12.90/umbrello/codeimport/cppimport.cpp 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/umbrello/codeimport/cppimport.cpp 2014-03-25 09:28:52.000000000 +0100 @@ -75,7 +75,6 @@ { if (ms_seenFiles.indexOf(fileName) != -1) return; - ms_seenFiles.append(fileName); QMap<QString, Dependence> deps = ms_driver->dependences(fileName); if (! deps.empty()) { QMap<QString, Dependence>::Iterator it; @@ -94,9 +93,10 @@ } ParsedFilePointer ast = ms_driver->translationUnit(fileName); if (ast.isNull()) { - uError() << fileName << " not found"; + uError() << fileName << " not found in list of parsed files"; return; } + ms_seenFiles.append(fileName); CppTree2Uml modelFeeder(fileName, m_thread); modelFeeder.parseTranslationUnit(*ast); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/umbrello/umlscene.cpp new/umbrello-4.12.97/umbrello/umlscene.cpp --- old/umbrello-4.12.90/umbrello/umlscene.cpp 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/umbrello/umlscene.cpp 2014-03-25 09:28:52.000000000 +0100 @@ -624,14 +624,7 @@ // We need to invoke createAutoAttributeAssociations() // on all other widgets again because the newly created // widget might saturate some latent attribute assocs. - foreach(UMLWidget* w, m_WidgetList) { - if (w != newWidget) { - createAutoAttributeAssociations(w); - - if (o->baseType() == UMLObject::ot_Entity) - createAutoConstraintAssociations(w); - } - } + createAutoAttributeAssociations2(newWidget); break; default: break; @@ -816,6 +809,8 @@ } setupNewWidget(newWidget); + createAutoAssociations(newWidget); + createAutoAttributeAssociations2(newWidget); } /** @@ -2617,6 +2612,18 @@ } +void UMLScene::createAutoAttributeAssociations2(UMLWidget *widget) +{ + foreach(UMLWidget* w, m_WidgetList) { + if (w != widget) { + createAutoAttributeAssociations(w); + + if (widget->umlObject() && widget->umlObject()->baseType() == UMLObject::ot_Entity) + createAutoConstraintAssociations(w); + } + } +} + /** * Find the maximum bounding rectangle of FloatingTextWidget widgets. * Auxiliary to copyAsImage(). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/umbrello-4.12.90/umbrello/umlscene.h new/umbrello-4.12.97/umbrello/umlscene.h --- old/umbrello-4.12.90/umbrello/umlscene.h 2014-03-05 16:04:09.000000000 +0100 +++ new/umbrello-4.12.97/umbrello/umlscene.h 2014-03-25 09:28:52.000000000 +0100 @@ -253,6 +253,7 @@ void createAutoAssociations(UMLWidget * widget); void createAutoAttributeAssociations(UMLWidget *widget); void createAutoConstraintAssociations(UMLWidget* widget); + void createAutoAttributeAssociations2(UMLWidget *widget); void updateContainment(UMLCanvasObject *self); -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
