diff --git a/src/ProcessInfo.cpp b/src/ProcessInfo.cpp index 1f5505a1..2b98f747 100644 --- a/src/ProcessInfo.cpp +++ b/src/ProcessInfo.cpp @@ -80,6 +80,7 @@ ProcessInfo::ProcessInfo(int aPid , bool enableEnvironmentRead) , _lastError(NoError) , _userName(QString()) , _userHomeDir(QString()) + , _userNameRequired(true) { } @@ -106,7 +107,8 @@ QString ProcessInfo::validCurrentDir() const int currentPid = parentPid(&ok); QString dir = currentDir(&ok); while (!ok && currentPid != 0) { - ProcessInfo* current = ProcessInfo::newInstance(currentPid); + QString tmp = QString(""); + ProcessInfo* current = ProcessInfo::newInstance(currentPid, tmp); current->update(); currentPid = current->parentPid(&ok); dir = current->currentDir(&ok); @@ -296,6 +298,16 @@ void ProcessInfo::setForegroundPid(int aPid) _fields |= FOREGROUND_PID; } +void ProcessInfo::setUserNameRequired(bool need) +{ + _userNameRequired = need; +} + +bool ProcessInfo::userNameRequired() const +{ + return _userNameRequired; +} + QString ProcessInfo::currentDir(bool* ok) const { if (ok) @@ -348,7 +360,7 @@ void ProcessInfo::setFileError(QFile::FileError error) // implementations of the UnixProcessInfo abstract class. // -NullProcessInfo::NullProcessInfo(int aPid, bool enableEnvironmentRead) +NullProcessInfo::NullProcessInfo(int aPid, const QString& /*titleFormat*/, bool enableEnvironmentRead) : ProcessInfo(aPid, enableEnvironmentRead) { } @@ -363,9 +375,10 @@ void NullProcessInfo::readUserName() } #if !defined(Q_OS_WIN) -UnixProcessInfo::UnixProcessInfo(int aPid, bool enableEnvironmentRead) +UnixProcessInfo::UnixProcessInfo(int aPid, const QString& titleFormat, bool enableEnvironmentRead) : ProcessInfo(aPid, enableEnvironmentRead) { + setUserNameRequired(titleFormat.contains(QLatin1String("%u"))); } bool UnixProcessInfo::readProcessInfo(int aPid , bool enableEnvironmentRead) @@ -419,8 +432,8 @@ void UnixProcessInfo::readUserName() class LinuxProcessInfo : public UnixProcessInfo { public: - LinuxProcessInfo(int aPid, bool env) : - UnixProcessInfo(aPid, env) { + LinuxProcessInfo(int aPid, const QString& titleFormat, bool env) : + UnixProcessInfo(aPid, titleFormat, env) { } private: @@ -462,7 +475,10 @@ private: const int uid = uidString.toInt(&ok); if (ok) setUserId(uid); - readUserName(); + // This will cause constant opening of /etc/passwd + if (userNameRequired()) { + readUserName(); + } } else { setFileError(statusInfo.error()); return false; @@ -611,8 +627,8 @@ private: class FreeBSDProcessInfo : public UnixProcessInfo { public: - FreeBSDProcessInfo(int aPid, bool readEnvironment) : - UnixProcessInfo(aPid, readEnvironment) { + FreeBSDProcessInfo(int aPid, const QString& titleFormat, bool readEnvironment) : + UnixProcessInfo(aPid, titleFormat, readEnvironment) { } private: @@ -731,8 +747,8 @@ private: class OpenBSDProcessInfo : public UnixProcessInfo { public: - OpenBSDProcessInfo(int aPid, bool readEnvironment) : - UnixProcessInfo(aPid, readEnvironment) { + OpenBSDProcessInfo(int aPid, const QString& titleFormat, bool readEnvironment) : + UnixProcessInfo(aPid, titleFormat, readEnvironment) { } private: @@ -865,8 +881,8 @@ private: class MacProcessInfo : public UnixProcessInfo { public: - MacProcessInfo(int aPid, bool env) : - UnixProcessInfo(aPid, env) { + MacProcessInfo(int aPid, const QString& titleFormat, bool env) : + UnixProcessInfo(aPid, titleFormat, env) { } private: @@ -961,8 +977,8 @@ private: class SolarisProcessInfo : public UnixProcessInfo { public: - SolarisProcessInfo(int aPid, bool readEnvironment) - : UnixProcessInfo(aPid, readEnvironment) { + SolarisProcessInfo(int aPid, const QString& titleFormat, bool readEnvironment) + : UnixProcessInfo(aPid, titleFormat, readEnvironment) { } private: virtual bool readProcInfo(int aPid) { @@ -1164,20 +1180,20 @@ QString SSHProcessInfo::format(const QString& input) const return output; } -ProcessInfo* ProcessInfo::newInstance(int aPid, bool enableEnvironmentRead) +ProcessInfo* ProcessInfo::newInstance(int aPid, const QString& titleFormat, bool enableEnvironmentRead) { #if defined(Q_OS_LINUX) - return new LinuxProcessInfo(aPid, enableEnvironmentRead); + return new LinuxProcessInfo(aPid, titleFormat, enableEnvironmentRead); #elif defined(Q_OS_SOLARIS) - return new SolarisProcessInfo(aPid, enableEnvironmentRead); + return new SolarisProcessInfo(aPid, titleFormat, enableEnvironmentRead); #elif defined(Q_OS_MAC) - return new MacProcessInfo(aPid, enableEnvironmentRead); + return new MacProcessInfo(aPid, titleFormat, enableEnvironmentRead); #elif defined(Q_OS_FREEBSD) - return new FreeBSDProcessInfo(aPid, enableEnvironmentRead); + return new FreeBSDProcessInfo(aPid, titleFormat, enableEnvironmentRead); #elif defined(Q_OS_OPENBSD) - return new OpenBSDProcessInfo(aPid, enableEnvironmentRead); + return new OpenBSDProcessInfo(aPid, titleFormat, enableEnvironmentRead); #else - return new NullProcessInfo(aPid, enableEnvironmentRead); + return new NullProcessInfo(aPid, titleFormat, enableEnvironmentRead); #endif } diff --git a/src/ProcessInfo.h b/src/ProcessInfo.h index a1643542..7c846b62 100644 --- a/src/ProcessInfo.h +++ b/src/ProcessInfo.h @@ -85,7 +85,7 @@ public: * of reading the (potentially large) environment data when it * is not required. */ - static ProcessInfo* newInstance(int pid, bool readEnvironment = false); + static ProcessInfo* newInstance(int pid, const QString& titleFormat, bool readEnvironment = false); virtual ~ProcessInfo() {} @@ -294,6 +294,9 @@ protected: */ void addEnvironmentBinding(const QString& name , const QString& value); + void setUserNameRequired(bool need); + bool userNameRequired() const; + private: // takes a full directory path and returns a // shortened version suitable for display in @@ -316,6 +319,8 @@ private: QString _userHomeDir; QString _currentDir; + bool _userNameRequired; + QVector _arguments; QMap _environment; @@ -338,7 +343,7 @@ public: * Constructs a new NullProcessInfo instance. * See ProcessInfo::newInstance() */ - explicit NullProcessInfo(int pid, bool readEnvironment = false); + explicit NullProcessInfo(int pid, const QString& titleFormat, bool readEnvironment = false); protected: virtual bool readProcessInfo(int pid, bool readEnvironment); virtual void readUserName(void); @@ -356,7 +361,7 @@ public: * Constructs a new instance of UnixProcessInfo. * See ProcessInfo::newInstance() */ - explicit UnixProcessInfo(int pid, bool readEnvironment = false); + explicit UnixProcessInfo(int pid, const QString& titleFormat, bool readEnvironment = false); protected: /** diff --git a/src/Session.cpp b/src/Session.cpp index eec20df4..ee2b43bc 100644 --- a/src/Session.cpp +++ b/src/Session.cpp @@ -972,7 +972,8 @@ void Session::updateSessionProcessInfo() if (!_sessionProcessInfo || (processId() != 0 && processId() != _sessionProcessInfo->pid(&ok))) { delete _sessionProcessInfo; - _sessionProcessInfo = ProcessInfo::newInstance(processId()); + _sessionProcessInfo = ProcessInfo::newInstance(processId(), + tabTitleFormat(Session::LocalTabTitle)); _sessionProcessInfo->setUserHomeDir(); } _sessionProcessInfo->update(); @@ -985,7 +986,8 @@ bool Session::updateForegroundProcessInfo() const int foregroundPid = _shellProcess->foregroundProcessGroup(); if (foregroundPid != _foregroundPid) { delete _foregroundProcessInfo; - _foregroundProcessInfo = ProcessInfo::newInstance(foregroundPid); + _foregroundProcessInfo = ProcessInfo::newInstance(foregroundPid, + tabTitleFormat(Session::LocalTabTitle)); _foregroundPid = foregroundPid; }