Hello community, here is the log from the commit of package kcachegrind for openSUSE:Factory checked in at 2015-10-03 20:19:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kcachegrind (Old) and /work/SRC/openSUSE:Factory/.kcachegrind.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kcachegrind" Changes: -------- --- /work/SRC/openSUSE:Factory/kcachegrind/kcachegrind.changes 2015-07-14 17:32:31.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.kcachegrind.new/kcachegrind.changes 2015-10-03 20:19:06.000000000 +0200 @@ -1,0 +2,23 @@ +Sun Sep 13 19:01:39 UTC 2015 - [email protected] + +- Update to KDE Applications 15.08.1 + * KDE Applications 15.08.1 + * https://www.kde.org/announcements/announce-applications-15.08.1.php + + +------------------------------------------------------------------- +Wed Aug 19 19:42:50 UTC 2015 - [email protected] + +- Update to KDE Applications 15.08.0 + * KDE Applications 15.08.0 + * https://www.kde.org/announcements/announce-applications-15.08.0.php + +------------------------------------------------------------------- +Fri Aug 7 06:48:12 UTC 2015 - [email protected] + +- Update to KDE Applications 15.07.90 + * KDE Applications 15.08.0 RC1 + * https://www.kde.org/announcements/announce-applications-15.07.90.php + + +------------------------------------------------------------------- Old: ---- kcachegrind-15.04.3.tar.xz New: ---- kcachegrind-15.08.1.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kcachegrind.spec ++++++ --- /var/tmp/diff_new_pack.N2ywVa/_old 2015-10-03 20:19:07.000000000 +0200 +++ /var/tmp/diff_new_pack.N2ywVa/_new 2015-10-03 20:19:07.000000000 +0200 @@ -22,7 +22,7 @@ License: GPL-2.0 and BSD-4-Clause and GFDL-1.2 Group: Development/Tools/Other Url: http://www.kde.org/ -Version: 15.04.3 +Version: 15.08.1 Release: 0 Source0: %{name}-%{version}.tar.xz BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ kcachegrind-15.04.3.tar.xz -> kcachegrind-15.08.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/README_DEVELOPER new/kcachegrind-15.08.1/README_DEVELOPER --- old/kcachegrind-15.04.3/README_DEVELOPER 1970-01-01 01:00:00.000000000 +0100 +++ new/kcachegrind-15.08.1/README_DEVELOPER 2015-06-16 22:05:36.000000000 +0200 @@ -0,0 +1,79 @@ +A short guide into the internal design of KCachegrind +===================================================== + + +Basics of the data model +------------------------ + +KCachegrind is a visualization of constant data. This makes the +data model quite simple. However, as the visualization may require +a lot of aggregation/summation of a huge number of raw data points in +all kind of different ways, this aggregation is done in a lazy way. +Only when the visualization asks for aggregated data, and the data was +never requested before, aggregation is done. +This makes the loading of large files faster: only the hierarchy of +records (e.g. instructions belonging to a source line, source lines +belong to a function, multiple functions are part of an ELF object) +is built while loading a file, but no aggregation of data is done. +Further, this reduces memory consumption. + +Important classes of the data model: + +* TraceData is a representation of profile data from one profile session, + possibly consisting of multiple parts, where each part corresponds to a + loaded file + +* any record/entry of a some profile data is inherited from CostItem, + and this is a complete hierarchy, which gets automatically built + when loading a file. E.g. TraceData itself inherits from CostItem. + +* every record/entry usually consists of different fields, and + are indexed by so-called EventType's. So-called "derived" event + types are not actually backed by real fields with concrete data, + but get calculated on-demand using a given formula referencing + fields with real data. + + +Basics of the GUI +----------------- + +At any time, every view visualizes some CostItem from loaded profile data. +More concretely, the "visualization state" consists of e.g. the +current CostItem to show, a curent EventType to show, from which +part(s) to show, which sub-CostItem should be shown selected and so on. + +Every view is inherited from the TraceItemView class, which manages the +visualization state. TraceItemView's can be setup in a hierarchical +fashion, and make sure to keep the visualization state consistent between +each other. E.g. item selection by mouse are forwarded to the parent view, +which passes the new selection back to all its sub-views. + +When a subclass of TraceItemView is asked to change its visualization state, +it actually only starts a timer, and all state change wishes get merged +until a time-out happens. +Then, TraceViewItem::doUpdate() gets called with an argument telling what +parts of the visualization state should be changed. There, one can do +special handling if only one thing is to be changed, such as selection of +another CostItem - in such cases, it is not required to refresh the whole +view. Otherwise, TraceViewItem::refresh() gets called, which is expected +to do a complete refresh of the visualization. + +The basic visualization task of subclasses of TraceItemView's is to visualize +one CostItem (the "active" CostItem), typically e.g. a function +(TraceFunction). Further, there is a "selected" CostItem. This usually is +a subitem of the active, visualized CostItem, e.g. a source line from the +active function (TraceLine), or another function in the call graph around +the active function. + +TraceItemView's may not be able to show a given CostItem, but want to show +another CostItem instead, or show nothing. In the latter case, they get +grayed out. This behavior is encoded through TraceItemView::canShow, which, +given a CostItem to visualize, returns the replacement it can visualize +instead, or 0 if it cannot show anything. + +Every top-level window visualizes exactly one profile data (_data), +and consists of some subviews (FunctionSelection on the left, MultiView on +the right, with various TabViews embedded) which all inherit from +TraceItemView, always synced to show some visualization state at a given +time. + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/converters/README new/kcachegrind-15.08.1/converters/README --- old/kcachegrind-15.04.3/converters/README 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/converters/README 2015-06-16 22:05:36.000000000 +0200 @@ -17,8 +17,8 @@ * Jörg Beyer <[email protected]> for hotshot2calltree -If you want to write a converter, have a look at the calltree format -description on the web site (kcachegrind.sf.net). +If you want to write a converter, have a look at the callgrind format +description on the web site (kcachegrind.github.io). Josef diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/doc/index.docbook new/kcachegrind-15.08.1/doc/index.docbook --- old/kcachegrind-15.04.3/doc/index.docbook 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/doc/index.docbook 2015-06-16 22:05:36.000000000 +0200 @@ -406,7 +406,7 @@ <para> To explore the &GUI; further, in addition to this manual, also have a look at -the documentation section <ulink url="http://kcachegrind.sf.net">on the Web +the documentation section <ulink url="https://kcachegrind.github.io">on the Web site</ulink>. Also, every widget in &kcachegrind; has <quote>What's this</quote> help. </para> @@ -1157,7 +1157,7 @@ <para> &kcachegrind; is part of the &package; package of &kde;. For less supported interim releases, &callgrind; and further documentation, see -<ulink url="http://kcachegrind.sf.net">the Web page</ulink>. Look there for +<ulink url="https://kcachegrind.github.io">the Web page</ulink>. Look there for further installation and compile instructions. </para> </sect1> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/kcachegrind/kcachegrind.desktop new/kcachegrind-15.08.1/kcachegrind/kcachegrind.desktop --- old/kcachegrind-15.04.3/kcachegrind/kcachegrind.desktop 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/kcachegrind/kcachegrind.desktop 2015-06-16 22:05:36.000000000 +0200 @@ -174,5 +174,5 @@ Comment[zh_CN]=性能测试数据的可视化表现 Comment[zh_TW]=效能分析資料視覺化 X-DBUS-StartupType=Multi -X-DBUS-ServiceName=net.sf.kcachegrind +X-DBUS-ServiceName=io.github.kcachegrind Categories=Qt;KDE;Development; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/kcachegrind/main.cpp new/kcachegrind-15.08.1/kcachegrind/main.cpp --- old/kcachegrind-15.04.3/kcachegrind/main.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/kcachegrind/main.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -41,8 +41,8 @@ KCACHEGRIND_VERSION, ki18n("KDE Frontend for Callgrind/Cachegrind"), KAboutData::License_GPL, - ki18n("(C) 2002 - 2011"), KLocalizedString(), - "http://kcachegrind.sf.net"); + ki18n("(C) 2002 - 2015"), KLocalizedString(), + "https://kcachegrind.github.io"); aboutData.addAuthor(ki18n("Josef Weidendorfer"), ki18n("Author/Maintainer"), "[email protected]"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/kcachegrind.lsm.cmake new/kcachegrind-15.08.1/kcachegrind.lsm.cmake --- old/kcachegrind-15.04.3/kcachegrind.lsm.cmake 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/kcachegrind.lsm.cmake 2015-06-16 22:05:36.000000000 +0200 @@ -5,7 +5,7 @@ Keywords: Profiling, Performance Analysis, Visualisation, Development Author: Josef Weidendorfer <[email protected]> Maintained-by: Josef Weidendorfer <[email protected]> -Home-page: http://kcachegrind.sourceforge.net +Home-page: https://kcachegrind.github.io Platforms: Linux and other Unices Copying-policy: GNU Public License End diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/kcachegrind.spec.cmake new/kcachegrind-15.08.1/kcachegrind.spec.cmake --- old/kcachegrind-15.04.3/kcachegrind.spec.cmake 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/kcachegrind.spec.cmake 2015-06-16 22:05:36.000000000 +0200 @@ -5,7 +5,7 @@ Copyright: GPL Group: Development/Tools Vendor: (none) -URL: http://kcachegrind.sourceforge.net +URL: https://kcachegrind.github.io Packager: Josef Weidendorfer <[email protected]> Source: kcachegrind-${KCACHEGRIND_VERSION}.tar.gz BuildRoot: /var/tmp/build diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/addr.h new/kcachegrind-15.08.1/libcore/addr.h --- old/kcachegrind-15.04.3/libcore/addr.h 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libcore/addr.h 2015-06-16 22:05:36.000000000 +0200 @@ -55,6 +55,9 @@ Addr operator+(int d) const { return Addr(_v + d); } Addr operator-(int d) const { return Addr(_v - d); } + // return decremented address until it is a multiple of <a>, a power of 2 + Addr alignedDown(int a) { return Addr(_v & ~( ((uint64)a) -1)); } + private: uint64 _v; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/cachegrindloader.cpp new/kcachegrind-15.08.1/libcore/cachegrindloader.cpp --- old/kcachegrind-15.04.3/libcore/cachegrindloader.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libcore/cachegrindloader.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -944,6 +944,19 @@ case '#': continue; + case 'a': + // "arch: arm" + if (line.stripPrefix("rch: arm")) { + TraceData::Arch a = _data->architecture(); + if ((a != TraceData::ArchUnknown) && + (a != TraceData::ArchARM)) { + error(QString("Redefined architecture!")); + } + _data->setArchitecture(TraceData::ArchARM); + continue; + } + break; + case 't': // totals: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/globalconfig.cpp new/kcachegrind-15.08.1/libcore/globalconfig.cpp --- old/kcachegrind-15.04.3/libcore/globalconfig.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libcore/globalconfig.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -474,3 +474,8 @@ else _objectSourceDirs.insert(obj, dirs); } + +void GlobalConfig::clearObjectSourceDirs() +{ + _objectSourceDirs.clear(); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/globalconfig.h new/kcachegrind-15.08.1/libcore/globalconfig.h --- old/kcachegrind-15.04.3/libcore/globalconfig.h 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libcore/globalconfig.h 2015-06-16 22:05:36.000000000 +0200 @@ -73,6 +73,7 @@ QStringList objectSourceDirs(QString); void setGeneralSourceDirs(QStringList); void setObjectSourceDirs(QString, QStringList); + void clearObjectSourceDirs(); void setPercentPrecision(int); void setMaxSymbolLength(int); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/tracedata.cpp new/kcachegrind-15.08.1/libcore/tracedata.cpp --- old/kcachegrind-15.04.3/libcore/tracedata.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libcore/tracedata.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -3080,6 +3080,8 @@ _maxPartNumber = 0; _fixPool = 0; _dynPool = 0; + + _arch = ArchUnknown; } TraceData::~TraceData() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libcore/tracedata.h new/kcachegrind-15.08.1/libcore/tracedata.h --- old/kcachegrind-15.04.3/libcore/tracedata.h 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libcore/tracedata.h 2015-06-16 22:05:36.000000000 +0200 @@ -1363,6 +1363,9 @@ class TraceData: public ProfileCostArray { public: + // profiled architecture (must be same for every part) + enum Arch { ArchUnknown, ArchARM }; + TraceData(Logger* l = 0); virtual ~TraceData(); @@ -1446,6 +1449,8 @@ void setCommand(const QString& command) { _command = command; } QString command() const { return _command; } + void setArchitecture(Arch a) { _arch = a; } + Arch architecture() const { return _arch; } ProfileCostArray* totals() { return &_totals; } void setMaxThreadID(int tid) { _maxThreadID = tid; } int maxThreadID() const { return _maxThreadID; } @@ -1493,6 +1498,7 @@ TraceFileMap _fileMap; TraceFunctionMap _functionMap; QString _command; + Arch _arch; QString _traceName; // Max of all costs of calls: This allows to see if the incl. cost can diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libviews/functionselection.cpp new/kcachegrind-15.08.1/libviews/functionselection.cpp --- old/kcachegrind-15.04.3/libviews/functionselection.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libviews/functionselection.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -162,7 +162,7 @@ functionList->setItemDelegate(new AutoToolTipDelegate(functionList)); vboxLayout->addWidget(functionList); - // order has to match mapping in groupTypeSelected() + // only to adjust size, will be repopulated on data change QStringList args; args << tr("(No Grouping)") << ProfileContext::i18nTypeName(ProfileContext::Object) @@ -351,9 +351,12 @@ addGroupAction(m, ProfileContext::Function, tr("No Grouping")); m->addSeparator(); } - addGroupAction(m, ProfileContext::Object); - addGroupAction(m, ProfileContext::File); - addGroupAction(m, ProfileContext::Class); + if (_data->objectMap().count()>1) + addGroupAction(m, ProfileContext::Object); + if (_data->fileMap().count()>1) + addGroupAction(m, ProfileContext::File); + if (_data->classMap().count()>1) + addGroupAction(m, ProfileContext::Class); addGroupAction(m, ProfileContext::FunctionCycle); connect(m, SIGNAL(triggered(QAction*)), @@ -368,16 +371,12 @@ void FunctionSelection::groupTypeSelected(int cg) { - switch(cg) { - case 0: selectedGroupType( ProfileContext::Function ); break; - case 1: selectedGroupType( ProfileContext::Object ); break; - case 2: selectedGroupType( ProfileContext::File ); break; - case 3: selectedGroupType( ProfileContext::Class ); break; - case 4: selectedGroupType( ProfileContext::FunctionCycle ); break; - default: break; - } -} + int t = groupBox->itemData(cg).toInt(); + if (t == 0) + t = ProfileContext::Function; // always works + selectedGroupType((ProfileContext::Type) t); +} CostItem* FunctionSelection::canShow(CostItem* i) { @@ -501,6 +500,24 @@ return; } + if (changeType & dataChanged) { + groupBox->clear(); + groupBox->addItem(tr("(No Grouping)"), ProfileContext::Function); + if (_data) { + if (_data->objectMap().count()>1) + groupBox->addItem(ProfileContext::i18nTypeName(ProfileContext::Object), + ProfileContext::Object); + if (_data->fileMap().count()>1) + groupBox->addItem(ProfileContext::i18nTypeName(ProfileContext::File), + ProfileContext::File); + if (_data->classMap().count()>1) + groupBox->addItem(ProfileContext::i18nTypeName(ProfileContext::Class), + ProfileContext::Class); + groupBox->addItem(ProfileContext::i18nTypeName(ProfileContext::FunctionCycle), + ProfileContext::FunctionCycle); + } + } + if (changeType & groupTypeChanged) { if (_activeItem && (_activeItem->type() == ProfileContext::Function)) { TraceFunction* f = (TraceFunction*) _activeItem; @@ -517,14 +534,8 @@ } } - int id; - switch(_groupType) { - case ProfileContext::Object: id = 1; break; - case ProfileContext::File: id = 2; break; - case ProfileContext::Class: id = 3; break; - case ProfileContext::FunctionCycle: id = 4; break; - default: id = 0; break; - } + int id = groupBox->findData(_groupType); + if (id < 0) id = 0; // if not found, default to first entry groupBox->setCurrentIndex(id); if (_groupType == ProfileContext::Function) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libviews/instrview.cpp new/kcachegrind-15.08.1/libviews/instrview.cpp --- old/kcachegrind-15.04.3/libviews/instrview.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libviews/instrview.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -34,6 +34,7 @@ #include <QScrollBar> #include <QHeaderView> #include <QKeyEvent> +#include <QProcessEnvironment> #include "config.h" #include "globalconfig.h" @@ -45,7 +46,31 @@ #define DEFAULT_SHOWHEXCODE true -// Helpers for parsing output of 'objdump' +// Helpers + +// check environment variables + +QProcessEnvironment env; + +static +QString getSysRoot() +{ + if (env.isEmpty()) + env = QProcessEnvironment::systemEnvironment(); + + return env.value("SYSROOT"); +} + +static +QString getObjDump() +{ + if (env.isEmpty()) + env = QProcessEnvironment::systemEnvironment(); + + return env.value("OBJDUMP", "objdump"); +} + +// parsing output of 'objdump' static Addr parseAddr(char* buf) { @@ -554,6 +579,7 @@ new InstrItem(this, this, 3, tr(" --dump-instr=yes")); new InstrItem(this, this, 4, tr("To see (conditional) jumps, additionally specify")); new InstrItem(this, this, 5, tr(" --collect-jumps=yes")); + setColumnWidths(); return; } @@ -728,7 +754,17 @@ QString filename = o->shortName(); if (QDir::isAbsolutePath(dir)) { - return QFile::exists(dir + '/' + filename); + if (QFile::exists(dir + '/' + filename)) + return true; + + QString sysRoot = getSysRoot(); + if (!sysRoot.isEmpty()) { + if (!dir.startsWith('/') && !sysRoot.endsWith('/')) + sysRoot += '/'; + dir = sysRoot + dir; + return QFile::exists(dir + '/' + filename); + } + return false; } QFileInfo fi(dir, filename); @@ -759,6 +795,7 @@ Addr costAddr, nextCostAddr, objAddr, addr; Addr dumpStartAddr, dumpEndAddr; TraceInstrMap::Iterator costIt; + bool isArm = (function->data()->architecture() == TraceData::ArchARM); // should not happen if (it == itEnd) return false; @@ -767,9 +804,16 @@ TraceInstrMap::Iterator tmpIt = itEnd; --tmpIt; nextCostAddr = (*it).addr(); + + if (isArm) { + // for Arm: address always even (even for Thumb encoding) + nextCostAddr = nextCostAddr.alignedDown(2); + } + dumpStartAddr = (nextCostAddr<20) ? Addr(0) : nextCostAddr -20; dumpEndAddr = (*tmpIt).addr() +20; + QString dir = function->object()->directory(); if (!searchFile(dir, function->object())) { new InstrItem(this, this, 1, @@ -779,6 +823,9 @@ QString(" '%1'").arg(function->object()->name())); new InstrItem(this, this, 3, tr("This file can not be found.")); + if (isArm) + new InstrItem(this, this, 4, + tr("If cross-compiled, set SYSROOT variable.")); return false; } function->object()->setDirectory(dir); @@ -790,13 +837,13 @@ << QString("--start-address=0x%1").arg(dumpStartAddr.toString()) << QString("--stop-address=0x%1").arg(dumpEndAddr.toString()) << objfile; - QString objdumpCmd = "objdump " + objdumpArgs.join(" "); - if (1) qDebug("Running '%s'...", qPrintable(objdumpCmd)); + QString objdumpCmd = getObjDump() + " " + objdumpArgs.join(" "); + qDebug("Running '%s'...", qPrintable(objdumpCmd)); // and run... QProcess objdump; - objdump.start("objdump", objdumpArgs); + objdump.start(getObjDump(), objdumpArgs); if (!objdump.waitForStarted() || !objdump.waitForFinished()) { @@ -873,6 +920,8 @@ } costAddr = nextCostAddr; nextCostAddr = (it == itEnd) ? Addr(0) : (*it).addr(); + if (isArm) + nextCostAddr = nextCostAddr.alignedDown(2); if (0) qDebug() << "Got nextCostAddr: 0x" << nextCostAddr.toString() << ", costAddr 0x" << costAddr.toString(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libviews/sourceitem.cpp new/kcachegrind-15.08.1/libviews/sourceitem.cpp --- old/kcachegrind-15.04.3/libviews/sourceitem.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libviews/sourceitem.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -27,6 +27,7 @@ #include <QPainter> #include <QPolygon> #include <QTextDocument> +#include <QLineEdit> #include "globalguiconfig.h" #include "listutils.h" @@ -64,6 +65,9 @@ QString s = src; setText(4, s.replace( QRegExp("\t"), " " )); + // to allow text selection after double click + setFlags(flags() | Qt::ItemIsEditable); + updateGroup(); updateCost(); } @@ -302,6 +306,16 @@ _parent = parent; } +QWidget* SourceItemDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + QWidget* w = QItemDelegate::createEditor(parent, option, index); + QLineEdit* e = qobject_cast<QLineEdit*>(w); + if (e) e->setReadOnly(true); + return w; +} + QSize SourceItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libviews/sourceitem.h new/kcachegrind-15.08.1/libviews/sourceitem.h --- old/kcachegrind-15.04.3/libviews/sourceitem.h 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libviews/sourceitem.h 2015-06-16 22:05:36.000000000 +0200 @@ -89,6 +89,9 @@ const QModelIndex & index ) const; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + QWidget* createEditor(QWidget *parent, + const QStyleOptionViewItem &option, + const QModelIndex &index) const; protected: void paintArrows(QPainter *p, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/libviews/sourceview.cpp new/kcachegrind-15.08.1/libviews/sourceview.cpp --- old/kcachegrind-15.04.3/libviews/sourceview.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/libviews/sourceview.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -50,7 +50,6 @@ _arrowLevels = 0; - setColumnCount(5); setRootIsDecorated(false); setAllColumnsShowFocus(true); @@ -63,7 +62,7 @@ << tr( "Cost" ) << tr( "Cost 2" ) << "" - << tr( "Source (unknown)"); + << tr( "Source"); setHeaderLabels(headerLabels); // sorting will be enabled after refresh() @@ -314,7 +313,6 @@ _arrowLevels = 0; if (!_data || !_activeItem) { - headerItem()->setText(4, tr("(No Source)")); return; } @@ -658,9 +656,9 @@ // do it here, because the source directory could have been set before if (topLevelItemCount()==0) { - headerItem()->setText(4, validSourceFile ? - tr("Source ('%1')").arg(filename) : - tr("Source (unknown)")); + if (validSourceFile && (nextCostLineno != 0)) + new SourceItem(this, this, fileno, 0, true, + tr("--- From '%1' ---").arg(filename)); } else { new SourceItem(this, this, fileno, 0, true, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/qcachegrind/qcgmain.cpp new/kcachegrind-15.08.1/qcachegrind/qcgmain.cpp --- old/kcachegrind-15.04.3/qcachegrind/qcgmain.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/qcachegrind/qcgmain.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -35,7 +35,7 @@ QApplication app(argc, argv); Loader::initLoaders(); - QCoreApplication::setOrganizationName("kcachegrind.sf.net"); + QCoreApplication::setOrganizationName("kcachegrind.github.io"); QCoreApplication::setApplicationName("QCachegrind"); ConfigStorage::setStorage(new QCGConfigStorage); // creates global config object of type GlobalGUIConfig diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/qcachegrind/qcgtoplevel.cpp new/kcachegrind-15.08.1/qcachegrind/qcgtoplevel.cpp --- old/kcachegrind-15.04.3/qcachegrind/qcgtoplevel.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/qcachegrind/qcgtoplevel.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -174,10 +174,11 @@ delete lConfig; ConfigGroup* pConfig = ConfigStorage::group("TracePositions"); - if (_eventType) - pConfig->setValue(QString("EventType%1").arg(key), _eventType->name()); - if (_eventType2) - pConfig->setValue(QString("EventType2%1").arg(key), _eventType2->name()); + QString eventType, eventType2; + if (_eventType) eventType = _eventType->name(); + if (_eventType2) eventType2 = _eventType2->name(); + pConfig->setValue(QString("EventType%1").arg(key), eventType); + pConfig->setValue(QString("EventType2%1").arg(key), eventType2); if (_groupType != ProfileContext::InvalidType) pConfig->setValue(QString("GroupType%1").arg(key), ProfileContext::typeName(_groupType)); @@ -618,12 +619,12 @@ "phase of developing a computer program. " "QCachegrind is open-source, and it is distributed under the " "terms of the GPL v2. For details and source code, see the " - "<a href=\"http://kcachegrind.sf.net\">homepage</a> of the " + "<a href=\"https://kcachegrind.github.io\">homepage</a> of the " "KCachegrind project.</p>" "Main author and maintainer: " "<a href=\"mailto:[email protected]\">" "Josef Weidendorfer</a><br>" - "(with lots of bug fixes and porting to Qt4 by the KDE team)"); + "(with lots of bug fixes/porting help by the KDE community)"); QMessageBox::about(this, tr("About QCachegrind"), text); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/qcachegrind/qcgtoplevel.h new/kcachegrind-15.08.1/qcachegrind/qcgtoplevel.h --- old/kcachegrind-15.04.3/qcachegrind/qcgtoplevel.h 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/qcachegrind/qcgtoplevel.h 2015-06-16 22:05:36.000000000 +0200 @@ -51,7 +51,7 @@ class QCGTopLevel : public QMainWindow, public Logger, public TopLevelBase { Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "net.sf.qcachegrind") + Q_CLASSINFO("D-Bus Interface", "io.github.qcachegrind") public: QCGTopLevel(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-15.04.3/qcachegrind/sourcesettings.cpp new/kcachegrind-15.08.1/qcachegrind/sourcesettings.cpp --- old/kcachegrind-15.04.3/qcachegrind/sourcesettings.cpp 2015-05-15 09:47:33.000000000 +0200 +++ new/kcachegrind-15.08.1/qcachegrind/sourcesettings.cpp 2015-06-16 22:05:36.000000000 +0200 @@ -200,6 +200,10 @@ QTreeWidgetItem* item = ui.dirList->topLevelItem(idx); dirs[item->text(0)] << item->text(1); } + + c->setGeneralSourceDirs(QStringList()); + c->clearObjectSourceDirs(); + QHash<QString, QStringList>::const_iterator oit = dirs.constBegin(); for(;oit != dirs.constEnd(); ++oit) { if (oit.key() == _always)
